# HG changeset patch # User jwe # Date 1109361328 0 # Node ID 57077d0ddc8ed8895142555b01a69b7f322b52ca # Parent 9f3299378193a965cf87ff26e4d23fc445b4a791 [project @ 2005-02-25 19:55:24 by jwe] diff -r 9f3299378193 -r 57077d0ddc8e Makeconf.in --- a/Makeconf.in Fri Feb 25 17:42:55 2005 +0000 +++ b/Makeconf.in Fri Feb 25 19:55:28 2005 +0000 @@ -101,13 +101,21 @@ TMP_IF_1 = -I. -I$(srcdir) endif ifeq ($(TOPDIR),$(top_srcdir)) - TMP_IF_2 = -I$(TOPDIR) -I$(TOPDIR)/liboctave -I$(TOPDIR)/src \ - -I$(TOPDIR)/libcruft/misc + TMP_IF_2 = \ + -I$(TOPDIR) \ + -I$(TOPDIR)/liboctave \ + -I$(TOPDIR)/src \ + -I$(TOPDIR)/libcruft/misc else - TMP_IF_2 = -I$(TOPDIR) -I$(TOPDIR)/liboctave -I$(TOPDIR)/src \ - -I$(TOPDIR)/libcruft/misc -I$(top_srcdir) \ - -I$(top_srcdir)/liboctave -I$(top_srcdir)/src \ - -I$(top_srcdir)/libcruft/misc + TMP_IF_2 = \ + -I$(TOPDIR) \ + -I$(TOPDIR)/liboctave \ + -I$(TOPDIR)/src \ + -I$(TOPDIR)/libcruft/misc \ + -I$(top_srcdir) \ + -I$(top_srcdir)/liboctave \ + -I$(top_srcdir)/src \ + -I$(top_srcdir)/libcruft/misc endif INCFLAGS = $(TMP_IF_1) $(TMP_IF_2) $(DLFCN_INCFLAGS) $(GLOB_INCFLAGS) diff -r 9f3299378193 -r 57077d0ddc8e PROJECTS --- a/PROJECTS Fri Feb 25 17:42:55 2005 +0000 +++ b/PROJECTS Fri Feb 25 19:55:28 2005 +0000 @@ -35,8 +35,6 @@ * Free NLP solver. - * Support for sparse matrices. - * Fix CollocWt to handle Laguerre polynomials. Make it easy to extend it to other polynomial types. @@ -105,6 +103,104 @@ non-square systems compatible with Matlab. Currently, they return the minimum norm solution from DGELSS, which behaves differently. +--------------- +Sparse Matrices: +--------------- + + * Sparse Cholesky factorization for Fchol function and also for the + in built polymorphic solvers. + + * QR factorization functions, also for use in lssolve functions. Write + svds function based on this. Write sprank function based on svds. + + * Once dmperm is implemented, use the technique to detect permuted + triangular matrices. Test the permuted triangular matrix solver code + + * Accelerate the copying of the data from a sparse matrix to a banded matrix + in the solvers, that takes a significant portion of the computation time + for narrow matrices. This is not obvious, due to the treatment of zero + elements in the matrix. Maybe current solution is optimal. + + * Perhaps split the overly long ::solve functions up, either by the type + of solver, or seperate factorization functions, so that they can be + reused in each of 4 different ::solve functions. + + * Sparse inverse function, based on Andy's code from octave-forge. + + * Implement fourth argument to the sprand and sprandn that the leading + brand implements. + + * Mapper functions such as real, imag, abs, etc need to be treated, either + with a dispatch or by changing the mapper function code. + + * Write the rest of the sparse docs + + * The algo in TOMS 582 is perfect for symrcm function. However, this is + under the ACM license and can't be used in a GPL program. + + An alternative is that PETSC is GPL compatiable and has a symrcm + implemented from the original SPARSPAK. Its not clear that this is + legal to me as I have found no clarification of the original license + of SPARSPAK. As PETSC has had this code for over 10 years without + problem, we can perhaps assume that there is no issues. Maybe need + to contact PETSC people or the SPARSPAK people at uni of waterloo + to check issues. + + * Make spalloc(r,c,n) actually create an empty sparse with n non-zero + elements? This allows something like + + sm = spalloc (r,c,n) + for j=1:c + for i=1:r + tmp = foo (i,j); + if (tmp != 0.) + sm (i,j) = tmp; + endif + endfor + endfor + + actually make sense. Otherwise the above will cause massive amounts + of memory reallocation. + + The fact is that this doesn't make sense in any case as the assign + function makes another copy of the sparse matrix. So although spalloc + might easily be made to have the correct behaviour, the first assign + will cause the matrix to be resized !!! There seems to be no simple + way to treat this but a complete rewrite of the sparse assignment + functions... + + * Port the sparse testing code into the DejaGNU testing code. + + * Treat the dispatching of the splu, spdet, functions, etc within octave + itself. This either means that classes need implementing or at the + minimum the octave-forge dispatch function is implemented within octave + + * Other missing Functions + - eigs + - dmperm Tim Davis is apparently working on something + - symmmd Superseded by symamd + - colmmd Superseded by colamd + - sprandsym + - symbfact + - etreeplot + - treeplot + - gplot + - treelayout + - cholinc + - condest + - normest + - bicg + - bicgstab + - cgs + - gmres + - lsqr + - minres + - pcg Can this be taken from o-forge? Is it compatiable + - pcr Can and should this be taken from o-forge? + - qmr + - symmlq + - spaugment + -------- Graphics: -------- diff -r 9f3299378193 -r 57077d0ddc8e doc/ChangeLog --- a/doc/ChangeLog Fri Feb 25 17:42:55 2005 +0000 +++ b/doc/ChangeLog Fri Feb 25 19:55:28 2005 +0000 @@ -1,3 +1,14 @@ +2005-02-25 John W. Eaton + + Sparse merge. + + 2005-01-07 David Bateman + + * interpreter/sparse.txi: New file. + * interpreter/Makefile.in: Add it to the build. + * interpreter/octave.texi: Include it in the contents tables and the + top level document. + 2005-02-25 John W. Eaton * liboctave/Makefile.in (all): Also depend on Octave-FAQ.pdf. diff -r 9f3299378193 -r 57077d0ddc8e doc/interpreter/Makefile.in --- a/doc/interpreter/Makefile.in Fri Feb 25 17:42:55 2005 +0000 +++ b/doc/interpreter/Makefile.in Fri Feb 25 19:55:28 2005 +0000 @@ -25,7 +25,7 @@ grammar.txi image.txi install.txi intro.txi io.txi \ linalg.txi matrix.txi nonlin.txi numbers.txi \ op-idx.txi optim.txi plot.txi poly.txi preface.txi \ - quad.txi quaternion.txi set.txi signal.txi stats.txi \ + quad.txi quaternion.txi set.txi signal.txi sparse.txi stats.txi \ stmt.txi stream.txi strings.txi struct.txi system.txi \ tips.txi var.txi vr-idx.txi diff -r 9f3299378193 -r 57077d0ddc8e doc/interpreter/octave.texi --- a/doc/interpreter/octave.texi Fri Feb 25 17:42:55 2005 +0000 +++ b/doc/interpreter/octave.texi Fri Feb 25 19:55:28 2005 +0000 @@ -138,6 +138,7 @@ * Arithmetic:: * Linear Algebra:: * Nonlinear Equations:: +* Sparse Matrices:: * Quadrature:: * Differential Equations:: * Optimization:: @@ -378,6 +379,16 @@ * Matrix Factorizations:: * Functions of a Matrix:: +Sparse Matrices + +* Basics:: +* Graph Theory:: +* Sparse Linear Algebra:: +* Iterative Techniques:: +* Oct-Files:: +* License:: +* Function Reference:: + Quadrature * Functions of One Variable:: @@ -507,6 +518,7 @@ @include arith.texi @include linalg.texi @include nonlin.texi +@include sparse.texi @include quad.texi @include diffeq.texi @include optim.texi diff -r 9f3299378193 -r 57077d0ddc8e doc/interpreter/sparse.txi --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/interpreter/sparse.txi Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,1308 @@ +@c Copyright (C) 2004, 2005 David Bateman +@c This is part of the Octave manual. +@c For copying conditions, see the file gpl.texi. + +@node Sparse Matrices +@chapter Sparse Matrices + +@menu +* Basics:: The Creation and Manipulation of Sparse Matrices +* Graph Theory:: Graphs are their use with Sparse Matrices +* Sparse Linear Algebra:: Linear Algebra on Sparse Matrices +* Iterative Techniques:: Iterative Techniques applied to Sparse Matrices +* Oct-Files:: Using Sparse Matrices in Oct-files +* License:: Licensing of Third Party Software +* Function Reference:: Documentation from the Specific Sparse Functions +@end menu + +@node Basics, Graph Theory, Sparse Matrices, Sparse Matrices +@section The Creation and Manipulation of Sparse Matrices + +The size of mathematical problems that can be treated at any particular +time is generally limited by the available computing resources. Both, +the speed of the computer and its available memory place limitation on +the problem size. + +There are many classes mathematical problems which give rise to +matrices, where a large number of the elements are zero. In this case +it makes sense to have a special matrix type to handle this class of +problems where only the non-zero elements of the matrix are +stored. Not only done this reduce the amount of memory to store the +matrix, but it also means that operations on this type of matrix can +take advantage of the a-priori knowledge of the positions of the +non-zero elements to accelerate their calculations. + +A matrix type that stores only the non-zero elements is generally called +sparse. It is the purpose of this document to discuss the basics of the +storage and creation of sparse matrices and the fundamental operations +on them. + +THIS DOCUMENT STILL HAS LARGE BLANKS. PLEASE FILL THEM IN. LOOK FOR +THE TAG "WRITE ME" + +@menu +* Storage:: Storage of Sparse Matrices +* Creation:: Creating Sparse Matrices +* Operators and Functions:: Basic Operators and Functions on Sparse Matrices +* Information:: Finding out Information about Sparse Matrices +@end menu + +@node Storage, Creation, Basics, Basics +@subsection Storage of Sparse Matrices + +It is not strictly speaking necessary for the user to understand how +sparse matrices are stored. However, such an understanding will help +to get an understanding of the size of sparse matrices. Understanding +the storage technique is also necessary for those users wishing to +create their own oct-files. + +There are many different means of storing sparse matrix data. What all +of the methods have in common is that they attempt to reduce the compelxity +and storage given a-priori knowledge of the particular class of problems +that will be solved. A good summary of the available techniques for storing +sparse matrix is given by Saad @footnote{Youcef Saad "SPARSKIT: A basic toolkit +for sparse matrix computation", 1994, +@url{ftp://ftp.cs.umn.edu/dept/sparse/SPARSKIT2/DOC/paper.ps}}. +With full matrices, knowledge of the point of an element of the matrix +within the matrix is implied by its position in the computers memory. +However, this is not the case for sparse matrices, and so the positions +of the non-zero elements of the matrix must equally be stored. + +An obvious way to do this is by storing the elements of the matrix as +triplets, with two elements being the of the position in the array +(rows and column) and the third being the data itself. This is conceptually +easy to grasp, but requires more storage than is strictly needed. + +The storage technique used within @sc{Octave} is compressed column +format. In this format the position of each element in a row and the +data are stored as previously. However, if we assume that all elements +in the same column are stored adjacent in the computers memory, then +we only need to store information on the number of non-zero elements +in each column, rather than their positions. Thus assuming that the +matrix has more non-zero elements than there are columns in the +matrix, we win in terms of the amount of memory used. + +In fact, the column index contains one more element than the number of +columns, with the first element always being zero. The advantage of +this is a simplication in the code, in that their is no special case +for the first or last columns. A short example, demonstrating this in +C is. + +@example + for (j = 0; j < nc; j++) + for (i = cidx (j); i < cidx(j+1); i++) + printf ("non-zero element (%i,%i) is %d\n", ridx(i), j, data(i)); +@end example + +A clear understanding might be had by considering an example of how the +above applies to an example matrix. Consider the matrix + +@example +@group + 1 2 0 0 + 0 0 0 3 + 0 0 0 4 +@end group +@end example + +The non-zero elements of this matrix are + +@example +@group + (1, 1) @result{} 1 + (1, 2) @result{} 2 + (2, 4) @result{} 3 + (3, 4) @result{} 4 +@end group +@end example + +This will be stored as three vectors @var{cidx}, @var{ridx} and @var{data}, +representing the column indexing, row indexing and data respectively. The +contents of these three vectors for the above matrix will be + +@example +@group + @var{cidx} = [0, 2, 2, 4] + @var{ridx} = [0, 0, 1, 2] + @var{data} = [1, 2, 3, 4] +@end group +@end example + +Note that this is the representation of these elements with the first row +and column assumed to start as zero. Thus the number of elements in the +@var{i}-th column is given by @code{@var{cidx} (@var{i} + 1) - +@var{cidx} (@var{i})}. + +It should be noted that compressed row formats are equally possible. However, +in the context of mixed operations between mixed sparse and dense matrices, +it makes sense that the elements of the sparse matrices are in the same +order as the dense matrices. @sc{Octave} stores dense matrices in column +major ordering, and so sparse matrices are equally stored in this manner. + +A further constraint on the sparse matrix storage used by @sc{Octave} is that +all elements in the rows are stored in increasing order of their row +index. This makes certain operations, later be faster. However, it imposes +the need to sort the elements on the creation of sparse matrices. Having +dis-ordered elements is potentially an advantage in that it makes operations +such as concatenating two sparse matrices together easier and faster, however +it adds complexity and speed problems elsewhere. + +@node Creation, Operators and Functions, Storage, Basics +@subsection Creating Sparse Matrices + +There are several means to create sparse matrix. + +@table @asis +@item Returned from a function +There are many functions that directly return sparse matrices. These include +@dfn{speye}, @dfn{sprand}, @dfn{spdiag}, etc. +@item Constructed from matrices or vectors +The function @dfn{sparse} allows a sparse matrix to be constructed from +three vectors representing the row, column and data. ALternatively, the +function @dfn{spconvert} uses a three column matrix format to allow easy +importation of data from elsewhere. +@item Created and then filled +The function @dfn{sparse} or @dfn{spalloc} can be used to create an empty +matrix that is then filled by the user +@item From a user binary program +The user can directly create the sparse matrix within an oct-file. +@end table + +There are several basic functions to return specific sparse +matrices. For example the sparse identity matrix, is a matrix that is +often needed. It therefore has its own function to create it as +@code{speye (@var{n})} or @code{speye (@var{r}, @var{c})}, which +creates an @var{n}-by-@var{n} or @var{r}-by-@var{c} sparse identity +matrix. + +Another typical sparse matrix that is often needed is a random distribution +of random elements. The functions @dfn{sprand} and @dfn{sprandn} perform +this for uniform and random distributions of elements. They have exactly +the same calling convention as @code{sprand (@var{r}, @var{c}, @var{d})}, +which creates an @var{r}-by-@var{c} sparse matrix a density of filled +elements of @var{d}. + +Other functions of interest that directly creates a sparse matrix, are +@dfn{spdiag} or its generalization @dfn{spdiags}, that can take the +definition of the diagonals of the matrix and create the sparse matrix +that corresponds to this. For example + +@c FIXME, when spdiag is overloaded to diag the below won't work. + +@example +s = spdiag (randn(1,n), -1); +@end example + +creates a sparse (@var{n}+1)-by-(@var{n}+1) sparse matrix with a single +diagonal defined. + +The recommended way for the user to create a sparse matrix, is to create +two vectors contain the row and column index of the data and a third +vector of the same size containing the data to be stored. For example + +@example + function x = foo (r, j) + idx = randperm (r); + x = ([zeros(r-2,1); rand(2,1)])(idx); + endfunction + + ri = []; + ci = []; + d = []; + + for j=1:c + dtmp = foo (r, j); # Returns vector of length r with (:,j) values + idx = find (dtmp != 0.); + ri = [ri; idx]; + ci = [ci; j*ones(length(idx),1)]; + d = [d; dtmp(idx)]; + endfor + s = sparse (ri, ci, d, r, c); +@end example + +creates an @var{r}-by-@var{c} sparse matrix with a random distribution of +2 elements per row. The elements of the vectors do not need to be sorted in +any particular order as @sc{Octave} will store them prior to storing the +data. However, per sorting the data will make teh creation of the sparse +matrix faster. + +The function @dfn{spconvert} takes a three or four column real matrix. +The first two columns represent the row and column index respectively and +the third and four columns, the real and imaginary parts of the sparse +matrix. The matrix can contain zero elements and the elements can be +sorted in any order. Adding zero elements is a convenient way to define +the size of the sparse matrix. For example + +@example +s = spconvert ([1 2 3 4; 1 3 4 4; 1 2 3 0]') +@result{} Compressed Column Sparse (rows=4, cols=4, nnz=3) + (1 , 1) -> 1 + (2 , 3) -> 2 + (3 , 4) -> 3 +@end example + +An example of creating and filling a matrix might be + +@example +k = 5; +nz = r * k; +s = spalloc (r, c, nz) +for j = 1:c + idx = randperm (r); + s (:, j) = [zeros(r - k, 1); rand(k, 1)] (idx); +endfor +@end example + +It should be noted, that due to the way that the @sc{Octave} +assignment functions are written that the assignment will reallocate +the memory used by the sparse matrix at each iteration. Therefore the +@dfn{spalloc} function ignores the @var{nz} argument and does not +preassign the memory for the matrix. Therefore, it is vitally +important that code using to above structure should be as vectorized +as possible to minimize the number of assignments and reduce the +number of memory allocations. + +The above problem can be avoided in oct-files. However, the +construction of a sparse matrix from an oct-file is more complex than +can be discussed in this brief introduction, and you are referred to +section @ref{Oct-Files}, to have a full description of the techniques +involved. + +@node Operators and Functions, Information, Creation, Basics +@subsection Basic Operators and Functions on Sparse Matrices + +@menu +* Functions:: Operators and Functions +* ReturnType:: The Return Types of Operators and Functions +* MathConsiderations:: Mathematical Considerations +@end menu + +@node Functions, ReturnType, Operators and Functions, Operators and Functions +@subsubsection Operators and Functions + +WRITE ME + +@node ReturnType, MathConsiderations, Functions, Operators and Functions +@subsubsection The Return Types of Operators and Functions + +The two basic reason to use sparse matrices are to reduce the memory +usage and to not have to do calculations on zero elements. The two are +closely related in that the computation time on a sparse matrix operator +or function is roughly linear with the numberof non-zero elements. + +Therefore, there is a certain density of non-zero elements of a matrix +where it no longer makes sense to store it as a sparse matrix, but rather +as a full matrix. For this reason operators and functions that have a +high probability of returning a full matrix will always return one. For +example adding a scalar constant to a sparse matrix will almost always +make it a full matrix, and so the example + +@example +speye(3) + 0 +@result{} 1 0 0 + 0 1 0 + 0 0 1 +@end example + +returns a full matrix as can be seen. Additionally all sparse functions +test the amount of memory occupied by the sparse matrix to see if the +amount of storage used is larger than the amount used by the full +equivalent. Therefore @code{speye (2) * 1} will return a full matrix as +the memory used is smaller for the full version than the sparse version. + +As all of the mixed operators and functions between full and sparse +matrices exist, in general this does not cause any problems. However, +one area where it does cause a problem is where a sparse matrix is +promoted to a full matrix, where subsequent operations would resparsify +the matrix. Such cases as rare, but can be artificially created, for +example @code{(fliplr(speye(3)) + speye(3)) - speye(3)} gives a full +matrix when it should give a sparse one. In general, where such cases +occur, they impose only a small memory penalty. + +There is however one known case where this behaviour of @sc{Octave}'s +sparse matrices will cause a problem. That is in the handling of the +@dfn{diag} function. Whether @dfn{diag} returns a sparse or full matrix +depending on the type of its input arguments. So + +@example + a = diag (sparse([1,2,3]), -1); +@end example + +should return a sparse matrix. To ensure this actually happens, the +@dfn{sparse} function, and other functions based on it like @dfn{speye}, +always returns a sparse matrix, even if the memory used will be larger +than its full representation. + +@node MathConsiderations, , ReturnType, Operators and Functions +@subsubsection Mathematical Considerations + +The attempt has been made to make sparse matrices behave in exactly the +same manner as there full counterparts. However, there are certain differences +and especially differences with other products sparse implementations. + +Firstly, the "./" and ".^" operators must be used with care. Consider what +the examples + +@example + s = speye (4); + a1 = s .^ 2; + a2 = s .^ s; + a3 = s .^ -2; + a4 = s ./ 2; + a5 = 2 ./ s; + a6 = s ./ s; +@end example + +will give. The first example of @var{s} raised to the power of 2 causes +no problems. However @var{s} raised element-wise to itself involves a +a large number of terms @code{0 .^ 0} which is 1. There @code{@var{s} .^ +@var{s}} is a full matrix. + +Likewise @code{@var{s} .^ -2} involves terms terms like @code{0 .^ -2} which +is infinity, and so @code{@var{s} .^ -2} is equally a full matrix. + +For the "./" operator @code{@var{s} ./ 2} has no problems, but +@code{2 ./ @var{s}} involves a large number of infinity terms as well +and is equally a full matrix. The case of @code{@var{s} ./ @var{s}} +involves terms like @code{0 ./ 0} which is a @code{NaN} and so this +is equally a full matrix with the zero elements of @var{s} filled with +@code{NaN} values. + +The above behaviour is consistent with full matrices, but is not +consistent with sparse implementations in other products. + +A particular problem of sparse matrices comes about due to the fact that +as the zeros are not stored, the sign-bit of these zeros is equally not +stored... In certain cases the sign-bit of zero is important. For example + +@example + a = 0 ./ [-1, 1; 1, -1]; + b = 1 ./ a + @result{} -Inf Inf + Inf -Inf + c = 1 ./ sparse (a) + @result{} Inf Inf + Inf Inf +@end example + +To correct this behaviour would mean that zero elements with a negative +sign-bit would need to be stored in the matrix to ensure that their +sign-bit was respected. This is not done at this time, for reasons of +efficient, and so the user is warned that calculations where the sign-bit +of zero is important must not be done using sparse matrices. + +Also discuss issues of fill-in. Discuss symamd etc, and mention randperm +that is included elsewhere in the docs... + +WRITE ME + +@node Information, , Operators and Functions, Basics +@subsection Finding out Information about Sparse Matrices + +Talk about the spy, spstats, nnz, spparms, etc function + +WRITE ME + +@node Graph Theory, Sparse Linear Algebra, Basics, Sparse Matrices +@section Graphs are their use with Sparse Matrices + +Someone who knows more about this than me should write this... + +WRITE ME + +@node Sparse Linear Algebra, Iterative Techniques, Graph Theory, Sparse Matrices +@section Linear Algebra on Sparse Matrices + +@sc{Octave} includes a poly-morphic solver for sparse matrices, where +the exact solver used to factorize the matrix, depends on the properties +of the sparse matrix, itself. As the cost of determining the matrix type +is small relative to the cost of factorizing the matrix itself, the matrix +type is re-determined each time it is used in a linear equation. + +The selection tree for how the linear equation is solve is + +@enumerate 1 +@item If the matrix is not square go to 9. + +@item If the matrix is diagonal, solve directly and goto 9 + +@item If the matrix is a permuted diagonal, solve directly taking into +account the permutations. Goto 9 + +@item If the matrix is banded and if the band density is less than that +given by @code{spparms ("bandden")} continue, else goto 5. + +@enumerate a +@item If the matrix is tridiagonal and the right-hand side is not sparse +continue, else goto 4b. + +@enumerate +@item If the matrix is hermitian, with a positive real diagonal, attempt + Cholesky factorization using @sc{Lapack} xPTSV. + +@item If the above failed or the matrix is not hermitian with a positive + real diagonal use Gaussian elimination with pivoting using + @sc{Lapack} xGTSV, and goto 9. +@end enumerate + +@item If the matrix is hermitian with a positive real diagonal, attempt + Cholesky factorization using @sc{Lapack} xPBTRF. + +@item if the above failed or the matrix is not hermitian with a positive + real diagonal use Gaussian elimination with pivoting using + @sc{Lapack} xGBTRF, and goto 9. +@end enumerate + +@item If the matrix is upper or lower triangular perform a sparse forward +or backward subsitution, and goto 9 + +@item If the matrix is a permuted upper or lower triangular matrix, perform +a sparse forward or backward subsitution, and goto 9 + +FIXME: Detection of permuted triangular matrices not written yet, and so + the code itself is not tested either + +@item If the matrix is hermitian with a real positive diagonal, attempt +sparse Cholesky factorization. + +FIXME: Detection of positive definite matrices written and tested, but + Cholesky factorization isn't yet written + +@item If the sparse Cholesky factorization failed or the matrix is not +hermitian with a real positive diagonal, factorize using UMFPACK. + +@item If the matrix is not square, or any of the previous solvers flags +a singular or near singular matrix, find a minimum norm solution + +FIXME: QR solvers not yet written. + +@end enumerate + +The band density is defined as the number of non-zero values in the matrix +divided by the number of non-zero values in the matrix. The banded matrix +solvers can be entirely disabled by using @dfn{spparms} to set @code{bandden} +to 1 (i.e. @code{spparms ("bandden", 1)}). + +All of the solvers above, expect the banded solvers, calculate an +estimate of the condition number. This can be used to detect numerical +stability problems in the solution and force a minimum norm solution +to be used. However, for narrow banded matrices, the cost of +calculating the condition number is significant, and can in fact exceed +the cost of factoring the matrix. Therefore the condition number is +not calculated for banded matrices, and therefore unless the factorization +is exactly singular, these numerical instabilities won't be detected. +In cases where, this might be a problem the user is recommended to disable +the banded solvers as above, at a significant cost in terms of speed. + +@node Iterative Techniques, Oct-Files, Sparse Linear Algebra, Sparse Matrices +@section Iterative Techniques applied to sparse matrices + +WRITE ME + +@node Oct-Files, License, Iterative Techniques, Sparse Matrices +@section Using Sparse Matrices in Oct-files + +An oct-file is a means of writing an @sc{Octave} function in a compilable +language like C++, rather than as a script file. This results in a +significant acceleration in the code. It is not the purpose of this +section to discuss how to write an oct-file, or discuss what they +are. There are already two @footnote{Paul Thomas "Dal Segno al Coda +- The octave dynamically linked function cookbook", +@url{http://perso.wanadoo.fr/prthomas/intro.html}, and Cristophe Spiel +"Del Coda Al Fine - Pushing Octave's Limits", +@url{http://octave.sourceforge.net/coda/coda.pdf}} very good +references on oct-files themselves. Users who are not familiar with +oct-files are urged to read these references to fully understand this +chapter. The examples discussed here assume that the oct-file is written +entirely in C++. + +There are three classes of sparse objects that are of interest to the +user. + +@table @asis +@item SparseMatrix +A double precision sparse matrix class +@item SparseComplexMatrix +A Complex sparse matrix class +@item SparseBoolMatrix +A boolen sparse matrix class +@end table + +All of these classes inherit from the @code{Sparse} template class, +and so all have similar capabilities and usage. The @code{Sparse} +class was based on @sc{Octave} @code{Array} class, and so users familar +with @sc{Octave}'s Array classes will be comfortable with the use of +the sparse classes. + +The sparse classes will not be entirely described in this section, due +to their similar with the existing Array classes. However, there are a +few differences due the different nature of sparse objects, and these +will be described. Firstly, although it is fundamentally possible to +have N-dimensional sparse objects, the @sc{Octave} sparse classes do +not allow them at this time. So all operations of the sparse classes +must be 2-dimensional. This means that in fact @code{SparseMatrix} is +similar to @sc{Octave}'s @code{Matrix} class rather than its +@code{NDArray} class. + +@menu +* OctDifferences:: The Differences between the Array and Sparse Classes +* OctCreation:: Creating Spare Matrices in Oct-Files +* OctUse:: Using Sparse Matrices in Oct-Files +@end menu + +@node OctDifferences, OctCreation, Oct-Files, Oct-Files +@subsection The Differences between the Array and Sparse Classes + +The number of elements in a sparse matrix is considered to be the number +of non-zero elements rather than the product of the dimensions. Therefore + +@example + SparseMatrix sm; + @dots{} + int nel = sm.nelem (); +@end example + +returns the number of non-zero elements. If the user really requires the +number of elements in the matrix, including the non-zero elements, they +should use @code{numel} rather than @code{nelem}. Note that for very +large matrices, where the product of the two dimensions is large that +the representation of the an unsigned int, then @code{numel} can overflow. +An example is @code{speye(1e6)} which will create a matrix with a million +rows and columns, but only a million non-zero elements. Therefore the +number of rows by the number of columns in this case is more than two +hundred times the maximum value that can be represented by an unsigned int. +The use of @code{numel} should therefore be avoided useless it is known +it won't overflow. + +Extreme care must be take with the elem method and the "()" operator, +which perform basically the same function. The reason is that if a +sparse object is non-const, then @sc{Octave} will assume that a +request for a zero element in a sparse matrix is in fact a request +to create this element so it can be filled. Therefore a piece of +code like + +@example + SparseMatrix sm; + @dots{} + for (int j = 0; j < nc; j++) + for (int i = 0; i < nr; i++) + std::cerr << " (" << i << "," << j << "): " << sm(i,j) + << std::endl; +@end example + +is a great way of turning the sparse matrix into a dense one, and a +very slow way at that since it reallocates the sparse object at each +zero element in the matrix. + +An easy way of preventing the above from hapening is to create a temporary +constant version of the sparse matrix. Note that only the container for +the sparse matrix will be copied, while the actual representation of the +data will be shared between the two versions of the sparse matrix. So this +is not a costly operation. For example, the above would become + +@example + SparseMatrix sm; + @dots{} + const SparseMatrix tmp (sm); + for (int j = 0; j < nc; j++) + for (int i = 0; i < nr; i++) + std::cerr << " (" << i << "," << j << "): " << tmp(i,j) + << std::endl; +@end example + +Finally, as the sparse types aren't just represented as a contiguous +block of memory, the @code{fortran_vec} method of the @code{Array} +is not available. It is however replaced by three seperate methods +@code{ridx}, @code{cidx} and @code{data}, that access the raw compressed +column format that the @sc{Octave} sparse matrices are stored in. +Additionally, these methods can be used in a manner similar to @code{elem}, +to allow the matrix to be accessed or filled. However, in that case it is +up to the user to repect the sparse matrix compressed column format +discussed previous. + +@node OctCreation, OctUse, OctDifferences, Oct-Files +@subsection Creating Spare Matrices in Oct-Files + +The user has several alternatives in how to create a sparse matrix. +They can first create the data as three vectors representing the +row and column indexes and the data, and from those create the matrix. +Or alternatively, they can create a sparse matrix with the appropriate +amount of space and then fill in the values. Both techniques have their +advantages and disadvantages. + +An example of how to create a small sparse matrix with the first technique +might be seen the example + +@example + int nz = 4, nr = 3, nc = 4; + ColumnVector ridx (nz); + ColumnVector cidx (nz); + ColumnVector data (nz); + + ridx(0) = 0; ridx(1) = 0; ridx(2) = 1; ridx(3) = 2; + cidx(0) = 0; cidx(1) = 1; cidx(2) = 3; cidx(3) = 3; + data(0) = 1; data(1) = 2; data(2) = 3; data(3) = 4; + + SparseMatrix sm (data, ridx, cidx, nr, nc); +@end example + +which creates the matrix given in section @ref{Storage}. Note that +the compressed matrix format is not used at the time of the creation +of the matrix itself, however it is used internally. + +As previously mentioned, the values of the sparse matrix are stored +in increasing column-major ordering. Although the data passed by the +user does not need to respect this requirement, the pre-sorting the +data significantly speeds up the creation of the sparse matrix. + +The disadvantage of this technique of creating a sparse matrix is +that there is a brief time where two copies of the data exists. Therefore +for extremely memory constrained problems this might not be the right +technique to create the sparse matrix. + +The alternative is to first create the sparse matrix with the desired +number of non-zero elements and then later fill those elements in. The +easiest way to do this is + +@example + int nz = 4, nr = 3, nc = 4; + SparseMatrix sm (nr, nc, nz); + sm(0,0) = 1; sm(0,1) = 2; sm(1,3) = 3; sm(2,3) = 4; +@end example + +That creates the same matrix as previously. Again, although it is not +strictly necessary, it is significantly faster if the sparse matrix is +created in this manner that the elements are added in column-major +ordering. The reason for this is that if the elements are inserted +at the end of the current list of known elements then no element +in the matrix needs to be moved to allow the new element to be +inserted. Only the column indexes need to be updated. + +There are a few further points to note about this technique of creating +a sparse matrix. Firstly, it is not illegal to create a sparse matrix +with fewer elements than are actually inserted in the matrix. Therefore + +@example + int nz = 4, nr = 3, nc = 4; + SparseMatrix sm (nr, nc, 0); + sm(0,0) = 1; sm(0,1) = 2; sm(1,3) = 3; sm(2,3) = 4; +@end example + +is perfectly legal. However it is a very bad idea. The reason is that +as each new element is added to the sparse matrix the space allocated +to it is increased by reallocating the memory. This is an expensive +operation, that will significantly slow this means of creating a sparse +matrix. Furthermore, it is not illegal to create a sparse matrix with +too much storage, so having @var{nz} above equaling 6 is also legal. +The disadvantage is that the matrix occupies more memory than strictly +needed. + +It is not always easy to known the number of non-zero elements prior +to filling a matrix. For this reason the additional storage for the +sparse matrix can be removed after its creation with the +@dfn{maybe_compress} function. Furthermore, the maybe_compress can +deallocate the unused storage, but it can equally remove zero elements +from the matrix. The removal of zero elements from the matrix is +controlled by setting the argument of the @dfn{maybe_compress} function +to be 'true'. However, the cost of removing the zeros is high because it +implies resorting the elements. Therefore, if possible it is better +is the user doesn't add the zeros in the first place. An example of +the use of @dfn{maybe_compress} is + +@example + int nz = 6, nr = 3, nc = 4; + SparseMatrix sm1 (nr, nc, nz); + sm1(0,0) = 1; sm1(0,1) = 2; sm1(1,3) = 3; sm1(2,3) = 4; + sm1.maybe_compress (); // No zero elements were added + + SparseMatrix sm2 (nr, nc, nz); + sm2(0,0) = 1; sm2(0,1) = 2; sm(0,2) = 0; sm(1,2) = 0; + sm1(1,3) = 3; sm1(2,3) = 4; + sm2.maybe_compress (true); // Zero elements were added +@end example + +The use of the @dfn{maybe_compress} function should be avoided if +possible, as it will slow the creation of the matrices. + +A third means of creating a sparse matrix is to work directly with +the data in compressed row format. An example of this technique might +be + +@c Note the @verbatim environment is a relatively new addition to texinfo. +@c Therefore use the @example environment and replace @, with @@, +@c { with @{, etc + +@example + octave_value arg; + + @dots{} + + int nz = 6, nr = 3, nc = 4; // Assume we know the max no nz + SparseMatrix sm (nr, nc, nz); + Matrix m = arg.matrix_value (); + + int ii = 0; + sm.cidx (0) = 0; + for (int j = 1; j < nc; j++) + @{ + for (int i = 0; i < nr; i++) + @{ + double tmp = foo (m(i,j)); + if (tmp != 0.) + @{ + sm.data(ii) = tmp; + sm.ridx(ii) = i; + ii++; + @} + @} + sm.cidx(j+1) = ii; + @} + sm.maybe_mutate (); // If don't know a-priori the final no of nz. +@end example + +which is probably the most efficient means of creating the sparse matrix. + +Finally, it might sometimes arise that the amount of storage initially +created is insufficient to completely store the sparse matrix. Therefore, +the method @code{change_capacity} exists to reallocate the sparse memory. +The above example would then be modified as + +@example + octave_value arg; + + @dots{} + + int nz = 6, nr = 3, nc = 4; // Assume we know the max no nz + SparseMatrix sm (nr, nc, nz); + Matrix m = arg.matrix_value (); + + int ii = 0; + sm.cidx (0) = 0; + for (int j = 1; j < nc; j++) + @{ + for (int i = 0; i < nr; i++) + @{ + double tmp = foo (m(i,j)); + if (tmp != 0.) + @{ + if (ii == nz) + @{ + nz += 2; // Add 2 more elements + sm.change_capacity (nz); + @} + sm.data(ii) = tmp; + sm.ridx(ii) = i; + ii++; + @} + @} + sm.cidx(j+1) = ii; + @} + sm.maybe_mutate (); // If don't know a-priori the final no of nz. +@end example + +Note that both increasing and decreasing the number of non-zero elements in +a sparse matrix is expensive, as it involves memory reallocation. Also as +parts of the matrix, though not its entirety, exist as the old and new copy +at the same time, additional memory is needed. Therefore if possible this +should be avoided. + +@node OctUse, , OctCreation, Oct-Files +@subsection Using Sparse Matrices in Oct-Files + +Most of the same operators and functions on sparse matrices that are +available from the @sc{Octave} are equally available with oct-files. +The basic means of extracting a sparse matrix from an @code{octave_value} +and returning them as an @code{octave_value}, can be seen in the +following example + +@example + octave_value_list retval; + + SparseMatrix sm = args(0).sparse_matrix_value (); + SparseComplexMatrix scm = args(1).sparse_complex_matrix_value (); + SparseBoolMatrix sbm = args(2).sparse_bool_matrix_value (); + + @dots{} + + retval(2) = sbm; + retval(1) = scm; + retval(0) = sm; +@end example + +The conversion to an octave-value is handled by the sparse +@code{octave_value} constructors, and so no special care is needed. + +@node License, Function Reference, Oct-Files, Sparse Matrices +@section Licensing of Third Party Software + +There are several third party software packages used by the @sc{Octave} +sparse matrix. + +@table @asis +@item COLAMD +is used for the @dfn{colamd} and @dfn{symamd} functions. + +@table @asis +@item Authors +The authors of the code itself are Stefan I. Larimore and Timothy A. +Davis (davis@@cise.ufl.edu), University of Florida. The algorithm was +developed in collaboration with John Gilbert, Xerox PARC, and Esmond +Ng, Oak Ridge National Laboratory. + +@item License +Copyright @copyright{} 1998-2003 by the University of Florida. +All Rights Reserved. + +THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY +EXPRESSED OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + +Permission is hereby granted to use, copy, modify, and/or distribute +this program, provided that the Copyright, this License, and the +Availability of the original version is retained on all copies and made +accessible to the end-user of any code or package that includes COLAMD +or any modified version of COLAMD. + +@item Availability +@url{http://www.cise.ufl.edu/research/sparse/colamd/} +@end table + +@item UMFPACK +is used in various places with the sparse types, including the +LU decomposition and solvers. + +@table @asis +@item License +UMFPACK Version 4.3 (Jan. 16, 2004), Copyright @copyright{} 2004 by +Timothy A. Davis. All Rights Reserved. + +Your use or distribution of UMFPACK or any modified version of +UMFPACK implies that you agree to this License. + +THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY +EXPRESSED OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + +Permission is hereby granted to use or copy this program, 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 UMFPACK or any modified version of UMFPACK 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. This +software was developed with support from the National Science Foundation, +and is provided to you free of charge. + +@item Availability +@url{http://www.cise.ufl.edu/research/sparse/umfpack/} +@end table +@end table + +@node Function Reference, , License, Sparse Matrices +@section Function Reference + +@iftex +@subsection Functions by Category +@subsubsection Generate sparse matrix +@table @asis +@item spdiags +A generalization of the function `spdiag'. +@item speye +Returns a sparse identity matrix. +@item sprand +Generate a random sparse matrix. +@item sprandn +Generate a random sparse matrix. +@item sprandsym +@emph{Not implemented} +@end table +@subsubsection Sparse matrix conversion +@table @asis +@item full +returns a full storage matrix from a sparse one See also: sparse +@item sparse +SPARSE: create a sparse matrix +@item spconvert +This function converts for a simple sparse matrix format easily produced by other programs into Octave's internal sparse format. +@item spfind +SPFIND: a sparse version of the find operator 1. +@end table +@subsubsection Manipulate sparse matrices +@table @asis +@item issparse +Return 1 if the value of the expression EXPR is a sparse matrix. +@item nnz +returns number of non zero elements in SM See also: sparse +@item nonzeros +Returns a vector of the non-zero values of the sparse matrix S +@item nzmax +Returns the amount of storage allocated to the sparse matrix SM. +@item spalloc +Returns an empty sparse matrix of size R-by-C. +@item spfun +Compute `f(X)' for the non-zero values of X This results in a sparse matrix with the same structure as X. +@item spones +Replace the non-zero entries of X with ones. +@item spy +Plot the sparsity pattern of the sparse matrix X +@end table +@subsubsection Graph Theory +@table @asis +@item etree +Returns the elimination tree for the matrix S. +@item etreeplot +@emph{Not implemented} +@item gplot +@emph{Not implemented} +@item treelayout +@emph{Not implemented} +@item treeplot +@emph{Not implemented} +@end table +@subsubsection Sparse matrix reordering +@table @asis +@item colamd +Column approximate minimum degree permutation. +@item colperm +Returns the column permutations such that the columns of `S (:, P)' are ordered in terms of increase number of non-zero elements. +@item dmperm +Perfrom a Deulmage-Mendelsohn permutation on the sparse matrix S. +@item symamd +For a symmetric positive definite matrix S, returns the permutation vector p such that `S (P, P)' tends to have a sparser Cholesky factor than S. +@item symrcm +Returns the Reverse Cuthill McKee reordering of the sparse matrix S. +@end table +@subsubsection Linear algebra +@table @asis +@item cholinc +@emph{Not implemented} +@item condest +@emph{Not implemented} +@item eigs +@emph{Not implemented} +@item normest +@emph{Not implemented} +@item spdet +Compute the determinant of sparse matrix A using UMFPACK. +@item spinv +Compute the inverse of the square matrix A. +@item splu +Compute the LU decomposition of the sparse matrix A, using subroutines from UMFPACK. +@item sprank +@emph{Not implemented} +@item svds +@emph{Not implemented} +@end table +@subsubsection Iterative techniques +@table @asis +@item bicg +@emph{Not implemented} +@item bicgstab +@emph{Not implemented} +@item cgs +@emph{Not implemented} +@item gmres +@emph{Not implemented} +@item lsqr +@emph{Not implemented} +@item minres +@emph{Not implemented} +@item pcg +@emph{Not implemented} +@item pcr +@emph{Not implemented} +@item qmr +@emph{Not implemented} +@item symmlq +@emph{Not implemented} +@end table +@subsubsection Miscellaneous +@table @asis +@item spaugment +@emph{Not implemented} +@item spparms +Sets or displays the parameters used by the sparse solvers and factorization functions. +@item symbfact +Performs a symbolic factorization analysis on the sparse matrix S. +@item spstats +Return the stats for the non-zero elements of the sparse matrix S COUNT is the number of non-zeros in each column, MEAN is the mean of the non-zeros in each column, and VAR is the variance of the non-zeros in each column +@item spprod +Product of elements along dimension DIM. +@item spcumprod +Cumulative product of elements along dimension DIM. +@item spcumsum +Cumulative sum of elements along dimension DIM. +@item spsum +Sum of elements along dimension DIM. +@item spsumsq +Sum of squares of elements along dimension DIM. +@item spmin +For a vector argument, return the minimum value. +@item spmax +For a vector argument, return the maximum value. +@item spatan2 +Compute atan (Y / X) for corresponding sparse matrix elements of Y and X. +@item spdiag +Return a diagonal matrix with the sparse vector V on diagonal K. +@item spreshape +Return a sparse matrix with M rows and N columns whose elements are taken from the sparse matrix A. +@end table + +@subsection Functions Alphabetically +@end iftex + +@menu +* colamd:: Column approximate minimum degree permutation. +* colperm:: Returns the column permutations such that the columns of `S + (:, P)' are ordered in terms of increase number of non-zero + elements. +* dmperm:: Perfrom a Deulmage-Mendelsohn permutation on the sparse + matrix S. +* etree:: Returns the elimination tree for the matrix S. +* full:: returns a full storage matrix from a sparse one See also: + sparse +* issparse:: Return 1 if the value of the expression EXPR is a sparse + matrix. +* nnz:: returns number of non zero elements in SM See also: sparse +* nonzeros:: Returns a vector of the non-zero values of the sparse + matrix S +* nzmax:: Returns the amount of storage allocated to the sparse + matrix SM. +* spalloc:: Returns an empty sparse matrix of size R-by-C. +* sparse:: SPARSE: create a sparse matrix +* spatan2:: Compute atan (Y / X) for corresponding sparse matrix + elements of Y and X. +* spconvert:: This function converts for a simple sparse matrix format + easily produced by other programs into Octave's internal + sparse format. +* spcumprod:: Cumulative product of elements along dimension DIM. +* spcumsum:: Cumulative sum of elements along dimension DIM. +* spdet:: Compute the determinant of sparse matrix A using UMFPACK. +* spdiag:: Return a diagonal matrix with the sparse vector V on + diagonal K. +* spdiags:: A generalization of the function `spdiag'. +* speye:: Returns a sparse identity matrix. +* spfind:: SPFIND: a sparse version of the find operator 1. +* spfun:: Compute `f(X)' for the non-zero values of X This results in + a sparse matrix with the same structure as X. +* spinv:: Compute the inverse of the square matrix A. +* splu:: Compute the LU decomposition of the sparse matrix A, using + subroutines from UMFPACK. +* spmax:: For a vector argument, return the maximum value. +* spmin:: For a vector argument, return the minimum value. +* spones:: Replace the non-zero entries of X with ones. +* spparms:: Sets or displays the parameters used by the sparse solvers + and factorization functions. +* spprod:: Product of elements along dimension DIM. +* sprand:: Generate a random sparse matrix. +* sprandn:: Generate a random sparse matrix. +* spreshape:: Return a sparse matrix with M rows and N columns whose + elements are taken from the sparse matrix A. +* spstats:: Return the stats for the non-zero elements of the sparse + matrix S COUNT is the number of non-zeros in each column, + MEAN is the mean of the non-zeros in each column, and VAR + is the variance of the non-zeros in each column +* spsum:: Sum of elements along dimension DIM. +* spsumsq:: Sum of squares of elements along dimension DIM. +* spy:: Plot the sparsity pattern of the sparse matrix X +* symamd:: For a symmetric positive definite matrix S, returns the + permutation vector p such that `S (P, P)' tends to have a + sparser Cholesky factor than S. +* symbfact:: Performs a symbolic factorization analysis on the sparse + matrix S. +* symrcm:: Returns the Reverse Cuthill McKee reordering of the sparse + matrix S. +@end menu + +@node colamd, colperm, , Function Reference +@subsubsection colamd + +@DOCSTRING(colamd) + +@node colperm, dmperm, colamd, Function Reference +@subsubsection colperm + +@DOCSTRING(colperm) + +@node dmperm, etree, colperm, Function Reference +@subsubsection dmperm + +@DOCSTRING(dmperm) + +@node etree, full, dmperm, Function Reference +@subsubsection etree + +@DOCSTRING(etree) + +@node full, issparse, etree, Function Reference +@subsubsection full + +@DOCSTRING(full) + +@node issparse, nnz, full, Function Reference +@subsubsection issparse + +@DOCSTRING(issparse) + +@node nnz, nonzeros, issparse, Function Reference +@subsubsection nnz + +@DOCSTRING(nnz) + +@node nonzeros, nzmax, nnz, Function Reference +@subsubsection nonzeros + +@DOCSTRING(nonzeros) + +@node nzmax, spalloc, nonzeros, Function Reference +@subsubsection nzmax + +@DOCSTRING(nzmax) + +@node spalloc, sparse, nzmax, Function Reference +@subsubsection spalloc + +@DOCSTRING(spalloc) + +@node sparse, spatan2, spalloc, Function Reference +@subsubsection sparse + +@DOCSTRING(sparse) + +@node spatan2, spconvert, sparse, Function Reference +@subsubsection spatan2 + +@DOCSTRING(spatan2) + +@node spconvert, spcumprod, spatan2, Function Reference +@subsubsection spconvert + +@DOCSTRING(spconvert) + +@node spcumprod, spcumsum, spconvert, Function Reference +@subsubsection spcumprod + +@DOCSTRING(spcumprod) + +@node spcumsum, spdet, spcumprod, Function Reference +@subsubsection spcumsum + +@DOCSTRING(spcumsum) + +@node spdet, spdiag, spcumsum, Function Reference +@subsubsection spdet + +@DOCSTRING(spdet) + +@node spdiag, spdiags, spdet, Function Reference +@subsubsection spdiag + +@DOCSTRING(spdiag) + +@node spdiags, speye, spdiag, Function Reference +@subsubsection spdiags + +@DOCSTRING(spdiags) + +@node speye, spfind, spdiags, Function Reference +@subsubsection speye + +@DOCSTRING(speye) + +@node spfind, spfun, speye, Function Reference +@subsubsection spfind + +@DOCSTRING(spfind) + +@node spfun, spinv, spfind, Function Reference +@subsubsection spfun + +@DOCSTRING(spfun) + +@node spinv, splu, spfun, Function Reference +@subsubsection spinv + +@DOCSTRING(spinv) + +@node splu, spmax, spinv, Function Reference +@subsubsection splu + +@DOCSTRING(splu) + +@node spmax, spmin, splu, Function Reference +@subsubsection spmax + +@DOCSTRING(spmax) + +@node spmin, spones, spmax, Function Reference +@subsubsection spmin + +@DOCSTRING(spmin) + +@node spones, spparms, spmin, Function Reference +@subsubsection spones + +@DOCSTRING(spones) + +@node spparms, spprod, spones, Function Reference +@subsubsection spparms + +@DOCSTRING(spparms) + +@node spprod, sprand, spparms, Function Reference +@subsubsection spprod + +@DOCSTRING(spprod) + +@node sprand, sprandn, spprod, Function Reference +@subsubsection sprand + +@DOCSTRING(sprand) + +@node sprandn, spreshape, sprand, Function Reference +@subsubsection sprandn + +@DOCSTRING(sprandn) + +@node spreshape, spstats, sprandn, Function Reference +@subsubsection spreshape + +@DOCSTRING(spreshape) + +@node spstats, spsum, spreshape, Function Reference +@subsubsection spstats + +@DOCSTRING(spstats) + +@node spsum, spsumsq, spstats, Function Reference +@subsubsection spsum + +@DOCSTRING(spsum) + +@node spsumsq, spy, spsum, Function Reference +@subsubsection spsumsq + +@DOCSTRING(spsumsq) + +@node spy, symamd, spsumsq, Function Reference +@subsubsection spy + +@DOCSTRING(spy) + +@node symamd, symbfact, spy, Function Reference +@subsubsection symamd + +@DOCSTRING(symamd) + +@node symbfact, symrcm, symamd, Function Reference +@subsubsection symbfact + +@DOCSTRING(symbfact) + +@node symrcm, , symbfact, Function Reference +@subsubsection symrcm + +@DOCSTRING(symrcm) + +@c Local Variables: *** +@c Mode: texinfo *** +@c End: *** diff -r 9f3299378193 -r 57077d0ddc8e libcruft/ChangeLog --- a/libcruft/ChangeLog Fri Feb 25 17:42:55 2005 +0000 +++ b/libcruft/ChangeLog Fri Feb 25 19:55:28 2005 +0000 @@ -1,3 +1,29 @@ +2005-02-25 John W. Eaton + + * blas/zher.f: New file. + + Sparse merge. + + 2005-01-13 David Bateman + + * lapack/dgttrf.f lapack/dgttrs.f lapacl/zgttrf.f lapack/zgttrs.f: + new files + + 2005-01-23 David Bateman + + * lapack/dgtsv.f lapack/dpbcon.f lapack/dpbtf2.f lapack/dpbtrf.f + lapack/dpbtrs.f lapack/dptsv.f lapack/dpttrf.f lapack/dpttrs.f + lapack/dptts2.f lapack/zgtsv.f lapack/zpbcon.f lapack/zpbtf2.f + lapack/zpbtrf.f lapack/zpbtrs.f lapack/zptsv.f lapack/zpttrf.f + lapack/zpttrs.f lapck/zptts2.f: New files. + + 2004-12-29 John W. Eaton + + * blas/zbtsv.f: New file. + * lapack/dgbcon.f, lapack/dgbtrf.f, lapack/dgbtrs.f, + lapack/dlatbs.f, lapack/zgbcon.f, lapack/zgbtf2.f, + lapack/zgbtrf.f, lapack/zgbtrs.f, lapack/zlatbs.f: New files. + 2005-02-10 John W. Eaton * misc/cquit.c (octave_signal_caught): New global variable. diff -r 9f3299378193 -r 57077d0ddc8e libcruft/blas/zher.f --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libcruft/blas/zher.f Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,212 @@ + SUBROUTINE ZHER ( UPLO, N, ALPHA, X, INCX, A, LDA ) +* .. Scalar Arguments .. + DOUBLE PRECISION ALPHA + INTEGER INCX, LDA, N + CHARACTER*1 UPLO +* .. Array Arguments .. + COMPLEX*16 A( LDA, * ), X( * ) +* .. +* +* Purpose +* ======= +* +* ZHER performs the hermitian rank 1 operation +* +* A := alpha*x*conjg( x' ) + A, +* +* where alpha is a real scalar, x is an n element vector and A is an +* n by n hermitian matrix. +* +* Parameters +* ========== +* +* UPLO - CHARACTER*1. +* On entry, UPLO specifies whether the upper or lower +* triangular part of the array A is to be referenced as +* follows: +* +* UPLO = 'U' or 'u' Only the upper triangular part of A +* is to be referenced. +* +* UPLO = 'L' or 'l' Only the lower triangular part of A +* is to be referenced. +* +* Unchanged on exit. +* +* N - INTEGER. +* On entry, N specifies the order of the matrix A. +* N must be at least zero. +* Unchanged on exit. +* +* ALPHA - DOUBLE PRECISION. +* On entry, ALPHA specifies the scalar alpha. +* Unchanged on exit. +* +* X - COMPLEX*16 array of dimension at least +* ( 1 + ( n - 1 )*abs( INCX ) ). +* Before entry, the incremented array X must contain the n +* element vector x. +* Unchanged on exit. +* +* INCX - INTEGER. +* On entry, INCX specifies the increment for the elements of +* X. INCX must not be zero. +* Unchanged on exit. +* +* A - COMPLEX*16 array of DIMENSION ( LDA, n ). +* Before entry with UPLO = 'U' or 'u', the leading n by n +* upper triangular part of the array A must contain the upper +* triangular part of the hermitian matrix and the strictly +* lower triangular part of A is not referenced. On exit, the +* upper triangular part of the array A is overwritten by the +* upper triangular part of the updated matrix. +* Before entry with UPLO = 'L' or 'l', the leading n by n +* lower triangular part of the array A must contain the lower +* triangular part of the hermitian matrix and the strictly +* upper triangular part of A is not referenced. On exit, the +* lower triangular part of the array A is overwritten by the +* lower triangular part of the updated matrix. +* Note that the imaginary parts of the diagonal elements need +* not be set, they are assumed to be zero, and on exit they +* are set to zero. +* +* LDA - INTEGER. +* On entry, LDA specifies the first dimension of A as declared +* in the calling (sub) program. LDA must be at least +* max( 1, n ). +* Unchanged on exit. +* +* +* Level 2 Blas routine. +* +* -- Written on 22-October-1986. +* Jack Dongarra, Argonne National Lab. +* Jeremy Du Croz, Nag Central Office. +* Sven Hammarling, Nag Central Office. +* Richard Hanson, Sandia National Labs. +* +* +* .. Parameters .. + COMPLEX*16 ZERO + PARAMETER ( ZERO = ( 0.0D+0, 0.0D+0 ) ) +* .. Local Scalars .. + COMPLEX*16 TEMP + INTEGER I, INFO, IX, J, JX, KX +* .. External Functions .. + LOGICAL LSAME + EXTERNAL LSAME +* .. External Subroutines .. + EXTERNAL XERBLA +* .. Intrinsic Functions .. + INTRINSIC DCONJG, MAX, DBLE +* .. +* .. Executable Statements .. +* +* Test the input parameters. +* + INFO = 0 + IF ( .NOT.LSAME( UPLO, 'U' ).AND. + $ .NOT.LSAME( UPLO, 'L' ) )THEN + INFO = 1 + ELSE IF( N.LT.0 )THEN + INFO = 2 + ELSE IF( INCX.EQ.0 )THEN + INFO = 5 + ELSE IF( LDA.LT.MAX( 1, N ) )THEN + INFO = 7 + END IF + IF( INFO.NE.0 )THEN + CALL XERBLA( 'ZHER ', INFO ) + RETURN + END IF +* +* Quick return if possible. +* + IF( ( N.EQ.0 ).OR.( ALPHA.EQ.DBLE( ZERO ) ) ) + $ RETURN +* +* Set the start point in X if the increment is not unity. +* + IF( INCX.LE.0 )THEN + KX = 1 - ( N - 1 )*INCX + ELSE IF( INCX.NE.1 )THEN + KX = 1 + END IF +* +* Start the operations. In this version the elements of A are +* accessed sequentially with one pass through the triangular part +* of A. +* + IF( LSAME( UPLO, 'U' ) )THEN +* +* Form A when A is stored in upper triangle. +* + IF( INCX.EQ.1 )THEN + DO 20, J = 1, N + IF( X( J ).NE.ZERO )THEN + TEMP = ALPHA*DCONJG( X( J ) ) + DO 10, I = 1, J - 1 + A( I, J ) = A( I, J ) + X( I )*TEMP + 10 CONTINUE + A( J, J ) = DBLE( A( J, J ) ) + DBLE( X( J )*TEMP ) + ELSE + A( J, J ) = DBLE( A( J, J ) ) + END IF + 20 CONTINUE + ELSE + JX = KX + DO 40, J = 1, N + IF( X( JX ).NE.ZERO )THEN + TEMP = ALPHA*DCONJG( X( JX ) ) + IX = KX + DO 30, I = 1, J - 1 + A( I, J ) = A( I, J ) + X( IX )*TEMP + IX = IX + INCX + 30 CONTINUE + A( J, J ) = DBLE( A( J, J ) ) + DBLE( X( JX )*TEMP ) + ELSE + A( J, J ) = DBLE( A( J, J ) ) + END IF + JX = JX + INCX + 40 CONTINUE + END IF + ELSE +* +* Form A when A is stored in lower triangle. +* + IF( INCX.EQ.1 )THEN + DO 60, J = 1, N + IF( X( J ).NE.ZERO )THEN + TEMP = ALPHA*DCONJG( X( J ) ) + A( J, J ) = DBLE( A( J, J ) ) + DBLE( TEMP*X( J ) ) + DO 50, I = J + 1, N + A( I, J ) = A( I, J ) + X( I )*TEMP + 50 CONTINUE + ELSE + A( J, J ) = DBLE( A( J, J ) ) + END IF + 60 CONTINUE + ELSE + JX = KX + DO 80, J = 1, N + IF( X( JX ).NE.ZERO )THEN + TEMP = ALPHA*DCONJG( X( JX ) ) + A( J, J ) = DBLE( A( J, J ) ) + DBLE( TEMP*X( JX ) ) + IX = JX + DO 70, I = J + 1, N + IX = IX + INCX + A( I, J ) = A( I, J ) + X( IX )*TEMP + 70 CONTINUE + ELSE + A( J, J ) = DBLE( A( J, J ) ) + END IF + JX = JX + INCX + 80 CONTINUE + END IF + END IF +* + RETURN +* +* End of ZHER . +* + END diff -r 9f3299378193 -r 57077d0ddc8e libcruft/blas/ztbsv.f --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libcruft/blas/ztbsv.f Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,381 @@ + SUBROUTINE ZTBSV ( UPLO, TRANS, DIAG, N, K, A, LDA, X, INCX ) +* .. Scalar Arguments .. + INTEGER INCX, K, LDA, N + CHARACTER*1 DIAG, TRANS, UPLO +* .. Array Arguments .. + COMPLEX*16 A( LDA, * ), X( * ) +* .. +* +* Purpose +* ======= +* +* ZTBSV solves one of the systems of equations +* +* A*x = b, or A'*x = b, or conjg( A' )*x = b, +* +* where b and x are n element vectors and A is an n by n unit, or +* non-unit, upper or lower triangular band matrix, with ( k + 1 ) +* diagonals. +* +* No test for singularity or near-singularity is included in this +* routine. Such tests must be performed before calling this routine. +* +* Parameters +* ========== +* +* UPLO - CHARACTER*1. +* On entry, UPLO specifies whether the matrix is an upper or +* lower triangular matrix as follows: +* +* UPLO = 'U' or 'u' A is an upper triangular matrix. +* +* UPLO = 'L' or 'l' A is a lower triangular matrix. +* +* Unchanged on exit. +* +* TRANS - CHARACTER*1. +* On entry, TRANS specifies the equations to be solved as +* follows: +* +* TRANS = 'N' or 'n' A*x = b. +* +* TRANS = 'T' or 't' A'*x = b. +* +* TRANS = 'C' or 'c' conjg( A' )*x = b. +* +* Unchanged on exit. +* +* DIAG - CHARACTER*1. +* On entry, DIAG specifies whether or not A is unit +* triangular as follows: +* +* DIAG = 'U' or 'u' A is assumed to be unit triangular. +* +* DIAG = 'N' or 'n' A is not assumed to be unit +* triangular. +* +* Unchanged on exit. +* +* N - INTEGER. +* On entry, N specifies the order of the matrix A. +* N must be at least zero. +* Unchanged on exit. +* +* K - INTEGER. +* On entry with UPLO = 'U' or 'u', K specifies the number of +* super-diagonals of the matrix A. +* On entry with UPLO = 'L' or 'l', K specifies the number of +* sub-diagonals of the matrix A. +* K must satisfy 0 .le. K. +* Unchanged on exit. +* +* A - COMPLEX*16 array of DIMENSION ( LDA, n ). +* Before entry with UPLO = 'U' or 'u', the leading ( k + 1 ) +* by n part of the array A must contain the upper triangular +* band part of the matrix of coefficients, supplied column by +* column, with the leading diagonal of the matrix in row +* ( k + 1 ) of the array, the first super-diagonal starting at +* position 2 in row k, and so on. The top left k by k triangle +* of the array A is not referenced. +* The following program segment will transfer an upper +* triangular band matrix from conventional full matrix storage +* to band storage: +* +* DO 20, J = 1, N +* M = K + 1 - J +* DO 10, I = MAX( 1, J - K ), J +* A( M + I, J ) = matrix( I, J ) +* 10 CONTINUE +* 20 CONTINUE +* +* Before entry with UPLO = 'L' or 'l', the leading ( k + 1 ) +* by n part of the array A must contain the lower triangular +* band part of the matrix of coefficients, supplied column by +* column, with the leading diagonal of the matrix in row 1 of +* the array, the first sub-diagonal starting at position 1 in +* row 2, and so on. The bottom right k by k triangle of the +* array A is not referenced. +* The following program segment will transfer a lower +* triangular band matrix from conventional full matrix storage +* to band storage: +* +* DO 20, J = 1, N +* M = 1 - J +* DO 10, I = J, MIN( N, J + K ) +* A( M + I, J ) = matrix( I, J ) +* 10 CONTINUE +* 20 CONTINUE +* +* Note that when DIAG = 'U' or 'u' the elements of the array A +* corresponding to the diagonal elements of the matrix are not +* referenced, but are assumed to be unity. +* Unchanged on exit. +* +* LDA - INTEGER. +* On entry, LDA specifies the first dimension of A as declared +* in the calling (sub) program. LDA must be at least +* ( k + 1 ). +* Unchanged on exit. +* +* X - COMPLEX*16 array of dimension at least +* ( 1 + ( n - 1 )*abs( INCX ) ). +* Before entry, the incremented array X must contain the n +* element right-hand side vector b. On exit, X is overwritten +* with the solution vector x. +* +* INCX - INTEGER. +* On entry, INCX specifies the increment for the elements of +* X. INCX must not be zero. +* Unchanged on exit. +* +* +* Level 2 Blas routine. +* +* -- Written on 22-October-1986. +* Jack Dongarra, Argonne National Lab. +* Jeremy Du Croz, Nag Central Office. +* Sven Hammarling, Nag Central Office. +* Richard Hanson, Sandia National Labs. +* +* +* .. Parameters .. + COMPLEX*16 ZERO + PARAMETER ( ZERO = ( 0.0D+0, 0.0D+0 ) ) +* .. Local Scalars .. + COMPLEX*16 TEMP + INTEGER I, INFO, IX, J, JX, KPLUS1, KX, L + LOGICAL NOCONJ, NOUNIT +* .. External Functions .. + LOGICAL LSAME + EXTERNAL LSAME +* .. External Subroutines .. + EXTERNAL XERBLA +* .. Intrinsic Functions .. + INTRINSIC DCONJG, MAX, MIN +* .. +* .. Executable Statements .. +* +* Test the input parameters. +* + INFO = 0 + IF ( .NOT.LSAME( UPLO , 'U' ).AND. + $ .NOT.LSAME( UPLO , 'L' ) )THEN + INFO = 1 + ELSE IF( .NOT.LSAME( TRANS, 'N' ).AND. + $ .NOT.LSAME( TRANS, 'T' ).AND. + $ .NOT.LSAME( TRANS, 'C' ) )THEN + INFO = 2 + ELSE IF( .NOT.LSAME( DIAG , 'U' ).AND. + $ .NOT.LSAME( DIAG , 'N' ) )THEN + INFO = 3 + ELSE IF( N.LT.0 )THEN + INFO = 4 + ELSE IF( K.LT.0 )THEN + INFO = 5 + ELSE IF( LDA.LT.( K + 1 ) )THEN + INFO = 7 + ELSE IF( INCX.EQ.0 )THEN + INFO = 9 + END IF + IF( INFO.NE.0 )THEN + CALL XERBLA( 'ZTBSV ', INFO ) + RETURN + END IF +* +* Quick return if possible. +* + IF( N.EQ.0 ) + $ RETURN +* + NOCONJ = LSAME( TRANS, 'T' ) + NOUNIT = LSAME( DIAG , 'N' ) +* +* Set up the start point in X if the increment is not unity. This +* will be ( N - 1 )*INCX too small for descending loops. +* + IF( INCX.LE.0 )THEN + KX = 1 - ( N - 1 )*INCX + ELSE IF( INCX.NE.1 )THEN + KX = 1 + END IF +* +* Start the operations. In this version the elements of A are +* accessed by sequentially with one pass through A. +* + IF( LSAME( TRANS, 'N' ) )THEN +* +* Form x := inv( A )*x. +* + IF( LSAME( UPLO, 'U' ) )THEN + KPLUS1 = K + 1 + IF( INCX.EQ.1 )THEN + DO 20, J = N, 1, -1 + IF( X( J ).NE.ZERO )THEN + L = KPLUS1 - J + IF( NOUNIT ) + $ X( J ) = X( J )/A( KPLUS1, J ) + TEMP = X( J ) + DO 10, I = J - 1, MAX( 1, J - K ), -1 + X( I ) = X( I ) - TEMP*A( L + I, J ) + 10 CONTINUE + END IF + 20 CONTINUE + ELSE + KX = KX + ( N - 1 )*INCX + JX = KX + DO 40, J = N, 1, -1 + KX = KX - INCX + IF( X( JX ).NE.ZERO )THEN + IX = KX + L = KPLUS1 - J + IF( NOUNIT ) + $ X( JX ) = X( JX )/A( KPLUS1, J ) + TEMP = X( JX ) + DO 30, I = J - 1, MAX( 1, J - K ), -1 + X( IX ) = X( IX ) - TEMP*A( L + I, J ) + IX = IX - INCX + 30 CONTINUE + END IF + JX = JX - INCX + 40 CONTINUE + END IF + ELSE + IF( INCX.EQ.1 )THEN + DO 60, J = 1, N + IF( X( J ).NE.ZERO )THEN + L = 1 - J + IF( NOUNIT ) + $ X( J ) = X( J )/A( 1, J ) + TEMP = X( J ) + DO 50, I = J + 1, MIN( N, J + K ) + X( I ) = X( I ) - TEMP*A( L + I, J ) + 50 CONTINUE + END IF + 60 CONTINUE + ELSE + JX = KX + DO 80, J = 1, N + KX = KX + INCX + IF( X( JX ).NE.ZERO )THEN + IX = KX + L = 1 - J + IF( NOUNIT ) + $ X( JX ) = X( JX )/A( 1, J ) + TEMP = X( JX ) + DO 70, I = J + 1, MIN( N, J + K ) + X( IX ) = X( IX ) - TEMP*A( L + I, J ) + IX = IX + INCX + 70 CONTINUE + END IF + JX = JX + INCX + 80 CONTINUE + END IF + END IF + ELSE +* +* Form x := inv( A' )*x or x := inv( conjg( A') )*x. +* + IF( LSAME( UPLO, 'U' ) )THEN + KPLUS1 = K + 1 + IF( INCX.EQ.1 )THEN + DO 110, J = 1, N + TEMP = X( J ) + L = KPLUS1 - J + IF( NOCONJ )THEN + DO 90, I = MAX( 1, J - K ), J - 1 + TEMP = TEMP - A( L + I, J )*X( I ) + 90 CONTINUE + IF( NOUNIT ) + $ TEMP = TEMP/A( KPLUS1, J ) + ELSE + DO 100, I = MAX( 1, J - K ), J - 1 + TEMP = TEMP - DCONJG( A( L + I, J ) )*X( I ) + 100 CONTINUE + IF( NOUNIT ) + $ TEMP = TEMP/DCONJG( A( KPLUS1, J ) ) + END IF + X( J ) = TEMP + 110 CONTINUE + ELSE + JX = KX + DO 140, J = 1, N + TEMP = X( JX ) + IX = KX + L = KPLUS1 - J + IF( NOCONJ )THEN + DO 120, I = MAX( 1, J - K ), J - 1 + TEMP = TEMP - A( L + I, J )*X( IX ) + IX = IX + INCX + 120 CONTINUE + IF( NOUNIT ) + $ TEMP = TEMP/A( KPLUS1, J ) + ELSE + DO 130, I = MAX( 1, J - K ), J - 1 + TEMP = TEMP - DCONJG( A( L + I, J ) )*X( IX ) + IX = IX + INCX + 130 CONTINUE + IF( NOUNIT ) + $ TEMP = TEMP/DCONJG( A( KPLUS1, J ) ) + END IF + X( JX ) = TEMP + JX = JX + INCX + IF( J.GT.K ) + $ KX = KX + INCX + 140 CONTINUE + END IF + ELSE + IF( INCX.EQ.1 )THEN + DO 170, J = N, 1, -1 + TEMP = X( J ) + L = 1 - J + IF( NOCONJ )THEN + DO 150, I = MIN( N, J + K ), J + 1, -1 + TEMP = TEMP - A( L + I, J )*X( I ) + 150 CONTINUE + IF( NOUNIT ) + $ TEMP = TEMP/A( 1, J ) + ELSE + DO 160, I = MIN( N, J + K ), J + 1, -1 + TEMP = TEMP - DCONJG( A( L + I, J ) )*X( I ) + 160 CONTINUE + IF( NOUNIT ) + $ TEMP = TEMP/DCONJG( A( 1, J ) ) + END IF + X( J ) = TEMP + 170 CONTINUE + ELSE + KX = KX + ( N - 1 )*INCX + JX = KX + DO 200, J = N, 1, -1 + TEMP = X( JX ) + IX = KX + L = 1 - J + IF( NOCONJ )THEN + DO 180, I = MIN( N, J + K ), J + 1, -1 + TEMP = TEMP - A( L + I, J )*X( IX ) + IX = IX - INCX + 180 CONTINUE + IF( NOUNIT ) + $ TEMP = TEMP/A( 1, J ) + ELSE + DO 190, I = MIN( N, J + K ), J + 1, -1 + TEMP = TEMP - DCONJG( A( L + I, J ) )*X( IX ) + IX = IX - INCX + 190 CONTINUE + IF( NOUNIT ) + $ TEMP = TEMP/DCONJG( A( 1, J ) ) + END IF + X( JX ) = TEMP + JX = JX - INCX + IF( ( N - J ).GE.K ) + $ KX = KX - INCX + 200 CONTINUE + END IF + END IF + END IF +* + RETURN +* +* End of ZTBSV . +* + END diff -r 9f3299378193 -r 57077d0ddc8e libcruft/lapack/dgbcon.f --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libcruft/lapack/dgbcon.f Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,222 @@ + SUBROUTINE DGBCON( NORM, N, KL, KU, AB, LDAB, IPIV, ANORM, RCOND, + $ WORK, IWORK, INFO ) +* +* -- LAPACK routine (version 3.0) -- +* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., +* Courant Institute, Argonne National Lab, and Rice University +* September 30, 1994 +* +* .. Scalar Arguments .. + CHARACTER NORM + INTEGER INFO, KL, KU, LDAB, N + DOUBLE PRECISION ANORM, RCOND +* .. +* .. Array Arguments .. + INTEGER IPIV( * ), IWORK( * ) + DOUBLE PRECISION AB( LDAB, * ), WORK( * ) +* .. +* +* Purpose +* ======= +* +* DGBCON estimates the reciprocal of the condition number of a real +* general band matrix A, in either the 1-norm or the infinity-norm, +* using the LU factorization computed by DGBTRF. +* +* An estimate is obtained for norm(inv(A)), and the reciprocal of the +* condition number is computed as +* RCOND = 1 / ( norm(A) * norm(inv(A)) ). +* +* Arguments +* ========= +* +* NORM (input) CHARACTER*1 +* Specifies whether the 1-norm condition number or the +* infinity-norm condition number is required: +* = '1' or 'O': 1-norm; +* = 'I': Infinity-norm. +* +* N (input) INTEGER +* The order of the matrix A. N >= 0. +* +* KL (input) INTEGER +* The number of subdiagonals within the band of A. KL >= 0. +* +* KU (input) INTEGER +* The number of superdiagonals within the band of A. KU >= 0. +* +* AB (input) DOUBLE PRECISION array, dimension (LDAB,N) +* Details of the LU factorization of the band matrix A, as +* computed by DGBTRF. U is stored as an upper triangular band +* matrix with KL+KU superdiagonals in rows 1 to KL+KU+1, and +* the multipliers used during the factorization are stored in +* rows KL+KU+2 to 2*KL+KU+1. +* +* LDAB (input) INTEGER +* The leading dimension of the array AB. LDAB >= 2*KL+KU+1. +* +* IPIV (input) INTEGER array, dimension (N) +* The pivot indices; for 1 <= i <= N, row i of the matrix was +* interchanged with row IPIV(i). +* +* ANORM (input) DOUBLE PRECISION +* If NORM = '1' or 'O', the 1-norm of the original matrix A. +* If NORM = 'I', the infinity-norm of the original matrix A. +* +* RCOND (output) DOUBLE PRECISION +* The reciprocal of the condition number of the matrix A, +* computed as RCOND = 1/(norm(A) * norm(inv(A))). +* +* WORK (workspace) DOUBLE PRECISION array, dimension (3*N) +* +* IWORK (workspace) INTEGER array, dimension (N) +* +* INFO (output) INTEGER +* = 0: successful exit +* < 0: if INFO = -i, the i-th argument had an illegal value +* +* ===================================================================== +* +* .. Parameters .. + DOUBLE PRECISION ONE, ZERO + PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) +* .. +* .. Local Scalars .. + LOGICAL LNOTI, ONENRM + CHARACTER NORMIN + INTEGER IX, J, JP, KASE, KASE1, KD, LM + DOUBLE PRECISION AINVNM, SCALE, SMLNUM, T +* .. +* .. External Functions .. + LOGICAL LSAME + INTEGER IDAMAX + DOUBLE PRECISION DDOT, DLAMCH + EXTERNAL LSAME, IDAMAX, DDOT, DLAMCH +* .. +* .. External Subroutines .. + EXTERNAL DAXPY, DLACON, DLATBS, DRSCL, XERBLA +* .. +* .. Intrinsic Functions .. + INTRINSIC ABS, MIN +* .. +* .. Executable Statements .. +* +* Test the input parameters. +* + INFO = 0 + ONENRM = NORM.EQ.'1' .OR. LSAME( NORM, 'O' ) + IF( .NOT.ONENRM .AND. .NOT.LSAME( NORM, 'I' ) ) THEN + INFO = -1 + ELSE IF( N.LT.0 ) THEN + INFO = -2 + ELSE IF( KL.LT.0 ) THEN + INFO = -3 + ELSE IF( KU.LT.0 ) THEN + INFO = -4 + ELSE IF( LDAB.LT.2*KL+KU+1 ) THEN + INFO = -6 + ELSE IF( ANORM.LT.ZERO ) THEN + INFO = -8 + END IF + IF( INFO.NE.0 ) THEN + CALL XERBLA( 'DGBCON', -INFO ) + RETURN + END IF +* +* Quick return if possible +* + RCOND = ZERO + IF( N.EQ.0 ) THEN + RCOND = ONE + RETURN + ELSE IF( ANORM.EQ.ZERO ) THEN + RETURN + END IF +* + SMLNUM = DLAMCH( 'Safe minimum' ) +* +* Estimate the norm of inv(A). +* + AINVNM = ZERO + NORMIN = 'N' + IF( ONENRM ) THEN + KASE1 = 1 + ELSE + KASE1 = 2 + END IF + KD = KL + KU + 1 + LNOTI = KL.GT.0 + KASE = 0 + 10 CONTINUE + CALL DLACON( N, WORK( N+1 ), WORK, IWORK, AINVNM, KASE ) + IF( KASE.NE.0 ) THEN + IF( KASE.EQ.KASE1 ) THEN +* +* Multiply by inv(L). +* + IF( LNOTI ) THEN + DO 20 J = 1, N - 1 + LM = MIN( KL, N-J ) + JP = IPIV( J ) + T = WORK( JP ) + IF( JP.NE.J ) THEN + WORK( JP ) = WORK( J ) + WORK( J ) = T + END IF + CALL DAXPY( LM, -T, AB( KD+1, J ), 1, WORK( J+1 ), 1 ) + 20 CONTINUE + END IF +* +* Multiply by inv(U). +* + CALL DLATBS( 'Upper', 'No transpose', 'Non-unit', NORMIN, N, + $ KL+KU, AB, LDAB, WORK, SCALE, WORK( 2*N+1 ), + $ INFO ) + ELSE +* +* Multiply by inv(U'). +* + CALL DLATBS( 'Upper', 'Transpose', 'Non-unit', NORMIN, N, + $ KL+KU, AB, LDAB, WORK, SCALE, WORK( 2*N+1 ), + $ INFO ) +* +* Multiply by inv(L'). +* + IF( LNOTI ) THEN + DO 30 J = N - 1, 1, -1 + LM = MIN( KL, N-J ) + WORK( J ) = WORK( J ) - DDOT( LM, AB( KD+1, J ), 1, + $ WORK( J+1 ), 1 ) + JP = IPIV( J ) + IF( JP.NE.J ) THEN + T = WORK( JP ) + WORK( JP ) = WORK( J ) + WORK( J ) = T + END IF + 30 CONTINUE + END IF + END IF +* +* Divide X by 1/SCALE if doing so will not cause overflow. +* + NORMIN = 'Y' + IF( SCALE.NE.ONE ) THEN + IX = IDAMAX( N, WORK, 1 ) + IF( SCALE.LT.ABS( WORK( IX ) )*SMLNUM .OR. SCALE.EQ.ZERO ) + $ GO TO 40 + CALL DRSCL( N, SCALE, WORK, 1 ) + END IF + GO TO 10 + END IF +* +* Compute the estimate of the reciprocal condition number. +* + IF( AINVNM.NE.ZERO ) + $ RCOND = ( ONE / AINVNM ) / ANORM +* + 40 CONTINUE + RETURN +* +* End of DGBCON +* + END diff -r 9f3299378193 -r 57077d0ddc8e libcruft/lapack/dgtsv.f --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libcruft/lapack/dgtsv.f Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,263 @@ + SUBROUTINE DGTSV( N, NRHS, DL, D, DU, B, LDB, INFO ) +* +* -- LAPACK routine (version 3.0) -- +* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., +* Courant Institute, Argonne National Lab, and Rice University +* October 31, 1999 +* +* .. Scalar Arguments .. + INTEGER INFO, LDB, N, NRHS +* .. +* .. Array Arguments .. + DOUBLE PRECISION B( LDB, * ), D( * ), DL( * ), DU( * ) +* .. +* +* Purpose +* ======= +* +* DGTSV solves the equation +* +* A*X = B, +* +* where A is an n by n tridiagonal matrix, by Gaussian elimination with +* partial pivoting. +* +* Note that the equation A'*X = B may be solved by interchanging the +* order of the arguments DU and DL. +* +* Arguments +* ========= +* +* N (input) INTEGER +* The order of the matrix A. N >= 0. +* +* NRHS (input) INTEGER +* The number of right hand sides, i.e., the number of columns +* of the matrix B. NRHS >= 0. +* +* DL (input/output) DOUBLE PRECISION array, dimension (N-1) +* On entry, DL must contain the (n-1) sub-diagonal elements of +* A. +* +* On exit, DL is overwritten by the (n-2) elements of the +* second super-diagonal of the upper triangular matrix U from +* the LU factorization of A, in DL(1), ..., DL(n-2). +* +* D (input/output) DOUBLE PRECISION array, dimension (N) +* On entry, D must contain the diagonal elements of A. +* +* On exit, D is overwritten by the n diagonal elements of U. +* +* DU (input/output) DOUBLE PRECISION array, dimension (N-1) +* On entry, DU must contain the (n-1) super-diagonal elements +* of A. +* +* On exit, DU is overwritten by the (n-1) elements of the first +* super-diagonal of U. +* +* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) +* On entry, the N by NRHS matrix of right hand side matrix B. +* On exit, if INFO = 0, the N by NRHS solution matrix X. +* +* LDB (input) INTEGER +* The leading dimension of the array B. LDB >= max(1,N). +* +* INFO (output) INTEGER +* = 0: successful exit +* < 0: if INFO = -i, the i-th argument had an illegal value +* > 0: if INFO = i, U(i,i) is exactly zero, and the solution +* has not been computed. The factorization has not been +* completed unless i = N. +* +* ===================================================================== +* +* .. Parameters .. + DOUBLE PRECISION ZERO + PARAMETER ( ZERO = 0.0D+0 ) +* .. +* .. Local Scalars .. + INTEGER I, J + DOUBLE PRECISION FACT, TEMP +* .. +* .. Intrinsic Functions .. + INTRINSIC ABS, MAX +* .. +* .. External Subroutines .. + EXTERNAL XERBLA +* .. +* .. Executable Statements .. +* + INFO = 0 + IF( N.LT.0 ) THEN + INFO = -1 + ELSE IF( NRHS.LT.0 ) THEN + INFO = -2 + ELSE IF( LDB.LT.MAX( 1, N ) ) THEN + INFO = -7 + END IF + IF( INFO.NE.0 ) THEN + CALL XERBLA( 'DGTSV ', -INFO ) + RETURN + END IF +* + IF( N.EQ.0 ) + $ RETURN +* + IF( NRHS.EQ.1 ) THEN + DO 10 I = 1, N - 2 + IF( ABS( D( I ) ).GE.ABS( DL( I ) ) ) THEN +* +* No row interchange required +* + IF( D( I ).NE.ZERO ) THEN + FACT = DL( I ) / D( I ) + D( I+1 ) = D( I+1 ) - FACT*DU( I ) + B( I+1, 1 ) = B( I+1, 1 ) - FACT*B( I, 1 ) + ELSE + INFO = I + RETURN + END IF + DL( I ) = ZERO + ELSE +* +* Interchange rows I and I+1 +* + FACT = D( I ) / DL( I ) + D( I ) = DL( I ) + TEMP = D( I+1 ) + D( I+1 ) = DU( I ) - FACT*TEMP + DL( I ) = DU( I+1 ) + DU( I+1 ) = -FACT*DL( I ) + DU( I ) = TEMP + TEMP = B( I, 1 ) + B( I, 1 ) = B( I+1, 1 ) + B( I+1, 1 ) = TEMP - FACT*B( I+1, 1 ) + END IF + 10 CONTINUE + IF( N.GT.1 ) THEN + I = N - 1 + IF( ABS( D( I ) ).GE.ABS( DL( I ) ) ) THEN + IF( D( I ).NE.ZERO ) THEN + FACT = DL( I ) / D( I ) + D( I+1 ) = D( I+1 ) - FACT*DU( I ) + B( I+1, 1 ) = B( I+1, 1 ) - FACT*B( I, 1 ) + ELSE + INFO = I + RETURN + END IF + ELSE + FACT = D( I ) / DL( I ) + D( I ) = DL( I ) + TEMP = D( I+1 ) + D( I+1 ) = DU( I ) - FACT*TEMP + DU( I ) = TEMP + TEMP = B( I, 1 ) + B( I, 1 ) = B( I+1, 1 ) + B( I+1, 1 ) = TEMP - FACT*B( I+1, 1 ) + END IF + END IF + IF( D( N ).EQ.ZERO ) THEN + INFO = N + RETURN + END IF + ELSE + DO 40 I = 1, N - 2 + IF( ABS( D( I ) ).GE.ABS( DL( I ) ) ) THEN +* +* No row interchange required +* + IF( D( I ).NE.ZERO ) THEN + FACT = DL( I ) / D( I ) + D( I+1 ) = D( I+1 ) - FACT*DU( I ) + DO 20 J = 1, NRHS + B( I+1, J ) = B( I+1, J ) - FACT*B( I, J ) + 20 CONTINUE + ELSE + INFO = I + RETURN + END IF + DL( I ) = ZERO + ELSE +* +* Interchange rows I and I+1 +* + FACT = D( I ) / DL( I ) + D( I ) = DL( I ) + TEMP = D( I+1 ) + D( I+1 ) = DU( I ) - FACT*TEMP + DL( I ) = DU( I+1 ) + DU( I+1 ) = -FACT*DL( I ) + DU( I ) = TEMP + DO 30 J = 1, NRHS + TEMP = B( I, J ) + B( I, J ) = B( I+1, J ) + B( I+1, J ) = TEMP - FACT*B( I+1, J ) + 30 CONTINUE + END IF + 40 CONTINUE + IF( N.GT.1 ) THEN + I = N - 1 + IF( ABS( D( I ) ).GE.ABS( DL( I ) ) ) THEN + IF( D( I ).NE.ZERO ) THEN + FACT = DL( I ) / D( I ) + D( I+1 ) = D( I+1 ) - FACT*DU( I ) + DO 50 J = 1, NRHS + B( I+1, J ) = B( I+1, J ) - FACT*B( I, J ) + 50 CONTINUE + ELSE + INFO = I + RETURN + END IF + ELSE + FACT = D( I ) / DL( I ) + D( I ) = DL( I ) + TEMP = D( I+1 ) + D( I+1 ) = DU( I ) - FACT*TEMP + DU( I ) = TEMP + DO 60 J = 1, NRHS + TEMP = B( I, J ) + B( I, J ) = B( I+1, J ) + B( I+1, J ) = TEMP - FACT*B( I+1, J ) + 60 CONTINUE + END IF + END IF + IF( D( N ).EQ.ZERO ) THEN + INFO = N + RETURN + END IF + END IF +* +* Back solve with the matrix U from the factorization. +* + IF( NRHS.LE.2 ) THEN + J = 1 + 70 CONTINUE + B( N, J ) = B( N, J ) / D( N ) + IF( N.GT.1 ) + $ B( N-1, J ) = ( B( N-1, J )-DU( N-1 )*B( N, J ) ) / D( N-1 ) + DO 80 I = N - 2, 1, -1 + B( I, J ) = ( B( I, J )-DU( I )*B( I+1, J )-DL( I )* + $ B( I+2, J ) ) / D( I ) + 80 CONTINUE + IF( J.LT.NRHS ) THEN + J = J + 1 + GO TO 70 + END IF + ELSE + DO 100 J = 1, NRHS + B( N, J ) = B( N, J ) / D( N ) + IF( N.GT.1 ) + $ B( N-1, J ) = ( B( N-1, J )-DU( N-1 )*B( N, J ) ) / + $ D( N-1 ) + DO 90 I = N - 2, 1, -1 + B( I, J ) = ( B( I, J )-DU( I )*B( I+1, J )-DL( I )* + $ B( I+2, J ) ) / D( I ) + 90 CONTINUE + 100 CONTINUE + END IF +* + RETURN +* +* End of DGTSV +* + END diff -r 9f3299378193 -r 57077d0ddc8e libcruft/lapack/dgttrf.f --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libcruft/lapack/dgttrf.f Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,149 @@ + SUBROUTINE DGTTRF( N, DL, D, DU, DU2, IPIV, INFO ) +* +* -- LAPACK routine (version 2.0) -- +* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., +* Courant Institute, Argonne National Lab, and Rice University +* September 30, 1994 +* +* .. Scalar Arguments .. + INTEGER INFO, N +* .. +* .. Array Arguments .. + INTEGER IPIV( * ) + DOUBLE PRECISION D( * ), DL( * ), DU( * ), DU2( * ) +* .. +* +* Purpose +* ======= +* +* DGTTRF computes an LU factorization of a real tridiagonal matrix A +* using elimination with partial pivoting and row interchanges. +* +* The factorization has the form +* A = L * U +* where L is a product of permutation and unit lower bidiagonal +* matrices and U is upper triangular with nonzeros in only the main +* diagonal and first two superdiagonals. +* +* Arguments +* ========= +* +* N (input) INTEGER +* The order of the matrix A. N >= 0. +* +* DL (input/output) DOUBLE PRECISION array, dimension (N-1) +* On entry, DL must contain the (n-1) subdiagonal elements of +* A. +* On exit, DL is overwritten by the (n-1) multipliers that +* define the matrix L from the LU factorization of A. +* +* D (input/output) DOUBLE PRECISION array, dimension (N) +* On entry, D must contain the diagonal elements of A. +* On exit, D is overwritten by the n diagonal elements of the +* upper triangular matrix U from the LU factorization of A. +* +* DU (input/output) DOUBLE PRECISION array, dimension (N-1) +* On entry, DU must contain the (n-1) superdiagonal elements +* of A. +* On exit, DU is overwritten by the (n-1) elements of the first +* superdiagonal of U. +* +* DU2 (output) DOUBLE PRECISION array, dimension (N-2) +* On exit, DU2 is overwritten by the (n-2) elements of the +* second superdiagonal of U. +* +* IPIV (output) INTEGER array, dimension (N) +* The pivot indices; for 1 <= i <= n, row i of the matrix was +* interchanged with row IPIV(i). IPIV(i) will always be either +* i or i+1; IPIV(i) = i indicates a row interchange was not +* required. +* +* INFO (output) INTEGER +* = 0: successful exit +* < 0: if INFO = -i, the i-th argument had an illegal value +* > 0: if INFO = i, U(i,i) is exactly zero. The factorization +* has been completed, but the factor U is exactly +* singular, and division by zero will occur if it is used +* to solve a system of equations. +* +* ===================================================================== +* +* .. Local Scalars .. + INTEGER I + DOUBLE PRECISION FACT, TEMP +* .. +* .. Intrinsic Functions .. + INTRINSIC ABS +* .. +* .. External Subroutines .. + EXTERNAL XERBLA +* .. +* .. Parameters .. + DOUBLE PRECISION ZERO + PARAMETER ( ZERO = 0.0D+0 ) +* .. +* .. Executable Statements .. +* + INFO = 0 + IF( N.LT.0 ) THEN + INFO = -1 + CALL XERBLA( 'DGTTRF', -INFO ) + RETURN + END IF +* +* Quick return if possible +* + IF( N.EQ.0 ) + $ RETURN +* +* Initialize IPIV(i) = i +* + DO 10 I = 1, N + IPIV( I ) = I + 10 CONTINUE +* + DO 20 I = 1, N - 1 + IF( DL( I ).EQ.ZERO ) THEN +* +* Subdiagonal is zero, no elimination is required. +* + IF( D( I ).EQ.ZERO .AND. INFO.EQ.0 ) + $ INFO = I + IF( I.LT.N-1 ) + $ DU2( I ) = ZERO + ELSE IF( ABS( D( I ) ).GE.ABS( DL( I ) ) ) THEN +* +* No row interchange required, eliminate DL(I) +* + FACT = DL( I ) / D( I ) + DL( I ) = FACT + D( I+1 ) = D( I+1 ) - FACT*DU( I ) + IF( I.LT.N-1 ) + $ DU2( I ) = ZERO + ELSE +* +* Interchange rows I and I+1, eliminate DL(I) +* + FACT = D( I ) / DL( I ) + D( I ) = DL( I ) + DL( I ) = FACT + TEMP = DU( I ) + DU( I ) = D( I+1 ) + D( I+1 ) = TEMP - FACT*D( I+1 ) + IF( I.LT.N-1 ) THEN + DU2( I ) = DU( I+1 ) + DU( I+1 ) = -FACT*DU( I+1 ) + END IF + IPIV( I ) = IPIV( I ) + 1 + END IF + 20 CONTINUE + IF( D( N ).EQ.ZERO .AND. INFO.EQ.0 ) THEN + INFO = N + RETURN + END IF +* + RETURN +* +* End of DGTTRF +* + END diff -r 9f3299378193 -r 57077d0ddc8e libcruft/lapack/dgttrs.f --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libcruft/lapack/dgttrs.f Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,176 @@ + SUBROUTINE DGTTRS( TRANS, N, NRHS, DL, D, DU, DU2, IPIV, B, LDB, + $ INFO ) +* +* -- LAPACK routine (version 2.0) -- +* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., +* Courant Institute, Argonne National Lab, and Rice University +* September 30, 1994 +* +* .. Scalar Arguments .. + CHARACTER TRANS + INTEGER INFO, LDB, N, NRHS +* .. +* .. Array Arguments .. + INTEGER IPIV( * ) + DOUBLE PRECISION B( LDB, * ), D( * ), DL( * ), DU( * ), DU2( * ) +* .. +* +* Purpose +* ======= +* +* DGTTRS solves one of the systems of equations +* A*X = B or A'*X = B, +* with a tridiagonal matrix A using the LU factorization computed +* by DGTTRF. +* +* Arguments +* ========= +* +* TRANS (input) CHARACTER +* Specifies the form of the system of equations: +* = 'N': A * X = B (No transpose) +* = 'T': A'* X = B (Transpose) +* = 'C': A'* X = B (Conjugate transpose = Transpose) +* +* N (input) INTEGER +* The order of the matrix A. N >= 0. +* +* NRHS (input) INTEGER +* The number of right hand sides, i.e., the number of columns +* of the matrix B. NRHS >= 0. +* +* DL (input) DOUBLE PRECISION array, dimension (N-1) +* The (n-1) multipliers that define the matrix L from the +* LU factorization of A. +* +* D (input) DOUBLE PRECISION array, dimension (N) +* The n diagonal elements of the upper triangular matrix U from +* the LU factorization of A. +* +* DU (input) DOUBLE PRECISION array, dimension (N-1) +* The (n-1) elements of the first superdiagonal of U. +* +* DU2 (input) DOUBLE PRECISION array, dimension (N-2) +* The (n-2) elements of the second superdiagonal of U. +* +* IPIV (input) INTEGER array, dimension (N) +* The pivot indices; for 1 <= i <= n, row i of the matrix was +* interchanged with row IPIV(i). IPIV(i) will always be either +* i or i+1; IPIV(i) = i indicates a row interchange was not +* required. +* +* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) +* On entry, the right hand side matrix B. +* On exit, B is overwritten by the solution matrix X. +* +* LDB (input) INTEGER +* The leading dimension of the array B. LDB >= max(1,N). +* +* INFO (output) INTEGER +* = 0: successful exit +* < 0: if INFO = -i, the i-th argument had an illegal value +* +* ===================================================================== +* +* .. Local Scalars .. + LOGICAL NOTRAN + INTEGER I, J + DOUBLE PRECISION TEMP +* .. +* .. External Functions .. + LOGICAL LSAME + EXTERNAL LSAME +* .. +* .. External Subroutines .. + EXTERNAL XERBLA +* .. +* .. Intrinsic Functions .. + INTRINSIC MAX +* .. +* .. Executable Statements .. +* + INFO = 0 + NOTRAN = LSAME( TRANS, 'N' ) + IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) .AND. .NOT. + $ LSAME( TRANS, 'C' ) ) THEN + INFO = -1 + ELSE IF( N.LT.0 ) THEN + INFO = -2 + ELSE IF( NRHS.LT.0 ) THEN + INFO = -3 + ELSE IF( LDB.LT.MAX( N, 1 ) ) THEN + INFO = -10 + END IF + IF( INFO.NE.0 ) THEN + CALL XERBLA( 'DGTTRS', -INFO ) + RETURN + END IF +* +* Quick return if possible +* + IF( N.EQ.0 .OR. NRHS.EQ.0 ) + $ RETURN +* + IF( NOTRAN ) THEN +* +* Solve A*X = B using the LU factorization of A, +* overwriting each right hand side vector with its solution. +* + DO 30 J = 1, NRHS +* +* Solve L*x = b. +* + DO 10 I = 1, N - 1 + IF( IPIV( I ).EQ.I ) THEN + B( I+1, J ) = B( I+1, J ) - DL( I )*B( I, J ) + ELSE + TEMP = B( I, J ) + B( I, J ) = B( I+1, J ) + B( I+1, J ) = TEMP - DL( I )*B( I, J ) + END IF + 10 CONTINUE +* +* Solve U*x = b. +* + B( N, J ) = B( N, J ) / D( N ) + IF( N.GT.1 ) + $ B( N-1, J ) = ( B( N-1, J )-DU( N-1 )*B( N, J ) ) / + $ D( N-1 ) + DO 20 I = N - 2, 1, -1 + B( I, J ) = ( B( I, J )-DU( I )*B( I+1, J )-DU2( I )* + $ B( I+2, J ) ) / D( I ) + 20 CONTINUE + 30 CONTINUE + ELSE +* +* Solve A' * X = B. +* + DO 60 J = 1, NRHS +* +* Solve U'*x = b. +* + B( 1, J ) = B( 1, J ) / D( 1 ) + IF( N.GT.1 ) + $ B( 2, J ) = ( B( 2, J )-DU( 1 )*B( 1, J ) ) / D( 2 ) + DO 40 I = 3, N + B( I, J ) = ( B( I, J )-DU( I-1 )*B( I-1, J )-DU2( I-2 )* + $ B( I-2, J ) ) / D( I ) + 40 CONTINUE +* +* Solve L'*x = b. +* + DO 50 I = N - 1, 1, -1 + IF( IPIV( I ).EQ.I ) THEN + B( I, J ) = B( I, J ) - DL( I )*B( I+1, J ) + ELSE + TEMP = B( I+1, J ) + B( I+1, J ) = B( I, J ) - DL( I )*TEMP + B( I, J ) = TEMP + END IF + 50 CONTINUE + 60 CONTINUE + END IF +* +* End of DGTTRS +* + END diff -r 9f3299378193 -r 57077d0ddc8e libcruft/lapack/dlatbs.f --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libcruft/lapack/dlatbs.f Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,724 @@ + SUBROUTINE DLATBS( UPLO, TRANS, DIAG, NORMIN, N, KD, AB, LDAB, X, + $ SCALE, CNORM, INFO ) +* +* -- LAPACK auxiliary routine (version 3.0) -- +* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., +* Courant Institute, Argonne National Lab, and Rice University +* June 30, 1992 +* +* .. Scalar Arguments .. + CHARACTER DIAG, NORMIN, TRANS, UPLO + INTEGER INFO, KD, LDAB, N + DOUBLE PRECISION SCALE +* .. +* .. Array Arguments .. + DOUBLE PRECISION AB( LDAB, * ), CNORM( * ), X( * ) +* .. +* +* Purpose +* ======= +* +* DLATBS solves one of the triangular systems +* +* A *x = s*b or A'*x = s*b +* +* with scaling to prevent overflow, where A is an upper or lower +* triangular band matrix. Here A' denotes the transpose of A, x and b +* are n-element vectors, and s is a scaling factor, usually less than +* or equal to 1, chosen so that the components of x will be less than +* the overflow threshold. If the unscaled problem will not cause +* overflow, the Level 2 BLAS routine DTBSV is called. If the matrix A +* is singular (A(j,j) = 0 for some j), then s is set to 0 and a +* non-trivial solution to A*x = 0 is returned. +* +* Arguments +* ========= +* +* UPLO (input) CHARACTER*1 +* Specifies whether the matrix A is upper or lower triangular. +* = 'U': Upper triangular +* = 'L': Lower triangular +* +* TRANS (input) CHARACTER*1 +* Specifies the operation applied to A. +* = 'N': Solve A * x = s*b (No transpose) +* = 'T': Solve A'* x = s*b (Transpose) +* = 'C': Solve A'* x = s*b (Conjugate transpose = Transpose) +* +* DIAG (input) CHARACTER*1 +* Specifies whether or not the matrix A is unit triangular. +* = 'N': Non-unit triangular +* = 'U': Unit triangular +* +* NORMIN (input) CHARACTER*1 +* Specifies whether CNORM has been set or not. +* = 'Y': CNORM contains the column norms on entry +* = 'N': CNORM is not set on entry. On exit, the norms will +* be computed and stored in CNORM. +* +* N (input) INTEGER +* The order of the matrix A. N >= 0. +* +* KD (input) INTEGER +* The number of subdiagonals or superdiagonals in the +* triangular matrix A. KD >= 0. +* +* AB (input) DOUBLE PRECISION array, dimension (LDAB,N) +* The upper or lower triangular band matrix A, stored in the +* first KD+1 rows of the array. The j-th column of A is stored +* in the j-th column of the array AB as follows: +* if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j; +* if UPLO = 'L', AB(1+i-j,j) = A(i,j) for j<=i<=min(n,j+kd). +* +* LDAB (input) INTEGER +* The leading dimension of the array AB. LDAB >= KD+1. +* +* X (input/output) DOUBLE PRECISION array, dimension (N) +* On entry, the right hand side b of the triangular system. +* On exit, X is overwritten by the solution vector x. +* +* SCALE (output) DOUBLE PRECISION +* The scaling factor s for the triangular system +* A * x = s*b or A'* x = s*b. +* If SCALE = 0, the matrix A is singular or badly scaled, and +* the vector x is an exact or approximate solution to A*x = 0. +* +* CNORM (input or output) DOUBLE PRECISION array, dimension (N) +* +* If NORMIN = 'Y', CNORM is an input argument and CNORM(j) +* contains the norm of the off-diagonal part of the j-th column +* of A. If TRANS = 'N', CNORM(j) must be greater than or equal +* to the infinity-norm, and if TRANS = 'T' or 'C', CNORM(j) +* must be greater than or equal to the 1-norm. +* +* If NORMIN = 'N', CNORM is an output argument and CNORM(j) +* returns the 1-norm of the offdiagonal part of the j-th column +* of A. +* +* INFO (output) INTEGER +* = 0: successful exit +* < 0: if INFO = -k, the k-th argument had an illegal value +* +* Further Details +* ======= ======= +* +* A rough bound on x is computed; if that is less than overflow, DTBSV +* is called, otherwise, specific code is used which checks for possible +* overflow or divide-by-zero at every operation. +* +* A columnwise scheme is used for solving A*x = b. The basic algorithm +* if A is lower triangular is +* +* x[1:n] := b[1:n] +* for j = 1, ..., n +* x(j) := x(j) / A(j,j) +* x[j+1:n] := x[j+1:n] - x(j) * A[j+1:n,j] +* end +* +* Define bounds on the components of x after j iterations of the loop: +* M(j) = bound on x[1:j] +* G(j) = bound on x[j+1:n] +* Initially, let M(0) = 0 and G(0) = max{x(i), i=1,...,n}. +* +* Then for iteration j+1 we have +* M(j+1) <= G(j) / | A(j+1,j+1) | +* G(j+1) <= G(j) + M(j+1) * | A[j+2:n,j+1] | +* <= G(j) ( 1 + CNORM(j+1) / | A(j+1,j+1) | ) +* +* where CNORM(j+1) is greater than or equal to the infinity-norm of +* column j+1 of A, not counting the diagonal. Hence +* +* G(j) <= G(0) product ( 1 + CNORM(i) / | A(i,i) | ) +* 1<=i<=j +* and +* +* |x(j)| <= ( G(0) / |A(j,j)| ) product ( 1 + CNORM(i) / |A(i,i)| ) +* 1<=i< j +* +* Since |x(j)| <= M(j), we use the Level 2 BLAS routine DTBSV if the +* reciprocal of the largest M(j), j=1,..,n, is larger than +* max(underflow, 1/overflow). +* +* The bound on x(j) is also used to determine when a step in the +* columnwise method can be performed without fear of overflow. If +* the computed bound is greater than a large constant, x is scaled to +* prevent overflow, but if the bound overflows, x is set to 0, x(j) to +* 1, and scale to 0, and a non-trivial solution to A*x = 0 is found. +* +* Similarly, a row-wise scheme is used to solve A'*x = b. The basic +* algorithm for A upper triangular is +* +* for j = 1, ..., n +* x(j) := ( b(j) - A[1:j-1,j]' * x[1:j-1] ) / A(j,j) +* end +* +* We simultaneously compute two bounds +* G(j) = bound on ( b(i) - A[1:i-1,i]' * x[1:i-1] ), 1<=i<=j +* M(j) = bound on x(i), 1<=i<=j +* +* The initial values are G(0) = 0, M(0) = max{b(i), i=1,..,n}, and we +* add the constraint G(j) >= G(j-1) and M(j) >= M(j-1) for j >= 1. +* Then the bound on x(j) is +* +* M(j) <= M(j-1) * ( 1 + CNORM(j) ) / | A(j,j) | +* +* <= M(0) * product ( ( 1 + CNORM(i) ) / |A(i,i)| ) +* 1<=i<=j +* +* and we can safely call DTBSV if 1/M(n) and 1/G(n) are both greater +* than max(underflow, 1/overflow). +* +* ===================================================================== +* +* .. Parameters .. + DOUBLE PRECISION ZERO, HALF, ONE + PARAMETER ( ZERO = 0.0D+0, HALF = 0.5D+0, ONE = 1.0D+0 ) +* .. +* .. Local Scalars .. + LOGICAL NOTRAN, NOUNIT, UPPER + INTEGER I, IMAX, J, JFIRST, JINC, JLAST, JLEN, MAIND + DOUBLE PRECISION BIGNUM, GROW, REC, SMLNUM, SUMJ, TJJ, TJJS, + $ TMAX, TSCAL, USCAL, XBND, XJ, XMAX +* .. +* .. External Functions .. + LOGICAL LSAME + INTEGER IDAMAX + DOUBLE PRECISION DASUM, DDOT, DLAMCH + EXTERNAL LSAME, IDAMAX, DASUM, DDOT, DLAMCH +* .. +* .. External Subroutines .. + EXTERNAL DAXPY, DSCAL, DTBSV, XERBLA +* .. +* .. Intrinsic Functions .. + INTRINSIC ABS, MAX, MIN +* .. +* .. Executable Statements .. +* + INFO = 0 + UPPER = LSAME( UPLO, 'U' ) + NOTRAN = LSAME( TRANS, 'N' ) + NOUNIT = LSAME( DIAG, 'N' ) +* +* Test the input parameters. +* + IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN + INFO = -1 + ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) .AND. .NOT. + $ LSAME( TRANS, 'C' ) ) THEN + INFO = -2 + ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN + INFO = -3 + ELSE IF( .NOT.LSAME( NORMIN, 'Y' ) .AND. .NOT. + $ LSAME( NORMIN, 'N' ) ) THEN + INFO = -4 + ELSE IF( N.LT.0 ) THEN + INFO = -5 + ELSE IF( KD.LT.0 ) THEN + INFO = -6 + ELSE IF( LDAB.LT.KD+1 ) THEN + INFO = -8 + END IF + IF( INFO.NE.0 ) THEN + CALL XERBLA( 'DLATBS', -INFO ) + RETURN + END IF +* +* Quick return if possible +* + IF( N.EQ.0 ) + $ RETURN +* +* Determine machine dependent parameters to control overflow. +* + SMLNUM = DLAMCH( 'Safe minimum' ) / DLAMCH( 'Precision' ) + BIGNUM = ONE / SMLNUM + SCALE = ONE +* + IF( LSAME( NORMIN, 'N' ) ) THEN +* +* Compute the 1-norm of each column, not including the diagonal. +* + IF( UPPER ) THEN +* +* A is upper triangular. +* + DO 10 J = 1, N + JLEN = MIN( KD, J-1 ) + CNORM( J ) = DASUM( JLEN, AB( KD+1-JLEN, J ), 1 ) + 10 CONTINUE + ELSE +* +* A is lower triangular. +* + DO 20 J = 1, N + JLEN = MIN( KD, N-J ) + IF( JLEN.GT.0 ) THEN + CNORM( J ) = DASUM( JLEN, AB( 2, J ), 1 ) + ELSE + CNORM( J ) = ZERO + END IF + 20 CONTINUE + END IF + END IF +* +* Scale the column norms by TSCAL if the maximum element in CNORM is +* greater than BIGNUM. +* + IMAX = IDAMAX( N, CNORM, 1 ) + TMAX = CNORM( IMAX ) + IF( TMAX.LE.BIGNUM ) THEN + TSCAL = ONE + ELSE + TSCAL = ONE / ( SMLNUM*TMAX ) + CALL DSCAL( N, TSCAL, CNORM, 1 ) + END IF +* +* Compute a bound on the computed solution vector to see if the +* Level 2 BLAS routine DTBSV can be used. +* + J = IDAMAX( N, X, 1 ) + XMAX = ABS( X( J ) ) + XBND = XMAX + IF( NOTRAN ) THEN +* +* Compute the growth in A * x = b. +* + IF( UPPER ) THEN + JFIRST = N + JLAST = 1 + JINC = -1 + MAIND = KD + 1 + ELSE + JFIRST = 1 + JLAST = N + JINC = 1 + MAIND = 1 + END IF +* + IF( TSCAL.NE.ONE ) THEN + GROW = ZERO + GO TO 50 + END IF +* + IF( NOUNIT ) THEN +* +* A is non-unit triangular. +* +* Compute GROW = 1/G(j) and XBND = 1/M(j). +* Initially, G(0) = max{x(i), i=1,...,n}. +* + GROW = ONE / MAX( XBND, SMLNUM ) + XBND = GROW + DO 30 J = JFIRST, JLAST, JINC +* +* Exit the loop if the growth factor is too small. +* + IF( GROW.LE.SMLNUM ) + $ GO TO 50 +* +* M(j) = G(j-1) / abs(A(j,j)) +* + TJJ = ABS( AB( MAIND, J ) ) + XBND = MIN( XBND, MIN( ONE, TJJ )*GROW ) + IF( TJJ+CNORM( J ).GE.SMLNUM ) THEN +* +* G(j) = G(j-1)*( 1 + CNORM(j) / abs(A(j,j)) ) +* + GROW = GROW*( TJJ / ( TJJ+CNORM( J ) ) ) + ELSE +* +* G(j) could overflow, set GROW to 0. +* + GROW = ZERO + END IF + 30 CONTINUE + GROW = XBND + ELSE +* +* A is unit triangular. +* +* Compute GROW = 1/G(j), where G(0) = max{x(i), i=1,...,n}. +* + GROW = MIN( ONE, ONE / MAX( XBND, SMLNUM ) ) + DO 40 J = JFIRST, JLAST, JINC +* +* Exit the loop if the growth factor is too small. +* + IF( GROW.LE.SMLNUM ) + $ GO TO 50 +* +* G(j) = G(j-1)*( 1 + CNORM(j) ) +* + GROW = GROW*( ONE / ( ONE+CNORM( J ) ) ) + 40 CONTINUE + END IF + 50 CONTINUE +* + ELSE +* +* Compute the growth in A' * x = b. +* + IF( UPPER ) THEN + JFIRST = 1 + JLAST = N + JINC = 1 + MAIND = KD + 1 + ELSE + JFIRST = N + JLAST = 1 + JINC = -1 + MAIND = 1 + END IF +* + IF( TSCAL.NE.ONE ) THEN + GROW = ZERO + GO TO 80 + END IF +* + IF( NOUNIT ) THEN +* +* A is non-unit triangular. +* +* Compute GROW = 1/G(j) and XBND = 1/M(j). +* Initially, M(0) = max{x(i), i=1,...,n}. +* + GROW = ONE / MAX( XBND, SMLNUM ) + XBND = GROW + DO 60 J = JFIRST, JLAST, JINC +* +* Exit the loop if the growth factor is too small. +* + IF( GROW.LE.SMLNUM ) + $ GO TO 80 +* +* G(j) = max( G(j-1), M(j-1)*( 1 + CNORM(j) ) ) +* + XJ = ONE + CNORM( J ) + GROW = MIN( GROW, XBND / XJ ) +* +* M(j) = M(j-1)*( 1 + CNORM(j) ) / abs(A(j,j)) +* + TJJ = ABS( AB( MAIND, J ) ) + IF( XJ.GT.TJJ ) + $ XBND = XBND*( TJJ / XJ ) + 60 CONTINUE + GROW = MIN( GROW, XBND ) + ELSE +* +* A is unit triangular. +* +* Compute GROW = 1/G(j), where G(0) = max{x(i), i=1,...,n}. +* + GROW = MIN( ONE, ONE / MAX( XBND, SMLNUM ) ) + DO 70 J = JFIRST, JLAST, JINC +* +* Exit the loop if the growth factor is too small. +* + IF( GROW.LE.SMLNUM ) + $ GO TO 80 +* +* G(j) = ( 1 + CNORM(j) )*G(j-1) +* + XJ = ONE + CNORM( J ) + GROW = GROW / XJ + 70 CONTINUE + END IF + 80 CONTINUE + END IF +* + IF( ( GROW*TSCAL ).GT.SMLNUM ) THEN +* +* Use the Level 2 BLAS solve if the reciprocal of the bound on +* elements of X is not too small. +* + CALL DTBSV( UPLO, TRANS, DIAG, N, KD, AB, LDAB, X, 1 ) + ELSE +* +* Use a Level 1 BLAS solve, scaling intermediate results. +* + IF( XMAX.GT.BIGNUM ) THEN +* +* Scale X so that its components are less than or equal to +* BIGNUM in absolute value. +* + SCALE = BIGNUM / XMAX + CALL DSCAL( N, SCALE, X, 1 ) + XMAX = BIGNUM + END IF +* + IF( NOTRAN ) THEN +* +* Solve A * x = b +* + DO 110 J = JFIRST, JLAST, JINC +* +* Compute x(j) = b(j) / A(j,j), scaling x if necessary. +* + XJ = ABS( X( J ) ) + IF( NOUNIT ) THEN + TJJS = AB( MAIND, J )*TSCAL + ELSE + TJJS = TSCAL + IF( TSCAL.EQ.ONE ) + $ GO TO 100 + END IF + TJJ = ABS( TJJS ) + IF( TJJ.GT.SMLNUM ) THEN +* +* abs(A(j,j)) > SMLNUM: +* + IF( TJJ.LT.ONE ) THEN + IF( XJ.GT.TJJ*BIGNUM ) THEN +* +* Scale x by 1/b(j). +* + REC = ONE / XJ + CALL DSCAL( N, REC, X, 1 ) + SCALE = SCALE*REC + XMAX = XMAX*REC + END IF + END IF + X( J ) = X( J ) / TJJS + XJ = ABS( X( J ) ) + ELSE IF( TJJ.GT.ZERO ) THEN +* +* 0 < abs(A(j,j)) <= SMLNUM: +* + IF( XJ.GT.TJJ*BIGNUM ) THEN +* +* Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM +* to avoid overflow when dividing by A(j,j). +* + REC = ( TJJ*BIGNUM ) / XJ + IF( CNORM( J ).GT.ONE ) THEN +* +* Scale by 1/CNORM(j) to avoid overflow when +* multiplying x(j) times column j. +* + REC = REC / CNORM( J ) + END IF + CALL DSCAL( N, REC, X, 1 ) + SCALE = SCALE*REC + XMAX = XMAX*REC + END IF + X( J ) = X( J ) / TJJS + XJ = ABS( X( J ) ) + ELSE +* +* A(j,j) = 0: Set x(1:n) = 0, x(j) = 1, and +* scale = 0, and compute a solution to A*x = 0. +* + DO 90 I = 1, N + X( I ) = ZERO + 90 CONTINUE + X( J ) = ONE + XJ = ONE + SCALE = ZERO + XMAX = ZERO + END IF + 100 CONTINUE +* +* Scale x if necessary to avoid overflow when adding a +* multiple of column j of A. +* + IF( XJ.GT.ONE ) THEN + REC = ONE / XJ + IF( CNORM( J ).GT.( BIGNUM-XMAX )*REC ) THEN +* +* Scale x by 1/(2*abs(x(j))). +* + REC = REC*HALF + CALL DSCAL( N, REC, X, 1 ) + SCALE = SCALE*REC + END IF + ELSE IF( XJ*CNORM( J ).GT.( BIGNUM-XMAX ) ) THEN +* +* Scale x by 1/2. +* + CALL DSCAL( N, HALF, X, 1 ) + SCALE = SCALE*HALF + END IF +* + IF( UPPER ) THEN + IF( J.GT.1 ) THEN +* +* Compute the update +* x(max(1,j-kd):j-1) := x(max(1,j-kd):j-1) - +* x(j)* A(max(1,j-kd):j-1,j) +* + JLEN = MIN( KD, J-1 ) + CALL DAXPY( JLEN, -X( J )*TSCAL, + $ AB( KD+1-JLEN, J ), 1, X( J-JLEN ), 1 ) + I = IDAMAX( J-1, X, 1 ) + XMAX = ABS( X( I ) ) + END IF + ELSE IF( J.LT.N ) THEN +* +* Compute the update +* x(j+1:min(j+kd,n)) := x(j+1:min(j+kd,n)) - +* x(j) * A(j+1:min(j+kd,n),j) +* + JLEN = MIN( KD, N-J ) + IF( JLEN.GT.0 ) + $ CALL DAXPY( JLEN, -X( J )*TSCAL, AB( 2, J ), 1, + $ X( J+1 ), 1 ) + I = J + IDAMAX( N-J, X( J+1 ), 1 ) + XMAX = ABS( X( I ) ) + END IF + 110 CONTINUE +* + ELSE +* +* Solve A' * x = b +* + DO 160 J = JFIRST, JLAST, JINC +* +* Compute x(j) = b(j) - sum A(k,j)*x(k). +* k<>j +* + XJ = ABS( X( J ) ) + USCAL = TSCAL + REC = ONE / MAX( XMAX, ONE ) + IF( CNORM( J ).GT.( BIGNUM-XJ )*REC ) THEN +* +* If x(j) could overflow, scale x by 1/(2*XMAX). +* + REC = REC*HALF + IF( NOUNIT ) THEN + TJJS = AB( MAIND, J )*TSCAL + ELSE + TJJS = TSCAL + END IF + TJJ = ABS( TJJS ) + IF( TJJ.GT.ONE ) THEN +* +* Divide by A(j,j) when scaling x if A(j,j) > 1. +* + REC = MIN( ONE, REC*TJJ ) + USCAL = USCAL / TJJS + END IF + IF( REC.LT.ONE ) THEN + CALL DSCAL( N, REC, X, 1 ) + SCALE = SCALE*REC + XMAX = XMAX*REC + END IF + END IF +* + SUMJ = ZERO + IF( USCAL.EQ.ONE ) THEN +* +* If the scaling needed for A in the dot product is 1, +* call DDOT to perform the dot product. +* + IF( UPPER ) THEN + JLEN = MIN( KD, J-1 ) + SUMJ = DDOT( JLEN, AB( KD+1-JLEN, J ), 1, + $ X( J-JLEN ), 1 ) + ELSE + JLEN = MIN( KD, N-J ) + IF( JLEN.GT.0 ) + $ SUMJ = DDOT( JLEN, AB( 2, J ), 1, X( J+1 ), 1 ) + END IF + ELSE +* +* Otherwise, use in-line code for the dot product. +* + IF( UPPER ) THEN + JLEN = MIN( KD, J-1 ) + DO 120 I = 1, JLEN + SUMJ = SUMJ + ( AB( KD+I-JLEN, J )*USCAL )* + $ X( J-JLEN-1+I ) + 120 CONTINUE + ELSE + JLEN = MIN( KD, N-J ) + DO 130 I = 1, JLEN + SUMJ = SUMJ + ( AB( I+1, J )*USCAL )*X( J+I ) + 130 CONTINUE + END IF + END IF +* + IF( USCAL.EQ.TSCAL ) THEN +* +* Compute x(j) := ( x(j) - sumj ) / A(j,j) if 1/A(j,j) +* was not used to scale the dotproduct. +* + X( J ) = X( J ) - SUMJ + XJ = ABS( X( J ) ) + IF( NOUNIT ) THEN +* +* Compute x(j) = x(j) / A(j,j), scaling if necessary. +* + TJJS = AB( MAIND, J )*TSCAL + ELSE + TJJS = TSCAL + IF( TSCAL.EQ.ONE ) + $ GO TO 150 + END IF + TJJ = ABS( TJJS ) + IF( TJJ.GT.SMLNUM ) THEN +* +* abs(A(j,j)) > SMLNUM: +* + IF( TJJ.LT.ONE ) THEN + IF( XJ.GT.TJJ*BIGNUM ) THEN +* +* Scale X by 1/abs(x(j)). +* + REC = ONE / XJ + CALL DSCAL( N, REC, X, 1 ) + SCALE = SCALE*REC + XMAX = XMAX*REC + END IF + END IF + X( J ) = X( J ) / TJJS + ELSE IF( TJJ.GT.ZERO ) THEN +* +* 0 < abs(A(j,j)) <= SMLNUM: +* + IF( XJ.GT.TJJ*BIGNUM ) THEN +* +* Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM. +* + REC = ( TJJ*BIGNUM ) / XJ + CALL DSCAL( N, REC, X, 1 ) + SCALE = SCALE*REC + XMAX = XMAX*REC + END IF + X( J ) = X( J ) / TJJS + ELSE +* +* A(j,j) = 0: Set x(1:n) = 0, x(j) = 1, and +* scale = 0, and compute a solution to A'*x = 0. +* + DO 140 I = 1, N + X( I ) = ZERO + 140 CONTINUE + X( J ) = ONE + SCALE = ZERO + XMAX = ZERO + END IF + 150 CONTINUE + ELSE +* +* Compute x(j) := x(j) / A(j,j) - sumj if the dot +* product has already been divided by 1/A(j,j). +* + X( J ) = X( J ) / TJJS - SUMJ + END IF + XMAX = MAX( XMAX, ABS( X( J ) ) ) + 160 CONTINUE + END IF + SCALE = SCALE / TSCAL + END IF +* +* Scale the column norms by 1/TSCAL for return. +* + IF( TSCAL.NE.ONE ) THEN + CALL DSCAL( N, ONE / TSCAL, CNORM, 1 ) + END IF +* + RETURN +* +* End of DLATBS +* + END diff -r 9f3299378193 -r 57077d0ddc8e libcruft/lapack/dpbcon.f --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libcruft/lapack/dpbcon.f Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,188 @@ + SUBROUTINE DPBCON( UPLO, N, KD, AB, LDAB, ANORM, RCOND, WORK, + $ IWORK, INFO ) +* +* -- LAPACK routine (version 3.0) -- +* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., +* Courant Institute, Argonne National Lab, and Rice University +* September 30, 1994 +* +* .. Scalar Arguments .. + CHARACTER UPLO + INTEGER INFO, KD, LDAB, N + DOUBLE PRECISION ANORM, RCOND +* .. +* .. Array Arguments .. + INTEGER IWORK( * ) + DOUBLE PRECISION AB( LDAB, * ), WORK( * ) +* .. +* +* Purpose +* ======= +* +* DPBCON estimates the reciprocal of the condition number (in the +* 1-norm) of a real symmetric positive definite band matrix using the +* Cholesky factorization A = U**T*U or A = L*L**T computed by DPBTRF. +* +* An estimate is obtained for norm(inv(A)), and the reciprocal of the +* condition number is computed as RCOND = 1 / (ANORM * norm(inv(A))). +* +* Arguments +* ========= +* +* UPLO (input) CHARACTER*1 +* = 'U': Upper triangular factor stored in AB; +* = 'L': Lower triangular factor stored in AB. +* +* N (input) INTEGER +* The order of the matrix A. N >= 0. +* +* KD (input) INTEGER +* The number of superdiagonals of the matrix A if UPLO = 'U', +* or the number of subdiagonals if UPLO = 'L'. KD >= 0. +* +* AB (input) DOUBLE PRECISION array, dimension (LDAB,N) +* The triangular factor U or L from the Cholesky factorization +* A = U**T*U or A = L*L**T of the band matrix A, stored in the +* first KD+1 rows of the array. The j-th column of U or L is +* stored in the j-th column of the array AB as follows: +* if UPLO ='U', AB(kd+1+i-j,j) = U(i,j) for max(1,j-kd)<=i<=j; +* if UPLO ='L', AB(1+i-j,j) = L(i,j) for j<=i<=min(n,j+kd). +* +* LDAB (input) INTEGER +* The leading dimension of the array AB. LDAB >= KD+1. +* +* ANORM (input) DOUBLE PRECISION +* The 1-norm (or infinity-norm) of the symmetric band matrix A. +* +* RCOND (output) DOUBLE PRECISION +* The reciprocal of the condition number of the matrix A, +* computed as RCOND = 1/(ANORM * AINVNM), where AINVNM is an +* estimate of the 1-norm of inv(A) computed in this routine. +* +* WORK (workspace) DOUBLE PRECISION array, dimension (3*N) +* +* IWORK (workspace) INTEGER array, dimension (N) +* +* INFO (output) INTEGER +* = 0: successful exit +* < 0: if INFO = -i, the i-th argument had an illegal value +* +* ===================================================================== +* +* .. Parameters .. + DOUBLE PRECISION ONE, ZERO + PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) +* .. +* .. Local Scalars .. + LOGICAL UPPER + CHARACTER NORMIN + INTEGER IX, KASE + DOUBLE PRECISION AINVNM, SCALE, SCALEL, SCALEU, SMLNUM +* .. +* .. External Functions .. + LOGICAL LSAME + INTEGER IDAMAX + DOUBLE PRECISION DLAMCH + EXTERNAL LSAME, IDAMAX, DLAMCH +* .. +* .. External Subroutines .. + EXTERNAL DLACON, DLATBS, DRSCL, XERBLA +* .. +* .. Intrinsic Functions .. + INTRINSIC ABS +* .. +* .. Executable Statements .. +* +* Test the input parameters. +* + INFO = 0 + UPPER = LSAME( UPLO, 'U' ) + IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN + INFO = -1 + ELSE IF( N.LT.0 ) THEN + INFO = -2 + ELSE IF( KD.LT.0 ) THEN + INFO = -3 + ELSE IF( LDAB.LT.KD+1 ) THEN + INFO = -5 + ELSE IF( ANORM.LT.ZERO ) THEN + INFO = -6 + END IF + IF( INFO.NE.0 ) THEN + CALL XERBLA( 'DPBCON', -INFO ) + RETURN + END IF +* +* Quick return if possible +* + RCOND = ZERO + IF( N.EQ.0 ) THEN + RCOND = ONE + RETURN + ELSE IF( ANORM.EQ.ZERO ) THEN + RETURN + END IF +* + SMLNUM = DLAMCH( 'Safe minimum' ) +* +* Estimate the 1-norm of the inverse. +* + KASE = 0 + NORMIN = 'N' + 10 CONTINUE + CALL DLACON( N, WORK( N+1 ), WORK, IWORK, AINVNM, KASE ) + IF( KASE.NE.0 ) THEN + IF( UPPER ) THEN +* +* Multiply by inv(U'). +* + CALL DLATBS( 'Upper', 'Transpose', 'Non-unit', NORMIN, N, + $ KD, AB, LDAB, WORK, SCALEL, WORK( 2*N+1 ), + $ INFO ) + NORMIN = 'Y' +* +* Multiply by inv(U). +* + CALL DLATBS( 'Upper', 'No transpose', 'Non-unit', NORMIN, N, + $ KD, AB, LDAB, WORK, SCALEU, WORK( 2*N+1 ), + $ INFO ) + ELSE +* +* Multiply by inv(L). +* + CALL DLATBS( 'Lower', 'No transpose', 'Non-unit', NORMIN, N, + $ KD, AB, LDAB, WORK, SCALEL, WORK( 2*N+1 ), + $ INFO ) + NORMIN = 'Y' +* +* Multiply by inv(L'). +* + CALL DLATBS( 'Lower', 'Transpose', 'Non-unit', NORMIN, N, + $ KD, AB, LDAB, WORK, SCALEU, WORK( 2*N+1 ), + $ INFO ) + END IF +* +* Multiply by 1/SCALE if doing so will not cause overflow. +* + SCALE = SCALEL*SCALEU + IF( SCALE.NE.ONE ) THEN + IX = IDAMAX( N, WORK, 1 ) + IF( SCALE.LT.ABS( WORK( IX ) )*SMLNUM .OR. SCALE.EQ.ZERO ) + $ GO TO 20 + CALL DRSCL( N, SCALE, WORK, 1 ) + END IF + GO TO 10 + END IF +* +* Compute the estimate of the reciprocal condition number. +* + IF( AINVNM.NE.ZERO ) + $ RCOND = ( ONE / AINVNM ) / ANORM +* + 20 CONTINUE +* + RETURN +* +* End of DPBCON +* + END diff -r 9f3299378193 -r 57077d0ddc8e libcruft/lapack/dpbtf2.f --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libcruft/lapack/dpbtf2.f Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,195 @@ + SUBROUTINE DPBTF2( UPLO, N, KD, AB, LDAB, INFO ) +* +* -- LAPACK routine (version 3.0) -- +* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., +* Courant Institute, Argonne National Lab, and Rice University +* February 29, 1992 +* +* .. Scalar Arguments .. + CHARACTER UPLO + INTEGER INFO, KD, LDAB, N +* .. +* .. Array Arguments .. + DOUBLE PRECISION AB( LDAB, * ) +* .. +* +* Purpose +* ======= +* +* DPBTF2 computes the Cholesky factorization of a real symmetric +* positive definite band matrix A. +* +* The factorization has the form +* A = U' * U , if UPLO = 'U', or +* A = L * L', if UPLO = 'L', +* where U is an upper triangular matrix, U' is the transpose of U, and +* L is lower triangular. +* +* This is the unblocked version of the algorithm, calling Level 2 BLAS. +* +* Arguments +* ========= +* +* UPLO (input) CHARACTER*1 +* Specifies whether the upper or lower triangular part of the +* symmetric matrix A is stored: +* = 'U': Upper triangular +* = 'L': Lower triangular +* +* N (input) INTEGER +* The order of the matrix A. N >= 0. +* +* KD (input) INTEGER +* The number of super-diagonals of the matrix A if UPLO = 'U', +* or the number of sub-diagonals if UPLO = 'L'. KD >= 0. +* +* AB (input/output) DOUBLE PRECISION array, dimension (LDAB,N) +* On entry, the upper or lower triangle of the symmetric band +* matrix A, stored in the first KD+1 rows of the array. The +* j-th column of A is stored in the j-th column of the array AB +* as follows: +* if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j; +* if UPLO = 'L', AB(1+i-j,j) = A(i,j) for j<=i<=min(n,j+kd). +* +* On exit, if INFO = 0, the triangular factor U or L from the +* Cholesky factorization A = U'*U or A = L*L' of the band +* matrix A, in the same storage format as A. +* +* LDAB (input) INTEGER +* The leading dimension of the array AB. LDAB >= KD+1. +* +* INFO (output) INTEGER +* = 0: successful exit +* < 0: if INFO = -k, the k-th argument had an illegal value +* > 0: if INFO = k, the leading minor of order k is not +* positive definite, and the factorization could not be +* completed. +* +* Further Details +* =============== +* +* The band storage scheme is illustrated by the following example, when +* N = 6, KD = 2, and UPLO = 'U': +* +* On entry: On exit: +* +* * * a13 a24 a35 a46 * * u13 u24 u35 u46 +* * a12 a23 a34 a45 a56 * u12 u23 u34 u45 u56 +* a11 a22 a33 a44 a55 a66 u11 u22 u33 u44 u55 u66 +* +* Similarly, if UPLO = 'L' the format of A is as follows: +* +* On entry: On exit: +* +* a11 a22 a33 a44 a55 a66 l11 l22 l33 l44 l55 l66 +* a21 a32 a43 a54 a65 * l21 l32 l43 l54 l65 * +* a31 a42 a53 a64 * * l31 l42 l53 l64 * * +* +* Array elements marked * are not used by the routine. +* +* ===================================================================== +* +* .. Parameters .. + DOUBLE PRECISION ONE, ZERO + PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) +* .. +* .. Local Scalars .. + LOGICAL UPPER + INTEGER J, KLD, KN + DOUBLE PRECISION AJJ +* .. +* .. External Functions .. + LOGICAL LSAME + EXTERNAL LSAME +* .. +* .. External Subroutines .. + EXTERNAL DSCAL, DSYR, XERBLA +* .. +* .. Intrinsic Functions .. + INTRINSIC MAX, MIN, SQRT +* .. +* .. Executable Statements .. +* +* Test the input parameters. +* + INFO = 0 + UPPER = LSAME( UPLO, 'U' ) + IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN + INFO = -1 + ELSE IF( N.LT.0 ) THEN + INFO = -2 + ELSE IF( KD.LT.0 ) THEN + INFO = -3 + ELSE IF( LDAB.LT.KD+1 ) THEN + INFO = -5 + END IF + IF( INFO.NE.0 ) THEN + CALL XERBLA( 'DPBTF2', -INFO ) + RETURN + END IF +* +* Quick return if possible +* + IF( N.EQ.0 ) + $ RETURN +* + KLD = MAX( 1, LDAB-1 ) +* + IF( UPPER ) THEN +* +* Compute the Cholesky factorization A = U'*U. +* + DO 10 J = 1, N +* +* Compute U(J,J) and test for non-positive-definiteness. +* + AJJ = AB( KD+1, J ) + IF( AJJ.LE.ZERO ) + $ GO TO 30 + AJJ = SQRT( AJJ ) + AB( KD+1, J ) = AJJ +* +* Compute elements J+1:J+KN of row J and update the +* trailing submatrix within the band. +* + KN = MIN( KD, N-J ) + IF( KN.GT.0 ) THEN + CALL DSCAL( KN, ONE / AJJ, AB( KD, J+1 ), KLD ) + CALL DSYR( 'Upper', KN, -ONE, AB( KD, J+1 ), KLD, + $ AB( KD+1, J+1 ), KLD ) + END IF + 10 CONTINUE + ELSE +* +* Compute the Cholesky factorization A = L*L'. +* + DO 20 J = 1, N +* +* Compute L(J,J) and test for non-positive-definiteness. +* + AJJ = AB( 1, J ) + IF( AJJ.LE.ZERO ) + $ GO TO 30 + AJJ = SQRT( AJJ ) + AB( 1, J ) = AJJ +* +* Compute elements J+1:J+KN of column J and update the +* trailing submatrix within the band. +* + KN = MIN( KD, N-J ) + IF( KN.GT.0 ) THEN + CALL DSCAL( KN, ONE / AJJ, AB( 2, J ), 1 ) + CALL DSYR( 'Lower', KN, -ONE, AB( 2, J ), 1, + $ AB( 1, J+1 ), KLD ) + END IF + 20 CONTINUE + END IF + RETURN +* + 30 CONTINUE + INFO = J + RETURN +* +* End of DPBTF2 +* + END diff -r 9f3299378193 -r 57077d0ddc8e libcruft/lapack/dpbtrf.f --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libcruft/lapack/dpbtrf.f Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,365 @@ + SUBROUTINE DPBTRF( UPLO, N, KD, AB, LDAB, INFO ) +* +* -- LAPACK routine (version 3.0) -- +* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., +* Courant Institute, Argonne National Lab, and Rice University +* March 31, 1993 +* +* .. Scalar Arguments .. + CHARACTER UPLO + INTEGER INFO, KD, LDAB, N +* .. +* .. Array Arguments .. + DOUBLE PRECISION AB( LDAB, * ) +* .. +* +* Purpose +* ======= +* +* DPBTRF computes the Cholesky factorization of a real symmetric +* positive definite band matrix A. +* +* The factorization has the form +* A = U**T * U, if UPLO = 'U', or +* A = L * L**T, if UPLO = 'L', +* where U is an upper triangular matrix and L is lower triangular. +* +* Arguments +* ========= +* +* UPLO (input) CHARACTER*1 +* = 'U': Upper triangle of A is stored; +* = 'L': Lower triangle of A is stored. +* +* N (input) INTEGER +* The order of the matrix A. N >= 0. +* +* KD (input) INTEGER +* The number of superdiagonals of the matrix A if UPLO = 'U', +* or the number of subdiagonals if UPLO = 'L'. KD >= 0. +* +* AB (input/output) DOUBLE PRECISION array, dimension (LDAB,N) +* On entry, the upper or lower triangle of the symmetric band +* matrix A, stored in the first KD+1 rows of the array. The +* j-th column of A is stored in the j-th column of the array AB +* as follows: +* if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j; +* if UPLO = 'L', AB(1+i-j,j) = A(i,j) for j<=i<=min(n,j+kd). +* +* On exit, if INFO = 0, the triangular factor U or L from the +* Cholesky factorization A = U**T*U or A = L*L**T of the band +* matrix A, in the same storage format as A. +* +* LDAB (input) INTEGER +* The leading dimension of the array AB. LDAB >= KD+1. +* +* INFO (output) INTEGER +* = 0: successful exit +* < 0: if INFO = -i, the i-th argument had an illegal value +* > 0: if INFO = i, the leading minor of order i is not +* positive definite, and the factorization could not be +* completed. +* +* Further Details +* =============== +* +* The band storage scheme is illustrated by the following example, when +* N = 6, KD = 2, and UPLO = 'U': +* +* On entry: On exit: +* +* * * a13 a24 a35 a46 * * u13 u24 u35 u46 +* * a12 a23 a34 a45 a56 * u12 u23 u34 u45 u56 +* a11 a22 a33 a44 a55 a66 u11 u22 u33 u44 u55 u66 +* +* Similarly, if UPLO = 'L' the format of A is as follows: +* +* On entry: On exit: +* +* a11 a22 a33 a44 a55 a66 l11 l22 l33 l44 l55 l66 +* a21 a32 a43 a54 a65 * l21 l32 l43 l54 l65 * +* a31 a42 a53 a64 * * l31 l42 l53 l64 * * +* +* Array elements marked * are not used by the routine. +* +* Contributed by +* Peter Mayes and Giuseppe Radicati, IBM ECSEC, Rome, March 23, 1989 +* +* ===================================================================== +* +* .. Parameters .. + DOUBLE PRECISION ONE, ZERO + PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) + INTEGER NBMAX, LDWORK + PARAMETER ( NBMAX = 32, LDWORK = NBMAX+1 ) +* .. +* .. Local Scalars .. + INTEGER I, I2, I3, IB, II, J, JJ, NB +* .. +* .. Local Arrays .. + DOUBLE PRECISION WORK( LDWORK, NBMAX ) +* .. +* .. External Functions .. + LOGICAL LSAME + INTEGER ILAENV + EXTERNAL LSAME, ILAENV +* .. +* .. External Subroutines .. + EXTERNAL DGEMM, DPBTF2, DPOTF2, DSYRK, DTRSM, XERBLA +* .. +* .. Intrinsic Functions .. + INTRINSIC MIN +* .. +* .. Executable Statements .. +* +* Test the input parameters. +* + INFO = 0 + IF( ( .NOT.LSAME( UPLO, 'U' ) ) .AND. + $ ( .NOT.LSAME( UPLO, 'L' ) ) ) THEN + INFO = -1 + ELSE IF( N.LT.0 ) THEN + INFO = -2 + ELSE IF( KD.LT.0 ) THEN + INFO = -3 + ELSE IF( LDAB.LT.KD+1 ) THEN + INFO = -5 + END IF + IF( INFO.NE.0 ) THEN + CALL XERBLA( 'DPBTRF', -INFO ) + RETURN + END IF +* +* Quick return if possible +* + IF( N.EQ.0 ) + $ RETURN +* +* Determine the block size for this environment +* + NB = ILAENV( 1, 'DPBTRF', UPLO, N, KD, -1, -1 ) +* +* The block size must not exceed the semi-bandwidth KD, and must not +* exceed the limit set by the size of the local array WORK. +* + NB = MIN( NB, NBMAX ) +* + IF( NB.LE.1 .OR. NB.GT.KD ) THEN +* +* Use unblocked code +* + CALL DPBTF2( UPLO, N, KD, AB, LDAB, INFO ) + ELSE +* +* Use blocked code +* + IF( LSAME( UPLO, 'U' ) ) THEN +* +* Compute the Cholesky factorization of a symmetric band +* matrix, given the upper triangle of the matrix in band +* storage. +* +* Zero the upper triangle of the work array. +* + DO 20 J = 1, NB + DO 10 I = 1, J - 1 + WORK( I, J ) = ZERO + 10 CONTINUE + 20 CONTINUE +* +* Process the band matrix one diagonal block at a time. +* + DO 70 I = 1, N, NB + IB = MIN( NB, N-I+1 ) +* +* Factorize the diagonal block +* + CALL DPOTF2( UPLO, IB, AB( KD+1, I ), LDAB-1, II ) + IF( II.NE.0 ) THEN + INFO = I + II - 1 + GO TO 150 + END IF + IF( I+IB.LE.N ) THEN +* +* Update the relevant part of the trailing submatrix. +* If A11 denotes the diagonal block which has just been +* factorized, then we need to update the remaining +* blocks in the diagram: +* +* A11 A12 A13 +* A22 A23 +* A33 +* +* The numbers of rows and columns in the partitioning +* are IB, I2, I3 respectively. The blocks A12, A22 and +* A23 are empty if IB = KD. The upper triangle of A13 +* lies outside the band. +* + I2 = MIN( KD-IB, N-I-IB+1 ) + I3 = MIN( IB, N-I-KD+1 ) +* + IF( I2.GT.0 ) THEN +* +* Update A12 +* + CALL DTRSM( 'Left', 'Upper', 'Transpose', + $ 'Non-unit', IB, I2, ONE, AB( KD+1, I ), + $ LDAB-1, AB( KD+1-IB, I+IB ), LDAB-1 ) +* +* Update A22 +* + CALL DSYRK( 'Upper', 'Transpose', I2, IB, -ONE, + $ AB( KD+1-IB, I+IB ), LDAB-1, ONE, + $ AB( KD+1, I+IB ), LDAB-1 ) + END IF +* + IF( I3.GT.0 ) THEN +* +* Copy the lower triangle of A13 into the work array. +* + DO 40 JJ = 1, I3 + DO 30 II = JJ, IB + WORK( II, JJ ) = AB( II-JJ+1, JJ+I+KD-1 ) + 30 CONTINUE + 40 CONTINUE +* +* Update A13 (in the work array). +* + CALL DTRSM( 'Left', 'Upper', 'Transpose', + $ 'Non-unit', IB, I3, ONE, AB( KD+1, I ), + $ LDAB-1, WORK, LDWORK ) +* +* Update A23 +* + IF( I2.GT.0 ) + $ CALL DGEMM( 'Transpose', 'No Transpose', I2, I3, + $ IB, -ONE, AB( KD+1-IB, I+IB ), + $ LDAB-1, WORK, LDWORK, ONE, + $ AB( 1+IB, I+KD ), LDAB-1 ) +* +* Update A33 +* + CALL DSYRK( 'Upper', 'Transpose', I3, IB, -ONE, + $ WORK, LDWORK, ONE, AB( KD+1, I+KD ), + $ LDAB-1 ) +* +* Copy the lower triangle of A13 back into place. +* + DO 60 JJ = 1, I3 + DO 50 II = JJ, IB + AB( II-JJ+1, JJ+I+KD-1 ) = WORK( II, JJ ) + 50 CONTINUE + 60 CONTINUE + END IF + END IF + 70 CONTINUE + ELSE +* +* Compute the Cholesky factorization of a symmetric band +* matrix, given the lower triangle of the matrix in band +* storage. +* +* Zero the lower triangle of the work array. +* + DO 90 J = 1, NB + DO 80 I = J + 1, NB + WORK( I, J ) = ZERO + 80 CONTINUE + 90 CONTINUE +* +* Process the band matrix one diagonal block at a time. +* + DO 140 I = 1, N, NB + IB = MIN( NB, N-I+1 ) +* +* Factorize the diagonal block +* + CALL DPOTF2( UPLO, IB, AB( 1, I ), LDAB-1, II ) + IF( II.NE.0 ) THEN + INFO = I + II - 1 + GO TO 150 + END IF + IF( I+IB.LE.N ) THEN +* +* Update the relevant part of the trailing submatrix. +* If A11 denotes the diagonal block which has just been +* factorized, then we need to update the remaining +* blocks in the diagram: +* +* A11 +* A21 A22 +* A31 A32 A33 +* +* The numbers of rows and columns in the partitioning +* are IB, I2, I3 respectively. The blocks A21, A22 and +* A32 are empty if IB = KD. The lower triangle of A31 +* lies outside the band. +* + I2 = MIN( KD-IB, N-I-IB+1 ) + I3 = MIN( IB, N-I-KD+1 ) +* + IF( I2.GT.0 ) THEN +* +* Update A21 +* + CALL DTRSM( 'Right', 'Lower', 'Transpose', + $ 'Non-unit', I2, IB, ONE, AB( 1, I ), + $ LDAB-1, AB( 1+IB, I ), LDAB-1 ) +* +* Update A22 +* + CALL DSYRK( 'Lower', 'No Transpose', I2, IB, -ONE, + $ AB( 1+IB, I ), LDAB-1, ONE, + $ AB( 1, I+IB ), LDAB-1 ) + END IF +* + IF( I3.GT.0 ) THEN +* +* Copy the upper triangle of A31 into the work array. +* + DO 110 JJ = 1, IB + DO 100 II = 1, MIN( JJ, I3 ) + WORK( II, JJ ) = AB( KD+1-JJ+II, JJ+I-1 ) + 100 CONTINUE + 110 CONTINUE +* +* Update A31 (in the work array). +* + CALL DTRSM( 'Right', 'Lower', 'Transpose', + $ 'Non-unit', I3, IB, ONE, AB( 1, I ), + $ LDAB-1, WORK, LDWORK ) +* +* Update A32 +* + IF( I2.GT.0 ) + $ CALL DGEMM( 'No transpose', 'Transpose', I3, I2, + $ IB, -ONE, WORK, LDWORK, + $ AB( 1+IB, I ), LDAB-1, ONE, + $ AB( 1+KD-IB, I+IB ), LDAB-1 ) +* +* Update A33 +* + CALL DSYRK( 'Lower', 'No Transpose', I3, IB, -ONE, + $ WORK, LDWORK, ONE, AB( 1, I+KD ), + $ LDAB-1 ) +* +* Copy the upper triangle of A31 back into place. +* + DO 130 JJ = 1, IB + DO 120 II = 1, MIN( JJ, I3 ) + AB( KD+1-JJ+II, JJ+I-1 ) = WORK( II, JJ ) + 120 CONTINUE + 130 CONTINUE + END IF + END IF + 140 CONTINUE + END IF + END IF + RETURN +* + 150 CONTINUE + RETURN +* +* End of DPBTRF +* + END diff -r 9f3299378193 -r 57077d0ddc8e libcruft/lapack/dpbtrs.f --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libcruft/lapack/dpbtrs.f Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,146 @@ + SUBROUTINE DPBTRS( UPLO, N, KD, NRHS, AB, LDAB, B, LDB, INFO ) +* +* -- LAPACK routine (version 3.0) -- +* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., +* Courant Institute, Argonne National Lab, and Rice University +* September 30, 1994 +* +* .. Scalar Arguments .. + CHARACTER UPLO + INTEGER INFO, KD, LDAB, LDB, N, NRHS +* .. +* .. Array Arguments .. + DOUBLE PRECISION AB( LDAB, * ), B( LDB, * ) +* .. +* +* Purpose +* ======= +* +* DPBTRS solves a system of linear equations A*X = B with a symmetric +* positive definite band matrix A using the Cholesky factorization +* A = U**T*U or A = L*L**T computed by DPBTRF. +* +* Arguments +* ========= +* +* UPLO (input) CHARACTER*1 +* = 'U': Upper triangular factor stored in AB; +* = 'L': Lower triangular factor stored in AB. +* +* N (input) INTEGER +* The order of the matrix A. N >= 0. +* +* KD (input) INTEGER +* The number of superdiagonals of the matrix A if UPLO = 'U', +* or the number of subdiagonals if UPLO = 'L'. KD >= 0. +* +* NRHS (input) INTEGER +* The number of right hand sides, i.e., the number of columns +* of the matrix B. NRHS >= 0. +* +* AB (input) DOUBLE PRECISION array, dimension (LDAB,N) +* The triangular factor U or L from the Cholesky factorization +* A = U**T*U or A = L*L**T of the band matrix A, stored in the +* first KD+1 rows of the array. The j-th column of U or L is +* stored in the j-th column of the array AB as follows: +* if UPLO ='U', AB(kd+1+i-j,j) = U(i,j) for max(1,j-kd)<=i<=j; +* if UPLO ='L', AB(1+i-j,j) = L(i,j) for j<=i<=min(n,j+kd). +* +* LDAB (input) INTEGER +* The leading dimension of the array AB. LDAB >= KD+1. +* +* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) +* On entry, the right hand side matrix B. +* On exit, the solution matrix X. +* +* LDB (input) INTEGER +* The leading dimension of the array B. LDB >= max(1,N). +* +* INFO (output) INTEGER +* = 0: successful exit +* < 0: if INFO = -i, the i-th argument had an illegal value +* +* ===================================================================== +* +* .. Local Scalars .. + LOGICAL UPPER + INTEGER J +* .. +* .. External Functions .. + LOGICAL LSAME + EXTERNAL LSAME +* .. +* .. External Subroutines .. + EXTERNAL DTBSV, XERBLA +* .. +* .. Intrinsic Functions .. + INTRINSIC MAX +* .. +* .. Executable Statements .. +* +* Test the input parameters. +* + INFO = 0 + UPPER = LSAME( UPLO, 'U' ) + IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN + INFO = -1 + ELSE IF( N.LT.0 ) THEN + INFO = -2 + ELSE IF( KD.LT.0 ) THEN + INFO = -3 + ELSE IF( NRHS.LT.0 ) THEN + INFO = -4 + ELSE IF( LDAB.LT.KD+1 ) THEN + INFO = -6 + ELSE IF( LDB.LT.MAX( 1, N ) ) THEN + INFO = -8 + END IF + IF( INFO.NE.0 ) THEN + CALL XERBLA( 'DPBTRS', -INFO ) + RETURN + END IF +* +* Quick return if possible +* + IF( N.EQ.0 .OR. NRHS.EQ.0 ) + $ RETURN +* + IF( UPPER ) THEN +* +* Solve A*X = B where A = U'*U. +* + DO 10 J = 1, NRHS +* +* Solve U'*X = B, overwriting B with X. +* + CALL DTBSV( 'Upper', 'Transpose', 'Non-unit', N, KD, AB, + $ LDAB, B( 1, J ), 1 ) +* +* Solve U*X = B, overwriting B with X. +* + CALL DTBSV( 'Upper', 'No transpose', 'Non-unit', N, KD, AB, + $ LDAB, B( 1, J ), 1 ) + 10 CONTINUE + ELSE +* +* Solve A*X = B where A = L*L'. +* + DO 20 J = 1, NRHS +* +* Solve L*X = B, overwriting B with X. +* + CALL DTBSV( 'Lower', 'No transpose', 'Non-unit', N, KD, AB, + $ LDAB, B( 1, J ), 1 ) +* +* Solve L'*X = B, overwriting B with X. +* + CALL DTBSV( 'Lower', 'Transpose', 'Non-unit', N, KD, AB, + $ LDAB, B( 1, J ), 1 ) + 20 CONTINUE + END IF +* + RETURN +* +* End of DPBTRS +* + END diff -r 9f3299378193 -r 57077d0ddc8e libcruft/lapack/dptsv.f --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libcruft/lapack/dptsv.f Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,100 @@ + SUBROUTINE DPTSV( N, NRHS, D, E, B, LDB, INFO ) +* +* -- LAPACK routine (version 3.0) -- +* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., +* Courant Institute, Argonne National Lab, and Rice University +* February 25, 1997 +* +* .. Scalar Arguments .. + INTEGER INFO, LDB, N, NRHS +* .. +* .. Array Arguments .. + DOUBLE PRECISION B( LDB, * ), D( * ), E( * ) +* .. +* +* Purpose +* ======= +* +* DPTSV computes the solution to a real system of linear equations +* A*X = B, where A is an N-by-N symmetric positive definite tridiagonal +* matrix, and X and B are N-by-NRHS matrices. +* +* A is factored as A = L*D*L**T, and the factored form of A is then +* used to solve the system of equations. +* +* Arguments +* ========= +* +* N (input) INTEGER +* The order of the matrix A. N >= 0. +* +* NRHS (input) INTEGER +* The number of right hand sides, i.e., the number of columns +* of the matrix B. NRHS >= 0. +* +* D (input/output) DOUBLE PRECISION array, dimension (N) +* On entry, the n diagonal elements of the tridiagonal matrix +* A. On exit, the n diagonal elements of the diagonal matrix +* D from the factorization A = L*D*L**T. +* +* E (input/output) DOUBLE PRECISION array, dimension (N-1) +* On entry, the (n-1) subdiagonal elements of the tridiagonal +* matrix A. On exit, the (n-1) subdiagonal elements of the +* unit bidiagonal factor L from the L*D*L**T factorization of +* A. (E can also be regarded as the superdiagonal of the unit +* bidiagonal factor U from the U**T*D*U factorization of A.) +* +* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) +* On entry, the N-by-NRHS right hand side matrix B. +* On exit, if INFO = 0, the N-by-NRHS solution matrix X. +* +* LDB (input) INTEGER +* The leading dimension of the array B. LDB >= max(1,N). +* +* INFO (output) INTEGER +* = 0: successful exit +* < 0: if INFO = -i, the i-th argument had an illegal value +* > 0: if INFO = i, the leading minor of order i is not +* positive definite, and the solution has not been +* computed. The factorization has not been completed +* unless i = N. +* +* ===================================================================== +* +* .. External Subroutines .. + EXTERNAL DPTTRF, DPTTRS, XERBLA +* .. +* .. Intrinsic Functions .. + INTRINSIC MAX +* .. +* .. Executable Statements .. +* +* Test the input parameters. +* + INFO = 0 + IF( N.LT.0 ) THEN + INFO = -1 + ELSE IF( NRHS.LT.0 ) THEN + INFO = -2 + ELSE IF( LDB.LT.MAX( 1, N ) ) THEN + INFO = -6 + END IF + IF( INFO.NE.0 ) THEN + CALL XERBLA( 'DPTSV ', -INFO ) + RETURN + END IF +* +* Compute the L*D*L' (or U'*D*U) factorization of A. +* + CALL DPTTRF( N, D, E, INFO ) + IF( INFO.EQ.0 ) THEN +* +* Solve the system A*X = B, overwriting B with X. +* + CALL DPTTRS( N, NRHS, D, E, B, LDB, INFO ) + END IF + RETURN +* +* End of DPTSV +* + END diff -r 9f3299378193 -r 57077d0ddc8e libcruft/lapack/dpttrf.f --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libcruft/lapack/dpttrf.f Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,153 @@ + SUBROUTINE DPTTRF( N, D, E, INFO ) +* +* -- LAPACK routine (version 3.0) -- +* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., +* Courant Institute, Argonne National Lab, and Rice University +* June 30, 1999 +* +* .. Scalar Arguments .. + INTEGER INFO, N +* .. +* .. Array Arguments .. + DOUBLE PRECISION D( * ), E( * ) +* .. +* +* Purpose +* ======= +* +* DPTTRF computes the L*D*L' factorization of a real symmetric +* positive definite tridiagonal matrix A. The factorization may also +* be regarded as having the form A = U'*D*U. +* +* Arguments +* ========= +* +* N (input) INTEGER +* The order of the matrix A. N >= 0. +* +* D (input/output) DOUBLE PRECISION array, dimension (N) +* On entry, the n diagonal elements of the tridiagonal matrix +* A. On exit, the n diagonal elements of the diagonal matrix +* D from the L*D*L' factorization of A. +* +* E (input/output) DOUBLE PRECISION array, dimension (N-1) +* On entry, the (n-1) subdiagonal elements of the tridiagonal +* matrix A. On exit, the (n-1) subdiagonal elements of the +* unit bidiagonal factor L from the L*D*L' factorization of A. +* E can also be regarded as the superdiagonal of the unit +* bidiagonal factor U from the U'*D*U factorization of A. +* +* INFO (output) INTEGER +* = 0: successful exit +* < 0: if INFO = -k, the k-th argument had an illegal value +* > 0: if INFO = k, the leading minor of order k is not +* positive definite; if k < N, the factorization could not +* be completed, while if k = N, the factorization was +* completed, but D(N) = 0. +* +* ===================================================================== +* +* .. Parameters .. + DOUBLE PRECISION ZERO + PARAMETER ( ZERO = 0.0D+0 ) +* .. +* .. Local Scalars .. + INTEGER I, I4 + DOUBLE PRECISION EI +* .. +* .. External Subroutines .. + EXTERNAL XERBLA +* .. +* .. Intrinsic Functions .. + INTRINSIC MOD +* .. +* .. Executable Statements .. +* +* Test the input parameters. +* + INFO = 0 + IF( N.LT.0 ) THEN + INFO = -1 + CALL XERBLA( 'DPTTRF', -INFO ) + RETURN + END IF +* +* Quick return if possible +* + IF( N.EQ.0 ) + $ RETURN +* +* Compute the L*D*L' (or U'*D*U) factorization of A. +* + I4 = MOD( N-1, 4 ) + DO 10 I = 1, I4 + IF( D( I ).LE.ZERO ) THEN + INFO = I + GO TO 30 + END IF + EI = E( I ) + E( I ) = EI / D( I ) + D( I+1 ) = D( I+1 ) - E( I )*EI + 10 CONTINUE +* + DO 20 I = I4 + 1, N - 4, 4 +* +* Drop out of the loop if d(i) <= 0: the matrix is not positive +* definite. +* + IF( D( I ).LE.ZERO ) THEN + INFO = I + GO TO 30 + END IF +* +* Solve for e(i) and d(i+1). +* + EI = E( I ) + E( I ) = EI / D( I ) + D( I+1 ) = D( I+1 ) - E( I )*EI +* + IF( D( I+1 ).LE.ZERO ) THEN + INFO = I + 1 + GO TO 30 + END IF +* +* Solve for e(i+1) and d(i+2). +* + EI = E( I+1 ) + E( I+1 ) = EI / D( I+1 ) + D( I+2 ) = D( I+2 ) - E( I+1 )*EI +* + IF( D( I+2 ).LE.ZERO ) THEN + INFO = I + 2 + GO TO 30 + END IF +* +* Solve for e(i+2) and d(i+3). +* + EI = E( I+2 ) + E( I+2 ) = EI / D( I+2 ) + D( I+3 ) = D( I+3 ) - E( I+2 )*EI +* + IF( D( I+3 ).LE.ZERO ) THEN + INFO = I + 3 + GO TO 30 + END IF +* +* Solve for e(i+3) and d(i+4). +* + EI = E( I+3 ) + E( I+3 ) = EI / D( I+3 ) + D( I+4 ) = D( I+4 ) - E( I+3 )*EI + 20 CONTINUE +* +* Check d(n) for positive definiteness. +* + IF( D( N ).LE.ZERO ) + $ INFO = N +* + 30 CONTINUE + RETURN +* +* End of DPTTRF +* + END diff -r 9f3299378193 -r 57077d0ddc8e libcruft/lapack/dpttrs.f --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libcruft/lapack/dpttrs.f Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,115 @@ + SUBROUTINE DPTTRS( N, NRHS, D, E, B, LDB, INFO ) +* +* -- LAPACK routine (version 3.0) -- +* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., +* Courant Institute, Argonne National Lab, and Rice University +* June 30, 1999 +* +* .. Scalar Arguments .. + INTEGER INFO, LDB, N, NRHS +* .. +* .. Array Arguments .. + DOUBLE PRECISION B( LDB, * ), D( * ), E( * ) +* .. +* +* Purpose +* ======= +* +* DPTTRS solves a tridiagonal system of the form +* A * X = B +* using the L*D*L' factorization of A computed by DPTTRF. D is a +* diagonal matrix specified in the vector D, L is a unit bidiagonal +* matrix whose subdiagonal is specified in the vector E, and X and B +* are N by NRHS matrices. +* +* Arguments +* ========= +* +* N (input) INTEGER +* The order of the tridiagonal matrix A. N >= 0. +* +* NRHS (input) INTEGER +* The number of right hand sides, i.e., the number of columns +* of the matrix B. NRHS >= 0. +* +* D (input) DOUBLE PRECISION array, dimension (N) +* The n diagonal elements of the diagonal matrix D from the +* L*D*L' factorization of A. +* +* E (input) DOUBLE PRECISION array, dimension (N-1) +* The (n-1) subdiagonal elements of the unit bidiagonal factor +* L from the L*D*L' factorization of A. E can also be regarded +* as the superdiagonal of the unit bidiagonal factor U from the +* factorization A = U'*D*U. +* +* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) +* On entry, the right hand side vectors B for the system of +* linear equations. +* On exit, the solution vectors, X. +* +* LDB (input) INTEGER +* The leading dimension of the array B. LDB >= max(1,N). +* +* INFO (output) INTEGER +* = 0: successful exit +* < 0: if INFO = -k, the k-th argument had an illegal value +* +* ===================================================================== +* +* .. Local Scalars .. + INTEGER J, JB, NB +* .. +* .. External Functions .. + INTEGER ILAENV + EXTERNAL ILAENV +* .. +* .. External Subroutines .. + EXTERNAL DPTTS2, XERBLA +* .. +* .. Intrinsic Functions .. + INTRINSIC MAX, MIN +* .. +* .. Executable Statements .. +* +* Test the input arguments. +* + INFO = 0 + IF( N.LT.0 ) THEN + INFO = -1 + ELSE IF( NRHS.LT.0 ) THEN + INFO = -2 + ELSE IF( LDB.LT.MAX( 1, N ) ) THEN + INFO = -6 + END IF + IF( INFO.NE.0 ) THEN + CALL XERBLA( 'DPTTRS', -INFO ) + RETURN + END IF +* +* Quick return if possible +* + IF( N.EQ.0 .OR. NRHS.EQ.0 ) + $ RETURN +* +* Determine the number of right-hand sides to solve at a time. +* + IF( NRHS.EQ.1 ) THEN + NB = 1 + ELSE + NB = MAX( 1, ILAENV( 1, 'DPTTRS', ' ', N, NRHS, -1, -1 ) ) + END IF +* + IF( NB.GE.NRHS ) THEN + CALL DPTTS2( N, NRHS, D, E, B, LDB ) + ELSE + DO 10 J = 1, NRHS, NB + JB = MIN( NRHS-J+1, NB ) + CALL DPTTS2( N, JB, D, E, B( 1, J ), LDB ) + 10 CONTINUE + END IF +* + RETURN +* +* End of DPTTRS +* + END diff -r 9f3299378193 -r 57077d0ddc8e libcruft/lapack/dptts2.f --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libcruft/lapack/dptts2.f Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,94 @@ + SUBROUTINE DPTTS2( N, NRHS, D, E, B, LDB ) +* +* -- LAPACK routine (version 3.0) -- +* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., +* Courant Institute, Argonne National Lab, and Rice University +* June 30, 1999 +* +* .. Scalar Arguments .. + INTEGER LDB, N, NRHS +* .. +* .. Array Arguments .. + DOUBLE PRECISION B( LDB, * ), D( * ), E( * ) +* .. +* +* Purpose +* ======= +* +* DPTTS2 solves a tridiagonal system of the form +* A * X = B +* using the L*D*L' factorization of A computed by DPTTRF. D is a +* diagonal matrix specified in the vector D, L is a unit bidiagonal +* matrix whose subdiagonal is specified in the vector E, and X and B +* are N by NRHS matrices. +* +* Arguments +* ========= +* +* N (input) INTEGER +* The order of the tridiagonal matrix A. N >= 0. +* +* NRHS (input) INTEGER +* The number of right hand sides, i.e., the number of columns +* of the matrix B. NRHS >= 0. +* +* D (input) DOUBLE PRECISION array, dimension (N) +* The n diagonal elements of the diagonal matrix D from the +* L*D*L' factorization of A. +* +* E (input) DOUBLE PRECISION array, dimension (N-1) +* The (n-1) subdiagonal elements of the unit bidiagonal factor +* L from the L*D*L' factorization of A. E can also be regarded +* as the superdiagonal of the unit bidiagonal factor U from the +* factorization A = U'*D*U. +* +* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) +* On entry, the right hand side vectors B for the system of +* linear equations. +* On exit, the solution vectors, X. +* +* LDB (input) INTEGER +* The leading dimension of the array B. LDB >= max(1,N). +* +* ===================================================================== +* +* .. Local Scalars .. + INTEGER I, J +* .. +* .. External Subroutines .. + EXTERNAL DSCAL +* .. +* .. Executable Statements .. +* +* Quick return if possible +* + IF( N.LE.1 ) THEN + IF( N.EQ.1 ) + $ CALL DSCAL( NRHS, 1.D0 / D( 1 ), B, LDB ) + RETURN + END IF +* +* Solve A * X = B using the factorization A = L*D*L', +* overwriting each right hand side vector with its solution. +* + DO 30 J = 1, NRHS +* +* Solve L * x = b. +* + DO 10 I = 2, N + B( I, J ) = B( I, J ) - B( I-1, J )*E( I-1 ) + 10 CONTINUE +* +* Solve D * L' * x = b. +* + B( N, J ) = B( N, J ) / D( N ) + DO 20 I = N - 1, 1, -1 + B( I, J ) = B( I, J ) / D( I ) - B( I+1, J )*E( I ) + 20 CONTINUE + 30 CONTINUE +* + RETURN +* +* End of DPTTS2 +* + END diff -r 9f3299378193 -r 57077d0ddc8e libcruft/lapack/zgbcon.f --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libcruft/lapack/zgbcon.f Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,230 @@ + SUBROUTINE ZGBCON( NORM, N, KL, KU, AB, LDAB, IPIV, ANORM, RCOND, + $ WORK, RWORK, INFO ) +* +* -- LAPACK routine (version 3.0) -- +* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., +* Courant Institute, Argonne National Lab, and Rice University +* September 30, 1994 +* +* .. Scalar Arguments .. + CHARACTER NORM + INTEGER INFO, KL, KU, LDAB, N + DOUBLE PRECISION ANORM, RCOND +* .. +* .. Array Arguments .. + INTEGER IPIV( * ) + DOUBLE PRECISION RWORK( * ) + COMPLEX*16 AB( LDAB, * ), WORK( * ) +* .. +* +* Purpose +* ======= +* +* ZGBCON estimates the reciprocal of the condition number of a complex +* general band matrix A, in either the 1-norm or the infinity-norm, +* using the LU factorization computed by ZGBTRF. +* +* An estimate is obtained for norm(inv(A)), and the reciprocal of the +* condition number is computed as +* RCOND = 1 / ( norm(A) * norm(inv(A)) ). +* +* Arguments +* ========= +* +* NORM (input) CHARACTER*1 +* Specifies whether the 1-norm condition number or the +* infinity-norm condition number is required: +* = '1' or 'O': 1-norm; +* = 'I': Infinity-norm. +* +* N (input) INTEGER +* The order of the matrix A. N >= 0. +* +* KL (input) INTEGER +* The number of subdiagonals within the band of A. KL >= 0. +* +* KU (input) INTEGER +* The number of superdiagonals within the band of A. KU >= 0. +* +* AB (input) COMPLEX*16 array, dimension (LDAB,N) +* Details of the LU factorization of the band matrix A, as +* computed by ZGBTRF. U is stored as an upper triangular band +* matrix with KL+KU superdiagonals in rows 1 to KL+KU+1, and +* the multipliers used during the factorization are stored in +* rows KL+KU+2 to 2*KL+KU+1. +* +* LDAB (input) INTEGER +* The leading dimension of the array AB. LDAB >= 2*KL+KU+1. +* +* IPIV (input) INTEGER array, dimension (N) +* The pivot indices; for 1 <= i <= N, row i of the matrix was +* interchanged with row IPIV(i). +* +* ANORM (input) DOUBLE PRECISION +* If NORM = '1' or 'O', the 1-norm of the original matrix A. +* If NORM = 'I', the infinity-norm of the original matrix A. +* +* RCOND (output) DOUBLE PRECISION +* The reciprocal of the condition number of the matrix A, +* computed as RCOND = 1/(norm(A) * norm(inv(A))). +* +* WORK (workspace) COMPLEX*16 array, dimension (2*N) +* +* RWORK (workspace) DOUBLE PRECISION array, dimension (N) +* +* INFO (output) INTEGER +* = 0: successful exit +* < 0: if INFO = -i, the i-th argument had an illegal value +* +* ===================================================================== +* +* .. Parameters .. + DOUBLE PRECISION ONE, ZERO + PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) +* .. +* .. Local Scalars .. + LOGICAL LNOTI, ONENRM + CHARACTER NORMIN + INTEGER IX, J, JP, KASE, KASE1, KD, LM + DOUBLE PRECISION AINVNM, SCALE, SMLNUM + COMPLEX*16 T, ZDUM +* .. +* .. External Functions .. + LOGICAL LSAME + INTEGER IZAMAX + DOUBLE PRECISION DLAMCH + COMPLEX*16 ZDOTC + EXTERNAL LSAME, IZAMAX, DLAMCH, ZDOTC +* .. +* .. External Subroutines .. + EXTERNAL XERBLA, ZAXPY, ZDRSCL, ZLACON, ZLATBS +* .. +* .. Intrinsic Functions .. + INTRINSIC ABS, DBLE, DIMAG, MIN +* .. +* .. Statement Functions .. + DOUBLE PRECISION CABS1 +* .. +* .. Statement Function definitions .. + CABS1( ZDUM ) = ABS( DBLE( ZDUM ) ) + ABS( DIMAG( ZDUM ) ) +* .. +* .. Executable Statements .. +* +* Test the input parameters. +* + INFO = 0 + ONENRM = NORM.EQ.'1' .OR. LSAME( NORM, 'O' ) + IF( .NOT.ONENRM .AND. .NOT.LSAME( NORM, 'I' ) ) THEN + INFO = -1 + ELSE IF( N.LT.0 ) THEN + INFO = -2 + ELSE IF( KL.LT.0 ) THEN + INFO = -3 + ELSE IF( KU.LT.0 ) THEN + INFO = -4 + ELSE IF( LDAB.LT.2*KL+KU+1 ) THEN + INFO = -6 + ELSE IF( ANORM.LT.ZERO ) THEN + INFO = -8 + END IF + IF( INFO.NE.0 ) THEN + CALL XERBLA( 'ZGBCON', -INFO ) + RETURN + END IF +* +* Quick return if possible +* + RCOND = ZERO + IF( N.EQ.0 ) THEN + RCOND = ONE + RETURN + ELSE IF( ANORM.EQ.ZERO ) THEN + RETURN + END IF +* + SMLNUM = DLAMCH( 'Safe minimum' ) +* +* Estimate the norm of inv(A). +* + AINVNM = ZERO + NORMIN = 'N' + IF( ONENRM ) THEN + KASE1 = 1 + ELSE + KASE1 = 2 + END IF + KD = KL + KU + 1 + LNOTI = KL.GT.0 + KASE = 0 + 10 CONTINUE + CALL ZLACON( N, WORK( N+1 ), WORK, AINVNM, KASE ) + IF( KASE.NE.0 ) THEN + IF( KASE.EQ.KASE1 ) THEN +* +* Multiply by inv(L). +* + IF( LNOTI ) THEN + DO 20 J = 1, N - 1 + LM = MIN( KL, N-J ) + JP = IPIV( J ) + T = WORK( JP ) + IF( JP.NE.J ) THEN + WORK( JP ) = WORK( J ) + WORK( J ) = T + END IF + CALL ZAXPY( LM, -T, AB( KD+1, J ), 1, WORK( J+1 ), 1 ) + 20 CONTINUE + END IF +* +* Multiply by inv(U). +* + CALL ZLATBS( 'Upper', 'No transpose', 'Non-unit', NORMIN, N, + $ KL+KU, AB, LDAB, WORK, SCALE, RWORK, INFO ) + ELSE +* +* Multiply by inv(U'). +* + CALL ZLATBS( 'Upper', 'Conjugate transpose', 'Non-unit', + $ NORMIN, N, KL+KU, AB, LDAB, WORK, SCALE, RWORK, + $ INFO ) +* +* Multiply by inv(L'). +* + IF( LNOTI ) THEN + DO 30 J = N - 1, 1, -1 + LM = MIN( KL, N-J ) + WORK( J ) = WORK( J ) - ZDOTC( LM, AB( KD+1, J ), 1, + $ WORK( J+1 ), 1 ) + JP = IPIV( J ) + IF( JP.NE.J ) THEN + T = WORK( JP ) + WORK( JP ) = WORK( J ) + WORK( J ) = T + END IF + 30 CONTINUE + END IF + END IF +* +* Divide X by 1/SCALE if doing so will not cause overflow. +* + NORMIN = 'Y' + IF( SCALE.NE.ONE ) THEN + IX = IZAMAX( N, WORK, 1 ) + IF( SCALE.LT.CABS1( WORK( IX ) )*SMLNUM .OR. SCALE.EQ.ZERO ) + $ GO TO 40 + CALL ZDRSCL( N, SCALE, WORK, 1 ) + END IF + GO TO 10 + END IF +* +* Compute the estimate of the reciprocal condition number. +* + IF( AINVNM.NE.ZERO ) + $ RCOND = ( ONE / AINVNM ) / ANORM +* + 40 CONTINUE + RETURN +* +* End of ZGBCON +* + END diff -r 9f3299378193 -r 57077d0ddc8e libcruft/lapack/zgbtf2.f --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libcruft/lapack/zgbtf2.f Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,203 @@ + SUBROUTINE ZGBTF2( M, N, KL, KU, AB, LDAB, IPIV, INFO ) +* +* -- LAPACK routine (version 3.0) -- +* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., +* Courant Institute, Argonne National Lab, and Rice University +* September 30, 1994 +* +* .. Scalar Arguments .. + INTEGER INFO, KL, KU, LDAB, M, N +* .. +* .. Array Arguments .. + INTEGER IPIV( * ) + COMPLEX*16 AB( LDAB, * ) +* .. +* +* Purpose +* ======= +* +* ZGBTF2 computes an LU factorization of a complex m-by-n band matrix +* A using partial pivoting with row interchanges. +* +* This is the unblocked version of the algorithm, calling Level 2 BLAS. +* +* Arguments +* ========= +* +* M (input) INTEGER +* The number of rows of the matrix A. M >= 0. +* +* N (input) INTEGER +* The number of columns of the matrix A. N >= 0. +* +* KL (input) INTEGER +* The number of subdiagonals within the band of A. KL >= 0. +* +* KU (input) INTEGER +* The number of superdiagonals within the band of A. KU >= 0. +* +* AB (input/output) COMPLEX*16 array, dimension (LDAB,N) +* On entry, the matrix A in band storage, in rows KL+1 to +* 2*KL+KU+1; rows 1 to KL of the array need not be set. +* The j-th column of A is stored in the j-th column of the +* array AB as follows: +* AB(kl+ku+1+i-j,j) = A(i,j) for max(1,j-ku)<=i<=min(m,j+kl) +* +* On exit, details of the factorization: U is stored as an +* upper triangular band matrix with KL+KU superdiagonals in +* rows 1 to KL+KU+1, and the multipliers used during the +* factorization are stored in rows KL+KU+2 to 2*KL+KU+1. +* See below for further details. +* +* LDAB (input) INTEGER +* The leading dimension of the array AB. LDAB >= 2*KL+KU+1. +* +* IPIV (output) INTEGER array, dimension (min(M,N)) +* The pivot indices; for 1 <= i <= min(M,N), row i of the +* matrix was interchanged with row IPIV(i). +* +* INFO (output) INTEGER +* = 0: successful exit +* < 0: if INFO = -i, the i-th argument had an illegal value +* > 0: if INFO = +i, U(i,i) is exactly zero. The factorization +* has been completed, but the factor U is exactly +* singular, and division by zero will occur if it is used +* to solve a system of equations. +* +* Further Details +* =============== +* +* The band storage scheme is illustrated by the following example, when +* M = N = 6, KL = 2, KU = 1: +* +* On entry: On exit: +* +* * * * + + + * * * u14 u25 u36 +* * * + + + + * * u13 u24 u35 u46 +* * a12 a23 a34 a45 a56 * u12 u23 u34 u45 u56 +* a11 a22 a33 a44 a55 a66 u11 u22 u33 u44 u55 u66 +* a21 a32 a43 a54 a65 * m21 m32 m43 m54 m65 * +* a31 a42 a53 a64 * * m31 m42 m53 m64 * * +* +* Array elements marked * are not used by the routine; elements marked +* + need not be set on entry, but are required by the routine to store +* elements of U, because of fill-in resulting from the row +* interchanges. +* +* ===================================================================== +* +* .. Parameters .. + COMPLEX*16 ONE, ZERO + PARAMETER ( ONE = ( 1.0D+0, 0.0D+0 ), + $ ZERO = ( 0.0D+0, 0.0D+0 ) ) +* .. +* .. Local Scalars .. + INTEGER I, J, JP, JU, KM, KV +* .. +* .. External Functions .. + INTEGER IZAMAX + EXTERNAL IZAMAX +* .. +* .. External Subroutines .. + EXTERNAL XERBLA, ZGERU, ZSCAL, ZSWAP +* .. +* .. Intrinsic Functions .. + INTRINSIC MAX, MIN +* .. +* .. Executable Statements .. +* +* KV is the number of superdiagonals in the factor U, allowing for +* fill-in. +* + KV = KU + KL +* +* Test the input parameters. +* + INFO = 0 + IF( M.LT.0 ) THEN + INFO = -1 + ELSE IF( N.LT.0 ) THEN + INFO = -2 + ELSE IF( KL.LT.0 ) THEN + INFO = -3 + ELSE IF( KU.LT.0 ) THEN + INFO = -4 + ELSE IF( LDAB.LT.KL+KV+1 ) THEN + INFO = -6 + END IF + IF( INFO.NE.0 ) THEN + CALL XERBLA( 'ZGBTF2', -INFO ) + RETURN + END IF +* +* Quick return if possible +* + IF( M.EQ.0 .OR. N.EQ.0 ) + $ RETURN +* +* Gaussian elimination with partial pivoting +* +* Set fill-in elements in columns KU+2 to KV to zero. +* + DO 20 J = KU + 2, MIN( KV, N ) + DO 10 I = KV - J + 2, KL + AB( I, J ) = ZERO + 10 CONTINUE + 20 CONTINUE +* +* JU is the index of the last column affected by the current stage +* of the factorization. +* + JU = 1 +* + DO 40 J = 1, MIN( M, N ) +* +* Set fill-in elements in column J+KV to zero. +* + IF( J+KV.LE.N ) THEN + DO 30 I = 1, KL + AB( I, J+KV ) = ZERO + 30 CONTINUE + END IF +* +* Find pivot and test for singularity. KM is the number of +* subdiagonal elements in the current column. +* + KM = MIN( KL, M-J ) + JP = IZAMAX( KM+1, AB( KV+1, J ), 1 ) + IPIV( J ) = JP + J - 1 + IF( AB( KV+JP, J ).NE.ZERO ) THEN + JU = MAX( JU, MIN( J+KU+JP-1, N ) ) +* +* Apply interchange to columns J to JU. +* + IF( JP.NE.1 ) + $ CALL ZSWAP( JU-J+1, AB( KV+JP, J ), LDAB-1, + $ AB( KV+1, J ), LDAB-1 ) + IF( KM.GT.0 ) THEN +* +* Compute multipliers. +* + CALL ZSCAL( KM, ONE / AB( KV+1, J ), AB( KV+2, J ), 1 ) +* +* Update trailing submatrix within the band. +* + IF( JU.GT.J ) + $ CALL ZGERU( KM, JU-J, -ONE, AB( KV+2, J ), 1, + $ AB( KV, J+1 ), LDAB-1, AB( KV+1, J+1 ), + $ LDAB-1 ) + END IF + ELSE +* +* If pivot is zero, set INFO to the index of the pivot +* unless a zero pivot has already been found. +* + IF( INFO.EQ.0 ) + $ INFO = J + END IF + 40 CONTINUE + RETURN +* +* End of ZGBTF2 +* + END diff -r 9f3299378193 -r 57077d0ddc8e libcruft/lapack/zgbtrf.f --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libcruft/lapack/zgbtrf.f Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,443 @@ + SUBROUTINE ZGBTRF( M, N, KL, KU, AB, LDAB, IPIV, INFO ) +* +* -- LAPACK routine (version 3.0) -- +* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., +* Courant Institute, Argonne National Lab, and Rice University +* September 30, 1994 +* +* .. Scalar Arguments .. + INTEGER INFO, KL, KU, LDAB, M, N +* .. +* .. Array Arguments .. + INTEGER IPIV( * ) + COMPLEX*16 AB( LDAB, * ) +* .. +* +* Purpose +* ======= +* +* ZGBTRF computes an LU factorization of a complex m-by-n band matrix A +* using partial pivoting with row interchanges. +* +* This is the blocked version of the algorithm, calling Level 3 BLAS. +* +* Arguments +* ========= +* +* M (input) INTEGER +* The number of rows of the matrix A. M >= 0. +* +* N (input) INTEGER +* The number of columns of the matrix A. N >= 0. +* +* KL (input) INTEGER +* The number of subdiagonals within the band of A. KL >= 0. +* +* KU (input) INTEGER +* The number of superdiagonals within the band of A. KU >= 0. +* +* AB (input/output) COMPLEX*16 array, dimension (LDAB,N) +* On entry, the matrix A in band storage, in rows KL+1 to +* 2*KL+KU+1; rows 1 to KL of the array need not be set. +* The j-th column of A is stored in the j-th column of the +* array AB as follows: +* AB(kl+ku+1+i-j,j) = A(i,j) for max(1,j-ku)<=i<=min(m,j+kl) +* +* On exit, details of the factorization: U is stored as an +* upper triangular band matrix with KL+KU superdiagonals in +* rows 1 to KL+KU+1, and the multipliers used during the +* factorization are stored in rows KL+KU+2 to 2*KL+KU+1. +* See below for further details. +* +* LDAB (input) INTEGER +* The leading dimension of the array AB. LDAB >= 2*KL+KU+1. +* +* IPIV (output) INTEGER array, dimension (min(M,N)) +* The pivot indices; for 1 <= i <= min(M,N), row i of the +* matrix was interchanged with row IPIV(i). +* +* INFO (output) INTEGER +* = 0: successful exit +* < 0: if INFO = -i, the i-th argument had an illegal value +* > 0: if INFO = +i, U(i,i) is exactly zero. The factorization +* has been completed, but the factor U is exactly +* singular, and division by zero will occur if it is used +* to solve a system of equations. +* +* Further Details +* =============== +* +* The band storage scheme is illustrated by the following example, when +* M = N = 6, KL = 2, KU = 1: +* +* On entry: On exit: +* +* * * * + + + * * * u14 u25 u36 +* * * + + + + * * u13 u24 u35 u46 +* * a12 a23 a34 a45 a56 * u12 u23 u34 u45 u56 +* a11 a22 a33 a44 a55 a66 u11 u22 u33 u44 u55 u66 +* a21 a32 a43 a54 a65 * m21 m32 m43 m54 m65 * +* a31 a42 a53 a64 * * m31 m42 m53 m64 * * +* +* Array elements marked * are not used by the routine; elements marked +* + need not be set on entry, but are required by the routine to store +* elements of U because of fill-in resulting from the row interchanges. +* +* ===================================================================== +* +* .. Parameters .. + COMPLEX*16 ONE, ZERO + PARAMETER ( ONE = ( 1.0D+0, 0.0D+0 ), + $ ZERO = ( 0.0D+0, 0.0D+0 ) ) + INTEGER NBMAX, LDWORK + PARAMETER ( NBMAX = 64, LDWORK = NBMAX+1 ) +* .. +* .. Local Scalars .. + INTEGER I, I2, I3, II, IP, J, J2, J3, JB, JJ, JM, JP, + $ JU, K2, KM, KV, NB, NW + COMPLEX*16 TEMP +* .. +* .. Local Arrays .. + COMPLEX*16 WORK13( LDWORK, NBMAX ), + $ WORK31( LDWORK, NBMAX ) +* .. +* .. External Functions .. + INTEGER ILAENV, IZAMAX + EXTERNAL ILAENV, IZAMAX +* .. +* .. External Subroutines .. + EXTERNAL XERBLA, ZCOPY, ZGBTF2, ZGEMM, ZGERU, ZLASWP, + $ ZSCAL, ZSWAP, ZTRSM +* .. +* .. Intrinsic Functions .. + INTRINSIC MAX, MIN +* .. +* .. Executable Statements .. +* +* KV is the number of superdiagonals in the factor U, allowing for +* fill-in +* + KV = KU + KL +* +* Test the input parameters. +* + INFO = 0 + IF( M.LT.0 ) THEN + INFO = -1 + ELSE IF( N.LT.0 ) THEN + INFO = -2 + ELSE IF( KL.LT.0 ) THEN + INFO = -3 + ELSE IF( KU.LT.0 ) THEN + INFO = -4 + ELSE IF( LDAB.LT.KL+KV+1 ) THEN + INFO = -6 + END IF + IF( INFO.NE.0 ) THEN + CALL XERBLA( 'ZGBTRF', -INFO ) + RETURN + END IF +* +* Quick return if possible +* + IF( M.EQ.0 .OR. N.EQ.0 ) + $ RETURN +* +* Determine the block size for this environment +* + NB = ILAENV( 1, 'ZGBTRF', ' ', M, N, KL, KU ) +* +* The block size must not exceed the limit set by the size of the +* local arrays WORK13 and WORK31. +* + NB = MIN( NB, NBMAX ) +* + IF( NB.LE.1 .OR. NB.GT.KL ) THEN +* +* Use unblocked code +* + CALL ZGBTF2( M, N, KL, KU, AB, LDAB, IPIV, INFO ) + ELSE +* +* Use blocked code +* +* Zero the superdiagonal elements of the work array WORK13 +* + DO 20 J = 1, NB + DO 10 I = 1, J - 1 + WORK13( I, J ) = ZERO + 10 CONTINUE + 20 CONTINUE +* +* Zero the subdiagonal elements of the work array WORK31 +* + DO 40 J = 1, NB + DO 30 I = J + 1, NB + WORK31( I, J ) = ZERO + 30 CONTINUE + 40 CONTINUE +* +* Gaussian elimination with partial pivoting +* +* Set fill-in elements in columns KU+2 to KV to zero +* + DO 60 J = KU + 2, MIN( KV, N ) + DO 50 I = KV - J + 2, KL + AB( I, J ) = ZERO + 50 CONTINUE + 60 CONTINUE +* +* JU is the index of the last column affected by the current +* stage of the factorization +* + JU = 1 +* + DO 180 J = 1, MIN( M, N ), NB + JB = MIN( NB, MIN( M, N )-J+1 ) +* +* The active part of the matrix is partitioned +* +* A11 A12 A13 +* A21 A22 A23 +* A31 A32 A33 +* +* Here A11, A21 and A31 denote the current block of JB columns +* which is about to be factorized. The number of rows in the +* partitioning are JB, I2, I3 respectively, and the numbers +* of columns are JB, J2, J3. The superdiagonal elements of A13 +* and the subdiagonal elements of A31 lie outside the band. +* + I2 = MIN( KL-JB, M-J-JB+1 ) + I3 = MIN( JB, M-J-KL+1 ) +* +* J2 and J3 are computed after JU has been updated. +* +* Factorize the current block of JB columns +* + DO 80 JJ = J, J + JB - 1 +* +* Set fill-in elements in column JJ+KV to zero +* + IF( JJ+KV.LE.N ) THEN + DO 70 I = 1, KL + AB( I, JJ+KV ) = ZERO + 70 CONTINUE + END IF +* +* Find pivot and test for singularity. KM is the number of +* subdiagonal elements in the current column. +* + KM = MIN( KL, M-JJ ) + JP = IZAMAX( KM+1, AB( KV+1, JJ ), 1 ) + IPIV( JJ ) = JP + JJ - J + IF( AB( KV+JP, JJ ).NE.ZERO ) THEN + JU = MAX( JU, MIN( JJ+KU+JP-1, N ) ) + IF( JP.NE.1 ) THEN +* +* Apply interchange to columns J to J+JB-1 +* + IF( JP+JJ-1.LT.J+KL ) THEN +* + CALL ZSWAP( JB, AB( KV+1+JJ-J, J ), LDAB-1, + $ AB( KV+JP+JJ-J, J ), LDAB-1 ) + ELSE +* +* The interchange affects columns J to JJ-1 of A31 +* which are stored in the work array WORK31 +* + CALL ZSWAP( JJ-J, AB( KV+1+JJ-J, J ), LDAB-1, + $ WORK31( JP+JJ-J-KL, 1 ), LDWORK ) + CALL ZSWAP( J+JB-JJ, AB( KV+1, JJ ), LDAB-1, + $ AB( KV+JP, JJ ), LDAB-1 ) + END IF + END IF +* +* Compute multipliers +* + CALL ZSCAL( KM, ONE / AB( KV+1, JJ ), AB( KV+2, JJ ), + $ 1 ) +* +* Update trailing submatrix within the band and within +* the current block. JM is the index of the last column +* which needs to be updated. +* + JM = MIN( JU, J+JB-1 ) + IF( JM.GT.JJ ) + $ CALL ZGERU( KM, JM-JJ, -ONE, AB( KV+2, JJ ), 1, + $ AB( KV, JJ+1 ), LDAB-1, + $ AB( KV+1, JJ+1 ), LDAB-1 ) + ELSE +* +* If pivot is zero, set INFO to the index of the pivot +* unless a zero pivot has already been found. +* + IF( INFO.EQ.0 ) + $ INFO = JJ + END IF +* +* Copy current column of A31 into the work array WORK31 +* + NW = MIN( JJ-J+1, I3 ) + IF( NW.GT.0 ) + $ CALL ZCOPY( NW, AB( KV+KL+1-JJ+J, JJ ), 1, + $ WORK31( 1, JJ-J+1 ), 1 ) + 80 CONTINUE + IF( J+JB.LE.N ) THEN +* +* Apply the row interchanges to the other blocks. +* + J2 = MIN( JU-J+1, KV ) - JB + J3 = MAX( 0, JU-J-KV+1 ) +* +* Use ZLASWP to apply the row interchanges to A12, A22, and +* A32. +* + CALL ZLASWP( J2, AB( KV+1-JB, J+JB ), LDAB-1, 1, JB, + $ IPIV( J ), 1 ) +* +* Adjust the pivot indices. +* + DO 90 I = J, J + JB - 1 + IPIV( I ) = IPIV( I ) + J - 1 + 90 CONTINUE +* +* Apply the row interchanges to A13, A23, and A33 +* columnwise. +* + K2 = J - 1 + JB + J2 + DO 110 I = 1, J3 + JJ = K2 + I + DO 100 II = J + I - 1, J + JB - 1 + IP = IPIV( II ) + IF( IP.NE.II ) THEN + TEMP = AB( KV+1+II-JJ, JJ ) + AB( KV+1+II-JJ, JJ ) = AB( KV+1+IP-JJ, JJ ) + AB( KV+1+IP-JJ, JJ ) = TEMP + END IF + 100 CONTINUE + 110 CONTINUE +* +* Update the relevant part of the trailing submatrix +* + IF( J2.GT.0 ) THEN +* +* Update A12 +* + CALL ZTRSM( 'Left', 'Lower', 'No transpose', 'Unit', + $ JB, J2, ONE, AB( KV+1, J ), LDAB-1, + $ AB( KV+1-JB, J+JB ), LDAB-1 ) +* + IF( I2.GT.0 ) THEN +* +* Update A22 +* + CALL ZGEMM( 'No transpose', 'No transpose', I2, J2, + $ JB, -ONE, AB( KV+1+JB, J ), LDAB-1, + $ AB( KV+1-JB, J+JB ), LDAB-1, ONE, + $ AB( KV+1, J+JB ), LDAB-1 ) + END IF +* + IF( I3.GT.0 ) THEN +* +* Update A32 +* + CALL ZGEMM( 'No transpose', 'No transpose', I3, J2, + $ JB, -ONE, WORK31, LDWORK, + $ AB( KV+1-JB, J+JB ), LDAB-1, ONE, + $ AB( KV+KL+1-JB, J+JB ), LDAB-1 ) + END IF + END IF +* + IF( J3.GT.0 ) THEN +* +* Copy the lower triangle of A13 into the work array +* WORK13 +* + DO 130 JJ = 1, J3 + DO 120 II = JJ, JB + WORK13( II, JJ ) = AB( II-JJ+1, JJ+J+KV-1 ) + 120 CONTINUE + 130 CONTINUE +* +* Update A13 in the work array +* + CALL ZTRSM( 'Left', 'Lower', 'No transpose', 'Unit', + $ JB, J3, ONE, AB( KV+1, J ), LDAB-1, + $ WORK13, LDWORK ) +* + IF( I2.GT.0 ) THEN +* +* Update A23 +* + CALL ZGEMM( 'No transpose', 'No transpose', I2, J3, + $ JB, -ONE, AB( KV+1+JB, J ), LDAB-1, + $ WORK13, LDWORK, ONE, AB( 1+JB, J+KV ), + $ LDAB-1 ) + END IF +* + IF( I3.GT.0 ) THEN +* +* Update A33 +* + CALL ZGEMM( 'No transpose', 'No transpose', I3, J3, + $ JB, -ONE, WORK31, LDWORK, WORK13, + $ LDWORK, ONE, AB( 1+KL, J+KV ), LDAB-1 ) + END IF +* +* Copy the lower triangle of A13 back into place +* + DO 150 JJ = 1, J3 + DO 140 II = JJ, JB + AB( II-JJ+1, JJ+J+KV-1 ) = WORK13( II, JJ ) + 140 CONTINUE + 150 CONTINUE + END IF + ELSE +* +* Adjust the pivot indices. +* + DO 160 I = J, J + JB - 1 + IPIV( I ) = IPIV( I ) + J - 1 + 160 CONTINUE + END IF +* +* Partially undo the interchanges in the current block to +* restore the upper triangular form of A31 and copy the upper +* triangle of A31 back into place +* + DO 170 JJ = J + JB - 1, J, -1 + JP = IPIV( JJ ) - JJ + 1 + IF( JP.NE.1 ) THEN +* +* Apply interchange to columns J to JJ-1 +* + IF( JP+JJ-1.LT.J+KL ) THEN +* +* The interchange does not affect A31 +* + CALL ZSWAP( JJ-J, AB( KV+1+JJ-J, J ), LDAB-1, + $ AB( KV+JP+JJ-J, J ), LDAB-1 ) + ELSE +* +* The interchange does affect A31 +* + CALL ZSWAP( JJ-J, AB( KV+1+JJ-J, J ), LDAB-1, + $ WORK31( JP+JJ-J-KL, 1 ), LDWORK ) + END IF + END IF +* +* Copy the current column of A31 back into place +* + NW = MIN( I3, JJ-J+1 ) + IF( NW.GT.0 ) + $ CALL ZCOPY( NW, WORK31( 1, JJ-J+1 ), 1, + $ AB( KV+KL+1-JJ+J, JJ ), 1 ) + 170 CONTINUE + 180 CONTINUE + END IF +* + RETURN +* +* End of ZGBTRF +* + END diff -r 9f3299378193 -r 57077d0ddc8e libcruft/lapack/zgbtrs.f --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libcruft/lapack/zgbtrs.f Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,215 @@ + SUBROUTINE ZGBTRS( TRANS, N, KL, KU, NRHS, AB, LDAB, IPIV, B, LDB, + $ INFO ) +* +* -- LAPACK routine (version 3.0) -- +* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., +* Courant Institute, Argonne National Lab, and Rice University +* September 30, 1994 +* +* .. Scalar Arguments .. + CHARACTER TRANS + INTEGER INFO, KL, KU, LDAB, LDB, N, NRHS +* .. +* .. Array Arguments .. + INTEGER IPIV( * ) + COMPLEX*16 AB( LDAB, * ), B( LDB, * ) +* .. +* +* Purpose +* ======= +* +* ZGBTRS solves a system of linear equations +* A * X = B, A**T * X = B, or A**H * X = B +* with a general band matrix A using the LU factorization computed +* by ZGBTRF. +* +* Arguments +* ========= +* +* TRANS (input) CHARACTER*1 +* Specifies the form of the system of equations. +* = 'N': A * X = B (No transpose) +* = 'T': A**T * X = B (Transpose) +* = 'C': A**H * X = B (Conjugate transpose) +* +* N (input) INTEGER +* The order of the matrix A. N >= 0. +* +* KL (input) INTEGER +* The number of subdiagonals within the band of A. KL >= 0. +* +* KU (input) INTEGER +* The number of superdiagonals within the band of A. KU >= 0. +* +* NRHS (input) INTEGER +* The number of right hand sides, i.e., the number of columns +* of the matrix B. NRHS >= 0. +* +* AB (input) COMPLEX*16 array, dimension (LDAB,N) +* Details of the LU factorization of the band matrix A, as +* computed by ZGBTRF. U is stored as an upper triangular band +* matrix with KL+KU superdiagonals in rows 1 to KL+KU+1, and +* the multipliers used during the factorization are stored in +* rows KL+KU+2 to 2*KL+KU+1. +* +* LDAB (input) INTEGER +* The leading dimension of the array AB. LDAB >= 2*KL+KU+1. +* +* IPIV (input) INTEGER array, dimension (N) +* The pivot indices; for 1 <= i <= N, row i of the matrix was +* interchanged with row IPIV(i). +* +* B (input/output) COMPLEX*16 array, dimension (LDB,NRHS) +* On entry, the right hand side matrix B. +* On exit, the solution matrix X. +* +* LDB (input) INTEGER +* The leading dimension of the array B. LDB >= max(1,N). +* +* INFO (output) INTEGER +* = 0: successful exit +* < 0: if INFO = -i, the i-th argument had an illegal value +* +* ===================================================================== +* +* .. Parameters .. + COMPLEX*16 ONE + PARAMETER ( ONE = ( 1.0D+0, 0.0D+0 ) ) +* .. +* .. Local Scalars .. + LOGICAL LNOTI, NOTRAN + INTEGER I, J, KD, L, LM +* .. +* .. External Functions .. + LOGICAL LSAME + EXTERNAL LSAME +* .. +* .. External Subroutines .. + EXTERNAL XERBLA, ZGEMV, ZGERU, ZLACGV, ZSWAP, ZTBSV +* .. +* .. Intrinsic Functions .. + INTRINSIC MAX, MIN +* .. +* .. Executable Statements .. +* +* Test the input parameters. +* + INFO = 0 + NOTRAN = LSAME( TRANS, 'N' ) + IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) .AND. .NOT. + $ LSAME( TRANS, 'C' ) ) THEN + INFO = -1 + ELSE IF( N.LT.0 ) THEN + INFO = -2 + ELSE IF( KL.LT.0 ) THEN + INFO = -3 + ELSE IF( KU.LT.0 ) THEN + INFO = -4 + ELSE IF( NRHS.LT.0 ) THEN + INFO = -5 + ELSE IF( LDAB.LT.( 2*KL+KU+1 ) ) THEN + INFO = -7 + ELSE IF( LDB.LT.MAX( 1, N ) ) THEN + INFO = -10 + END IF + IF( INFO.NE.0 ) THEN + CALL XERBLA( 'ZGBTRS', -INFO ) + RETURN + END IF +* +* Quick return if possible +* + IF( N.EQ.0 .OR. NRHS.EQ.0 ) + $ RETURN +* + KD = KU + KL + 1 + LNOTI = KL.GT.0 +* + IF( NOTRAN ) THEN +* +* Solve A*X = B. +* +* Solve L*X = B, overwriting B with X. +* +* L is represented as a product of permutations and unit lower +* triangular matrices L = P(1) * L(1) * ... * P(n-1) * L(n-1), +* where each transformation L(i) is a rank-one modification of +* the identity matrix. +* + IF( LNOTI ) THEN + DO 10 J = 1, N - 1 + LM = MIN( KL, N-J ) + L = IPIV( J ) + IF( L.NE.J ) + $ CALL ZSWAP( NRHS, B( L, 1 ), LDB, B( J, 1 ), LDB ) + CALL ZGERU( LM, NRHS, -ONE, AB( KD+1, J ), 1, B( J, 1 ), + $ LDB, B( J+1, 1 ), LDB ) + 10 CONTINUE + END IF +* + DO 20 I = 1, NRHS +* +* Solve U*X = B, overwriting B with X. +* + CALL ZTBSV( 'Upper', 'No transpose', 'Non-unit', N, KL+KU, + $ AB, LDAB, B( 1, I ), 1 ) + 20 CONTINUE +* + ELSE IF( LSAME( TRANS, 'T' ) ) THEN +* +* Solve A**T * X = B. +* + DO 30 I = 1, NRHS +* +* Solve U**T * X = B, overwriting B with X. +* + CALL ZTBSV( 'Upper', 'Transpose', 'Non-unit', N, KL+KU, AB, + $ LDAB, B( 1, I ), 1 ) + 30 CONTINUE +* +* Solve L**T * X = B, overwriting B with X. +* + IF( LNOTI ) THEN + DO 40 J = N - 1, 1, -1 + LM = MIN( KL, N-J ) + CALL ZGEMV( 'Transpose', LM, NRHS, -ONE, B( J+1, 1 ), + $ LDB, AB( KD+1, J ), 1, ONE, B( J, 1 ), LDB ) + L = IPIV( J ) + IF( L.NE.J ) + $ CALL ZSWAP( NRHS, B( L, 1 ), LDB, B( J, 1 ), LDB ) + 40 CONTINUE + END IF +* + ELSE +* +* Solve A**H * X = B. +* + DO 50 I = 1, NRHS +* +* Solve U**H * X = B, overwriting B with X. +* + CALL ZTBSV( 'Upper', 'Conjugate transpose', 'Non-unit', N, + $ KL+KU, AB, LDAB, B( 1, I ), 1 ) + 50 CONTINUE +* +* Solve L**H * X = B, overwriting B with X. +* + IF( LNOTI ) THEN + DO 60 J = N - 1, 1, -1 + LM = MIN( KL, N-J ) + CALL ZLACGV( NRHS, B( J, 1 ), LDB ) + CALL ZGEMV( 'Conjugate transpose', LM, NRHS, -ONE, + $ B( J+1, 1 ), LDB, AB( KD+1, J ), 1, ONE, + $ B( J, 1 ), LDB ) + CALL ZLACGV( NRHS, B( J, 1 ), LDB ) + L = IPIV( J ) + IF( L.NE.J ) + $ CALL ZSWAP( NRHS, B( L, 1 ), LDB, B( J, 1 ), LDB ) + 60 CONTINUE + END IF + END IF + RETURN +* +* End of ZGBTRS +* + END diff -r 9f3299378193 -r 57077d0ddc8e libcruft/lapack/zgtsv.f --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libcruft/lapack/zgtsv.f Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,174 @@ + SUBROUTINE ZGTSV( N, NRHS, DL, D, DU, B, LDB, INFO ) +* +* -- LAPACK routine (version 3.0) -- +* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., +* Courant Institute, Argonne National Lab, and Rice University +* September 30, 1994 +* +* .. Scalar Arguments .. + INTEGER INFO, LDB, N, NRHS +* .. +* .. Array Arguments .. + COMPLEX*16 B( LDB, * ), D( * ), DL( * ), DU( * ) +* .. +* +* Purpose +* ======= +* +* ZGTSV solves the equation +* +* A*X = B, +* +* where A is an N-by-N tridiagonal matrix, by Gaussian elimination with +* partial pivoting. +* +* Note that the equation A'*X = B may be solved by interchanging the +* order of the arguments DU and DL. +* +* Arguments +* ========= +* +* N (input) INTEGER +* The order of the matrix A. N >= 0. +* +* NRHS (input) INTEGER +* The number of right hand sides, i.e., the number of columns +* of the matrix B. NRHS >= 0. +* +* DL (input/output) COMPLEX*16 array, dimension (N-1) +* On entry, DL must contain the (n-1) subdiagonal elements of +* A. +* On exit, DL is overwritten by the (n-2) elements of the +* second superdiagonal of the upper triangular matrix U from +* the LU factorization of A, in DL(1), ..., DL(n-2). +* +* D (input/output) COMPLEX*16 array, dimension (N) +* On entry, D must contain the diagonal elements of A. +* On exit, D is overwritten by the n diagonal elements of U. +* +* DU (input/output) COMPLEX*16 array, dimension (N-1) +* On entry, DU must contain the (n-1) superdiagonal elements +* of A. +* On exit, DU is overwritten by the (n-1) elements of the first +* superdiagonal of U. +* +* B (input/output) COMPLEX*16 array, dimension (LDB,NRHS) +* On entry, the N-by-NRHS right hand side matrix B. +* On exit, if INFO = 0, the N-by-NRHS solution matrix X. +* +* LDB (input) INTEGER +* The leading dimension of the array B. LDB >= max(1,N). +* +* INFO (output) INTEGER +* = 0: successful exit +* < 0: if INFO = -i, the i-th argument had an illegal value +* > 0: if INFO = i, U(i,i) is exactly zero, and the solution +* has not been computed. The factorization has not been +* completed unless i = N. +* +* ===================================================================== +* +* .. Parameters .. + COMPLEX*16 ZERO + PARAMETER ( ZERO = ( 0.0D+0, 0.0D+0 ) ) +* .. +* .. Local Scalars .. + INTEGER J, K + COMPLEX*16 MULT, TEMP, ZDUM +* .. +* .. Intrinsic Functions .. + INTRINSIC ABS, DBLE, DIMAG, MAX +* .. +* .. External Subroutines .. + EXTERNAL XERBLA +* .. +* .. Statement Functions .. + DOUBLE PRECISION CABS1 +* .. +* .. Statement Function definitions .. + CABS1( ZDUM ) = ABS( DBLE( ZDUM ) ) + ABS( DIMAG( ZDUM ) ) +* .. +* .. Executable Statements .. +* + INFO = 0 + IF( N.LT.0 ) THEN + INFO = -1 + ELSE IF( NRHS.LT.0 ) THEN + INFO = -2 + ELSE IF( LDB.LT.MAX( 1, N ) ) THEN + INFO = -7 + END IF + IF( INFO.NE.0 ) THEN + CALL XERBLA( 'ZGTSV ', -INFO ) + RETURN + END IF +* + IF( N.EQ.0 ) + $ RETURN +* + DO 30 K = 1, N - 1 + IF( DL( K ).EQ.ZERO ) THEN +* +* Subdiagonal is zero, no elimination is required. +* + IF( D( K ).EQ.ZERO ) THEN +* +* Diagonal is zero: set INFO = K and return; a unique +* solution can not be found. +* + INFO = K + RETURN + END IF + ELSE IF( CABS1( D( K ) ).GE.CABS1( DL( K ) ) ) THEN +* +* No row interchange required +* + MULT = DL( K ) / D( K ) + D( K+1 ) = D( K+1 ) - MULT*DU( K ) + DO 10 J = 1, NRHS + B( K+1, J ) = B( K+1, J ) - MULT*B( K, J ) + 10 CONTINUE + IF( K.LT.( N-1 ) ) + $ DL( K ) = ZERO + ELSE +* +* Interchange rows K and K+1 +* + MULT = D( K ) / DL( K ) + D( K ) = DL( K ) + TEMP = D( K+1 ) + D( K+1 ) = DU( K ) - MULT*TEMP + IF( K.LT.( N-1 ) ) THEN + DL( K ) = DU( K+1 ) + DU( K+1 ) = -MULT*DL( K ) + END IF + DU( K ) = TEMP + DO 20 J = 1, NRHS + TEMP = B( K, J ) + B( K, J ) = B( K+1, J ) + B( K+1, J ) = TEMP - MULT*B( K+1, J ) + 20 CONTINUE + END IF + 30 CONTINUE + IF( D( N ).EQ.ZERO ) THEN + INFO = N + RETURN + END IF +* +* Back solve with the matrix U from the factorization. +* + DO 50 J = 1, NRHS + B( N, J ) = B( N, J ) / D( N ) + IF( N.GT.1 ) + $ B( N-1, J ) = ( B( N-1, J )-DU( N-1 )*B( N, J ) ) / D( N-1 ) + DO 40 K = N - 2, 1, -1 + B( K, J ) = ( B( K, J )-DU( K )*B( K+1, J )-DL( K )* + $ B( K+2, J ) ) / D( K ) + 40 CONTINUE + 50 CONTINUE +* + RETURN +* +* End of ZGTSV +* + END diff -r 9f3299378193 -r 57077d0ddc8e libcruft/lapack/zgttrf.f --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libcruft/lapack/zgttrf.f Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,155 @@ + SUBROUTINE ZGTTRF( N, DL, D, DU, DU2, IPIV, INFO ) +* +* -- LAPACK routine (version 2.0) -- +* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., +* Courant Institute, Argonne National Lab, and Rice University +* September 30, 1994 +* +* .. Scalar Arguments .. + INTEGER INFO, N +* .. +* .. Array Arguments .. + INTEGER IPIV( * ) + COMPLEX*16 D( * ), DL( * ), DU( * ), DU2( * ) +* .. +* +* Purpose +* ======= +* +* ZGTTRF computes an LU factorization of a complex tridiagonal matrix A +* using elimination with partial pivoting and row interchanges. +* +* The factorization has the form +* A = L * U +* where L is a product of permutation and unit lower bidiagonal +* matrices and U is upper triangular with nonzeros in only the main +* diagonal and first two superdiagonals. +* +* Arguments +* ========= +* +* N (input) INTEGER +* The order of the matrix A. N >= 0. +* +* DL (input/output) COMPLEX*16 array, dimension (N-1) +* On entry, DL must contain the (n-1) subdiagonal elements of +* A. +* On exit, DL is overwritten by the (n-1) multipliers that +* define the matrix L from the LU factorization of A. +* +* D (input/output) COMPLEX*16 array, dimension (N) +* On entry, D must contain the diagonal elements of A. +* On exit, D is overwritten by the n diagonal elements of the +* upper triangular matrix U from the LU factorization of A. +* +* DU (input/output) COMPLEX*16 array, dimension (N-1) +* On entry, DU must contain the (n-1) superdiagonal elements +* of A. +* On exit, DU is overwritten by the (n-1) elements of the first +* superdiagonal of U. +* +* DU2 (output) COMPLEX*16 array, dimension (N-2) +* On exit, DU2 is overwritten by the (n-2) elements of the +* second superdiagonal of U. +* +* IPIV (output) INTEGER array, dimension (N) +* The pivot indices; for 1 <= i <= n, row i of the matrix was +* interchanged with row IPIV(i). IPIV(i) will always be either +* i or i+1; IPIV(i) = i indicates a row interchange was not +* required. +* +* INFO (output) INTEGER +* = 0: successful exit +* < 0: if INFO = -i, the i-th argument had an illegal value +* > 0: if INFO = i, U(i,i) is exactly zero. The factorization +* has been completed, but the factor U is exactly +* singular, and division by zero will occur if it is used +* to solve a system of equations. +* +* ===================================================================== +* +* .. Local Scalars .. + INTEGER I + COMPLEX*16 FACT, TEMP, ZDUM +* .. +* .. Intrinsic Functions .. + INTRINSIC ABS, DBLE, DIMAG +* .. +* .. External Subroutines .. + EXTERNAL XERBLA +* .. +* .. Parameters .. + COMPLEX*16 CZERO + PARAMETER ( CZERO = ( 0.0D+0, 0.0D+0 ) ) +* .. +* .. Statement Functions .. + DOUBLE PRECISION CABS1 +* .. +* .. Statement Function definitions .. + CABS1( ZDUM ) = ABS( DBLE( ZDUM ) ) + ABS( DIMAG( ZDUM ) ) +* .. +* .. Executable Statements .. +* + INFO = 0 + IF( N.LT.0 ) THEN + INFO = -1 + CALL XERBLA( 'ZGTTRF', -INFO ) + RETURN + END IF +* +* Quick return if possible +* + IF( N.EQ.0 ) + $ RETURN +* +* Initialize IPIV(i) = i +* + DO 10 I = 1, N + IPIV( I ) = I + 10 CONTINUE +* + DO 20 I = 1, N - 1 + IF( DL( I ).EQ.CZERO ) THEN +* +* Subdiagonal is zero, no elimination is required. +* + IF( D( I ).EQ.CZERO .AND. INFO.EQ.0 ) + $ INFO = I + IF( I.LT.N-1 ) + $ DU2( I ) = CZERO + ELSE IF( CABS1( D( I ) ).GE.CABS1( DL( I ) ) ) THEN +* +* No row interchange required, eliminate DL(I) +* + FACT = DL( I ) / D( I ) + DL( I ) = FACT + D( I+1 ) = D( I+1 ) - FACT*DU( I ) + IF( I.LT.N-1 ) + $ DU2( I ) = CZERO + ELSE +* +* Interchange rows I and I+1, eliminate DL(I) +* + FACT = D( I ) / DL( I ) + D( I ) = DL( I ) + DL( I ) = FACT + TEMP = DU( I ) + DU( I ) = D( I+1 ) + D( I+1 ) = TEMP - FACT*D( I+1 ) + IF( I.LT.N-1 ) THEN + DU2( I ) = DU( I+1 ) + DU( I+1 ) = -FACT*DU( I+1 ) + END IF + IPIV( I ) = IPIV( I ) + 1 + END IF + 20 CONTINUE + IF( D( N ).EQ.CZERO .AND. INFO.EQ.0 ) THEN + INFO = N + RETURN + END IF +* + RETURN +* +* End of ZGTTRF +* + END diff -r 9f3299378193 -r 57077d0ddc8e libcruft/lapack/zgttrs.f --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libcruft/lapack/zgttrs.f Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,206 @@ + SUBROUTINE ZGTTRS( TRANS, N, NRHS, DL, D, DU, DU2, IPIV, B, LDB, + $ INFO ) +* +* -- LAPACK routine (version 2.0) -- +* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., +* Courant Institute, Argonne National Lab, and Rice University +* September 30, 1994 +* +* .. Scalar Arguments .. + CHARACTER TRANS + INTEGER INFO, LDB, N, NRHS +* .. +* .. Array Arguments .. + INTEGER IPIV( * ) + COMPLEX*16 B( LDB, * ), D( * ), DL( * ), DU( * ), DU2( * ) +* .. +* +* Purpose +* ======= +* +* ZGTTRS solves one of the systems of equations +* A * X = B, A**T * X = B, or A**H * X = B, +* with a tridiagonal matrix A using the LU factorization computed +* by ZGTTRF. +* +* Arguments +* ========= +* +* TRANS (input) CHARACTER +* Specifies the form of the system of equations: +* = 'N': A * X = B (No transpose) +* = 'T': A**T * X = B (Transpose) +* = 'C': A**H * X = B (Conjugate transpose) +* +* N (input) INTEGER +* The order of the matrix A. N >= 0. +* +* NRHS (input) INTEGER +* The number of right hand sides, i.e., the number of columns +* of the matrix B. NRHS >= 0. +* +* DL (input) COMPLEX*16 array, dimension (N-1) +* The (n-1) multipliers that define the matrix L from the +* LU factorization of A. +* +* D (input) COMPLEX*16 array, dimension (N) +* The n diagonal elements of the upper triangular matrix U from +* the LU factorization of A. +* +* DU (input) COMPLEX*16 array, dimension (N-1) +* The (n-1) elements of the first superdiagonal of U. +* +* DU2 (input) COMPLEX*16 array, dimension (N-2) +* The (n-2) elements of the second superdiagonal of U. +* +* IPIV (input) INTEGER array, dimension (N) +* The pivot indices; for 1 <= i <= n, row i of the matrix was +* interchanged with row IPIV(i). IPIV(i) will always be either +* i or i+1; IPIV(i) = i indicates a row interchange was not +* required. +* +* B (input/output) COMPLEX*16 array, dimension (LDB,NRHS) +* On entry, the right hand side matrix B. +* On exit, B is overwritten by the solution matrix X. +* +* LDB (input) INTEGER +* The leading dimension of the array B. LDB >= max(1,N). +* +* INFO (output) INTEGER +* = 0: successful exit +* < 0: if INFO = -i, the i-th argument had an illegal value +* +* ===================================================================== +* +* .. Local Scalars .. + LOGICAL NOTRAN + INTEGER I, J + COMPLEX*16 TEMP +* .. +* .. External Functions .. + LOGICAL LSAME + EXTERNAL LSAME +* .. +* .. External Subroutines .. + EXTERNAL XERBLA +* .. +* .. Intrinsic Functions .. + INTRINSIC DCONJG, MAX +* .. +* .. Executable Statements .. +* + INFO = 0 + NOTRAN = LSAME( TRANS, 'N' ) + IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) .AND. .NOT. + $ LSAME( TRANS, 'C' ) ) THEN + INFO = -1 + ELSE IF( N.LT.0 ) THEN + INFO = -2 + ELSE IF( NRHS.LT.0 ) THEN + INFO = -3 + ELSE IF( LDB.LT.MAX( N, 1 ) ) THEN + INFO = -10 + END IF + IF( INFO.NE.0 ) THEN + CALL XERBLA( 'ZGTTRS', -INFO ) + RETURN + END IF +* +* Quick return if possible +* + IF( N.EQ.0 .OR. NRHS.EQ.0 ) + $ RETURN +* + IF( NOTRAN ) THEN +* +* Solve A*X = B using the LU factorization of A, +* overwriting each right hand side vector with its solution. +* + DO 30 J = 1, NRHS +* +* Solve L*x = b. +* + DO 10 I = 1, N - 1 + IF( IPIV( I ).EQ.I ) THEN + B( I+1, J ) = B( I+1, J ) - DL( I )*B( I, J ) + ELSE + TEMP = B( I, J ) + B( I, J ) = B( I+1, J ) + B( I+1, J ) = TEMP - DL( I )*B( I, J ) + END IF + 10 CONTINUE +* +* Solve U*x = b. +* + B( N, J ) = B( N, J ) / D( N ) + IF( N.GT.1 ) + $ B( N-1, J ) = ( B( N-1, J )-DU( N-1 )*B( N, J ) ) / + $ D( N-1 ) + DO 20 I = N - 2, 1, -1 + B( I, J ) = ( B( I, J )-DU( I )*B( I+1, J )-DU2( I )* + $ B( I+2, J ) ) / D( I ) + 20 CONTINUE + 30 CONTINUE + ELSE IF( LSAME( TRANS, 'T' ) ) THEN +* +* Solve A**T * X = B. +* + DO 60 J = 1, NRHS +* +* Solve U**T * x = b. +* + B( 1, J ) = B( 1, J ) / D( 1 ) + IF( N.GT.1 ) + $ B( 2, J ) = ( B( 2, J )-DU( 1 )*B( 1, J ) ) / D( 2 ) + DO 40 I = 3, N + B( I, J ) = ( B( I, J )-DU( I-1 )*B( I-1, J )-DU2( I-2 )* + $ B( I-2, J ) ) / D( I ) + 40 CONTINUE +* +* Solve L**T * x = b. +* + DO 50 I = N - 1, 1, -1 + IF( IPIV( I ).EQ.I ) THEN + B( I, J ) = B( I, J ) - DL( I )*B( I+1, J ) + ELSE + TEMP = B( I+1, J ) + B( I+1, J ) = B( I, J ) - DL( I )*TEMP + B( I, J ) = TEMP + END IF + 50 CONTINUE + 60 CONTINUE + ELSE +* +* Solve A**H * X = B. +* + DO 90 J = 1, NRHS +* +* Solve U**H * x = b. +* + B( 1, J ) = B( 1, J ) / DCONJG( D( 1 ) ) + IF( N.GT.1 ) + $ B( 2, J ) = ( B( 2, J )-DCONJG( DU( 1 ) )*B( 1, J ) ) / + $ DCONJG( D( 2 ) ) + DO 70 I = 3, N + B( I, J ) = ( B( I, J )-DCONJG( DU( I-1 ) )*B( I-1, J )- + $ DCONJG( DU2( I-2 ) )*B( I-2, J ) ) / + $ DCONJG( D( I ) ) + 70 CONTINUE +* +* Solve L**H * x = b. +* + DO 80 I = N - 1, 1, -1 + IF( IPIV( I ).EQ.I ) THEN + B( I, J ) = B( I, J ) - DCONJG( DL( I ) )*B( I+1, J ) + ELSE + TEMP = B( I+1, J ) + B( I+1, J ) = B( I, J ) - DCONJG( DL( I ) )*TEMP + B( I, J ) = TEMP + END IF + 80 CONTINUE + 90 CONTINUE + END IF +* +* End of ZGTTRS +* + END diff -r 9f3299378193 -r 57077d0ddc8e libcruft/lapack/zlatbs.f --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libcruft/lapack/zlatbs.f Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,909 @@ + SUBROUTINE ZLATBS( UPLO, TRANS, DIAG, NORMIN, N, KD, AB, LDAB, X, + $ SCALE, CNORM, INFO ) +* +* -- LAPACK auxiliary routine (version 3.0) -- +* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., +* Courant Institute, Argonne National Lab, and Rice University +* June 30, 1992 +* +* .. Scalar Arguments .. + CHARACTER DIAG, NORMIN, TRANS, UPLO + INTEGER INFO, KD, LDAB, N + DOUBLE PRECISION SCALE +* .. +* .. Array Arguments .. + DOUBLE PRECISION CNORM( * ) + COMPLEX*16 AB( LDAB, * ), X( * ) +* .. +* +* Purpose +* ======= +* +* ZLATBS solves one of the triangular systems +* +* A * x = s*b, A**T * x = s*b, or A**H * x = s*b, +* +* with scaling to prevent overflow, where A is an upper or lower +* triangular band matrix. Here A' denotes the transpose of A, x and b +* are n-element vectors, and s is a scaling factor, usually less than +* or equal to 1, chosen so that the components of x will be less than +* the overflow threshold. If the unscaled problem will not cause +* overflow, the Level 2 BLAS routine ZTBSV is called. If the matrix A +* is singular (A(j,j) = 0 for some j), then s is set to 0 and a +* non-trivial solution to A*x = 0 is returned. +* +* Arguments +* ========= +* +* UPLO (input) CHARACTER*1 +* Specifies whether the matrix A is upper or lower triangular. +* = 'U': Upper triangular +* = 'L': Lower triangular +* +* TRANS (input) CHARACTER*1 +* Specifies the operation applied to A. +* = 'N': Solve A * x = s*b (No transpose) +* = 'T': Solve A**T * x = s*b (Transpose) +* = 'C': Solve A**H * x = s*b (Conjugate transpose) +* +* DIAG (input) CHARACTER*1 +* Specifies whether or not the matrix A is unit triangular. +* = 'N': Non-unit triangular +* = 'U': Unit triangular +* +* NORMIN (input) CHARACTER*1 +* Specifies whether CNORM has been set or not. +* = 'Y': CNORM contains the column norms on entry +* = 'N': CNORM is not set on entry. On exit, the norms will +* be computed and stored in CNORM. +* +* N (input) INTEGER +* The order of the matrix A. N >= 0. +* +* KD (input) INTEGER +* The number of subdiagonals or superdiagonals in the +* triangular matrix A. KD >= 0. +* +* AB (input) COMPLEX*16 array, dimension (LDAB,N) +* The upper or lower triangular band matrix A, stored in the +* first KD+1 rows of the array. The j-th column of A is stored +* in the j-th column of the array AB as follows: +* if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j; +* if UPLO = 'L', AB(1+i-j,j) = A(i,j) for j<=i<=min(n,j+kd). +* +* LDAB (input) INTEGER +* The leading dimension of the array AB. LDAB >= KD+1. +* +* X (input/output) COMPLEX*16 array, dimension (N) +* On entry, the right hand side b of the triangular system. +* On exit, X is overwritten by the solution vector x. +* +* SCALE (output) DOUBLE PRECISION +* The scaling factor s for the triangular system +* A * x = s*b, A**T * x = s*b, or A**H * x = s*b. +* If SCALE = 0, the matrix A is singular or badly scaled, and +* the vector x is an exact or approximate solution to A*x = 0. +* +* CNORM (input or output) DOUBLE PRECISION array, dimension (N) +* +* If NORMIN = 'Y', CNORM is an input argument and CNORM(j) +* contains the norm of the off-diagonal part of the j-th column +* of A. If TRANS = 'N', CNORM(j) must be greater than or equal +* to the infinity-norm, and if TRANS = 'T' or 'C', CNORM(j) +* must be greater than or equal to the 1-norm. +* +* If NORMIN = 'N', CNORM is an output argument and CNORM(j) +* returns the 1-norm of the offdiagonal part of the j-th column +* of A. +* +* INFO (output) INTEGER +* = 0: successful exit +* < 0: if INFO = -k, the k-th argument had an illegal value +* +* Further Details +* ======= ======= +* +* A rough bound on x is computed; if that is less than overflow, ZTBSV +* is called, otherwise, specific code is used which checks for possible +* overflow or divide-by-zero at every operation. +* +* A columnwise scheme is used for solving A*x = b. The basic algorithm +* if A is lower triangular is +* +* x[1:n] := b[1:n] +* for j = 1, ..., n +* x(j) := x(j) / A(j,j) +* x[j+1:n] := x[j+1:n] - x(j) * A[j+1:n,j] +* end +* +* Define bounds on the components of x after j iterations of the loop: +* M(j) = bound on x[1:j] +* G(j) = bound on x[j+1:n] +* Initially, let M(0) = 0 and G(0) = max{x(i), i=1,...,n}. +* +* Then for iteration j+1 we have +* M(j+1) <= G(j) / | A(j+1,j+1) | +* G(j+1) <= G(j) + M(j+1) * | A[j+2:n,j+1] | +* <= G(j) ( 1 + CNORM(j+1) / | A(j+1,j+1) | ) +* +* where CNORM(j+1) is greater than or equal to the infinity-norm of +* column j+1 of A, not counting the diagonal. Hence +* +* G(j) <= G(0) product ( 1 + CNORM(i) / | A(i,i) | ) +* 1<=i<=j +* and +* +* |x(j)| <= ( G(0) / |A(j,j)| ) product ( 1 + CNORM(i) / |A(i,i)| ) +* 1<=i< j +* +* Since |x(j)| <= M(j), we use the Level 2 BLAS routine ZTBSV if the +* reciprocal of the largest M(j), j=1,..,n, is larger than +* max(underflow, 1/overflow). +* +* The bound on x(j) is also used to determine when a step in the +* columnwise method can be performed without fear of overflow. If +* the computed bound is greater than a large constant, x is scaled to +* prevent overflow, but if the bound overflows, x is set to 0, x(j) to +* 1, and scale to 0, and a non-trivial solution to A*x = 0 is found. +* +* Similarly, a row-wise scheme is used to solve A**T *x = b or +* A**H *x = b. The basic algorithm for A upper triangular is +* +* for j = 1, ..., n +* x(j) := ( b(j) - A[1:j-1,j]' * x[1:j-1] ) / A(j,j) +* end +* +* We simultaneously compute two bounds +* G(j) = bound on ( b(i) - A[1:i-1,i]' * x[1:i-1] ), 1<=i<=j +* M(j) = bound on x(i), 1<=i<=j +* +* The initial values are G(0) = 0, M(0) = max{b(i), i=1,..,n}, and we +* add the constraint G(j) >= G(j-1) and M(j) >= M(j-1) for j >= 1. +* Then the bound on x(j) is +* +* M(j) <= M(j-1) * ( 1 + CNORM(j) ) / | A(j,j) | +* +* <= M(0) * product ( ( 1 + CNORM(i) ) / |A(i,i)| ) +* 1<=i<=j +* +* and we can safely call ZTBSV if 1/M(n) and 1/G(n) are both greater +* than max(underflow, 1/overflow). +* +* ===================================================================== +* +* .. Parameters .. + DOUBLE PRECISION ZERO, HALF, ONE, TWO + PARAMETER ( ZERO = 0.0D+0, HALF = 0.5D+0, ONE = 1.0D+0, + $ TWO = 2.0D+0 ) +* .. +* .. Local Scalars .. + LOGICAL NOTRAN, NOUNIT, UPPER + INTEGER I, IMAX, J, JFIRST, JINC, JLAST, JLEN, MAIND + DOUBLE PRECISION BIGNUM, GROW, REC, SMLNUM, TJJ, TMAX, TSCAL, + $ XBND, XJ, XMAX + COMPLEX*16 CSUMJ, TJJS, USCAL, ZDUM +* .. +* .. External Functions .. + LOGICAL LSAME + INTEGER IDAMAX, IZAMAX + DOUBLE PRECISION DLAMCH, DZASUM + COMPLEX*16 ZDOTC, ZDOTU, ZLADIV + EXTERNAL LSAME, IDAMAX, IZAMAX, DLAMCH, DZASUM, ZDOTC, + $ ZDOTU, ZLADIV +* .. +* .. External Subroutines .. + EXTERNAL DSCAL, XERBLA, ZAXPY, ZDSCAL, ZTBSV +* .. +* .. Intrinsic Functions .. + INTRINSIC ABS, DBLE, DCMPLX, DCONJG, DIMAG, MAX, MIN +* .. +* .. Statement Functions .. + DOUBLE PRECISION CABS1, CABS2 +* .. +* .. Statement Function definitions .. + CABS1( ZDUM ) = ABS( DBLE( ZDUM ) ) + ABS( DIMAG( ZDUM ) ) + CABS2( ZDUM ) = ABS( DBLE( ZDUM ) / 2.D0 ) + + $ ABS( DIMAG( ZDUM ) / 2.D0 ) +* .. +* .. Executable Statements .. +* + INFO = 0 + UPPER = LSAME( UPLO, 'U' ) + NOTRAN = LSAME( TRANS, 'N' ) + NOUNIT = LSAME( DIAG, 'N' ) +* +* Test the input parameters. +* + IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN + INFO = -1 + ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) .AND. .NOT. + $ LSAME( TRANS, 'C' ) ) THEN + INFO = -2 + ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN + INFO = -3 + ELSE IF( .NOT.LSAME( NORMIN, 'Y' ) .AND. .NOT. + $ LSAME( NORMIN, 'N' ) ) THEN + INFO = -4 + ELSE IF( N.LT.0 ) THEN + INFO = -5 + ELSE IF( KD.LT.0 ) THEN + INFO = -6 + ELSE IF( LDAB.LT.KD+1 ) THEN + INFO = -8 + END IF + IF( INFO.NE.0 ) THEN + CALL XERBLA( 'ZLATBS', -INFO ) + RETURN + END IF +* +* Quick return if possible +* + IF( N.EQ.0 ) + $ RETURN +* +* Determine machine dependent parameters to control overflow. +* + SMLNUM = DLAMCH( 'Safe minimum' ) + BIGNUM = ONE / SMLNUM + CALL DLABAD( SMLNUM, BIGNUM ) + SMLNUM = SMLNUM / DLAMCH( 'Precision' ) + BIGNUM = ONE / SMLNUM + SCALE = ONE +* + IF( LSAME( NORMIN, 'N' ) ) THEN +* +* Compute the 1-norm of each column, not including the diagonal. +* + IF( UPPER ) THEN +* +* A is upper triangular. +* + DO 10 J = 1, N + JLEN = MIN( KD, J-1 ) + CNORM( J ) = DZASUM( JLEN, AB( KD+1-JLEN, J ), 1 ) + 10 CONTINUE + ELSE +* +* A is lower triangular. +* + DO 20 J = 1, N + JLEN = MIN( KD, N-J ) + IF( JLEN.GT.0 ) THEN + CNORM( J ) = DZASUM( JLEN, AB( 2, J ), 1 ) + ELSE + CNORM( J ) = ZERO + END IF + 20 CONTINUE + END IF + END IF +* +* Scale the column norms by TSCAL if the maximum element in CNORM is +* greater than BIGNUM/2. +* + IMAX = IDAMAX( N, CNORM, 1 ) + TMAX = CNORM( IMAX ) + IF( TMAX.LE.BIGNUM*HALF ) THEN + TSCAL = ONE + ELSE + TSCAL = HALF / ( SMLNUM*TMAX ) + CALL DSCAL( N, TSCAL, CNORM, 1 ) + END IF +* +* Compute a bound on the computed solution vector to see if the +* Level 2 BLAS routine ZTBSV can be used. +* + XMAX = ZERO + DO 30 J = 1, N + XMAX = MAX( XMAX, CABS2( X( J ) ) ) + 30 CONTINUE + XBND = XMAX + IF( NOTRAN ) THEN +* +* Compute the growth in A * x = b. +* + IF( UPPER ) THEN + JFIRST = N + JLAST = 1 + JINC = -1 + MAIND = KD + 1 + ELSE + JFIRST = 1 + JLAST = N + JINC = 1 + MAIND = 1 + END IF +* + IF( TSCAL.NE.ONE ) THEN + GROW = ZERO + GO TO 60 + END IF +* + IF( NOUNIT ) THEN +* +* A is non-unit triangular. +* +* Compute GROW = 1/G(j) and XBND = 1/M(j). +* Initially, G(0) = max{x(i), i=1,...,n}. +* + GROW = HALF / MAX( XBND, SMLNUM ) + XBND = GROW + DO 40 J = JFIRST, JLAST, JINC +* +* Exit the loop if the growth factor is too small. +* + IF( GROW.LE.SMLNUM ) + $ GO TO 60 +* + TJJS = AB( MAIND, J ) + TJJ = CABS1( TJJS ) +* + IF( TJJ.GE.SMLNUM ) THEN +* +* M(j) = G(j-1) / abs(A(j,j)) +* + XBND = MIN( XBND, MIN( ONE, TJJ )*GROW ) + ELSE +* +* M(j) could overflow, set XBND to 0. +* + XBND = ZERO + END IF +* + IF( TJJ+CNORM( J ).GE.SMLNUM ) THEN +* +* G(j) = G(j-1)*( 1 + CNORM(j) / abs(A(j,j)) ) +* + GROW = GROW*( TJJ / ( TJJ+CNORM( J ) ) ) + ELSE +* +* G(j) could overflow, set GROW to 0. +* + GROW = ZERO + END IF + 40 CONTINUE + GROW = XBND + ELSE +* +* A is unit triangular. +* +* Compute GROW = 1/G(j), where G(0) = max{x(i), i=1,...,n}. +* + GROW = MIN( ONE, HALF / MAX( XBND, SMLNUM ) ) + DO 50 J = JFIRST, JLAST, JINC +* +* Exit the loop if the growth factor is too small. +* + IF( GROW.LE.SMLNUM ) + $ GO TO 60 +* +* G(j) = G(j-1)*( 1 + CNORM(j) ) +* + GROW = GROW*( ONE / ( ONE+CNORM( J ) ) ) + 50 CONTINUE + END IF + 60 CONTINUE +* + ELSE +* +* Compute the growth in A**T * x = b or A**H * x = b. +* + IF( UPPER ) THEN + JFIRST = 1 + JLAST = N + JINC = 1 + MAIND = KD + 1 + ELSE + JFIRST = N + JLAST = 1 + JINC = -1 + MAIND = 1 + END IF +* + IF( TSCAL.NE.ONE ) THEN + GROW = ZERO + GO TO 90 + END IF +* + IF( NOUNIT ) THEN +* +* A is non-unit triangular. +* +* Compute GROW = 1/G(j) and XBND = 1/M(j). +* Initially, M(0) = max{x(i), i=1,...,n}. +* + GROW = HALF / MAX( XBND, SMLNUM ) + XBND = GROW + DO 70 J = JFIRST, JLAST, JINC +* +* Exit the loop if the growth factor is too small. +* + IF( GROW.LE.SMLNUM ) + $ GO TO 90 +* +* G(j) = max( G(j-1), M(j-1)*( 1 + CNORM(j) ) ) +* + XJ = ONE + CNORM( J ) + GROW = MIN( GROW, XBND / XJ ) +* + TJJS = AB( MAIND, J ) + TJJ = CABS1( TJJS ) +* + IF( TJJ.GE.SMLNUM ) THEN +* +* M(j) = M(j-1)*( 1 + CNORM(j) ) / abs(A(j,j)) +* + IF( XJ.GT.TJJ ) + $ XBND = XBND*( TJJ / XJ ) + ELSE +* +* M(j) could overflow, set XBND to 0. +* + XBND = ZERO + END IF + 70 CONTINUE + GROW = MIN( GROW, XBND ) + ELSE +* +* A is unit triangular. +* +* Compute GROW = 1/G(j), where G(0) = max{x(i), i=1,...,n}. +* + GROW = MIN( ONE, HALF / MAX( XBND, SMLNUM ) ) + DO 80 J = JFIRST, JLAST, JINC +* +* Exit the loop if the growth factor is too small. +* + IF( GROW.LE.SMLNUM ) + $ GO TO 90 +* +* G(j) = ( 1 + CNORM(j) )*G(j-1) +* + XJ = ONE + CNORM( J ) + GROW = GROW / XJ + 80 CONTINUE + END IF + 90 CONTINUE + END IF +* + IF( ( GROW*TSCAL ).GT.SMLNUM ) THEN +* +* Use the Level 2 BLAS solve if the reciprocal of the bound on +* elements of X is not too small. +* + CALL ZTBSV( UPLO, TRANS, DIAG, N, KD, AB, LDAB, X, 1 ) + ELSE +* +* Use a Level 1 BLAS solve, scaling intermediate results. +* + IF( XMAX.GT.BIGNUM*HALF ) THEN +* +* Scale X so that its components are less than or equal to +* BIGNUM in absolute value. +* + SCALE = ( BIGNUM*HALF ) / XMAX + CALL ZDSCAL( N, SCALE, X, 1 ) + XMAX = BIGNUM + ELSE + XMAX = XMAX*TWO + END IF +* + IF( NOTRAN ) THEN +* +* Solve A * x = b +* + DO 120 J = JFIRST, JLAST, JINC +* +* Compute x(j) = b(j) / A(j,j), scaling x if necessary. +* + XJ = CABS1( X( J ) ) + IF( NOUNIT ) THEN + TJJS = AB( MAIND, J )*TSCAL + ELSE + TJJS = TSCAL + IF( TSCAL.EQ.ONE ) + $ GO TO 110 + END IF + TJJ = CABS1( TJJS ) + IF( TJJ.GT.SMLNUM ) THEN +* +* abs(A(j,j)) > SMLNUM: +* + IF( TJJ.LT.ONE ) THEN + IF( XJ.GT.TJJ*BIGNUM ) THEN +* +* Scale x by 1/b(j). +* + REC = ONE / XJ + CALL ZDSCAL( N, REC, X, 1 ) + SCALE = SCALE*REC + XMAX = XMAX*REC + END IF + END IF + X( J ) = ZLADIV( X( J ), TJJS ) + XJ = CABS1( X( J ) ) + ELSE IF( TJJ.GT.ZERO ) THEN +* +* 0 < abs(A(j,j)) <= SMLNUM: +* + IF( XJ.GT.TJJ*BIGNUM ) THEN +* +* Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM +* to avoid overflow when dividing by A(j,j). +* + REC = ( TJJ*BIGNUM ) / XJ + IF( CNORM( J ).GT.ONE ) THEN +* +* Scale by 1/CNORM(j) to avoid overflow when +* multiplying x(j) times column j. +* + REC = REC / CNORM( J ) + END IF + CALL ZDSCAL( N, REC, X, 1 ) + SCALE = SCALE*REC + XMAX = XMAX*REC + END IF + X( J ) = ZLADIV( X( J ), TJJS ) + XJ = CABS1( X( J ) ) + ELSE +* +* A(j,j) = 0: Set x(1:n) = 0, x(j) = 1, and +* scale = 0, and compute a solution to A*x = 0. +* + DO 100 I = 1, N + X( I ) = ZERO + 100 CONTINUE + X( J ) = ONE + XJ = ONE + SCALE = ZERO + XMAX = ZERO + END IF + 110 CONTINUE +* +* Scale x if necessary to avoid overflow when adding a +* multiple of column j of A. +* + IF( XJ.GT.ONE ) THEN + REC = ONE / XJ + IF( CNORM( J ).GT.( BIGNUM-XMAX )*REC ) THEN +* +* Scale x by 1/(2*abs(x(j))). +* + REC = REC*HALF + CALL ZDSCAL( N, REC, X, 1 ) + SCALE = SCALE*REC + END IF + ELSE IF( XJ*CNORM( J ).GT.( BIGNUM-XMAX ) ) THEN +* +* Scale x by 1/2. +* + CALL ZDSCAL( N, HALF, X, 1 ) + SCALE = SCALE*HALF + END IF +* + IF( UPPER ) THEN + IF( J.GT.1 ) THEN +* +* Compute the update +* x(max(1,j-kd):j-1) := x(max(1,j-kd):j-1) - +* x(j)* A(max(1,j-kd):j-1,j) +* + JLEN = MIN( KD, J-1 ) + CALL ZAXPY( JLEN, -X( J )*TSCAL, + $ AB( KD+1-JLEN, J ), 1, X( J-JLEN ), 1 ) + I = IZAMAX( J-1, X, 1 ) + XMAX = CABS1( X( I ) ) + END IF + ELSE IF( J.LT.N ) THEN +* +* Compute the update +* x(j+1:min(j+kd,n)) := x(j+1:min(j+kd,n)) - +* x(j) * A(j+1:min(j+kd,n),j) +* + JLEN = MIN( KD, N-J ) + IF( JLEN.GT.0 ) + $ CALL ZAXPY( JLEN, -X( J )*TSCAL, AB( 2, J ), 1, + $ X( J+1 ), 1 ) + I = J + IZAMAX( N-J, X( J+1 ), 1 ) + XMAX = CABS1( X( I ) ) + END IF + 120 CONTINUE +* + ELSE IF( LSAME( TRANS, 'T' ) ) THEN +* +* Solve A**T * x = b +* + DO 170 J = JFIRST, JLAST, JINC +* +* Compute x(j) = b(j) - sum A(k,j)*x(k). +* k<>j +* + XJ = CABS1( X( J ) ) + USCAL = TSCAL + REC = ONE / MAX( XMAX, ONE ) + IF( CNORM( J ).GT.( BIGNUM-XJ )*REC ) THEN +* +* If x(j) could overflow, scale x by 1/(2*XMAX). +* + REC = REC*HALF + IF( NOUNIT ) THEN + TJJS = AB( MAIND, J )*TSCAL + ELSE + TJJS = TSCAL + END IF + TJJ = CABS1( TJJS ) + IF( TJJ.GT.ONE ) THEN +* +* Divide by A(j,j) when scaling x if A(j,j) > 1. +* + REC = MIN( ONE, REC*TJJ ) + USCAL = ZLADIV( USCAL, TJJS ) + END IF + IF( REC.LT.ONE ) THEN + CALL ZDSCAL( N, REC, X, 1 ) + SCALE = SCALE*REC + XMAX = XMAX*REC + END IF + END IF +* + CSUMJ = ZERO + IF( USCAL.EQ.DCMPLX( ONE ) ) THEN +* +* If the scaling needed for A in the dot product is 1, +* call ZDOTU to perform the dot product. +* + IF( UPPER ) THEN + JLEN = MIN( KD, J-1 ) + CSUMJ = ZDOTU( JLEN, AB( KD+1-JLEN, J ), 1, + $ X( J-JLEN ), 1 ) + ELSE + JLEN = MIN( KD, N-J ) + IF( JLEN.GT.1 ) + $ CSUMJ = ZDOTU( JLEN, AB( 2, J ), 1, X( J+1 ), + $ 1 ) + END IF + ELSE +* +* Otherwise, use in-line code for the dot product. +* + IF( UPPER ) THEN + JLEN = MIN( KD, J-1 ) + DO 130 I = 1, JLEN + CSUMJ = CSUMJ + ( AB( KD+I-JLEN, J )*USCAL )* + $ X( J-JLEN-1+I ) + 130 CONTINUE + ELSE + JLEN = MIN( KD, N-J ) + DO 140 I = 1, JLEN + CSUMJ = CSUMJ + ( AB( I+1, J )*USCAL )*X( J+I ) + 140 CONTINUE + END IF + END IF +* + IF( USCAL.EQ.DCMPLX( TSCAL ) ) THEN +* +* Compute x(j) := ( x(j) - CSUMJ ) / A(j,j) if 1/A(j,j) +* was not used to scale the dotproduct. +* + X( J ) = X( J ) - CSUMJ + XJ = CABS1( X( J ) ) + IF( NOUNIT ) THEN +* +* Compute x(j) = x(j) / A(j,j), scaling if necessary. +* + TJJS = AB( MAIND, J )*TSCAL + ELSE + TJJS = TSCAL + IF( TSCAL.EQ.ONE ) + $ GO TO 160 + END IF + TJJ = CABS1( TJJS ) + IF( TJJ.GT.SMLNUM ) THEN +* +* abs(A(j,j)) > SMLNUM: +* + IF( TJJ.LT.ONE ) THEN + IF( XJ.GT.TJJ*BIGNUM ) THEN +* +* Scale X by 1/abs(x(j)). +* + REC = ONE / XJ + CALL ZDSCAL( N, REC, X, 1 ) + SCALE = SCALE*REC + XMAX = XMAX*REC + END IF + END IF + X( J ) = ZLADIV( X( J ), TJJS ) + ELSE IF( TJJ.GT.ZERO ) THEN +* +* 0 < abs(A(j,j)) <= SMLNUM: +* + IF( XJ.GT.TJJ*BIGNUM ) THEN +* +* Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM. +* + REC = ( TJJ*BIGNUM ) / XJ + CALL ZDSCAL( N, REC, X, 1 ) + SCALE = SCALE*REC + XMAX = XMAX*REC + END IF + X( J ) = ZLADIV( X( J ), TJJS ) + ELSE +* +* A(j,j) = 0: Set x(1:n) = 0, x(j) = 1, and +* scale = 0 and compute a solution to A**T *x = 0. +* + DO 150 I = 1, N + X( I ) = ZERO + 150 CONTINUE + X( J ) = ONE + SCALE = ZERO + XMAX = ZERO + END IF + 160 CONTINUE + ELSE +* +* Compute x(j) := x(j) / A(j,j) - CSUMJ if the dot +* product has already been divided by 1/A(j,j). +* + X( J ) = ZLADIV( X( J ), TJJS ) - CSUMJ + END IF + XMAX = MAX( XMAX, CABS1( X( J ) ) ) + 170 CONTINUE +* + ELSE +* +* Solve A**H * x = b +* + DO 220 J = JFIRST, JLAST, JINC +* +* Compute x(j) = b(j) - sum A(k,j)*x(k). +* k<>j +* + XJ = CABS1( X( J ) ) + USCAL = TSCAL + REC = ONE / MAX( XMAX, ONE ) + IF( CNORM( J ).GT.( BIGNUM-XJ )*REC ) THEN +* +* If x(j) could overflow, scale x by 1/(2*XMAX). +* + REC = REC*HALF + IF( NOUNIT ) THEN + TJJS = DCONJG( AB( MAIND, J ) )*TSCAL + ELSE + TJJS = TSCAL + END IF + TJJ = CABS1( TJJS ) + IF( TJJ.GT.ONE ) THEN +* +* Divide by A(j,j) when scaling x if A(j,j) > 1. +* + REC = MIN( ONE, REC*TJJ ) + USCAL = ZLADIV( USCAL, TJJS ) + END IF + IF( REC.LT.ONE ) THEN + CALL ZDSCAL( N, REC, X, 1 ) + SCALE = SCALE*REC + XMAX = XMAX*REC + END IF + END IF +* + CSUMJ = ZERO + IF( USCAL.EQ.DCMPLX( ONE ) ) THEN +* +* If the scaling needed for A in the dot product is 1, +* call ZDOTC to perform the dot product. +* + IF( UPPER ) THEN + JLEN = MIN( KD, J-1 ) + CSUMJ = ZDOTC( JLEN, AB( KD+1-JLEN, J ), 1, + $ X( J-JLEN ), 1 ) + ELSE + JLEN = MIN( KD, N-J ) + IF( JLEN.GT.1 ) + $ CSUMJ = ZDOTC( JLEN, AB( 2, J ), 1, X( J+1 ), + $ 1 ) + END IF + ELSE +* +* Otherwise, use in-line code for the dot product. +* + IF( UPPER ) THEN + JLEN = MIN( KD, J-1 ) + DO 180 I = 1, JLEN + CSUMJ = CSUMJ + ( DCONJG( AB( KD+I-JLEN, J ) )* + $ USCAL )*X( J-JLEN-1+I ) + 180 CONTINUE + ELSE + JLEN = MIN( KD, N-J ) + DO 190 I = 1, JLEN + CSUMJ = CSUMJ + ( DCONJG( AB( I+1, J ) )*USCAL ) + $ *X( J+I ) + 190 CONTINUE + END IF + END IF +* + IF( USCAL.EQ.DCMPLX( TSCAL ) ) THEN +* +* Compute x(j) := ( x(j) - CSUMJ ) / A(j,j) if 1/A(j,j) +* was not used to scale the dotproduct. +* + X( J ) = X( J ) - CSUMJ + XJ = CABS1( X( J ) ) + IF( NOUNIT ) THEN +* +* Compute x(j) = x(j) / A(j,j), scaling if necessary. +* + TJJS = DCONJG( AB( MAIND, J ) )*TSCAL + ELSE + TJJS = TSCAL + IF( TSCAL.EQ.ONE ) + $ GO TO 210 + END IF + TJJ = CABS1( TJJS ) + IF( TJJ.GT.SMLNUM ) THEN +* +* abs(A(j,j)) > SMLNUM: +* + IF( TJJ.LT.ONE ) THEN + IF( XJ.GT.TJJ*BIGNUM ) THEN +* +* Scale X by 1/abs(x(j)). +* + REC = ONE / XJ + CALL ZDSCAL( N, REC, X, 1 ) + SCALE = SCALE*REC + XMAX = XMAX*REC + END IF + END IF + X( J ) = ZLADIV( X( J ), TJJS ) + ELSE IF( TJJ.GT.ZERO ) THEN +* +* 0 < abs(A(j,j)) <= SMLNUM: +* + IF( XJ.GT.TJJ*BIGNUM ) THEN +* +* Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM. +* + REC = ( TJJ*BIGNUM ) / XJ + CALL ZDSCAL( N, REC, X, 1 ) + SCALE = SCALE*REC + XMAX = XMAX*REC + END IF + X( J ) = ZLADIV( X( J ), TJJS ) + ELSE +* +* A(j,j) = 0: Set x(1:n) = 0, x(j) = 1, and +* scale = 0 and compute a solution to A**H *x = 0. +* + DO 200 I = 1, N + X( I ) = ZERO + 200 CONTINUE + X( J ) = ONE + SCALE = ZERO + XMAX = ZERO + END IF + 210 CONTINUE + ELSE +* +* Compute x(j) := x(j) / A(j,j) - CSUMJ if the dot +* product has already been divided by 1/A(j,j). +* + X( J ) = ZLADIV( X( J ), TJJS ) - CSUMJ + END IF + XMAX = MAX( XMAX, CABS1( X( J ) ) ) + 220 CONTINUE + END IF + SCALE = SCALE / TSCAL + END IF +* +* Scale the column norms by 1/TSCAL for return. +* + IF( TSCAL.NE.ONE ) THEN + CALL DSCAL( N, ONE / TSCAL, CNORM, 1 ) + END IF +* + RETURN +* +* End of ZLATBS +* + END diff -r 9f3299378193 -r 57077d0ddc8e libcruft/lapack/zpbcon.f --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libcruft/lapack/zpbcon.f Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,194 @@ + SUBROUTINE ZPBCON( UPLO, N, KD, AB, LDAB, ANORM, RCOND, WORK, + $ RWORK, INFO ) +* +* -- LAPACK routine (version 3.0) -- +* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., +* Courant Institute, Argonne National Lab, and Rice University +* September 30, 1994 +* +* .. Scalar Arguments .. + CHARACTER UPLO + INTEGER INFO, KD, LDAB, N + DOUBLE PRECISION ANORM, RCOND +* .. +* .. Array Arguments .. + DOUBLE PRECISION RWORK( * ) + COMPLEX*16 AB( LDAB, * ), WORK( * ) +* .. +* +* Purpose +* ======= +* +* ZPBCON estimates the reciprocal of the condition number (in the +* 1-norm) of a complex Hermitian positive definite band matrix using +* the Cholesky factorization A = U**H*U or A = L*L**H computed by +* ZPBTRF. +* +* An estimate is obtained for norm(inv(A)), and the reciprocal of the +* condition number is computed as RCOND = 1 / (ANORM * norm(inv(A))). +* +* Arguments +* ========= +* +* UPLO (input) CHARACTER*1 +* = 'U': Upper triangular factor stored in AB; +* = 'L': Lower triangular factor stored in AB. +* +* N (input) INTEGER +* The order of the matrix A. N >= 0. +* +* KD (input) INTEGER +* The number of superdiagonals of the matrix A if UPLO = 'U', +* or the number of sub-diagonals if UPLO = 'L'. KD >= 0. +* +* AB (input) COMPLEX*16 array, dimension (LDAB,N) +* The triangular factor U or L from the Cholesky factorization +* A = U**H*U or A = L*L**H of the band matrix A, stored in the +* first KD+1 rows of the array. The j-th column of U or L is +* stored in the j-th column of the array AB as follows: +* if UPLO ='U', AB(kd+1+i-j,j) = U(i,j) for max(1,j-kd)<=i<=j; +* if UPLO ='L', AB(1+i-j,j) = L(i,j) for j<=i<=min(n,j+kd). +* +* LDAB (input) INTEGER +* The leading dimension of the array AB. LDAB >= KD+1. +* +* ANORM (input) DOUBLE PRECISION +* The 1-norm (or infinity-norm) of the Hermitian band matrix A. +* +* RCOND (output) DOUBLE PRECISION +* The reciprocal of the condition number of the matrix A, +* computed as RCOND = 1/(ANORM * AINVNM), where AINVNM is an +* estimate of the 1-norm of inv(A) computed in this routine. +* +* WORK (workspace) COMPLEX*16 array, dimension (2*N) +* +* RWORK (workspace) DOUBLE PRECISION array, dimension (N) +* +* INFO (output) INTEGER +* = 0: successful exit +* < 0: if INFO = -i, the i-th argument had an illegal value +* +* ===================================================================== +* +* .. Parameters .. + DOUBLE PRECISION ONE, ZERO + PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) +* .. +* .. Local Scalars .. + LOGICAL UPPER + CHARACTER NORMIN + INTEGER IX, KASE + DOUBLE PRECISION AINVNM, SCALE, SCALEL, SCALEU, SMLNUM + COMPLEX*16 ZDUM +* .. +* .. External Functions .. + LOGICAL LSAME + INTEGER IZAMAX + DOUBLE PRECISION DLAMCH + EXTERNAL LSAME, IZAMAX, DLAMCH +* .. +* .. External Subroutines .. + EXTERNAL XERBLA, ZDRSCL, ZLACON, ZLATBS +* .. +* .. Intrinsic Functions .. + INTRINSIC ABS, DBLE, DIMAG +* .. +* .. Statement Functions .. + DOUBLE PRECISION CABS1 +* .. +* .. Statement Function definitions .. + CABS1( ZDUM ) = ABS( DBLE( ZDUM ) ) + ABS( DIMAG( ZDUM ) ) +* .. +* .. Executable Statements .. +* +* Test the input parameters. +* + INFO = 0 + UPPER = LSAME( UPLO, 'U' ) + IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN + INFO = -1 + ELSE IF( N.LT.0 ) THEN + INFO = -2 + ELSE IF( KD.LT.0 ) THEN + INFO = -3 + ELSE IF( LDAB.LT.KD+1 ) THEN + INFO = -5 + ELSE IF( ANORM.LT.ZERO ) THEN + INFO = -6 + END IF + IF( INFO.NE.0 ) THEN + CALL XERBLA( 'ZPBCON', -INFO ) + RETURN + END IF +* +* Quick return if possible +* + RCOND = ZERO + IF( N.EQ.0 ) THEN + RCOND = ONE + RETURN + ELSE IF( ANORM.EQ.ZERO ) THEN + RETURN + END IF +* + SMLNUM = DLAMCH( 'Safe minimum' ) +* +* Estimate the 1-norm of the inverse. +* + KASE = 0 + NORMIN = 'N' + 10 CONTINUE + CALL ZLACON( N, WORK( N+1 ), WORK, AINVNM, KASE ) + IF( KASE.NE.0 ) THEN + IF( UPPER ) THEN +* +* Multiply by inv(U'). +* + CALL ZLATBS( 'Upper', 'Conjugate transpose', 'Non-unit', + $ NORMIN, N, KD, AB, LDAB, WORK, SCALEL, RWORK, + $ INFO ) + NORMIN = 'Y' +* +* Multiply by inv(U). +* + CALL ZLATBS( 'Upper', 'No transpose', 'Non-unit', NORMIN, N, + $ KD, AB, LDAB, WORK, SCALEU, RWORK, INFO ) + ELSE +* +* Multiply by inv(L). +* + CALL ZLATBS( 'Lower', 'No transpose', 'Non-unit', NORMIN, N, + $ KD, AB, LDAB, WORK, SCALEL, RWORK, INFO ) + NORMIN = 'Y' +* +* Multiply by inv(L'). +* + CALL ZLATBS( 'Lower', 'Conjugate transpose', 'Non-unit', + $ NORMIN, N, KD, AB, LDAB, WORK, SCALEU, RWORK, + $ INFO ) + END IF +* +* Multiply by 1/SCALE if doing so will not cause overflow. +* + SCALE = SCALEL*SCALEU + IF( SCALE.NE.ONE ) THEN + IX = IZAMAX( N, WORK, 1 ) + IF( SCALE.LT.CABS1( WORK( IX ) )*SMLNUM .OR. SCALE.EQ.ZERO ) + $ GO TO 20 + CALL ZDRSCL( N, SCALE, WORK, 1 ) + END IF + GO TO 10 + END IF +* +* Compute the estimate of the reciprocal condition number. +* + IF( AINVNM.NE.ZERO ) + $ RCOND = ( ONE / AINVNM ) / ANORM +* + 20 CONTINUE +* + RETURN +* +* End of ZPBCON +* + END diff -r 9f3299378193 -r 57077d0ddc8e libcruft/lapack/zpbtf2.f --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libcruft/lapack/zpbtf2.f Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,201 @@ + SUBROUTINE ZPBTF2( UPLO, N, KD, AB, LDAB, INFO ) +* +* -- LAPACK routine (version 3.0) -- +* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., +* Courant Institute, Argonne National Lab, and Rice University +* February 29, 1992 +* +* .. Scalar Arguments .. + CHARACTER UPLO + INTEGER INFO, KD, LDAB, N +* .. +* .. Array Arguments .. + COMPLEX*16 AB( LDAB, * ) +* .. +* +* Purpose +* ======= +* +* ZPBTF2 computes the Cholesky factorization of a complex Hermitian +* positive definite band matrix A. +* +* The factorization has the form +* A = U' * U , if UPLO = 'U', or +* A = L * L', if UPLO = 'L', +* where U is an upper triangular matrix, U' is the conjugate transpose +* of U, and L is lower triangular. +* +* This is the unblocked version of the algorithm, calling Level 2 BLAS. +* +* Arguments +* ========= +* +* UPLO (input) CHARACTER*1 +* Specifies whether the upper or lower triangular part of the +* Hermitian matrix A is stored: +* = 'U': Upper triangular +* = 'L': Lower triangular +* +* N (input) INTEGER +* The order of the matrix A. N >= 0. +* +* KD (input) INTEGER +* The number of super-diagonals of the matrix A if UPLO = 'U', +* or the number of sub-diagonals if UPLO = 'L'. KD >= 0. +* +* AB (input/output) COMPLEX*16 array, dimension (LDAB,N) +* On entry, the upper or lower triangle of the Hermitian band +* matrix A, stored in the first KD+1 rows of the array. The +* j-th column of A is stored in the j-th column of the array AB +* as follows: +* if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j; +* if UPLO = 'L', AB(1+i-j,j) = A(i,j) for j<=i<=min(n,j+kd). +* +* On exit, if INFO = 0, the triangular factor U or L from the +* Cholesky factorization A = U'*U or A = L*L' of the band +* matrix A, in the same storage format as A. +* +* LDAB (input) INTEGER +* The leading dimension of the array AB. LDAB >= KD+1. +* +* INFO (output) INTEGER +* = 0: successful exit +* < 0: if INFO = -k, the k-th argument had an illegal value +* > 0: if INFO = k, the leading minor of order k is not +* positive definite, and the factorization could not be +* completed. +* +* Further Details +* =============== +* +* The band storage scheme is illustrated by the following example, when +* N = 6, KD = 2, and UPLO = 'U': +* +* On entry: On exit: +* +* * * a13 a24 a35 a46 * * u13 u24 u35 u46 +* * a12 a23 a34 a45 a56 * u12 u23 u34 u45 u56 +* a11 a22 a33 a44 a55 a66 u11 u22 u33 u44 u55 u66 +* +* Similarly, if UPLO = 'L' the format of A is as follows: +* +* On entry: On exit: +* +* a11 a22 a33 a44 a55 a66 l11 l22 l33 l44 l55 l66 +* a21 a32 a43 a54 a65 * l21 l32 l43 l54 l65 * +* a31 a42 a53 a64 * * l31 l42 l53 l64 * * +* +* Array elements marked * are not used by the routine. +* +* ===================================================================== +* +* .. Parameters .. + DOUBLE PRECISION ONE, ZERO + PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) +* .. +* .. Local Scalars .. + LOGICAL UPPER + INTEGER J, KLD, KN + DOUBLE PRECISION AJJ +* .. +* .. External Functions .. + LOGICAL LSAME + EXTERNAL LSAME +* .. +* .. External Subroutines .. + EXTERNAL XERBLA, ZDSCAL, ZHER, ZLACGV +* .. +* .. Intrinsic Functions .. + INTRINSIC DBLE, MAX, MIN, SQRT +* .. +* .. Executable Statements .. +* +* Test the input parameters. +* + INFO = 0 + UPPER = LSAME( UPLO, 'U' ) + IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN + INFO = -1 + ELSE IF( N.LT.0 ) THEN + INFO = -2 + ELSE IF( KD.LT.0 ) THEN + INFO = -3 + ELSE IF( LDAB.LT.KD+1 ) THEN + INFO = -5 + END IF + IF( INFO.NE.0 ) THEN + CALL XERBLA( 'ZPBTF2', -INFO ) + RETURN + END IF +* +* Quick return if possible +* + IF( N.EQ.0 ) + $ RETURN +* + KLD = MAX( 1, LDAB-1 ) +* + IF( UPPER ) THEN +* +* Compute the Cholesky factorization A = U'*U. +* + DO 10 J = 1, N +* +* Compute U(J,J) and test for non-positive-definiteness. +* + AJJ = DBLE( AB( KD+1, J ) ) + IF( AJJ.LE.ZERO ) THEN + AB( KD+1, J ) = AJJ + GO TO 30 + END IF + AJJ = SQRT( AJJ ) + AB( KD+1, J ) = AJJ +* +* Compute elements J+1:J+KN of row J and update the +* trailing submatrix within the band. +* + KN = MIN( KD, N-J ) + IF( KN.GT.0 ) THEN + CALL ZDSCAL( KN, ONE / AJJ, AB( KD, J+1 ), KLD ) + CALL ZLACGV( KN, AB( KD, J+1 ), KLD ) + CALL ZHER( 'Upper', KN, -ONE, AB( KD, J+1 ), KLD, + $ AB( KD+1, J+1 ), KLD ) + CALL ZLACGV( KN, AB( KD, J+1 ), KLD ) + END IF + 10 CONTINUE + ELSE +* +* Compute the Cholesky factorization A = L*L'. +* + DO 20 J = 1, N +* +* Compute L(J,J) and test for non-positive-definiteness. +* + AJJ = DBLE( AB( 1, J ) ) + IF( AJJ.LE.ZERO ) THEN + AB( 1, J ) = AJJ + GO TO 30 + END IF + AJJ = SQRT( AJJ ) + AB( 1, J ) = AJJ +* +* Compute elements J+1:J+KN of column J and update the +* trailing submatrix within the band. +* + KN = MIN( KD, N-J ) + IF( KN.GT.0 ) THEN + CALL ZDSCAL( KN, ONE / AJJ, AB( 2, J ), 1 ) + CALL ZHER( 'Lower', KN, -ONE, AB( 2, J ), 1, + $ AB( 1, J+1 ), KLD ) + END IF + 20 CONTINUE + END IF + RETURN +* + 30 CONTINUE + INFO = J + RETURN +* +* End of ZPBTF2 +* + END diff -r 9f3299378193 -r 57077d0ddc8e libcruft/lapack/zpbtrf.f --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libcruft/lapack/zpbtrf.f Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,372 @@ + SUBROUTINE ZPBTRF( UPLO, N, KD, AB, LDAB, INFO ) +* +* -- LAPACK routine (version 3.0) -- +* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., +* Courant Institute, Argonne National Lab, and Rice University +* September 30, 1994 +* +* .. Scalar Arguments .. + CHARACTER UPLO + INTEGER INFO, KD, LDAB, N +* .. +* .. Array Arguments .. + COMPLEX*16 AB( LDAB, * ) +* .. +* +* Purpose +* ======= +* +* ZPBTRF computes the Cholesky factorization of a complex Hermitian +* positive definite band matrix A. +* +* The factorization has the form +* A = U**H * U, if UPLO = 'U', or +* A = L * L**H, if UPLO = 'L', +* where U is an upper triangular matrix and L is lower triangular. +* +* Arguments +* ========= +* +* UPLO (input) CHARACTER*1 +* = 'U': Upper triangle of A is stored; +* = 'L': Lower triangle of A is stored. +* +* N (input) INTEGER +* The order of the matrix A. N >= 0. +* +* KD (input) INTEGER +* The number of superdiagonals of the matrix A if UPLO = 'U', +* or the number of subdiagonals if UPLO = 'L'. KD >= 0. +* +* AB (input/output) COMPLEX*16 array, dimension (LDAB,N) +* On entry, the upper or lower triangle of the Hermitian band +* matrix A, stored in the first KD+1 rows of the array. The +* j-th column of A is stored in the j-th column of the array AB +* as follows: +* if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j; +* if UPLO = 'L', AB(1+i-j,j) = A(i,j) for j<=i<=min(n,j+kd). +* +* On exit, if INFO = 0, the triangular factor U or L from the +* Cholesky factorization A = U**H*U or A = L*L**H of the band +* matrix A, in the same storage format as A. +* +* LDAB (input) INTEGER +* The leading dimension of the array AB. LDAB >= KD+1. +* +* INFO (output) INTEGER +* = 0: successful exit +* < 0: if INFO = -i, the i-th argument had an illegal value +* > 0: if INFO = i, the leading minor of order i is not +* positive definite, and the factorization could not be +* completed. +* +* Further Details +* =============== +* +* The band storage scheme is illustrated by the following example, when +* N = 6, KD = 2, and UPLO = 'U': +* +* On entry: On exit: +* +* * * a13 a24 a35 a46 * * u13 u24 u35 u46 +* * a12 a23 a34 a45 a56 * u12 u23 u34 u45 u56 +* a11 a22 a33 a44 a55 a66 u11 u22 u33 u44 u55 u66 +* +* Similarly, if UPLO = 'L' the format of A is as follows: +* +* On entry: On exit: +* +* a11 a22 a33 a44 a55 a66 l11 l22 l33 l44 l55 l66 +* a21 a32 a43 a54 a65 * l21 l32 l43 l54 l65 * +* a31 a42 a53 a64 * * l31 l42 l53 l64 * * +* +* Array elements marked * are not used by the routine. +* +* Contributed by +* Peter Mayes and Giuseppe Radicati, IBM ECSEC, Rome, March 23, 1989 +* +* ===================================================================== +* +* .. Parameters .. + DOUBLE PRECISION ONE, ZERO + PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) + COMPLEX*16 CONE + PARAMETER ( CONE = ( 1.0D+0, 0.0D+0 ) ) + INTEGER NBMAX, LDWORK + PARAMETER ( NBMAX = 32, LDWORK = NBMAX+1 ) +* .. +* .. Local Scalars .. + INTEGER I, I2, I3, IB, II, J, JJ, NB +* .. +* .. Local Arrays .. + COMPLEX*16 WORK( LDWORK, NBMAX ) +* .. +* .. External Functions .. + LOGICAL LSAME + INTEGER ILAENV + EXTERNAL LSAME, ILAENV +* .. +* .. External Subroutines .. + EXTERNAL XERBLA, ZGEMM, ZHERK, ZPBTF2, ZPOTF2, ZTRSM +* .. +* .. Intrinsic Functions .. + INTRINSIC MIN +* .. +* .. Executable Statements .. +* +* Test the input parameters. +* + INFO = 0 + IF( ( .NOT.LSAME( UPLO, 'U' ) ) .AND. + $ ( .NOT.LSAME( UPLO, 'L' ) ) ) THEN + INFO = -1 + ELSE IF( N.LT.0 ) THEN + INFO = -2 + ELSE IF( KD.LT.0 ) THEN + INFO = -3 + ELSE IF( LDAB.LT.KD+1 ) THEN + INFO = -5 + END IF + IF( INFO.NE.0 ) THEN + CALL XERBLA( 'ZPBTRF', -INFO ) + RETURN + END IF +* +* Quick return if possible +* + IF( N.EQ.0 ) + $ RETURN +* +* Determine the block size for this environment +* + NB = ILAENV( 1, 'ZPBTRF', UPLO, N, KD, -1, -1 ) +* +* The block size must not exceed the semi-bandwidth KD, and must not +* exceed the limit set by the size of the local array WORK. +* + NB = MIN( NB, NBMAX ) +* + IF( NB.LE.1 .OR. NB.GT.KD ) THEN +* +* Use unblocked code +* + CALL ZPBTF2( UPLO, N, KD, AB, LDAB, INFO ) + ELSE +* +* Use blocked code +* + IF( LSAME( UPLO, 'U' ) ) THEN +* +* Compute the Cholesky factorization of a Hermitian band +* matrix, given the upper triangle of the matrix in band +* storage. +* +* Zero the upper triangle of the work array. +* + DO 20 J = 1, NB + DO 10 I = 1, J - 1 + WORK( I, J ) = ZERO + 10 CONTINUE + 20 CONTINUE +* +* Process the band matrix one diagonal block at a time. +* + DO 70 I = 1, N, NB + IB = MIN( NB, N-I+1 ) +* +* Factorize the diagonal block +* + CALL ZPOTF2( UPLO, IB, AB( KD+1, I ), LDAB-1, II ) + IF( II.NE.0 ) THEN + INFO = I + II - 1 + GO TO 150 + END IF + IF( I+IB.LE.N ) THEN +* +* Update the relevant part of the trailing submatrix. +* If A11 denotes the diagonal block which has just been +* factorized, then we need to update the remaining +* blocks in the diagram: +* +* A11 A12 A13 +* A22 A23 +* A33 +* +* The numbers of rows and columns in the partitioning +* are IB, I2, I3 respectively. The blocks A12, A22 and +* A23 are empty if IB = KD. The upper triangle of A13 +* lies outside the band. +* + I2 = MIN( KD-IB, N-I-IB+1 ) + I3 = MIN( IB, N-I-KD+1 ) +* + IF( I2.GT.0 ) THEN +* +* Update A12 +* + CALL ZTRSM( 'Left', 'Upper', 'Conjugate transpose', + $ 'Non-unit', IB, I2, CONE, + $ AB( KD+1, I ), LDAB-1, + $ AB( KD+1-IB, I+IB ), LDAB-1 ) +* +* Update A22 +* + CALL ZHERK( 'Upper', 'Conjugate transpose', I2, IB, + $ -ONE, AB( KD+1-IB, I+IB ), LDAB-1, ONE, + $ AB( KD+1, I+IB ), LDAB-1 ) + END IF +* + IF( I3.GT.0 ) THEN +* +* Copy the lower triangle of A13 into the work array. +* + DO 40 JJ = 1, I3 + DO 30 II = JJ, IB + WORK( II, JJ ) = AB( II-JJ+1, JJ+I+KD-1 ) + 30 CONTINUE + 40 CONTINUE +* +* Update A13 (in the work array). +* + CALL ZTRSM( 'Left', 'Upper', 'Conjugate transpose', + $ 'Non-unit', IB, I3, CONE, + $ AB( KD+1, I ), LDAB-1, WORK, LDWORK ) +* +* Update A23 +* + IF( I2.GT.0 ) + $ CALL ZGEMM( 'Conjugate transpose', + $ 'No transpose', I2, I3, IB, -CONE, + $ AB( KD+1-IB, I+IB ), LDAB-1, WORK, + $ LDWORK, CONE, AB( 1+IB, I+KD ), + $ LDAB-1 ) +* +* Update A33 +* + CALL ZHERK( 'Upper', 'Conjugate transpose', I3, IB, + $ -ONE, WORK, LDWORK, ONE, + $ AB( KD+1, I+KD ), LDAB-1 ) +* +* Copy the lower triangle of A13 back into place. +* + DO 60 JJ = 1, I3 + DO 50 II = JJ, IB + AB( II-JJ+1, JJ+I+KD-1 ) = WORK( II, JJ ) + 50 CONTINUE + 60 CONTINUE + END IF + END IF + 70 CONTINUE + ELSE +* +* Compute the Cholesky factorization of a Hermitian band +* matrix, given the lower triangle of the matrix in band +* storage. +* +* Zero the lower triangle of the work array. +* + DO 90 J = 1, NB + DO 80 I = J + 1, NB + WORK( I, J ) = ZERO + 80 CONTINUE + 90 CONTINUE +* +* Process the band matrix one diagonal block at a time. +* + DO 140 I = 1, N, NB + IB = MIN( NB, N-I+1 ) +* +* Factorize the diagonal block +* + CALL ZPOTF2( UPLO, IB, AB( 1, I ), LDAB-1, II ) + IF( II.NE.0 ) THEN + INFO = I + II - 1 + GO TO 150 + END IF + IF( I+IB.LE.N ) THEN +* +* Update the relevant part of the trailing submatrix. +* If A11 denotes the diagonal block which has just been +* factorized, then we need to update the remaining +* blocks in the diagram: +* +* A11 +* A21 A22 +* A31 A32 A33 +* +* The numbers of rows and columns in the partitioning +* are IB, I2, I3 respectively. The blocks A21, A22 and +* A32 are empty if IB = KD. The lower triangle of A31 +* lies outside the band. +* + I2 = MIN( KD-IB, N-I-IB+1 ) + I3 = MIN( IB, N-I-KD+1 ) +* + IF( I2.GT.0 ) THEN +* +* Update A21 +* + CALL ZTRSM( 'Right', 'Lower', + $ 'Conjugate transpose', 'Non-unit', I2, + $ IB, CONE, AB( 1, I ), LDAB-1, + $ AB( 1+IB, I ), LDAB-1 ) +* +* Update A22 +* + CALL ZHERK( 'Lower', 'No transpose', I2, IB, -ONE, + $ AB( 1+IB, I ), LDAB-1, ONE, + $ AB( 1, I+IB ), LDAB-1 ) + END IF +* + IF( I3.GT.0 ) THEN +* +* Copy the upper triangle of A31 into the work array. +* + DO 110 JJ = 1, IB + DO 100 II = 1, MIN( JJ, I3 ) + WORK( II, JJ ) = AB( KD+1-JJ+II, JJ+I-1 ) + 100 CONTINUE + 110 CONTINUE +* +* Update A31 (in the work array). +* + CALL ZTRSM( 'Right', 'Lower', + $ 'Conjugate transpose', 'Non-unit', I3, + $ IB, CONE, AB( 1, I ), LDAB-1, WORK, + $ LDWORK ) +* +* Update A32 +* + IF( I2.GT.0 ) + $ CALL ZGEMM( 'No transpose', + $ 'Conjugate transpose', I3, I2, IB, + $ -CONE, WORK, LDWORK, AB( 1+IB, I ), + $ LDAB-1, CONE, AB( 1+KD-IB, I+IB ), + $ LDAB-1 ) +* +* Update A33 +* + CALL ZHERK( 'Lower', 'No transpose', I3, IB, -ONE, + $ WORK, LDWORK, ONE, AB( 1, I+KD ), + $ LDAB-1 ) +* +* Copy the upper triangle of A31 back into place. +* + DO 130 JJ = 1, IB + DO 120 II = 1, MIN( JJ, I3 ) + AB( KD+1-JJ+II, JJ+I-1 ) = WORK( II, JJ ) + 120 CONTINUE + 130 CONTINUE + END IF + END IF + 140 CONTINUE + END IF + END IF + RETURN +* + 150 CONTINUE + RETURN +* +* End of ZPBTRF +* + END diff -r 9f3299378193 -r 57077d0ddc8e libcruft/lapack/zpbtrs.f --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libcruft/lapack/zpbtrs.f Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,146 @@ + SUBROUTINE ZPBTRS( UPLO, N, KD, NRHS, AB, LDAB, B, LDB, INFO ) +* +* -- LAPACK routine (version 3.0) -- +* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., +* Courant Institute, Argonne National Lab, and Rice University +* September 30, 1994 +* +* .. Scalar Arguments .. + CHARACTER UPLO + INTEGER INFO, KD, LDAB, LDB, N, NRHS +* .. +* .. Array Arguments .. + COMPLEX*16 AB( LDAB, * ), B( LDB, * ) +* .. +* +* Purpose +* ======= +* +* ZPBTRS solves a system of linear equations A*X = B with a Hermitian +* positive definite band matrix A using the Cholesky factorization +* A = U**H*U or A = L*L**H computed by ZPBTRF. +* +* Arguments +* ========= +* +* UPLO (input) CHARACTER*1 +* = 'U': Upper triangular factor stored in AB; +* = 'L': Lower triangular factor stored in AB. +* +* N (input) INTEGER +* The order of the matrix A. N >= 0. +* +* KD (input) INTEGER +* The number of superdiagonals of the matrix A if UPLO = 'U', +* or the number of subdiagonals if UPLO = 'L'. KD >= 0. +* +* NRHS (input) INTEGER +* The number of right hand sides, i.e., the number of columns +* of the matrix B. NRHS >= 0. +* +* AB (input) COMPLEX*16 array, dimension (LDAB,N) +* The triangular factor U or L from the Cholesky factorization +* A = U**H*U or A = L*L**H of the band matrix A, stored in the +* first KD+1 rows of the array. The j-th column of U or L is +* stored in the j-th column of the array AB as follows: +* if UPLO ='U', AB(kd+1+i-j,j) = U(i,j) for max(1,j-kd)<=i<=j; +* if UPLO ='L', AB(1+i-j,j) = L(i,j) for j<=i<=min(n,j+kd). +* +* LDAB (input) INTEGER +* The leading dimension of the array AB. LDAB >= KD+1. +* +* B (input/output) COMPLEX*16 array, dimension (LDB,NRHS) +* On entry, the right hand side matrix B. +* On exit, the solution matrix X. +* +* LDB (input) INTEGER +* The leading dimension of the array B. LDB >= max(1,N). +* +* INFO (output) INTEGER +* = 0: successful exit +* < 0: if INFO = -i, the i-th argument had an illegal value +* +* ===================================================================== +* +* .. Local Scalars .. + LOGICAL UPPER + INTEGER J +* .. +* .. External Functions .. + LOGICAL LSAME + EXTERNAL LSAME +* .. +* .. External Subroutines .. + EXTERNAL XERBLA, ZTBSV +* .. +* .. Intrinsic Functions .. + INTRINSIC MAX +* .. +* .. Executable Statements .. +* +* Test the input parameters. +* + INFO = 0 + UPPER = LSAME( UPLO, 'U' ) + IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN + INFO = -1 + ELSE IF( N.LT.0 ) THEN + INFO = -2 + ELSE IF( KD.LT.0 ) THEN + INFO = -3 + ELSE IF( NRHS.LT.0 ) THEN + INFO = -4 + ELSE IF( LDAB.LT.KD+1 ) THEN + INFO = -6 + ELSE IF( LDB.LT.MAX( 1, N ) ) THEN + INFO = -8 + END IF + IF( INFO.NE.0 ) THEN + CALL XERBLA( 'ZPBTRS', -INFO ) + RETURN + END IF +* +* Quick return if possible +* + IF( N.EQ.0 .OR. NRHS.EQ.0 ) + $ RETURN +* + IF( UPPER ) THEN +* +* Solve A*X = B where A = U'*U. +* + DO 10 J = 1, NRHS +* +* Solve U'*X = B, overwriting B with X. +* + CALL ZTBSV( 'Upper', 'Conjugate transpose', 'Non-unit', N, + $ KD, AB, LDAB, B( 1, J ), 1 ) +* +* Solve U*X = B, overwriting B with X. +* + CALL ZTBSV( 'Upper', 'No transpose', 'Non-unit', N, KD, AB, + $ LDAB, B( 1, J ), 1 ) + 10 CONTINUE + ELSE +* +* Solve A*X = B where A = L*L'. +* + DO 20 J = 1, NRHS +* +* Solve L*X = B, overwriting B with X. +* + CALL ZTBSV( 'Lower', 'No transpose', 'Non-unit', N, KD, AB, + $ LDAB, B( 1, J ), 1 ) +* +* Solve L'*X = B, overwriting B with X. +* + CALL ZTBSV( 'Lower', 'Conjugate transpose', 'Non-unit', N, + $ KD, AB, LDAB, B( 1, J ), 1 ) + 20 CONTINUE + END IF +* + RETURN +* +* End of ZPBTRS +* + END diff -r 9f3299378193 -r 57077d0ddc8e libcruft/lapack/zptsv.f --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libcruft/lapack/zptsv.f Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,101 @@ + SUBROUTINE ZPTSV( N, NRHS, D, E, B, LDB, INFO ) +* +* -- LAPACK routine (version 3.0) -- +* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., +* Courant Institute, Argonne National Lab, and Rice University +* February 25, 1997 +* +* .. Scalar Arguments .. + INTEGER INFO, LDB, N, NRHS +* .. +* .. Array Arguments .. + DOUBLE PRECISION D( * ) + COMPLEX*16 B( LDB, * ), E( * ) +* .. +* +* Purpose +* ======= +* +* ZPTSV computes the solution to a complex system of linear equations +* A*X = B, where A is an N-by-N Hermitian positive definite tridiagonal +* matrix, and X and B are N-by-NRHS matrices. +* +* A is factored as A = L*D*L**H, and the factored form of A is then +* used to solve the system of equations. +* +* Arguments +* ========= +* +* N (input) INTEGER +* The order of the matrix A. N >= 0. +* +* NRHS (input) INTEGER +* The number of right hand sides, i.e., the number of columns +* of the matrix B. NRHS >= 0. +* +* D (input/output) DOUBLE PRECISION array, dimension (N) +* On entry, the n diagonal elements of the tridiagonal matrix +* A. On exit, the n diagonal elements of the diagonal matrix +* D from the factorization A = L*D*L**H. +* +* E (input/output) COMPLEX*16 array, dimension (N-1) +* On entry, the (n-1) subdiagonal elements of the tridiagonal +* matrix A. On exit, the (n-1) subdiagonal elements of the +* unit bidiagonal factor L from the L*D*L**H factorization of +* A. E can also be regarded as the superdiagonal of the unit +* bidiagonal factor U from the U**H*D*U factorization of A. +* +* B (input/output) COMPLEX*16 array, dimension (LDB,N) +* On entry, the N-by-NRHS right hand side matrix B. +* On exit, if INFO = 0, the N-by-NRHS solution matrix X. +* +* LDB (input) INTEGER +* The leading dimension of the array B. LDB >= max(1,N). +* +* INFO (output) INTEGER +* = 0: successful exit +* < 0: if INFO = -i, the i-th argument had an illegal value +* > 0: if INFO = i, the leading minor of order i is not +* positive definite, and the solution has not been +* computed. The factorization has not been completed +* unless i = N. +* +* ===================================================================== +* +* .. External Subroutines .. + EXTERNAL XERBLA, ZPTTRF, ZPTTRS +* .. +* .. Intrinsic Functions .. + INTRINSIC MAX +* .. +* .. Executable Statements .. +* +* Test the input parameters. +* + INFO = 0 + IF( N.LT.0 ) THEN + INFO = -1 + ELSE IF( NRHS.LT.0 ) THEN + INFO = -2 + ELSE IF( LDB.LT.MAX( 1, N ) ) THEN + INFO = -6 + END IF + IF( INFO.NE.0 ) THEN + CALL XERBLA( 'ZPTSV ', -INFO ) + RETURN + END IF +* +* Compute the L*D*L' (or U'*D*U) factorization of A. +* + CALL ZPTTRF( N, D, E, INFO ) + IF( INFO.EQ.0 ) THEN +* +* Solve the system A*X = B, overwriting B with X. +* + CALL ZPTTRS( 'Lower', N, NRHS, D, E, B, LDB, INFO ) + END IF + RETURN +* +* End of ZPTSV +* + END diff -r 9f3299378193 -r 57077d0ddc8e libcruft/lapack/zpttrf.f --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libcruft/lapack/zpttrf.f Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,169 @@ + SUBROUTINE ZPTTRF( N, D, E, INFO ) +* +* -- LAPACK routine (version 3.0) -- +* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., +* Courant Institute, Argonne National Lab, and Rice University +* June 30, 1999 +* +* .. Scalar Arguments .. + INTEGER INFO, N +* .. +* .. Array Arguments .. + DOUBLE PRECISION D( * ) + COMPLEX*16 E( * ) +* .. +* +* Purpose +* ======= +* +* ZPTTRF computes the L*D*L' factorization of a complex Hermitian +* positive definite tridiagonal matrix A. The factorization may also +* be regarded as having the form A = U'*D*U. +* +* Arguments +* ========= +* +* N (input) INTEGER +* The order of the matrix A. N >= 0. +* +* D (input/output) DOUBLE PRECISION array, dimension (N) +* On entry, the n diagonal elements of the tridiagonal matrix +* A. On exit, the n diagonal elements of the diagonal matrix +* D from the L*D*L' factorization of A. +* +* E (input/output) COMPLEX*16 array, dimension (N-1) +* On entry, the (n-1) subdiagonal elements of the tridiagonal +* matrix A. On exit, the (n-1) subdiagonal elements of the +* unit bidiagonal factor L from the L*D*L' factorization of A. +* E can also be regarded as the superdiagonal of the unit +* bidiagonal factor U from the U'*D*U factorization of A. +* +* INFO (output) INTEGER +* = 0: successful exit +* < 0: if INFO = -k, the k-th argument had an illegal value +* > 0: if INFO = k, the leading minor of order k is not +* positive definite; if k < N, the factorization could not +* be completed, while if k = N, the factorization was +* completed, but D(N) = 0. +* +* ===================================================================== +* +* .. Parameters .. + DOUBLE PRECISION ZERO + PARAMETER ( ZERO = 0.0D+0 ) +* .. +* .. Local Scalars .. + INTEGER I, I4 + DOUBLE PRECISION EII, EIR, F, G +* .. +* .. External Subroutines .. + EXTERNAL XERBLA +* .. +* .. Intrinsic Functions .. + INTRINSIC DBLE, DCMPLX, DIMAG, MOD +* .. +* .. Executable Statements .. +* +* Test the input parameters. +* + INFO = 0 + IF( N.LT.0 ) THEN + INFO = -1 + CALL XERBLA( 'ZPTTRF', -INFO ) + RETURN + END IF +* +* Quick return if possible +* + IF( N.EQ.0 ) + $ RETURN +* +* Compute the L*D*L' (or U'*D*U) factorization of A. +* + I4 = MOD( N-1, 4 ) + DO 10 I = 1, I4 + IF( D( I ).LE.ZERO ) THEN + INFO = I + GO TO 30 + END IF + EIR = DBLE( E( I ) ) + EII = DIMAG( E( I ) ) + F = EIR / D( I ) + G = EII / D( I ) + E( I ) = DCMPLX( F, G ) + D( I+1 ) = D( I+1 ) - F*EIR - G*EII + 10 CONTINUE +* + DO 20 I = I4 + 1, N - 4, 4 +* +* Drop out of the loop if d(i) <= 0: the matrix is not positive +* definite. +* + IF( D( I ).LE.ZERO ) THEN + INFO = I + GO TO 30 + END IF +* +* Solve for e(i) and d(i+1). +* + EIR = DBLE( E( I ) ) + EII = DIMAG( E( I ) ) + F = EIR / D( I ) + G = EII / D( I ) + E( I ) = DCMPLX( F, G ) + D( I+1 ) = D( I+1 ) - F*EIR - G*EII +* + IF( D( I+1 ).LE.ZERO ) THEN + INFO = I + 1 + GO TO 30 + END IF +* +* Solve for e(i+1) and d(i+2). +* + EIR = DBLE( E( I+1 ) ) + EII = DIMAG( E( I+1 ) ) + F = EIR / D( I+1 ) + G = EII / D( I+1 ) + E( I+1 ) = DCMPLX( F, G ) + D( I+2 ) = D( I+2 ) - F*EIR - G*EII +* + IF( D( I+2 ).LE.ZERO ) THEN + INFO = I + 2 + GO TO 30 + END IF +* +* Solve for e(i+2) and d(i+3). +* + EIR = DBLE( E( I+2 ) ) + EII = DIMAG( E( I+2 ) ) + F = EIR / D( I+2 ) + G = EII / D( I+2 ) + E( I+2 ) = DCMPLX( F, G ) + D( I+3 ) = D( I+3 ) - F*EIR - G*EII +* + IF( D( I+3 ).LE.ZERO ) THEN + INFO = I + 3 + GO TO 30 + END IF +* +* Solve for e(i+3) and d(i+4). +* + EIR = DBLE( E( I+3 ) ) + EII = DIMAG( E( I+3 ) ) + F = EIR / D( I+3 ) + G = EII / D( I+3 ) + E( I+3 ) = DCMPLX( F, G ) + D( I+4 ) = D( I+4 ) - F*EIR - G*EII + 20 CONTINUE +* +* Check d(n) for positive definiteness. +* + IF( D( N ).LE.ZERO ) + $ INFO = N +* + 30 CONTINUE + RETURN +* +* End of ZPTTRF +* + END diff -r 9f3299378193 -r 57077d0ddc8e libcruft/lapack/zpttrs.f --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libcruft/lapack/zpttrs.f Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,136 @@ + SUBROUTINE ZPTTRS( UPLO, N, NRHS, D, E, B, LDB, INFO ) +* +* -- LAPACK routine (version 3.0) -- +* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., +* Courant Institute, Argonne National Lab, and Rice University +* June 30, 1999 +* +* .. Scalar Arguments .. + CHARACTER UPLO + INTEGER INFO, LDB, N, NRHS +* .. +* .. Array Arguments .. + DOUBLE PRECISION D( * ) + COMPLEX*16 B( LDB, * ), E( * ) +* .. +* +* Purpose +* ======= +* +* ZPTTRS solves a tridiagonal system of the form +* A * X = B +* using the factorization A = U'*D*U or A = L*D*L' computed by ZPTTRF. +* D is a diagonal matrix specified in the vector D, U (or L) is a unit +* bidiagonal matrix whose superdiagonal (subdiagonal) is specified in +* the vector E, and X and B are N by NRHS matrices. +* +* Arguments +* ========= +* +* UPLO (input) CHARACTER*1 +* Specifies the form of the factorization and whether the +* vector E is the superdiagonal of the upper bidiagonal factor +* U or the subdiagonal of the lower bidiagonal factor L. +* = 'U': A = U'*D*U, E is the superdiagonal of U +* = 'L': A = L*D*L', E is the subdiagonal of L +* +* N (input) INTEGER +* The order of the tridiagonal matrix A. N >= 0. +* +* NRHS (input) INTEGER +* The number of right hand sides, i.e., the number of columns +* of the matrix B. NRHS >= 0. +* +* D (input) DOUBLE PRECISION array, dimension (N) +* The n diagonal elements of the diagonal matrix D from the +* factorization A = U'*D*U or A = L*D*L'. +* +* E (input) COMPLEX*16 array, dimension (N-1) +* If UPLO = 'U', the (n-1) superdiagonal elements of the unit +* bidiagonal factor U from the factorization A = U'*D*U. +* If UPLO = 'L', the (n-1) subdiagonal elements of the unit +* bidiagonal factor L from the factorization A = L*D*L'. +* +* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) +* On entry, the right hand side vectors B for the system of +* linear equations. +* On exit, the solution vectors, X. +* +* LDB (input) INTEGER +* The leading dimension of the array B. LDB >= max(1,N). +* +* INFO (output) INTEGER +* = 0: successful exit +* < 0: if INFO = -k, the k-th argument had an illegal value +* +* ===================================================================== +* +* .. Local Scalars .. + LOGICAL UPPER + INTEGER IUPLO, J, JB, NB +* .. +* .. External Functions .. + INTEGER ILAENV + EXTERNAL ILAENV +* .. +* .. External Subroutines .. + EXTERNAL XERBLA, ZPTTS2 +* .. +* .. Intrinsic Functions .. + INTRINSIC MAX, MIN +* .. +* .. Executable Statements .. +* +* Test the input arguments. +* + INFO = 0 + UPPER = ( UPLO.EQ.'U' .OR. UPLO.EQ.'u' ) + IF( .NOT.UPPER .AND. .NOT.( UPLO.EQ.'L' .OR. UPLO.EQ.'l' ) ) THEN + INFO = -1 + ELSE IF( N.LT.0 ) THEN + INFO = -2 + ELSE IF( NRHS.LT.0 ) THEN + INFO = -3 + ELSE IF( LDB.LT.MAX( 1, N ) ) THEN + INFO = -7 + END IF + IF( INFO.NE.0 ) THEN + CALL XERBLA( 'ZPTTRS', -INFO ) + RETURN + END IF +* +* Quick return if possible +* + IF( N.EQ.0 .OR. NRHS.EQ.0 ) + $ RETURN +* +* Determine the number of right-hand sides to solve at a time. +* + IF( NRHS.EQ.1 ) THEN + NB = 1 + ELSE + NB = MAX( 1, ILAENV( 1, 'ZPTTRS', UPLO, N, NRHS, -1, -1 ) ) + END IF +* +* Decode UPLO +* + IF( UPPER ) THEN + IUPLO = 1 + ELSE + IUPLO = 0 + END IF +* + IF( NB.GE.NRHS ) THEN + CALL ZPTTS2( IUPLO, N, NRHS, D, E, B, LDB ) + ELSE + DO 10 J = 1, NRHS, NB + JB = MIN( NRHS-J+1, NB ) + CALL ZPTTS2( IUPLO, N, JB, D, E, B( 1, J ), LDB ) + 10 CONTINUE + END IF +* + RETURN +* +* End of ZPTTRS +* + END diff -r 9f3299378193 -r 57077d0ddc8e libcruft/lapack/zptts2.f --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libcruft/lapack/zptts2.f Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,177 @@ + SUBROUTINE ZPTTS2( IUPLO, N, NRHS, D, E, B, LDB ) +* +* -- LAPACK routine (version 3.0) -- +* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., +* Courant Institute, Argonne National Lab, and Rice University +* June 30, 1999 +* +* .. Scalar Arguments .. + INTEGER IUPLO, LDB, N, NRHS +* .. +* .. Array Arguments .. + DOUBLE PRECISION D( * ) + COMPLEX*16 B( LDB, * ), E( * ) +* .. +* +* Purpose +* ======= +* +* ZPTTS2 solves a tridiagonal system of the form +* A * X = B +* using the factorization A = U'*D*U or A = L*D*L' computed by ZPTTRF. +* D is a diagonal matrix specified in the vector D, U (or L) is a unit +* bidiagonal matrix whose superdiagonal (subdiagonal) is specified in +* the vector E, and X and B are N by NRHS matrices. +* +* Arguments +* ========= +* +* IUPLO (input) INTEGER +* Specifies the form of the factorization and whether the +* vector E is the superdiagonal of the upper bidiagonal factor +* U or the subdiagonal of the lower bidiagonal factor L. +* = 1: A = U'*D*U, E is the superdiagonal of U +* = 0: A = L*D*L', E is the subdiagonal of L +* +* N (input) INTEGER +* The order of the tridiagonal matrix A. N >= 0. +* +* NRHS (input) INTEGER +* The number of right hand sides, i.e., the number of columns +* of the matrix B. NRHS >= 0. +* +* D (input) DOUBLE PRECISION array, dimension (N) +* The n diagonal elements of the diagonal matrix D from the +* factorization A = U'*D*U or A = L*D*L'. +* +* E (input) COMPLEX*16 array, dimension (N-1) +* If IUPLO = 1, the (n-1) superdiagonal elements of the unit +* bidiagonal factor U from the factorization A = U'*D*U. +* If IUPLO = 0, the (n-1) subdiagonal elements of the unit +* bidiagonal factor L from the factorization A = L*D*L'. +* +* B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) +* On entry, the right hand side vectors B for the system of +* linear equations. +* On exit, the solution vectors, X. +* +* LDB (input) INTEGER +* The leading dimension of the array B. LDB >= max(1,N). +* +* ===================================================================== +* +* .. Local Scalars .. + INTEGER I, J +* .. +* .. External Subroutines .. + EXTERNAL ZDSCAL +* .. +* .. Intrinsic Functions .. + INTRINSIC DCONJG +* .. +* .. Executable Statements .. +* +* Quick return if possible +* + IF( N.LE.1 ) THEN + IF( N.EQ.1 ) + $ CALL ZDSCAL( NRHS, 1.D0 / D( 1 ), B, LDB ) + RETURN + END IF +* + IF( IUPLO.EQ.1 ) THEN +* +* Solve A * X = B using the factorization A = U'*D*U, +* overwriting each right hand side vector with its solution. +* + IF( NRHS.LE.2 ) THEN + J = 1 + 10 CONTINUE +* +* Solve U' * x = b. +* + DO 20 I = 2, N + B( I, J ) = B( I, J ) - B( I-1, J )*DCONJG( E( I-1 ) ) + 20 CONTINUE +* +* Solve D * U * x = b. +* + DO 30 I = 1, N + B( I, J ) = B( I, J ) / D( I ) + 30 CONTINUE + DO 40 I = N - 1, 1, -1 + B( I, J ) = B( I, J ) - B( I+1, J )*E( I ) + 40 CONTINUE + IF( J.LT.NRHS ) THEN + J = J + 1 + GO TO 10 + END IF + ELSE + DO 70 J = 1, NRHS +* +* Solve U' * x = b. +* + DO 50 I = 2, N + B( I, J ) = B( I, J ) - B( I-1, J )*DCONJG( E( I-1 ) ) + 50 CONTINUE +* +* Solve D * U * x = b. +* + B( N, J ) = B( N, J ) / D( N ) + DO 60 I = N - 1, 1, -1 + B( I, J ) = B( I, J ) / D( I ) - B( I+1, J )*E( I ) + 60 CONTINUE + 70 CONTINUE + END IF + ELSE +* +* Solve A * X = B using the factorization A = L*D*L', +* overwriting each right hand side vector with its solution. +* + IF( NRHS.LE.2 ) THEN + J = 1 + 80 CONTINUE +* +* Solve L * x = b. +* + DO 90 I = 2, N + B( I, J ) = B( I, J ) - B( I-1, J )*E( I-1 ) + 90 CONTINUE +* +* Solve D * L' * x = b. +* + DO 100 I = 1, N + B( I, J ) = B( I, J ) / D( I ) + 100 CONTINUE + DO 110 I = N - 1, 1, -1 + B( I, J ) = B( I, J ) - B( I+1, J )*DCONJG( E( I ) ) + 110 CONTINUE + IF( J.LT.NRHS ) THEN + J = J + 1 + GO TO 80 + END IF + ELSE + DO 140 J = 1, NRHS +* +* Solve L * x = b. +* + DO 120 I = 2, N + B( I, J ) = B( I, J ) - B( I-1, J )*E( I-1 ) + 120 CONTINUE +* +* Solve D * L' * x = b. +* + B( N, J ) = B( N, J ) / D( N ) + DO 130 I = N - 1, 1, -1 + B( I, J ) = B( I, J ) / D( I ) - + $ B( I+1, J )*DCONJG( E( I ) ) + 130 CONTINUE + 140 CONTINUE + END IF + END IF +* + RETURN +* +* End of ZPTTS2 +* + END diff -r 9f3299378193 -r 57077d0ddc8e liboctave/CNDArray.cc --- a/liboctave/CNDArray.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/liboctave/CNDArray.cc Fri Feb 25 19:55:28 2005 +0000 @@ -26,6 +26,7 @@ #endif #include + #include #include "Array-util.h" diff -r 9f3299378193 -r 57077d0ddc8e liboctave/COLAMD.README --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/COLAMD.README Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,25 @@ +This directory contains an unmodified copy of COLAMD version 2.3 in +the subdirectory COLAMD. COLAMD was written by Stefan I. Larimore and +Timothy A. Davis (davis@cise.ufl.edu), University of Florida. The +algorithm was developed in collaboration with John Gilbert, Xerox +PARC, and Esmond Ng, Oak Ridge National Laboratory. COLAMD is +distributed under the following terms: + + Copyright (c) 1998-2003 by the University of Florida. + All Rights Reserved. + + THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY + EXPRESSED OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + + Permission is hereby granted to use, copy, modify, and/or distribute + this program, provided that the Copyright, this License, and the + Availability of the original version is retained on all copies and made + accessible to the end-user of any code or package that includes COLAMD + or any modified version of COLAMD. + +John W. Eaton +jwe@bevo.che.wisc.edu +University of Wisconsin-Madison +Department of Chemical & Biological Engineering + +Wed Dec 29 20:20:56 2004 diff -r 9f3299378193 -r 57077d0ddc8e liboctave/COLAMD.files --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/COLAMD.files Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,11 @@ + +COLAMD_SRC := colamd.c + +COLAMD_OBJ := $(COLAMD_SRC:.c=.o) + +COLAMD_DEP := $(COLAMD_SRC:.c=.d) + +$(COLAMD_OBJ) $(COLAMD_DEP) := INCFLAGS += -I$(top_srcdir)/liboctave/COLAMD + +COLAMD_EXTRAS := COLAMD.files COLAMD.README + diff -r 9f3299378193 -r 57077d0ddc8e liboctave/COLAMD/ChangeLog --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/COLAMD/ChangeLog Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,69 @@ + Changes from Version 2.2 to 2.3 (Sept. 8, 2003) + + * removed the call to the MATLAB spparms ('spumoni') function. + This can take a lot of time if you are ordering many small + matrices. Only affects the MATLAB interface (colamdmex.c, + symamdmex.c, colamdtestmex.c, and symamdtestmex.c). The + usage of the optional 2nd argument to the colamd and symamd + mexFunctions was changed accordingly. + + Changes from Version 2.1 to 2.2 (Sept. 23, 2002) + + * extensive testing routines added (colamd_test.m, colamdtestmex.c, + and symamdtestmex.c), and the Makefile modified accordingly. + + * a few typos in the comments corrected + + * use of the MATLAB "flops" command removed from colamd_demo, and an + m-file routine luflops.m added. + + * an explicit typecast from unsigned to int added, for COLAMD_C and + COLAMD_R in colamd.h. + + * #include added to colamd_example.c + + + Changes from Version 2.0 to 2.1 (May 4, 2001) + + * TRUE and FALSE are predefined on some systems, so they are defined + here only if not already defined. + + * web site changed + + * UNIX Makefile modified, to handle the case if "." is not in your path. + + + Changes from Version 1.0 to 2.0 (January 31, 2000) + + No bugs were found in version 1.1. These changes merely add new + functionality. + + * added the COLAMD_RECOMMENDED (nnz, n_row, n_col) macro. + + * moved the output statistics, from A, to a separate output argument. + The arguments changed for the C-callable routines. + + * added colamd_report and symamd_report. + + * added a C-callable symamd routine. Formerly, symamd was only + available as a mexFunction from MATLAB. + + * added error-checking to symamd. Formerly, it assumed its input + was error-free. + + * added the optional stats and knobs arguments to the symamd mexFunction + + * deleted colamd_help. A help message is still available from + "help colamd" and "help symamd" in MATLAB. + + * deleted colamdtree.m and symamdtree.m. Now, colamd.m and symamd.m + also do the elimination tree post-ordering. The Version 1.1 + colamd and symamd mexFunctions, which do not do the post- + ordering, are now visible as colamdmex and symamdmex from + MATLAB. Essentialy, the post-ordering is now the default + behavior of colamd.m and symamd.m, to match the behavior of + colmmd and symmmd. The post-ordering is only available in the + MATLAB interface, not the C-callable interface. + + * made a slight change to the dense row/column detection in symamd, + to match the stated specifications. diff -r 9f3299378193 -r 57077d0ddc8e liboctave/COLAMD/Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/COLAMD/Makefile Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,19 @@ +colamd_example: colamd_example.c colamd.c colamd.h + cc -O -o colamd_example colamd_example.c colamd.c + - ./colamd_example + +clean: + - rm *.o colamd_example + - rm colamdmex.mex* symamdmex.mex* + - rm colamdtestmex.mex* symamdtestmex.mex* + +# Compiles the MATLAB-callable routines +matlab: colamdmex.c colamd.c colamd.h + mex -O colamdmex.c colamd.c + mex -O symamdmex.c colamd.c + +# Compiles the extensive test code +test: matlab colamdmex.c colamd.c colamd.h + mex -O colamdtestmex.c colamd.c + mex -O symamdtestmex.c colamd.c + diff -r 9f3299378193 -r 57077d0ddc8e liboctave/COLAMD/README --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/COLAMD/README Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,104 @@ +The COLAMD ordering method - Version 2.3 +------------------------------------------------------------------------------- + +The COLAMD column approximate minimum degree ordering algorithm computes +a permutation vector P such that the LU factorization of A (:,P) +tends to be sparser than that of A. The Cholesky factorization of +(A (:,P))'*(A (:,P)) will also tend to be sparser than that of A'*A. +SYMAMD is a symmetric minimum degree ordering method based on COLAMD, +available as a MATLAB-callable function. It constructs a matrix M such +that M'*M has the same pattern as A, and then uses COLAMD to compute a column +ordering of M. Colamd and symamd tend to be faster and generate better +orderings than their MATLAB counterparts, colmmd and symmmd. + +To compile and test the colamd m-files and mexFunctions, just unpack the +colamd2.3/ directory from the colamd2.3.tar.gz file, and run MATLAB from +within that directory. Next, type colamd_test to compile and test colamd +and symamd. This will work on any computer with MATLAB (Unix, PC, or Mac). +Alternatively, type "make" (in Unix) to compile and run a simple example C +code, without using MATLAB. + +Colamd 2.0 is a built-in routine in MATLAB V6.0, available from The +Mathworks, Inc. Under most cases, the compiled codes from Versions 2.0 +through 2.2 do not differ. Colamd Versions 2.2 and 2.3 differ only in their +mexFunction interaces to MATLAB. + +To use colamd and symamd within an application written in C, all you need are +colamd.c and colamd.h, which are the C-callable colamd/symamd codes. +See colamd.c for more information on how to call colamd from a C program. + + + Copyright (c) 1998-2003 by the University of Florida. + All Rights Reserved. + + See http://www.cise.ufl.edu/research/sparse/colamd (the colamd.c + file) for the License. + + +Related papers: + + "A column approximate minimum degree ordering algorithm", Timothy A. + Davis, John R. Gilbert, Stefan I. Larimore, and Esmond G. Ng. + ACM Trans. on Mathematical Software. + + "Algorithm 8xx: COLAMD, a column approximate minimum degree ordering + algorithm", Timothy A. Davis, John R. Gilbert, Stefan I. Larimore, and + Esmond G. Ng. ACM Trans. on Mathematical Software. + + "An approximate minimum degree column ordering algorithm", + S. I. Larimore, MS Thesis, Dept. of Computer and Information + Science and Engineering, University of Florida, Gainesville, FL, + 1998. CISE Tech Report TR-98-016. Available at + ftp://ftp.cise.ufl.edu/cis/tech-reports/tr98/tr98-016.ps + via anonymous ftp. + + Approximate Deficiency for Ordering the Columns of a Matrix, + J. L. Kern, Senior Thesis, Dept. of Computer and Information + Science and Engineering, University of Florida, Gainesville, FL, + 1999. Available at http://www.cise.ufl.edu/~davis/Kern/kern.ps + + +Authors: Stefan I. Larimore and Timothy A. Davis, University of Florida, +in collaboration with John Gilbert, Xerox PARC (now at UC Santa Barbara), +and Esmong Ng, Lawrence Berkeley National Laboratory (much of this work +he did while at Oak Ridge National Laboratory). + +COLAMD files (Version 2.3, September 8, 2003): + + colamd2.3.tar.gz: + All files, as a gzipped, Unix tar file. + The *.m, and *mex.c files are for use in MATLAB. + + colamd.c: the primary colamd computational kernel. + + colamd.h: include file for colamd/symamd library. + + colamd.m: the MATLAB interface to colamd. + + colamd_demo.m: MATLAB demo file for colamd and symamd + (also compiles the colamdmex and symamdmex mexFunctions). + + colamdmex.c: colamd mexFunction for use in MATLAB. + + colamd_example.c: example C main program that calls colamd and symamd. + + colamd_example.out: output of colamd_example.c. + + Makefile: Makefile for colamd_example.c + + symamd.m: the MATLAB interface to symamd. + + symamdmex.c: symamd mexFunction for use in MATLAB. + + README: this file + + ChangeLog: a log of changes since Version 1.0. + + colamd_test.m: test code + + colamdtestmex.c: test code + + luflops.m: test code + + symamdtestmex.c: test code + diff -r 9f3299378193 -r 57077d0ddc8e liboctave/COLAMD/colamd.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/COLAMD/colamd.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,3412 @@ +/* ========================================================================== */ +/* === colamd/symamd - a sparse matrix column ordering algorithm ============ */ +/* ========================================================================== */ + +/* + colamd: an approximate minimum degree column ordering algorithm, + for LU factorization of symmetric or unsymmetric matrices, + QR factorization, least squares, interior point methods for + linear programming problems, and other related problems. + + symamd: an approximate minimum degree ordering algorithm for Cholesky + factorization of symmetric matrices. + + Purpose: + + Colamd computes a permutation Q such that the Cholesky factorization of + (AQ)'(AQ) has less fill-in and requires fewer floating point operations + than A'A. This also provides a good ordering for sparse partial + pivoting methods, P(AQ) = LU, where Q is computed prior to numerical + factorization, and P is computed during numerical factorization via + conventional partial pivoting with row interchanges. Colamd is the + column ordering method used in SuperLU, part of the ScaLAPACK library. + It is also available as built-in function in MATLAB Version 6, + available from MathWorks, Inc. (http://www.mathworks.com). This + routine can be used in place of colmmd in MATLAB. + + Symamd computes a permutation P of a symmetric matrix A such that the + Cholesky factorization of PAP' has less fill-in and requires fewer + floating point operations than A. Symamd constructs a matrix M such + that M'M has the same nonzero pattern of A, and then orders the columns + of M using colmmd. The column ordering of M is then returned as the + row and column ordering P of A. + + Authors: + + The authors of the code itself are Stefan I. Larimore and Timothy A. + Davis (davis@cise.ufl.edu), University of Florida. The algorithm was + developed in collaboration with John Gilbert, Xerox PARC, and Esmond + Ng, Oak Ridge National Laboratory. + + Date: + + September 8, 2003. Version 2.3. + + Acknowledgements: + + This work was supported by the National Science Foundation, under + grants DMS-9504974 and DMS-9803599. + + Copyright and License: + + Copyright (c) 1998-2003 by the University of Florida. + All Rights Reserved. + + THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY + EXPRESSED OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + + Permission is hereby granted to use, copy, modify, and/or distribute + this program, provided that the Copyright, this License, and the + Availability of the original version is retained on all copies and made + accessible to the end-user of any code or package that includes COLAMD + or any modified version of COLAMD. + + Availability: + + The colamd/symamd library is available at + + http://www.cise.ufl.edu/research/sparse/colamd/ + + This is the http://www.cise.ufl.edu/research/sparse/colamd/colamd.c + file. It requires the colamd.h file. It is required by the colamdmex.c + and symamdmex.c files, for the MATLAB interface to colamd and symamd. + + See the ChangeLog file for changes since Version 1.0. + +*/ + +/* ========================================================================== */ +/* === Description of user-callable routines ================================ */ +/* ========================================================================== */ + +/* + ---------------------------------------------------------------------------- + colamd_recommended: + ---------------------------------------------------------------------------- + + C syntax: + + #include "colamd.h" + int colamd_recommended (int nnz, int n_row, int n_col) ; + + or as a C macro + + #include "colamd.h" + Alen = COLAMD_RECOMMENDED (int nnz, int n_row, int n_col) ; + + Purpose: + + Returns recommended value of Alen for use by colamd. Returns -1 + if any input argument is negative. The use of this routine + or macro is optional. Note that the macro uses its arguments + more than once, so be careful for side effects, if you pass + expressions as arguments to COLAMD_RECOMMENDED. Not needed for + symamd, which dynamically allocates its own memory. + + Arguments (all input arguments): + + int nnz ; Number of nonzeros in the matrix A. This must + be the same value as p [n_col] in the call to + colamd - otherwise you will get a wrong value + of the recommended memory to use. + + int n_row ; Number of rows in the matrix A. + + int n_col ; Number of columns in the matrix A. + + ---------------------------------------------------------------------------- + colamd_set_defaults: + ---------------------------------------------------------------------------- + + C syntax: + + #include "colamd.h" + colamd_set_defaults (double knobs [COLAMD_KNOBS]) ; + + Purpose: + + Sets the default parameters. The use of this routine is optional. + + Arguments: + + double knobs [COLAMD_KNOBS] ; Output only. + + Colamd: rows with more than (knobs [COLAMD_DENSE_ROW] * n_col) + entries are removed prior to ordering. Columns with more than + (knobs [COLAMD_DENSE_COL] * n_row) entries are removed prior to + ordering, and placed last in the output column ordering. + + Symamd: uses only knobs [COLAMD_DENSE_ROW], which is knobs [0]. + Rows and columns with more than (knobs [COLAMD_DENSE_ROW] * n) + entries are removed prior to ordering, and placed last in the + output ordering. + + COLAMD_DENSE_ROW and COLAMD_DENSE_COL are defined as 0 and 1, + respectively, in colamd.h. Default values of these two knobs + are both 0.5. Currently, only knobs [0] and knobs [1] are + used, but future versions may use more knobs. If so, they will + be properly set to their defaults by the future version of + colamd_set_defaults, so that the code that calls colamd will + not need to change, assuming that you either use + colamd_set_defaults, or pass a (double *) NULL pointer as the + knobs array to colamd or symamd. + + ---------------------------------------------------------------------------- + colamd: + ---------------------------------------------------------------------------- + + C syntax: + + #include "colamd.h" + int colamd (int n_row, int n_col, int Alen, int *A, int *p, + double knobs [COLAMD_KNOBS], int stats [COLAMD_STATS]) ; + + Purpose: + + Computes a column ordering (Q) of A such that P(AQ)=LU or + (AQ)'AQ=LL' have less fill-in and require fewer floating point + operations than factorizing the unpermuted matrix A or A'A, + respectively. + + Returns: + + TRUE (1) if successful, FALSE (0) otherwise. + + Arguments: + + int n_row ; Input argument. + + Number of rows in the matrix A. + Restriction: n_row >= 0. + Colamd returns FALSE if n_row is negative. + + int n_col ; Input argument. + + Number of columns in the matrix A. + Restriction: n_col >= 0. + Colamd returns FALSE if n_col is negative. + + int Alen ; Input argument. + + Restriction (see note): + Alen >= 2*nnz + 6*(n_col+1) + 4*(n_row+1) + n_col + Colamd returns FALSE if these conditions are not met. + + Note: this restriction makes an modest assumption regarding + the size of the two typedef's structures in colamd.h. + We do, however, guarantee that + + Alen >= colamd_recommended (nnz, n_row, n_col) + + or equivalently as a C preprocessor macro: + + Alen >= COLAMD_RECOMMENDED (nnz, n_row, n_col) + + will be sufficient. + + int A [Alen] ; Input argument, undefined on output. + + A is an integer array of size Alen. Alen must be at least as + large as the bare minimum value given above, but this is very + low, and can result in excessive run time. For best + performance, we recommend that Alen be greater than or equal to + colamd_recommended (nnz, n_row, n_col), which adds + nnz/5 to the bare minimum value given above. + + On input, the row indices of the entries in column c of the + matrix are held in A [(p [c]) ... (p [c+1]-1)]. The row indices + in a given column c need not be in ascending order, and + duplicate row indices may be be present. However, colamd will + work a little faster if both of these conditions are met + (Colamd puts the matrix into this format, if it finds that the + the conditions are not met). + + The matrix is 0-based. That is, rows are in the range 0 to + n_row-1, and columns are in the range 0 to n_col-1. Colamd + returns FALSE if any row index is out of range. + + The contents of A are modified during ordering, and are + undefined on output. + + int p [n_col+1] ; Both input and output argument. + + p is an integer array of size n_col+1. On input, it holds the + "pointers" for the column form of the matrix A. Column c of + the matrix A is held in A [(p [c]) ... (p [c+1]-1)]. The first + entry, p [0], must be zero, and p [c] <= p [c+1] must hold + for all c in the range 0 to n_col-1. The value p [n_col] is + thus the total number of entries in the pattern of the matrix A. + Colamd returns FALSE if these conditions are not met. + + On output, if colamd returns TRUE, the array p holds the column + permutation (Q, for P(AQ)=LU or (AQ)'(AQ)=LL'), where p [0] is + the first column index in the new ordering, and p [n_col-1] is + the last. That is, p [k] = j means that column j of A is the + kth pivot column, in AQ, where k is in the range 0 to n_col-1 + (p [0] = j means that column j of A is the first column in AQ). + + If colamd returns FALSE, then no permutation is returned, and + p is undefined on output. + + double knobs [COLAMD_KNOBS] ; Input argument. + + See colamd_set_defaults for a description. + + int stats [COLAMD_STATS] ; Output argument. + + Statistics on the ordering, and error status. + See colamd.h for related definitions. + Colamd returns FALSE if stats is not present. + + stats [0]: number of dense or empty rows ignored. + + stats [1]: number of dense or empty columns ignored (and + ordered last in the output permutation p) + Note that a row can become "empty" if it + contains only "dense" and/or "empty" columns, + and similarly a column can become "empty" if it + only contains "dense" and/or "empty" rows. + + stats [2]: number of garbage collections performed. + This can be excessively high if Alen is close + to the minimum required value. + + stats [3]: status code. < 0 is an error code. + > 1 is a warning or notice. + + 0 OK. Each column of the input matrix contained + row indices in increasing order, with no + duplicates. + + 1 OK, but columns of input matrix were jumbled + (unsorted columns or duplicate entries). Colamd + had to do some extra work to sort the matrix + first and remove duplicate entries, but it + still was able to return a valid permutation + (return value of colamd was TRUE). + + stats [4]: highest numbered column that + is unsorted or has duplicate + entries. + stats [5]: last seen duplicate or + unsorted row index. + stats [6]: number of duplicate or + unsorted row indices. + + -1 A is a null pointer + + -2 p is a null pointer + + -3 n_row is negative + + stats [4]: n_row + + -4 n_col is negative + + stats [4]: n_col + + -5 number of nonzeros in matrix is negative + + stats [4]: number of nonzeros, p [n_col] + + -6 p [0] is nonzero + + stats [4]: p [0] + + -7 A is too small + + stats [4]: required size + stats [5]: actual size (Alen) + + -8 a column has a negative number of entries + + stats [4]: column with < 0 entries + stats [5]: number of entries in col + + -9 a row index is out of bounds + + stats [4]: column with bad row index + stats [5]: bad row index + stats [6]: n_row, # of rows of matrx + + -10 (unused; see symamd.c) + + -999 (unused; see symamd.c) + + Future versions may return more statistics in the stats array. + + Example: + + See http://www.cise.ufl.edu/research/sparse/colamd/example.c + for a complete example. + + To order the columns of a 5-by-4 matrix with 11 nonzero entries in + the following nonzero pattern + + x 0 x 0 + x 0 x x + 0 x x 0 + 0 0 x x + x x 0 0 + + with default knobs and no output statistics, do the following: + + #include "colamd.h" + #define ALEN COLAMD_RECOMMENDED (11, 5, 4) + int A [ALEN] = {1, 2, 5, 3, 5, 1, 2, 3, 4, 2, 4} ; + int p [ ] = {0, 3, 5, 9, 11} ; + int stats [COLAMD_STATS] ; + colamd (5, 4, ALEN, A, p, (double *) NULL, stats) ; + + The permutation is returned in the array p, and A is destroyed. + + ---------------------------------------------------------------------------- + symamd: + ---------------------------------------------------------------------------- + + C syntax: + + #include "colamd.h" + int symamd (int n, int *A, int *p, int *perm, + double knobs [COLAMD_KNOBS], int stats [COLAMD_STATS], + void (*allocate) (size_t, size_t), void (*release) (void *)) ; + + Purpose: + + The symamd routine computes an ordering P of a symmetric sparse + matrix A such that the Cholesky factorization PAP' = LL' remains + sparse. It is based on a column ordering of a matrix M constructed + so that the nonzero pattern of M'M is the same as A. The matrix A + is assumed to be symmetric; only the strictly lower triangular part + is accessed. You must pass your selected memory allocator (usually + calloc/free or mxCalloc/mxFree) to symamd, for it to allocate + memory for the temporary matrix M. + + Returns: + + TRUE (1) if successful, FALSE (0) otherwise. + + Arguments: + + int n ; Input argument. + + Number of rows and columns in the symmetrix matrix A. + Restriction: n >= 0. + Symamd returns FALSE if n is negative. + + int A [nnz] ; Input argument. + + A is an integer array of size nnz, where nnz = p [n]. + + The row indices of the entries in column c of the matrix are + held in A [(p [c]) ... (p [c+1]-1)]. The row indices in a + given column c need not be in ascending order, and duplicate + row indices may be present. However, symamd will run faster + if the columns are in sorted order with no duplicate entries. + + The matrix is 0-based. That is, rows are in the range 0 to + n-1, and columns are in the range 0 to n-1. Symamd + returns FALSE if any row index is out of range. + + The contents of A are not modified. + + int p [n+1] ; Input argument. + + p is an integer array of size n+1. On input, it holds the + "pointers" for the column form of the matrix A. Column c of + the matrix A is held in A [(p [c]) ... (p [c+1]-1)]. The first + entry, p [0], must be zero, and p [c] <= p [c+1] must hold + for all c in the range 0 to n-1. The value p [n] is + thus the total number of entries in the pattern of the matrix A. + Symamd returns FALSE if these conditions are not met. + + The contents of p are not modified. + + int perm [n+1] ; Output argument. + + On output, if symamd returns TRUE, the array perm holds the + permutation P, where perm [0] is the first index in the new + ordering, and perm [n-1] is the last. That is, perm [k] = j + means that row and column j of A is the kth column in PAP', + where k is in the range 0 to n-1 (perm [0] = j means + that row and column j of A are the first row and column in + PAP'). The array is used as a workspace during the ordering, + which is why it must be of length n+1, not just n. + + double knobs [COLAMD_KNOBS] ; Input argument. + + See colamd_set_defaults for a description. + + int stats [COLAMD_STATS] ; Output argument. + + Statistics on the ordering, and error status. + See colamd.h for related definitions. + Symamd returns FALSE if stats is not present. + + stats [0]: number of dense or empty row and columns ignored + (and ordered last in the output permutation + perm). Note that a row/column can become + "empty" if it contains only "dense" and/or + "empty" columns/rows. + + stats [1]: (same as stats [0]) + + stats [2]: number of garbage collections performed. + + stats [3]: status code. < 0 is an error code. + > 1 is a warning or notice. + + 0 OK. Each column of the input matrix contained + row indices in increasing order, with no + duplicates. + + 1 OK, but columns of input matrix were jumbled + (unsorted columns or duplicate entries). Symamd + had to do some extra work to sort the matrix + first and remove duplicate entries, but it + still was able to return a valid permutation + (return value of symamd was TRUE). + + stats [4]: highest numbered column that + is unsorted or has duplicate + entries. + stats [5]: last seen duplicate or + unsorted row index. + stats [6]: number of duplicate or + unsorted row indices. + + -1 A is a null pointer + + -2 p is a null pointer + + -3 (unused, see colamd.c) + + -4 n is negative + + stats [4]: n + + -5 number of nonzeros in matrix is negative + + stats [4]: # of nonzeros (p [n]). + + -6 p [0] is nonzero + + stats [4]: p [0] + + -7 (unused) + + -8 a column has a negative number of entries + + stats [4]: column with < 0 entries + stats [5]: number of entries in col + + -9 a row index is out of bounds + + stats [4]: column with bad row index + stats [5]: bad row index + stats [6]: n_row, # of rows of matrx + + -10 out of memory (unable to allocate temporary + workspace for M or count arrays using the + "allocate" routine passed into symamd). + + -999 internal error. colamd failed to order the + matrix M, when it should have succeeded. This + indicates a bug. If this (and *only* this) + error code occurs, please contact the authors. + Don't contact the authors if you get any other + error code. + + Future versions may return more statistics in the stats array. + + void * (*allocate) (size_t, size_t) + + A pointer to a function providing memory allocation. The + allocated memory must be returned initialized to zero. For a + C application, this argument should normally be a pointer to + calloc. For a MATLAB mexFunction, the routine mxCalloc is + passed instead. + + void (*release) (size_t, size_t) + + A pointer to a function that frees memory allocated by the + memory allocation routine above. For a C application, this + argument should normally be a pointer to free. For a MATLAB + mexFunction, the routine mxFree is passed instead. + + + ---------------------------------------------------------------------------- + colamd_report: + ---------------------------------------------------------------------------- + + C syntax: + + #include "colamd.h" + colamd_report (int stats [COLAMD_STATS]) ; + + Purpose: + + Prints the error status and statistics recorded in the stats + array on the standard error output (for a standard C routine) + or on the MATLAB output (for a mexFunction). + + Arguments: + + int stats [COLAMD_STATS] ; Input only. Statistics from colamd. + + + ---------------------------------------------------------------------------- + symamd_report: + ---------------------------------------------------------------------------- + + C syntax: + + #include "colamd.h" + symamd_report (int stats [COLAMD_STATS]) ; + + Purpose: + + Prints the error status and statistics recorded in the stats + array on the standard error output (for a standard C routine) + or on the MATLAB output (for a mexFunction). + + Arguments: + + int stats [COLAMD_STATS] ; Input only. Statistics from symamd. + + +*/ + +/* ========================================================================== */ +/* === Scaffolding code definitions ======================================== */ +/* ========================================================================== */ + +/* Ensure that debugging is turned off: */ +#ifndef NDEBUG +#define NDEBUG +#endif /* NDEBUG */ + +/* + Our "scaffolding code" philosophy: In our opinion, well-written library + code should keep its "debugging" code, and just normally have it turned off + by the compiler so as not to interfere with performance. This serves + several purposes: + + (1) assertions act as comments to the reader, telling you what the code + expects at that point. All assertions will always be true (unless + there really is a bug, of course). + + (2) leaving in the scaffolding code assists anyone who would like to modify + the code, or understand the algorithm (by reading the debugging output, + one can get a glimpse into what the code is doing). + + (3) (gasp!) for actually finding bugs. This code has been heavily tested + and "should" be fully functional and bug-free ... but you never know... + + To enable debugging, comment out the "#define NDEBUG" above. For a MATLAB + mexFunction, you will also need to modify mexopts.sh to remove the -DNDEBUG + definition. The code will become outrageously slow when debugging is + enabled. To control the level of debugging output, set an environment + variable D to 0 (little), 1 (some), 2, 3, or 4 (lots). When debugging, + you should see the following message on the standard output: + + colamd: debug version, D = 1 (THIS WILL BE SLOW!) + + or a similar message for symamd. If you don't, then debugging has not + been enabled. + +*/ + +/* ========================================================================== */ +/* === Include files ======================================================== */ +/* ========================================================================== */ + +#include "colamd.h" +#include + +#ifdef MATLAB_MEX_FILE +#include "mex.h" +#include "matrix.h" +#else +#include +#include +#endif /* MATLAB_MEX_FILE */ + +/* ========================================================================== */ +/* === Definitions ========================================================== */ +/* ========================================================================== */ + +/* Routines are either PUBLIC (user-callable) or PRIVATE (not user-callable) */ +#define PUBLIC +#define PRIVATE static + +#define MAX(a,b) (((a) > (b)) ? (a) : (b)) +#define MIN(a,b) (((a) < (b)) ? (a) : (b)) + +#define ONES_COMPLEMENT(r) (-(r)-1) + +/* -------------------------------------------------------------------------- */ +/* Change for version 2.1: define TRUE and FALSE only if not yet defined */ +/* -------------------------------------------------------------------------- */ + +#ifndef TRUE +#define TRUE (1) +#endif + +#ifndef FALSE +#define FALSE (0) +#endif + +/* -------------------------------------------------------------------------- */ + +#define EMPTY (-1) + +/* Row and column status */ +#define ALIVE (0) +#define DEAD (-1) + +/* Column status */ +#define DEAD_PRINCIPAL (-1) +#define DEAD_NON_PRINCIPAL (-2) + +/* Macros for row and column status update and checking. */ +#define ROW_IS_DEAD(r) ROW_IS_MARKED_DEAD (Row[r].shared2.mark) +#define ROW_IS_MARKED_DEAD(row_mark) (row_mark < ALIVE) +#define ROW_IS_ALIVE(r) (Row [r].shared2.mark >= ALIVE) +#define COL_IS_DEAD(c) (Col [c].start < ALIVE) +#define COL_IS_ALIVE(c) (Col [c].start >= ALIVE) +#define COL_IS_DEAD_PRINCIPAL(c) (Col [c].start == DEAD_PRINCIPAL) +#define KILL_ROW(r) { Row [r].shared2.mark = DEAD ; } +#define KILL_PRINCIPAL_COL(c) { Col [c].start = DEAD_PRINCIPAL ; } +#define KILL_NON_PRINCIPAL_COL(c) { Col [c].start = DEAD_NON_PRINCIPAL ; } + +/* ========================================================================== */ +/* === Colamd reporting mechanism =========================================== */ +/* ========================================================================== */ + +#ifdef MATLAB_MEX_FILE + +/* use mexPrintf in a MATLAB mexFunction, for debugging and statistics output */ +#define PRINTF mexPrintf + +/* In MATLAB, matrices are 1-based to the user, but 0-based internally */ +#define INDEX(i) ((i)+1) + +#else + +/* Use printf in standard C environment, for debugging and statistics output. */ +/* Output is generated only if debugging is enabled at compile time, or if */ +/* the caller explicitly calls colamd_report or symamd_report. */ +#define PRINTF printf + +/* In C, matrices are 0-based and indices are reported as such in *_report */ +#define INDEX(i) (i) + +#endif /* MATLAB_MEX_FILE */ + +/* ========================================================================== */ +/* === Prototypes of PRIVATE routines ======================================= */ +/* ========================================================================== */ + +PRIVATE int init_rows_cols +( + int n_row, + int n_col, + Colamd_Row Row [], + Colamd_Col Col [], + int A [], + int p [], + int stats [COLAMD_STATS] +) ; + +PRIVATE void init_scoring +( + int n_row, + int n_col, + Colamd_Row Row [], + Colamd_Col Col [], + int A [], + int head [], + double knobs [COLAMD_KNOBS], + int *p_n_row2, + int *p_n_col2, + int *p_max_deg +) ; + +PRIVATE int find_ordering +( + int n_row, + int n_col, + int Alen, + Colamd_Row Row [], + Colamd_Col Col [], + int A [], + int head [], + int n_col2, + int max_deg, + int pfree +) ; + +PRIVATE void order_children +( + int n_col, + Colamd_Col Col [], + int p [] +) ; + +PRIVATE void detect_super_cols +( + +#ifndef NDEBUG + int n_col, + Colamd_Row Row [], +#endif /* NDEBUG */ + + Colamd_Col Col [], + int A [], + int head [], + int row_start, + int row_length +) ; + +PRIVATE int garbage_collection +( + int n_row, + int n_col, + Colamd_Row Row [], + Colamd_Col Col [], + int A [], + int *pfree +) ; + +PRIVATE int clear_mark +( + int n_row, + Colamd_Row Row [] +) ; + +PRIVATE void print_report +( + char *method, + int stats [COLAMD_STATS] +) ; + +/* ========================================================================== */ +/* === Debugging prototypes and definitions ================================= */ +/* ========================================================================== */ + +#ifndef NDEBUG + +/* colamd_debug is the *ONLY* global variable, and is only */ +/* present when debugging */ + +PRIVATE int colamd_debug ; /* debug print level */ + +#define DEBUG0(params) { (void) PRINTF params ; } +#define DEBUG1(params) { if (colamd_debug >= 1) (void) PRINTF params ; } +#define DEBUG2(params) { if (colamd_debug >= 2) (void) PRINTF params ; } +#define DEBUG3(params) { if (colamd_debug >= 3) (void) PRINTF params ; } +#define DEBUG4(params) { if (colamd_debug >= 4) (void) PRINTF params ; } + +#ifdef MATLAB_MEX_FILE +#define ASSERT(expression) (mxAssert ((expression), "")) +#else +#define ASSERT(expression) (assert (expression)) +#endif /* MATLAB_MEX_FILE */ + +PRIVATE void colamd_get_debug /* gets the debug print level from getenv */ +( + char *method +) ; + +PRIVATE void debug_deg_lists +( + int n_row, + int n_col, + Colamd_Row Row [], + Colamd_Col Col [], + int head [], + int min_score, + int should, + int max_deg +) ; + +PRIVATE void debug_mark +( + int n_row, + Colamd_Row Row [], + int tag_mark, + int max_mark +) ; + +PRIVATE void debug_matrix +( + int n_row, + int n_col, + Colamd_Row Row [], + Colamd_Col Col [], + int A [] +) ; + +PRIVATE void debug_structures +( + int n_row, + int n_col, + Colamd_Row Row [], + Colamd_Col Col [], + int A [], + int n_col2 +) ; + +#else /* NDEBUG */ + +/* === No debugging ========================================================= */ + +#define DEBUG0(params) ; +#define DEBUG1(params) ; +#define DEBUG2(params) ; +#define DEBUG3(params) ; +#define DEBUG4(params) ; + +#define ASSERT(expression) ((void) 0) + +#endif /* NDEBUG */ + +/* ========================================================================== */ + + + +/* ========================================================================== */ +/* === USER-CALLABLE ROUTINES: ============================================== */ +/* ========================================================================== */ + + +/* ========================================================================== */ +/* === colamd_recommended =================================================== */ +/* ========================================================================== */ + +/* + The colamd_recommended routine returns the suggested size for Alen. This + value has been determined to provide good balance between the number of + garbage collections and the memory requirements for colamd. If any + argument is negative, a -1 is returned as an error condition. This + function is also available as a macro defined in colamd.h, so that you + can use it for a statically-allocated array size. +*/ + +PUBLIC int colamd_recommended /* returns recommended value of Alen. */ +( + /* === Parameters ======================================================= */ + + int nnz, /* number of nonzeros in A */ + int n_row, /* number of rows in A */ + int n_col /* number of columns in A */ +) +{ + return (COLAMD_RECOMMENDED (nnz, n_row, n_col)) ; +} + + +/* ========================================================================== */ +/* === colamd_set_defaults ================================================== */ +/* ========================================================================== */ + +/* + The colamd_set_defaults routine sets the default values of the user- + controllable parameters for colamd: + + knobs [0] rows with knobs[0]*n_col entries or more are removed + prior to ordering in colamd. Rows and columns with + knobs[0]*n_col entries or more are removed prior to + ordering in symamd and placed last in the output + ordering. + + knobs [1] columns with knobs[1]*n_row entries or more are removed + prior to ordering in colamd, and placed last in the + column permutation. Symamd ignores this knob. + + knobs [2..19] unused, but future versions might use this +*/ + +PUBLIC void colamd_set_defaults +( + /* === Parameters ======================================================= */ + + double knobs [COLAMD_KNOBS] /* knob array */ +) +{ + /* === Local variables ================================================== */ + + int i ; + + if (!knobs) + { + return ; /* no knobs to initialize */ + } + for (i = 0 ; i < COLAMD_KNOBS ; i++) + { + knobs [i] = 0 ; + } + knobs [COLAMD_DENSE_ROW] = 0.5 ; /* ignore rows over 50% dense */ + knobs [COLAMD_DENSE_COL] = 0.5 ; /* ignore columns over 50% dense */ +} + + +/* ========================================================================== */ +/* === symamd =============================================================== */ +/* ========================================================================== */ + +PUBLIC int symamd /* return TRUE if OK, FALSE otherwise */ +( + /* === Parameters ======================================================= */ + + int n, /* number of rows and columns of A */ + int A [], /* row indices of A */ + int p [], /* column pointers of A */ + int perm [], /* output permutation, size n+1 */ + double knobs [COLAMD_KNOBS], /* parameters (uses defaults if NULL) */ + int stats [COLAMD_STATS], /* output statistics and error codes */ + void * (*allocate) (size_t, size_t), + /* pointer to calloc (ANSI C) or */ + /* mxCalloc (for MATLAB mexFunction) */ + void (*release) (void *) + /* pointer to free (ANSI C) or */ + /* mxFree (for MATLAB mexFunction) */ +) +{ + /* === Local variables ================================================== */ + + int *count ; /* length of each column of M, and col pointer*/ + int *mark ; /* mark array for finding duplicate entries */ + int *M ; /* row indices of matrix M */ + int Mlen ; /* length of M */ + int n_row ; /* number of rows in M */ + int nnz ; /* number of entries in A */ + int i ; /* row index of A */ + int j ; /* column index of A */ + int k ; /* row index of M */ + int mnz ; /* number of nonzeros in M */ + int pp ; /* index into a column of A */ + int last_row ; /* last row seen in the current column */ + int length ; /* number of nonzeros in a column */ + + double cknobs [COLAMD_KNOBS] ; /* knobs for colamd */ + double default_knobs [COLAMD_KNOBS] ; /* default knobs for colamd */ + int cstats [COLAMD_STATS] ; /* colamd stats */ + +#ifndef NDEBUG + colamd_get_debug ("symamd") ; +#endif /* NDEBUG */ + + /* === Check the input arguments ======================================== */ + + if (!stats) + { + DEBUG0 (("symamd: stats not present\n")) ; + return (FALSE) ; + } + for (i = 0 ; i < COLAMD_STATS ; i++) + { + stats [i] = 0 ; + } + stats [COLAMD_STATUS] = COLAMD_OK ; + stats [COLAMD_INFO1] = -1 ; + stats [COLAMD_INFO2] = -1 ; + + if (!A) + { + stats [COLAMD_STATUS] = COLAMD_ERROR_A_not_present ; + DEBUG0 (("symamd: A not present\n")) ; + return (FALSE) ; + } + + if (!p) /* p is not present */ + { + stats [COLAMD_STATUS] = COLAMD_ERROR_p_not_present ; + DEBUG0 (("symamd: p not present\n")) ; + return (FALSE) ; + } + + if (n < 0) /* n must be >= 0 */ + { + stats [COLAMD_STATUS] = COLAMD_ERROR_ncol_negative ; + stats [COLAMD_INFO1] = n ; + DEBUG0 (("symamd: n negative %d\n", n)) ; + return (FALSE) ; + } + + nnz = p [n] ; + if (nnz < 0) /* nnz must be >= 0 */ + { + stats [COLAMD_STATUS] = COLAMD_ERROR_nnz_negative ; + stats [COLAMD_INFO1] = nnz ; + DEBUG0 (("symamd: number of entries negative %d\n", nnz)) ; + return (FALSE) ; + } + + if (p [0] != 0) + { + stats [COLAMD_STATUS] = COLAMD_ERROR_p0_nonzero ; + stats [COLAMD_INFO1] = p [0] ; + DEBUG0 (("symamd: p[0] not zero %d\n", p [0])) ; + return (FALSE) ; + } + + /* === If no knobs, set default knobs =================================== */ + + if (!knobs) + { + colamd_set_defaults (default_knobs) ; + knobs = default_knobs ; + } + + /* === Allocate count and mark ========================================== */ + + count = (int *) ((*allocate) (n+1, sizeof (int))) ; + if (!count) + { + stats [COLAMD_STATUS] = COLAMD_ERROR_out_of_memory ; + DEBUG0 (("symamd: allocate count (size %d) failed\n", n+1)) ; + return (FALSE) ; + } + + mark = (int *) ((*allocate) (n+1, sizeof (int))) ; + if (!mark) + { + stats [COLAMD_STATUS] = COLAMD_ERROR_out_of_memory ; + (*release) ((void *) count) ; + DEBUG0 (("symamd: allocate mark (size %d) failed\n", n+1)) ; + return (FALSE) ; + } + + /* === Compute column counts of M, check if A is valid ================== */ + + stats [COLAMD_INFO3] = 0 ; /* number of duplicate or unsorted row indices*/ + + for (i = 0 ; i < n ; i++) + { + mark [i] = -1 ; + } + + for (j = 0 ; j < n ; j++) + { + last_row = -1 ; + + length = p [j+1] - p [j] ; + if (length < 0) + { + /* column pointers must be non-decreasing */ + stats [COLAMD_STATUS] = COLAMD_ERROR_col_length_negative ; + stats [COLAMD_INFO1] = j ; + stats [COLAMD_INFO2] = length ; + (*release) ((void *) count) ; + (*release) ((void *) mark) ; + DEBUG0 (("symamd: col %d negative length %d\n", j, length)) ; + return (FALSE) ; + } + + for (pp = p [j] ; pp < p [j+1] ; pp++) + { + i = A [pp] ; + if (i < 0 || i >= n) + { + /* row index i, in column j, is out of bounds */ + stats [COLAMD_STATUS] = COLAMD_ERROR_row_index_out_of_bounds ; + stats [COLAMD_INFO1] = j ; + stats [COLAMD_INFO2] = i ; + stats [COLAMD_INFO3] = n ; + (*release) ((void *) count) ; + (*release) ((void *) mark) ; + DEBUG0 (("symamd: row %d col %d out of bounds\n", i, j)) ; + return (FALSE) ; + } + + if (i <= last_row || mark [i] == j) + { + /* row index is unsorted or repeated (or both), thus col */ + /* is jumbled. This is a notice, not an error condition. */ + stats [COLAMD_STATUS] = COLAMD_OK_BUT_JUMBLED ; + stats [COLAMD_INFO1] = j ; + stats [COLAMD_INFO2] = i ; + (stats [COLAMD_INFO3]) ++ ; + DEBUG1 (("symamd: row %d col %d unsorted/duplicate\n", i, j)) ; + } + + if (i > j && mark [i] != j) + { + /* row k of M will contain column indices i and j */ + count [i]++ ; + count [j]++ ; + } + + /* mark the row as having been seen in this column */ + mark [i] = j ; + + last_row = i ; + } + } + + if (stats [COLAMD_STATUS] == COLAMD_OK) + { + /* if there are no duplicate entries, then mark is no longer needed */ + (*release) ((void *) mark) ; + } + + /* === Compute column pointers of M ===================================== */ + + /* use output permutation, perm, for column pointers of M */ + perm [0] = 0 ; + for (j = 1 ; j <= n ; j++) + { + perm [j] = perm [j-1] + count [j-1] ; + } + for (j = 0 ; j < n ; j++) + { + count [j] = perm [j] ; + } + + /* === Construct M ====================================================== */ + + mnz = perm [n] ; + n_row = mnz / 2 ; + Mlen = colamd_recommended (mnz, n_row, n) ; + M = (int *) ((*allocate) (Mlen, sizeof (int))) ; + DEBUG0 (("symamd: M is %d-by-%d with %d entries, Mlen = %d\n", + n_row, n, mnz, Mlen)) ; + + if (!M) + { + stats [COLAMD_STATUS] = COLAMD_ERROR_out_of_memory ; + (*release) ((void *) count) ; + (*release) ((void *) mark) ; + DEBUG0 (("symamd: allocate M (size %d) failed\n", Mlen)) ; + return (FALSE) ; + } + + k = 0 ; + + if (stats [COLAMD_STATUS] == COLAMD_OK) + { + /* Matrix is OK */ + for (j = 0 ; j < n ; j++) + { + ASSERT (p [j+1] - p [j] >= 0) ; + for (pp = p [j] ; pp < p [j+1] ; pp++) + { + i = A [pp] ; + ASSERT (i >= 0 && i < n) ; + if (i > j) + { + /* row k of M contains column indices i and j */ + M [count [i]++] = k ; + M [count [j]++] = k ; + k++ ; + } + } + } + } + else + { + /* Matrix is jumbled. Do not add duplicates to M. Unsorted cols OK. */ + DEBUG0 (("symamd: Duplicates in A.\n")) ; + for (i = 0 ; i < n ; i++) + { + mark [i] = -1 ; + } + for (j = 0 ; j < n ; j++) + { + ASSERT (p [j+1] - p [j] >= 0) ; + for (pp = p [j] ; pp < p [j+1] ; pp++) + { + i = A [pp] ; + ASSERT (i >= 0 && i < n) ; + if (i > j && mark [i] != j) + { + /* row k of M contains column indices i and j */ + M [count [i]++] = k ; + M [count [j]++] = k ; + k++ ; + mark [i] = j ; + } + } + } + (*release) ((void *) mark) ; + } + + /* count and mark no longer needed */ + (*release) ((void *) count) ; + ASSERT (k == n_row) ; + + /* === Adjust the knobs for M =========================================== */ + + for (i = 0 ; i < COLAMD_KNOBS ; i++) + { + cknobs [i] = knobs [i] ; + } + + /* there are no dense rows in M */ + cknobs [COLAMD_DENSE_ROW] = 1.0 ; + + if (n_row != 0 && n < n_row) + { + /* On input, the knob is a fraction of 1..n, the number of rows of A. */ + /* Convert it to a fraction of 1..n_row, of the number of rows of M. */ + cknobs [COLAMD_DENSE_COL] = (knobs [COLAMD_DENSE_ROW] * n) / n_row ; + } + else + { + /* no dense columns in M */ + cknobs [COLAMD_DENSE_COL] = 1.0 ; + } + + DEBUG0 (("symamd: dense col knob for M: %g\n", cknobs [COLAMD_DENSE_COL])) ; + + /* === Order the columns of M =========================================== */ + + if (!colamd (n_row, n, Mlen, M, perm, cknobs, cstats)) + { + /* This "cannot" happen, unless there is a bug in the code. */ + stats [COLAMD_STATUS] = COLAMD_ERROR_internal_error ; + (*release) ((void *) M) ; + DEBUG0 (("symamd: internal error!\n")) ; + return (FALSE) ; + } + + /* Note that the output permutation is now in perm */ + + /* === get the statistics for symamd from colamd ======================== */ + + /* note that a dense column in colamd means a dense row and col in symamd */ + stats [COLAMD_DENSE_ROW] = cstats [COLAMD_DENSE_COL] ; + stats [COLAMD_DENSE_COL] = cstats [COLAMD_DENSE_COL] ; + stats [COLAMD_DEFRAG_COUNT] = cstats [COLAMD_DEFRAG_COUNT] ; + + /* === Free M =========================================================== */ + + (*release) ((void *) M) ; + DEBUG0 (("symamd: done.\n")) ; + return (TRUE) ; + +} + +/* ========================================================================== */ +/* === colamd =============================================================== */ +/* ========================================================================== */ + +/* + The colamd routine computes a column ordering Q of a sparse matrix + A such that the LU factorization P(AQ) = LU remains sparse, where P is + selected via partial pivoting. The routine can also be viewed as + providing a permutation Q such that the Cholesky factorization + (AQ)'(AQ) = LL' remains sparse. +*/ + +PUBLIC int colamd /* returns TRUE if successful, FALSE otherwise*/ +( + /* === Parameters ======================================================= */ + + int n_row, /* number of rows in A */ + int n_col, /* number of columns in A */ + int Alen, /* length of A */ + int A [], /* row indices of A */ + int p [], /* pointers to columns in A */ + double knobs [COLAMD_KNOBS],/* parameters (uses defaults if NULL) */ + int stats [COLAMD_STATS] /* output statistics and error codes */ +) +{ + /* === Local variables ================================================== */ + + int i ; /* loop index */ + int nnz ; /* nonzeros in A */ + int Row_size ; /* size of Row [], in integers */ + int Col_size ; /* size of Col [], in integers */ + int need ; /* minimum required length of A */ + Colamd_Row *Row ; /* pointer into A of Row [0..n_row] array */ + Colamd_Col *Col ; /* pointer into A of Col [0..n_col] array */ + int n_col2 ; /* number of non-dense, non-empty columns */ + int n_row2 ; /* number of non-dense, non-empty rows */ + int ngarbage ; /* number of garbage collections performed */ + int max_deg ; /* maximum row degree */ + double default_knobs [COLAMD_KNOBS] ; /* default knobs array */ + +#ifndef NDEBUG + colamd_get_debug ("colamd") ; +#endif /* NDEBUG */ + + /* === Check the input arguments ======================================== */ + + if (!stats) + { + DEBUG0 (("colamd: stats not present\n")) ; + return (FALSE) ; + } + for (i = 0 ; i < COLAMD_STATS ; i++) + { + stats [i] = 0 ; + } + stats [COLAMD_STATUS] = COLAMD_OK ; + stats [COLAMD_INFO1] = -1 ; + stats [COLAMD_INFO2] = -1 ; + + if (!A) /* A is not present */ + { + stats [COLAMD_STATUS] = COLAMD_ERROR_A_not_present ; + DEBUG0 (("colamd: A not present\n")) ; + return (FALSE) ; + } + + if (!p) /* p is not present */ + { + stats [COLAMD_STATUS] = COLAMD_ERROR_p_not_present ; + DEBUG0 (("colamd: p not present\n")) ; + return (FALSE) ; + } + + if (n_row < 0) /* n_row must be >= 0 */ + { + stats [COLAMD_STATUS] = COLAMD_ERROR_nrow_negative ; + stats [COLAMD_INFO1] = n_row ; + DEBUG0 (("colamd: nrow negative %d\n", n_row)) ; + return (FALSE) ; + } + + if (n_col < 0) /* n_col must be >= 0 */ + { + stats [COLAMD_STATUS] = COLAMD_ERROR_ncol_negative ; + stats [COLAMD_INFO1] = n_col ; + DEBUG0 (("colamd: ncol negative %d\n", n_col)) ; + return (FALSE) ; + } + + nnz = p [n_col] ; + if (nnz < 0) /* nnz must be >= 0 */ + { + stats [COLAMD_STATUS] = COLAMD_ERROR_nnz_negative ; + stats [COLAMD_INFO1] = nnz ; + DEBUG0 (("colamd: number of entries negative %d\n", nnz)) ; + return (FALSE) ; + } + + if (p [0] != 0) + { + stats [COLAMD_STATUS] = COLAMD_ERROR_p0_nonzero ; + stats [COLAMD_INFO1] = p [0] ; + DEBUG0 (("colamd: p[0] not zero %d\n", p [0])) ; + return (FALSE) ; + } + + /* === If no knobs, set default knobs =================================== */ + + if (!knobs) + { + colamd_set_defaults (default_knobs) ; + knobs = default_knobs ; + } + + /* === Allocate the Row and Col arrays from array A ===================== */ + + Col_size = COLAMD_C (n_col) ; + Row_size = COLAMD_R (n_row) ; + need = 2*nnz + n_col + Col_size + Row_size ; + + if (need > Alen) + { + /* not enough space in array A to perform the ordering */ + stats [COLAMD_STATUS] = COLAMD_ERROR_A_too_small ; + stats [COLAMD_INFO1] = need ; + stats [COLAMD_INFO2] = Alen ; + DEBUG0 (("colamd: Need Alen >= %d, given only Alen = %d\n", need,Alen)); + return (FALSE) ; + } + + Alen -= Col_size + Row_size ; + Col = (Colamd_Col *) &A [Alen] ; + Row = (Colamd_Row *) &A [Alen + Col_size] ; + + /* === Construct the row and column data structures ===================== */ + + if (!init_rows_cols (n_row, n_col, Row, Col, A, p, stats)) + { + /* input matrix is invalid */ + DEBUG0 (("colamd: Matrix invalid\n")) ; + return (FALSE) ; + } + + /* === Initialize scores, kill dense rows/columns ======================= */ + + init_scoring (n_row, n_col, Row, Col, A, p, knobs, + &n_row2, &n_col2, &max_deg) ; + + /* === Order the supercolumns =========================================== */ + + ngarbage = find_ordering (n_row, n_col, Alen, Row, Col, A, p, + n_col2, max_deg, 2*nnz) ; + + /* === Order the non-principal columns ================================== */ + + order_children (n_col, Col, p) ; + + /* === Return statistics in stats ======================================= */ + + stats [COLAMD_DENSE_ROW] = n_row - n_row2 ; + stats [COLAMD_DENSE_COL] = n_col - n_col2 ; + stats [COLAMD_DEFRAG_COUNT] = ngarbage ; + DEBUG0 (("colamd: done.\n")) ; + return (TRUE) ; +} + + +/* ========================================================================== */ +/* === colamd_report ======================================================== */ +/* ========================================================================== */ + +PUBLIC void colamd_report +( + int stats [COLAMD_STATS] +) +{ + print_report ("colamd", stats) ; +} + + +/* ========================================================================== */ +/* === symamd_report ======================================================== */ +/* ========================================================================== */ + +PUBLIC void symamd_report +( + int stats [COLAMD_STATS] +) +{ + print_report ("symamd", stats) ; +} + + + +/* ========================================================================== */ +/* === NON-USER-CALLABLE ROUTINES: ========================================== */ +/* ========================================================================== */ + +/* There are no user-callable routines beyond this point in the file */ + + +/* ========================================================================== */ +/* === init_rows_cols ======================================================= */ +/* ========================================================================== */ + +/* + Takes the column form of the matrix in A and creates the row form of the + matrix. Also, row and column attributes are stored in the Col and Row + structs. If the columns are un-sorted or contain duplicate row indices, + this routine will also sort and remove duplicate row indices from the + column form of the matrix. Returns FALSE if the matrix is invalid, + TRUE otherwise. Not user-callable. +*/ + +PRIVATE int init_rows_cols /* returns TRUE if OK, or FALSE otherwise */ +( + /* === Parameters ======================================================= */ + + int n_row, /* number of rows of A */ + int n_col, /* number of columns of A */ + Colamd_Row Row [], /* of size n_row+1 */ + Colamd_Col Col [], /* of size n_col+1 */ + int A [], /* row indices of A, of size Alen */ + int p [], /* pointers to columns in A, of size n_col+1 */ + int stats [COLAMD_STATS] /* colamd statistics */ +) +{ + /* === Local variables ================================================== */ + + int col ; /* a column index */ + int row ; /* a row index */ + int *cp ; /* a column pointer */ + int *cp_end ; /* a pointer to the end of a column */ + int *rp ; /* a row pointer */ + int *rp_end ; /* a pointer to the end of a row */ + int last_row ; /* previous row */ + + /* === Initialize columns, and check column pointers ==================== */ + + for (col = 0 ; col < n_col ; col++) + { + Col [col].start = p [col] ; + Col [col].length = p [col+1] - p [col] ; + + if (Col [col].length < 0) + { + /* column pointers must be non-decreasing */ + stats [COLAMD_STATUS] = COLAMD_ERROR_col_length_negative ; + stats [COLAMD_INFO1] = col ; + stats [COLAMD_INFO2] = Col [col].length ; + DEBUG0 (("colamd: col %d length %d < 0\n", col, Col [col].length)) ; + return (FALSE) ; + } + + Col [col].shared1.thickness = 1 ; + Col [col].shared2.score = 0 ; + Col [col].shared3.prev = EMPTY ; + Col [col].shared4.degree_next = EMPTY ; + } + + /* p [0..n_col] no longer needed, used as "head" in subsequent routines */ + + /* === Scan columns, compute row degrees, and check row indices ========= */ + + stats [COLAMD_INFO3] = 0 ; /* number of duplicate or unsorted row indices*/ + + for (row = 0 ; row < n_row ; row++) + { + Row [row].length = 0 ; + Row [row].shared2.mark = -1 ; + } + + for (col = 0 ; col < n_col ; col++) + { + last_row = -1 ; + + cp = &A [p [col]] ; + cp_end = &A [p [col+1]] ; + + while (cp < cp_end) + { + row = *cp++ ; + + /* make sure row indices within range */ + if (row < 0 || row >= n_row) + { + stats [COLAMD_STATUS] = COLAMD_ERROR_row_index_out_of_bounds ; + stats [COLAMD_INFO1] = col ; + stats [COLAMD_INFO2] = row ; + stats [COLAMD_INFO3] = n_row ; + DEBUG0 (("colamd: row %d col %d out of bounds\n", row, col)) ; + return (FALSE) ; + } + + if (row <= last_row || Row [row].shared2.mark == col) + { + /* row index are unsorted or repeated (or both), thus col */ + /* is jumbled. This is a notice, not an error condition. */ + stats [COLAMD_STATUS] = COLAMD_OK_BUT_JUMBLED ; + stats [COLAMD_INFO1] = col ; + stats [COLAMD_INFO2] = row ; + (stats [COLAMD_INFO3]) ++ ; + DEBUG1 (("colamd: row %d col %d unsorted/duplicate\n",row,col)); + } + + if (Row [row].shared2.mark != col) + { + Row [row].length++ ; + } + else + { + /* this is a repeated entry in the column, */ + /* it will be removed */ + Col [col].length-- ; + } + + /* mark the row as having been seen in this column */ + Row [row].shared2.mark = col ; + + last_row = row ; + } + } + + /* === Compute row pointers ============================================= */ + + /* row form of the matrix starts directly after the column */ + /* form of matrix in A */ + Row [0].start = p [n_col] ; + Row [0].shared1.p = Row [0].start ; + Row [0].shared2.mark = -1 ; + for (row = 1 ; row < n_row ; row++) + { + Row [row].start = Row [row-1].start + Row [row-1].length ; + Row [row].shared1.p = Row [row].start ; + Row [row].shared2.mark = -1 ; + } + + /* === Create row form ================================================== */ + + if (stats [COLAMD_STATUS] == COLAMD_OK_BUT_JUMBLED) + { + /* if cols jumbled, watch for repeated row indices */ + for (col = 0 ; col < n_col ; col++) + { + cp = &A [p [col]] ; + cp_end = &A [p [col+1]] ; + while (cp < cp_end) + { + row = *cp++ ; + if (Row [row].shared2.mark != col) + { + A [(Row [row].shared1.p)++] = col ; + Row [row].shared2.mark = col ; + } + } + } + } + else + { + /* if cols not jumbled, we don't need the mark (this is faster) */ + for (col = 0 ; col < n_col ; col++) + { + cp = &A [p [col]] ; + cp_end = &A [p [col+1]] ; + while (cp < cp_end) + { + A [(Row [*cp++].shared1.p)++] = col ; + } + } + } + + /* === Clear the row marks and set row degrees ========================== */ + + for (row = 0 ; row < n_row ; row++) + { + Row [row].shared2.mark = 0 ; + Row [row].shared1.degree = Row [row].length ; + } + + /* === See if we need to re-create columns ============================== */ + + if (stats [COLAMD_STATUS] == COLAMD_OK_BUT_JUMBLED) + { + DEBUG0 (("colamd: reconstructing column form, matrix jumbled\n")) ; + +#ifndef NDEBUG + /* make sure column lengths are correct */ + for (col = 0 ; col < n_col ; col++) + { + p [col] = Col [col].length ; + } + for (row = 0 ; row < n_row ; row++) + { + rp = &A [Row [row].start] ; + rp_end = rp + Row [row].length ; + while (rp < rp_end) + { + p [*rp++]-- ; + } + } + for (col = 0 ; col < n_col ; col++) + { + ASSERT (p [col] == 0) ; + } + /* now p is all zero (different than when debugging is turned off) */ +#endif /* NDEBUG */ + + /* === Compute col pointers ========================================= */ + + /* col form of the matrix starts at A [0]. */ + /* Note, we may have a gap between the col form and the row */ + /* form if there were duplicate entries, if so, it will be */ + /* removed upon the first garbage collection */ + Col [0].start = 0 ; + p [0] = Col [0].start ; + for (col = 1 ; col < n_col ; col++) + { + /* note that the lengths here are for pruned columns, i.e. */ + /* no duplicate row indices will exist for these columns */ + Col [col].start = Col [col-1].start + Col [col-1].length ; + p [col] = Col [col].start ; + } + + /* === Re-create col form =========================================== */ + + for (row = 0 ; row < n_row ; row++) + { + rp = &A [Row [row].start] ; + rp_end = rp + Row [row].length ; + while (rp < rp_end) + { + A [(p [*rp++])++] = row ; + } + } + } + + /* === Done. Matrix is not (or no longer) jumbled ====================== */ + + return (TRUE) ; +} + + +/* ========================================================================== */ +/* === init_scoring ========================================================= */ +/* ========================================================================== */ + +/* + Kills dense or empty columns and rows, calculates an initial score for + each column, and places all columns in the degree lists. Not user-callable. +*/ + +PRIVATE void init_scoring +( + /* === Parameters ======================================================= */ + + int n_row, /* number of rows of A */ + int n_col, /* number of columns of A */ + Colamd_Row Row [], /* of size n_row+1 */ + Colamd_Col Col [], /* of size n_col+1 */ + int A [], /* column form and row form of A */ + int head [], /* of size n_col+1 */ + double knobs [COLAMD_KNOBS],/* parameters */ + int *p_n_row2, /* number of non-dense, non-empty rows */ + int *p_n_col2, /* number of non-dense, non-empty columns */ + int *p_max_deg /* maximum row degree */ +) +{ + /* === Local variables ================================================== */ + + int c ; /* a column index */ + int r, row ; /* a row index */ + int *cp ; /* a column pointer */ + int deg ; /* degree of a row or column */ + int *cp_end ; /* a pointer to the end of a column */ + int *new_cp ; /* new column pointer */ + int col_length ; /* length of pruned column */ + int score ; /* current column score */ + int n_col2 ; /* number of non-dense, non-empty columns */ + int n_row2 ; /* number of non-dense, non-empty rows */ + int dense_row_count ; /* remove rows with more entries than this */ + int dense_col_count ; /* remove cols with more entries than this */ + int min_score ; /* smallest column score */ + int max_deg ; /* maximum row degree */ + int next_col ; /* Used to add to degree list.*/ + +#ifndef NDEBUG + int debug_count ; /* debug only. */ +#endif /* NDEBUG */ + + /* === Extract knobs ==================================================== */ + + dense_row_count = MAX (0, MIN (knobs [COLAMD_DENSE_ROW] * n_col, n_col)) ; + dense_col_count = MAX (0, MIN (knobs [COLAMD_DENSE_COL] * n_row, n_row)) ; + DEBUG1 (("colamd: densecount: %d %d\n", dense_row_count, dense_col_count)) ; + max_deg = 0 ; + n_col2 = n_col ; + n_row2 = n_row ; + + /* === Kill empty columns =============================================== */ + + /* Put the empty columns at the end in their natural order, so that LU */ + /* factorization can proceed as far as possible. */ + for (c = n_col-1 ; c >= 0 ; c--) + { + deg = Col [c].length ; + if (deg == 0) + { + /* this is a empty column, kill and order it last */ + Col [c].shared2.order = --n_col2 ; + KILL_PRINCIPAL_COL (c) ; + } + } + DEBUG1 (("colamd: null columns killed: %d\n", n_col - n_col2)) ; + + /* === Kill dense columns =============================================== */ + + /* Put the dense columns at the end, in their natural order */ + for (c = n_col-1 ; c >= 0 ; c--) + { + /* skip any dead columns */ + if (COL_IS_DEAD (c)) + { + continue ; + } + deg = Col [c].length ; + if (deg > dense_col_count) + { + /* this is a dense column, kill and order it last */ + Col [c].shared2.order = --n_col2 ; + /* decrement the row degrees */ + cp = &A [Col [c].start] ; + cp_end = cp + Col [c].length ; + while (cp < cp_end) + { + Row [*cp++].shared1.degree-- ; + } + KILL_PRINCIPAL_COL (c) ; + } + } + DEBUG1 (("colamd: Dense and null columns killed: %d\n", n_col - n_col2)) ; + + /* === Kill dense and empty rows ======================================== */ + + for (r = 0 ; r < n_row ; r++) + { + deg = Row [r].shared1.degree ; + ASSERT (deg >= 0 && deg <= n_col) ; + if (deg > dense_row_count || deg == 0) + { + /* kill a dense or empty row */ + KILL_ROW (r) ; + --n_row2 ; + } + else + { + /* keep track of max degree of remaining rows */ + max_deg = MAX (max_deg, deg) ; + } + } + DEBUG1 (("colamd: Dense and null rows killed: %d\n", n_row - n_row2)) ; + + /* === Compute initial column scores ==================================== */ + + /* At this point the row degrees are accurate. They reflect the number */ + /* of "live" (non-dense) columns in each row. No empty rows exist. */ + /* Some "live" columns may contain only dead rows, however. These are */ + /* pruned in the code below. */ + + /* now find the initial matlab score for each column */ + for (c = n_col-1 ; c >= 0 ; c--) + { + /* skip dead column */ + if (COL_IS_DEAD (c)) + { + continue ; + } + score = 0 ; + cp = &A [Col [c].start] ; + new_cp = cp ; + cp_end = cp + Col [c].length ; + while (cp < cp_end) + { + /* get a row */ + row = *cp++ ; + /* skip if dead */ + if (ROW_IS_DEAD (row)) + { + continue ; + } + /* compact the column */ + *new_cp++ = row ; + /* add row's external degree */ + score += Row [row].shared1.degree - 1 ; + /* guard against integer overflow */ + score = MIN (score, n_col) ; + } + /* determine pruned column length */ + col_length = (int) (new_cp - &A [Col [c].start]) ; + if (col_length == 0) + { + /* a newly-made null column (all rows in this col are "dense" */ + /* and have already been killed) */ + DEBUG2 (("Newly null killed: %d\n", c)) ; + Col [c].shared2.order = --n_col2 ; + KILL_PRINCIPAL_COL (c) ; + } + else + { + /* set column length and set score */ + ASSERT (score >= 0) ; + ASSERT (score <= n_col) ; + Col [c].length = col_length ; + Col [c].shared2.score = score ; + } + } + DEBUG1 (("colamd: Dense, null, and newly-null columns killed: %d\n", + n_col-n_col2)) ; + + /* At this point, all empty rows and columns are dead. All live columns */ + /* are "clean" (containing no dead rows) and simplicial (no supercolumns */ + /* yet). Rows may contain dead columns, but all live rows contain at */ + /* least one live column. */ + +#ifndef NDEBUG + debug_structures (n_row, n_col, Row, Col, A, n_col2) ; +#endif /* NDEBUG */ + + /* === Initialize degree lists ========================================== */ + +#ifndef NDEBUG + debug_count = 0 ; +#endif /* NDEBUG */ + + /* clear the hash buckets */ + for (c = 0 ; c <= n_col ; c++) + { + head [c] = EMPTY ; + } + min_score = n_col ; + /* place in reverse order, so low column indices are at the front */ + /* of the lists. This is to encourage natural tie-breaking */ + for (c = n_col-1 ; c >= 0 ; c--) + { + /* only add principal columns to degree lists */ + if (COL_IS_ALIVE (c)) + { + DEBUG4 (("place %d score %d minscore %d ncol %d\n", + c, Col [c].shared2.score, min_score, n_col)) ; + + /* === Add columns score to DList =============================== */ + + score = Col [c].shared2.score ; + + ASSERT (min_score >= 0) ; + ASSERT (min_score <= n_col) ; + ASSERT (score >= 0) ; + ASSERT (score <= n_col) ; + ASSERT (head [score] >= EMPTY) ; + + /* now add this column to dList at proper score location */ + next_col = head [score] ; + Col [c].shared3.prev = EMPTY ; + Col [c].shared4.degree_next = next_col ; + + /* if there already was a column with the same score, set its */ + /* previous pointer to this new column */ + if (next_col != EMPTY) + { + Col [next_col].shared3.prev = c ; + } + head [score] = c ; + + /* see if this score is less than current min */ + min_score = MIN (min_score, score) ; + +#ifndef NDEBUG + debug_count++ ; +#endif /* NDEBUG */ + + } + } + +#ifndef NDEBUG + DEBUG1 (("colamd: Live cols %d out of %d, non-princ: %d\n", + debug_count, n_col, n_col-debug_count)) ; + ASSERT (debug_count == n_col2) ; + debug_deg_lists (n_row, n_col, Row, Col, head, min_score, n_col2, max_deg) ; +#endif /* NDEBUG */ + + /* === Return number of remaining columns, and max row degree =========== */ + + *p_n_col2 = n_col2 ; + *p_n_row2 = n_row2 ; + *p_max_deg = max_deg ; +} + + +/* ========================================================================== */ +/* === find_ordering ======================================================== */ +/* ========================================================================== */ + +/* + Order the principal columns of the supercolumn form of the matrix + (no supercolumns on input). Uses a minimum approximate column minimum + degree ordering method. Not user-callable. +*/ + +PRIVATE int find_ordering /* return the number of garbage collections */ +( + /* === Parameters ======================================================= */ + + int n_row, /* number of rows of A */ + int n_col, /* number of columns of A */ + int Alen, /* size of A, 2*nnz + n_col or larger */ + Colamd_Row Row [], /* of size n_row+1 */ + Colamd_Col Col [], /* of size n_col+1 */ + int A [], /* column form and row form of A */ + int head [], /* of size n_col+1 */ + int n_col2, /* Remaining columns to order */ + int max_deg, /* Maximum row degree */ + int pfree /* index of first free slot (2*nnz on entry) */ +) +{ + /* === Local variables ================================================== */ + + int k ; /* current pivot ordering step */ + int pivot_col ; /* current pivot column */ + int *cp ; /* a column pointer */ + int *rp ; /* a row pointer */ + int pivot_row ; /* current pivot row */ + int *new_cp ; /* modified column pointer */ + int *new_rp ; /* modified row pointer */ + int pivot_row_start ; /* pointer to start of pivot row */ + int pivot_row_degree ; /* number of columns in pivot row */ + int pivot_row_length ; /* number of supercolumns in pivot row */ + int pivot_col_score ; /* score of pivot column */ + int needed_memory ; /* free space needed for pivot row */ + int *cp_end ; /* pointer to the end of a column */ + int *rp_end ; /* pointer to the end of a row */ + int row ; /* a row index */ + int col ; /* a column index */ + int max_score ; /* maximum possible score */ + int cur_score ; /* score of current column */ + unsigned int hash ; /* hash value for supernode detection */ + int head_column ; /* head of hash bucket */ + int first_col ; /* first column in hash bucket */ + int tag_mark ; /* marker value for mark array */ + int row_mark ; /* Row [row].shared2.mark */ + int set_difference ; /* set difference size of row with pivot row */ + int min_score ; /* smallest column score */ + int col_thickness ; /* "thickness" (no. of columns in a supercol) */ + int max_mark ; /* maximum value of tag_mark */ + int pivot_col_thickness ; /* number of columns represented by pivot col */ + int prev_col ; /* Used by Dlist operations. */ + int next_col ; /* Used by Dlist operations. */ + int ngarbage ; /* number of garbage collections performed */ + +#ifndef NDEBUG + int debug_d ; /* debug loop counter */ + int debug_step = 0 ; /* debug loop counter */ +#endif /* NDEBUG */ + + /* === Initialization and clear mark ==================================== */ + + max_mark = INT_MAX - n_col ; /* INT_MAX defined in */ + tag_mark = clear_mark (n_row, Row) ; + min_score = 0 ; + ngarbage = 0 ; + DEBUG1 (("colamd: Ordering, n_col2=%d\n", n_col2)) ; + + /* === Order the columns ================================================ */ + + for (k = 0 ; k < n_col2 ; /* 'k' is incremented below */) + { + +#ifndef NDEBUG + if (debug_step % 100 == 0) + { + DEBUG2 (("\n... Step k: %d out of n_col2: %d\n", k, n_col2)) ; + } + else + { + DEBUG3 (("\n----------Step k: %d out of n_col2: %d\n", k, n_col2)) ; + } + debug_step++ ; + debug_deg_lists (n_row, n_col, Row, Col, head, + min_score, n_col2-k, max_deg) ; + debug_matrix (n_row, n_col, Row, Col, A) ; +#endif /* NDEBUG */ + + /* === Select pivot column, and order it ============================ */ + + /* make sure degree list isn't empty */ + ASSERT (min_score >= 0) ; + ASSERT (min_score <= n_col) ; + ASSERT (head [min_score] >= EMPTY) ; + +#ifndef NDEBUG + for (debug_d = 0 ; debug_d < min_score ; debug_d++) + { + ASSERT (head [debug_d] == EMPTY) ; + } +#endif /* NDEBUG */ + + /* get pivot column from head of minimum degree list */ + while (head [min_score] == EMPTY && min_score < n_col) + { + min_score++ ; + } + pivot_col = head [min_score] ; + ASSERT (pivot_col >= 0 && pivot_col <= n_col) ; + next_col = Col [pivot_col].shared4.degree_next ; + head [min_score] = next_col ; + if (next_col != EMPTY) + { + Col [next_col].shared3.prev = EMPTY ; + } + + ASSERT (COL_IS_ALIVE (pivot_col)) ; + DEBUG3 (("Pivot col: %d\n", pivot_col)) ; + + /* remember score for defrag check */ + pivot_col_score = Col [pivot_col].shared2.score ; + + /* the pivot column is the kth column in the pivot order */ + Col [pivot_col].shared2.order = k ; + + /* increment order count by column thickness */ + pivot_col_thickness = Col [pivot_col].shared1.thickness ; + k += pivot_col_thickness ; + ASSERT (pivot_col_thickness > 0) ; + + /* === Garbage_collection, if necessary ============================= */ + + needed_memory = MIN (pivot_col_score, n_col - k) ; + if (pfree + needed_memory >= Alen) + { + pfree = garbage_collection (n_row, n_col, Row, Col, A, &A [pfree]) ; + ngarbage++ ; + /* after garbage collection we will have enough */ + ASSERT (pfree + needed_memory < Alen) ; + /* garbage collection has wiped out the Row[].shared2.mark array */ + tag_mark = clear_mark (n_row, Row) ; + +#ifndef NDEBUG + debug_matrix (n_row, n_col, Row, Col, A) ; +#endif /* NDEBUG */ + } + + /* === Compute pivot row pattern ==================================== */ + + /* get starting location for this new merged row */ + pivot_row_start = pfree ; + + /* initialize new row counts to zero */ + pivot_row_degree = 0 ; + + /* tag pivot column as having been visited so it isn't included */ + /* in merged pivot row */ + Col [pivot_col].shared1.thickness = -pivot_col_thickness ; + + /* pivot row is the union of all rows in the pivot column pattern */ + cp = &A [Col [pivot_col].start] ; + cp_end = cp + Col [pivot_col].length ; + while (cp < cp_end) + { + /* get a row */ + row = *cp++ ; + DEBUG4 (("Pivot col pattern %d %d\n", ROW_IS_ALIVE (row), row)) ; + /* skip if row is dead */ + if (ROW_IS_DEAD (row)) + { + continue ; + } + rp = &A [Row [row].start] ; + rp_end = rp + Row [row].length ; + while (rp < rp_end) + { + /* get a column */ + col = *rp++ ; + /* add the column, if alive and untagged */ + col_thickness = Col [col].shared1.thickness ; + if (col_thickness > 0 && COL_IS_ALIVE (col)) + { + /* tag column in pivot row */ + Col [col].shared1.thickness = -col_thickness ; + ASSERT (pfree < Alen) ; + /* place column in pivot row */ + A [pfree++] = col ; + pivot_row_degree += col_thickness ; + } + } + } + + /* clear tag on pivot column */ + Col [pivot_col].shared1.thickness = pivot_col_thickness ; + max_deg = MAX (max_deg, pivot_row_degree) ; + +#ifndef NDEBUG + DEBUG3 (("check2\n")) ; + debug_mark (n_row, Row, tag_mark, max_mark) ; +#endif /* NDEBUG */ + + /* === Kill all rows used to construct pivot row ==================== */ + + /* also kill pivot row, temporarily */ + cp = &A [Col [pivot_col].start] ; + cp_end = cp + Col [pivot_col].length ; + while (cp < cp_end) + { + /* may be killing an already dead row */ + row = *cp++ ; + DEBUG3 (("Kill row in pivot col: %d\n", row)) ; + KILL_ROW (row) ; + } + + /* === Select a row index to use as the new pivot row =============== */ + + pivot_row_length = pfree - pivot_row_start ; + if (pivot_row_length > 0) + { + /* pick the "pivot" row arbitrarily (first row in col) */ + pivot_row = A [Col [pivot_col].start] ; + DEBUG3 (("Pivotal row is %d\n", pivot_row)) ; + } + else + { + /* there is no pivot row, since it is of zero length */ + pivot_row = EMPTY ; + ASSERT (pivot_row_length == 0) ; + } + ASSERT (Col [pivot_col].length > 0 || pivot_row_length == 0) ; + + /* === Approximate degree computation =============================== */ + + /* Here begins the computation of the approximate degree. The column */ + /* score is the sum of the pivot row "length", plus the size of the */ + /* set differences of each row in the column minus the pattern of the */ + /* pivot row itself. The column ("thickness") itself is also */ + /* excluded from the column score (we thus use an approximate */ + /* external degree). */ + + /* The time taken by the following code (compute set differences, and */ + /* add them up) is proportional to the size of the data structure */ + /* being scanned - that is, the sum of the sizes of each column in */ + /* the pivot row. Thus, the amortized time to compute a column score */ + /* is proportional to the size of that column (where size, in this */ + /* context, is the column "length", or the number of row indices */ + /* in that column). The number of row indices in a column is */ + /* monotonically non-decreasing, from the length of the original */ + /* column on input to colamd. */ + + /* === Compute set differences ====================================== */ + + DEBUG3 (("** Computing set differences phase. **\n")) ; + + /* pivot row is currently dead - it will be revived later. */ + + DEBUG3 (("Pivot row: ")) ; + /* for each column in pivot row */ + rp = &A [pivot_row_start] ; + rp_end = rp + pivot_row_length ; + while (rp < rp_end) + { + col = *rp++ ; + ASSERT (COL_IS_ALIVE (col) && col != pivot_col) ; + DEBUG3 (("Col: %d\n", col)) ; + + /* clear tags used to construct pivot row pattern */ + col_thickness = -Col [col].shared1.thickness ; + ASSERT (col_thickness > 0) ; + Col [col].shared1.thickness = col_thickness ; + + /* === Remove column from degree list =========================== */ + + cur_score = Col [col].shared2.score ; + prev_col = Col [col].shared3.prev ; + next_col = Col [col].shared4.degree_next ; + ASSERT (cur_score >= 0) ; + ASSERT (cur_score <= n_col) ; + ASSERT (cur_score >= EMPTY) ; + if (prev_col == EMPTY) + { + head [cur_score] = next_col ; + } + else + { + Col [prev_col].shared4.degree_next = next_col ; + } + if (next_col != EMPTY) + { + Col [next_col].shared3.prev = prev_col ; + } + + /* === Scan the column ========================================== */ + + cp = &A [Col [col].start] ; + cp_end = cp + Col [col].length ; + while (cp < cp_end) + { + /* get a row */ + row = *cp++ ; + row_mark = Row [row].shared2.mark ; + /* skip if dead */ + if (ROW_IS_MARKED_DEAD (row_mark)) + { + continue ; + } + ASSERT (row != pivot_row) ; + set_difference = row_mark - tag_mark ; + /* check if the row has been seen yet */ + if (set_difference < 0) + { + ASSERT (Row [row].shared1.degree <= max_deg) ; + set_difference = Row [row].shared1.degree ; + } + /* subtract column thickness from this row's set difference */ + set_difference -= col_thickness ; + ASSERT (set_difference >= 0) ; + /* absorb this row if the set difference becomes zero */ + if (set_difference == 0) + { + DEBUG3 (("aggressive absorption. Row: %d\n", row)) ; + KILL_ROW (row) ; + } + else + { + /* save the new mark */ + Row [row].shared2.mark = set_difference + tag_mark ; + } + } + } + +#ifndef NDEBUG + debug_deg_lists (n_row, n_col, Row, Col, head, + min_score, n_col2-k-pivot_row_degree, max_deg) ; +#endif /* NDEBUG */ + + /* === Add up set differences for each column ======================= */ + + DEBUG3 (("** Adding set differences phase. **\n")) ; + + /* for each column in pivot row */ + rp = &A [pivot_row_start] ; + rp_end = rp + pivot_row_length ; + while (rp < rp_end) + { + /* get a column */ + col = *rp++ ; + ASSERT (COL_IS_ALIVE (col) && col != pivot_col) ; + hash = 0 ; + cur_score = 0 ; + cp = &A [Col [col].start] ; + /* compact the column */ + new_cp = cp ; + cp_end = cp + Col [col].length ; + + DEBUG4 (("Adding set diffs for Col: %d.\n", col)) ; + + while (cp < cp_end) + { + /* get a row */ + row = *cp++ ; + ASSERT(row >= 0 && row < n_row) ; + row_mark = Row [row].shared2.mark ; + /* skip if dead */ + if (ROW_IS_MARKED_DEAD (row_mark)) + { + continue ; + } + ASSERT (row_mark > tag_mark) ; + /* compact the column */ + *new_cp++ = row ; + /* compute hash function */ + hash += row ; + /* add set difference */ + cur_score += row_mark - tag_mark ; + /* integer overflow... */ + cur_score = MIN (cur_score, n_col) ; + } + + /* recompute the column's length */ + Col [col].length = (int) (new_cp - &A [Col [col].start]) ; + + /* === Further mass elimination ================================= */ + + if (Col [col].length == 0) + { + DEBUG4 (("further mass elimination. Col: %d\n", col)) ; + /* nothing left but the pivot row in this column */ + KILL_PRINCIPAL_COL (col) ; + pivot_row_degree -= Col [col].shared1.thickness ; + ASSERT (pivot_row_degree >= 0) ; + /* order it */ + Col [col].shared2.order = k ; + /* increment order count by column thickness */ + k += Col [col].shared1.thickness ; + } + else + { + /* === Prepare for supercolumn detection ==================== */ + + DEBUG4 (("Preparing supercol detection for Col: %d.\n", col)) ; + + /* save score so far */ + Col [col].shared2.score = cur_score ; + + /* add column to hash table, for supercolumn detection */ + hash %= n_col + 1 ; + + DEBUG4 ((" Hash = %d, n_col = %d.\n", hash, n_col)) ; + ASSERT (hash <= n_col) ; + + head_column = head [hash] ; + if (head_column > EMPTY) + { + /* degree list "hash" is non-empty, use prev (shared3) of */ + /* first column in degree list as head of hash bucket */ + first_col = Col [head_column].shared3.headhash ; + Col [head_column].shared3.headhash = col ; + } + else + { + /* degree list "hash" is empty, use head as hash bucket */ + first_col = - (head_column + 2) ; + head [hash] = - (col + 2) ; + } + Col [col].shared4.hash_next = first_col ; + + /* save hash function in Col [col].shared3.hash */ + Col [col].shared3.hash = (int) hash ; + ASSERT (COL_IS_ALIVE (col)) ; + } + } + + /* The approximate external column degree is now computed. */ + + /* === Supercolumn detection ======================================== */ + + DEBUG3 (("** Supercolumn detection phase. **\n")) ; + + detect_super_cols ( + +#ifndef NDEBUG + n_col, Row, +#endif /* NDEBUG */ + + Col, A, head, pivot_row_start, pivot_row_length) ; + + /* === Kill the pivotal column ====================================== */ + + KILL_PRINCIPAL_COL (pivot_col) ; + + /* === Clear mark =================================================== */ + + tag_mark += (max_deg + 1) ; + if (tag_mark >= max_mark) + { + DEBUG2 (("clearing tag_mark\n")) ; + tag_mark = clear_mark (n_row, Row) ; + } + +#ifndef NDEBUG + DEBUG3 (("check3\n")) ; + debug_mark (n_row, Row, tag_mark, max_mark) ; +#endif /* NDEBUG */ + + /* === Finalize the new pivot row, and column scores ================ */ + + DEBUG3 (("** Finalize scores phase. **\n")) ; + + /* for each column in pivot row */ + rp = &A [pivot_row_start] ; + /* compact the pivot row */ + new_rp = rp ; + rp_end = rp + pivot_row_length ; + while (rp < rp_end) + { + col = *rp++ ; + /* skip dead columns */ + if (COL_IS_DEAD (col)) + { + continue ; + } + *new_rp++ = col ; + /* add new pivot row to column */ + A [Col [col].start + (Col [col].length++)] = pivot_row ; + + /* retrieve score so far and add on pivot row's degree. */ + /* (we wait until here for this in case the pivot */ + /* row's degree was reduced due to mass elimination). */ + cur_score = Col [col].shared2.score + pivot_row_degree ; + + /* calculate the max possible score as the number of */ + /* external columns minus the 'k' value minus the */ + /* columns thickness */ + max_score = n_col - k - Col [col].shared1.thickness ; + + /* make the score the external degree of the union-of-rows */ + cur_score -= Col [col].shared1.thickness ; + + /* make sure score is less or equal than the max score */ + cur_score = MIN (cur_score, max_score) ; + ASSERT (cur_score >= 0) ; + + /* store updated score */ + Col [col].shared2.score = cur_score ; + + /* === Place column back in degree list ========================= */ + + ASSERT (min_score >= 0) ; + ASSERT (min_score <= n_col) ; + ASSERT (cur_score >= 0) ; + ASSERT (cur_score <= n_col) ; + ASSERT (head [cur_score] >= EMPTY) ; + next_col = head [cur_score] ; + Col [col].shared4.degree_next = next_col ; + Col [col].shared3.prev = EMPTY ; + if (next_col != EMPTY) + { + Col [next_col].shared3.prev = col ; + } + head [cur_score] = col ; + + /* see if this score is less than current min */ + min_score = MIN (min_score, cur_score) ; + + } + +#ifndef NDEBUG + debug_deg_lists (n_row, n_col, Row, Col, head, + min_score, n_col2-k, max_deg) ; +#endif /* NDEBUG */ + + /* === Resurrect the new pivot row ================================== */ + + if (pivot_row_degree > 0) + { + /* update pivot row length to reflect any cols that were killed */ + /* during super-col detection and mass elimination */ + Row [pivot_row].start = pivot_row_start ; + Row [pivot_row].length = (int) (new_rp - &A[pivot_row_start]) ; + Row [pivot_row].shared1.degree = pivot_row_degree ; + Row [pivot_row].shared2.mark = 0 ; + /* pivot row is no longer dead */ + } + } + + /* === All principal columns have now been ordered ====================== */ + + return (ngarbage) ; +} + + +/* ========================================================================== */ +/* === order_children ======================================================= */ +/* ========================================================================== */ + +/* + The find_ordering routine has ordered all of the principal columns (the + representatives of the supercolumns). The non-principal columns have not + yet been ordered. This routine orders those columns by walking up the + parent tree (a column is a child of the column which absorbed it). The + final permutation vector is then placed in p [0 ... n_col-1], with p [0] + being the first column, and p [n_col-1] being the last. It doesn't look + like it at first glance, but be assured that this routine takes time linear + in the number of columns. Although not immediately obvious, the time + taken by this routine is O (n_col), that is, linear in the number of + columns. Not user-callable. +*/ + +PRIVATE void order_children +( + /* === Parameters ======================================================= */ + + int n_col, /* number of columns of A */ + Colamd_Col Col [], /* of size n_col+1 */ + int p [] /* p [0 ... n_col-1] is the column permutation*/ +) +{ + /* === Local variables ================================================== */ + + int i ; /* loop counter for all columns */ + int c ; /* column index */ + int parent ; /* index of column's parent */ + int order ; /* column's order */ + + /* === Order each non-principal column ================================== */ + + for (i = 0 ; i < n_col ; i++) + { + /* find an un-ordered non-principal column */ + ASSERT (COL_IS_DEAD (i)) ; + if (!COL_IS_DEAD_PRINCIPAL (i) && Col [i].shared2.order == EMPTY) + { + parent = i ; + /* once found, find its principal parent */ + do + { + parent = Col [parent].shared1.parent ; + } while (!COL_IS_DEAD_PRINCIPAL (parent)) ; + + /* now, order all un-ordered non-principal columns along path */ + /* to this parent. collapse tree at the same time */ + c = i ; + /* get order of parent */ + order = Col [parent].shared2.order ; + + do + { + ASSERT (Col [c].shared2.order == EMPTY) ; + + /* order this column */ + Col [c].shared2.order = order++ ; + /* collaps tree */ + Col [c].shared1.parent = parent ; + + /* get immediate parent of this column */ + c = Col [c].shared1.parent ; + + /* continue until we hit an ordered column. There are */ + /* guarranteed not to be anymore unordered columns */ + /* above an ordered column */ + } while (Col [c].shared2.order == EMPTY) ; + + /* re-order the super_col parent to largest order for this group */ + Col [parent].shared2.order = order ; + } + } + + /* === Generate the permutation ========================================= */ + + for (c = 0 ; c < n_col ; c++) + { + p [Col [c].shared2.order] = c ; + } +} + + +/* ========================================================================== */ +/* === detect_super_cols ==================================================== */ +/* ========================================================================== */ + +/* + Detects supercolumns by finding matches between columns in the hash buckets. + Check amongst columns in the set A [row_start ... row_start + row_length-1]. + The columns under consideration are currently *not* in the degree lists, + and have already been placed in the hash buckets. + + The hash bucket for columns whose hash function is equal to h is stored + as follows: + + if head [h] is >= 0, then head [h] contains a degree list, so: + + head [h] is the first column in degree bucket h. + Col [head [h]].headhash gives the first column in hash bucket h. + + otherwise, the degree list is empty, and: + + -(head [h] + 2) is the first column in hash bucket h. + + For a column c in a hash bucket, Col [c].shared3.prev is NOT a "previous + column" pointer. Col [c].shared3.hash is used instead as the hash number + for that column. The value of Col [c].shared4.hash_next is the next column + in the same hash bucket. + + Assuming no, or "few" hash collisions, the time taken by this routine is + linear in the sum of the sizes (lengths) of each column whose score has + just been computed in the approximate degree computation. + Not user-callable. +*/ + +PRIVATE void detect_super_cols +( + /* === Parameters ======================================================= */ + +#ifndef NDEBUG + /* these two parameters are only needed when debugging is enabled: */ + int n_col, /* number of columns of A */ + Colamd_Row Row [], /* of size n_row+1 */ +#endif /* NDEBUG */ + + Colamd_Col Col [], /* of size n_col+1 */ + int A [], /* row indices of A */ + int head [], /* head of degree lists and hash buckets */ + int row_start, /* pointer to set of columns to check */ + int row_length /* number of columns to check */ +) +{ + /* === Local variables ================================================== */ + + int hash ; /* hash value for a column */ + int *rp ; /* pointer to a row */ + int c ; /* a column index */ + int super_c ; /* column index of the column to absorb into */ + int *cp1 ; /* column pointer for column super_c */ + int *cp2 ; /* column pointer for column c */ + int length ; /* length of column super_c */ + int prev_c ; /* column preceding c in hash bucket */ + int i ; /* loop counter */ + int *rp_end ; /* pointer to the end of the row */ + int col ; /* a column index in the row to check */ + int head_column ; /* first column in hash bucket or degree list */ + int first_col ; /* first column in hash bucket */ + + /* === Consider each column in the row ================================== */ + + rp = &A [row_start] ; + rp_end = rp + row_length ; + while (rp < rp_end) + { + col = *rp++ ; + if (COL_IS_DEAD (col)) + { + continue ; + } + + /* get hash number for this column */ + hash = Col [col].shared3.hash ; + ASSERT (hash <= n_col) ; + + /* === Get the first column in this hash bucket ===================== */ + + head_column = head [hash] ; + if (head_column > EMPTY) + { + first_col = Col [head_column].shared3.headhash ; + } + else + { + first_col = - (head_column + 2) ; + } + + /* === Consider each column in the hash bucket ====================== */ + + for (super_c = first_col ; super_c != EMPTY ; + super_c = Col [super_c].shared4.hash_next) + { + ASSERT (COL_IS_ALIVE (super_c)) ; + ASSERT (Col [super_c].shared3.hash == hash) ; + length = Col [super_c].length ; + + /* prev_c is the column preceding column c in the hash bucket */ + prev_c = super_c ; + + /* === Compare super_c with all columns after it ================ */ + + for (c = Col [super_c].shared4.hash_next ; + c != EMPTY ; c = Col [c].shared4.hash_next) + { + ASSERT (c != super_c) ; + ASSERT (COL_IS_ALIVE (c)) ; + ASSERT (Col [c].shared3.hash == hash) ; + + /* not identical if lengths or scores are different */ + if (Col [c].length != length || + Col [c].shared2.score != Col [super_c].shared2.score) + { + prev_c = c ; + continue ; + } + + /* compare the two columns */ + cp1 = &A [Col [super_c].start] ; + cp2 = &A [Col [c].start] ; + + for (i = 0 ; i < length ; i++) + { + /* the columns are "clean" (no dead rows) */ + ASSERT (ROW_IS_ALIVE (*cp1)) ; + ASSERT (ROW_IS_ALIVE (*cp2)) ; + /* row indices will same order for both supercols, */ + /* no gather scatter nessasary */ + if (*cp1++ != *cp2++) + { + break ; + } + } + + /* the two columns are different if the for-loop "broke" */ + if (i != length) + { + prev_c = c ; + continue ; + } + + /* === Got it! two columns are identical =================== */ + + ASSERT (Col [c].shared2.score == Col [super_c].shared2.score) ; + + Col [super_c].shared1.thickness += Col [c].shared1.thickness ; + Col [c].shared1.parent = super_c ; + KILL_NON_PRINCIPAL_COL (c) ; + /* order c later, in order_children() */ + Col [c].shared2.order = EMPTY ; + /* remove c from hash bucket */ + Col [prev_c].shared4.hash_next = Col [c].shared4.hash_next ; + } + } + + /* === Empty this hash bucket ======================================= */ + + if (head_column > EMPTY) + { + /* corresponding degree list "hash" is not empty */ + Col [head_column].shared3.headhash = EMPTY ; + } + else + { + /* corresponding degree list "hash" is empty */ + head [hash] = EMPTY ; + } + } +} + + +/* ========================================================================== */ +/* === garbage_collection =================================================== */ +/* ========================================================================== */ + +/* + Defragments and compacts columns and rows in the workspace A. Used when + all avaliable memory has been used while performing row merging. Returns + the index of the first free position in A, after garbage collection. The + time taken by this routine is linear is the size of the array A, which is + itself linear in the number of nonzeros in the input matrix. + Not user-callable. +*/ + +PRIVATE int garbage_collection /* returns the new value of pfree */ +( + /* === Parameters ======================================================= */ + + int n_row, /* number of rows */ + int n_col, /* number of columns */ + Colamd_Row Row [], /* row info */ + Colamd_Col Col [], /* column info */ + int A [], /* A [0 ... Alen-1] holds the matrix */ + int *pfree /* &A [0] ... pfree is in use */ +) +{ + /* === Local variables ================================================== */ + + int *psrc ; /* source pointer */ + int *pdest ; /* destination pointer */ + int j ; /* counter */ + int r ; /* a row index */ + int c ; /* a column index */ + int length ; /* length of a row or column */ + +#ifndef NDEBUG + int debug_rows ; + DEBUG2 (("Defrag..\n")) ; + for (psrc = &A[0] ; psrc < pfree ; psrc++) ASSERT (*psrc >= 0) ; + debug_rows = 0 ; +#endif /* NDEBUG */ + + /* === Defragment the columns =========================================== */ + + pdest = &A[0] ; + for (c = 0 ; c < n_col ; c++) + { + if (COL_IS_ALIVE (c)) + { + psrc = &A [Col [c].start] ; + + /* move and compact the column */ + ASSERT (pdest <= psrc) ; + Col [c].start = (int) (pdest - &A [0]) ; + length = Col [c].length ; + for (j = 0 ; j < length ; j++) + { + r = *psrc++ ; + if (ROW_IS_ALIVE (r)) + { + *pdest++ = r ; + } + } + Col [c].length = (int) (pdest - &A [Col [c].start]) ; + } + } + + /* === Prepare to defragment the rows =================================== */ + + for (r = 0 ; r < n_row ; r++) + { + if (ROW_IS_ALIVE (r)) + { + if (Row [r].length == 0) + { + /* this row is of zero length. cannot compact it, so kill it */ + DEBUG3 (("Defrag row kill\n")) ; + KILL_ROW (r) ; + } + else + { + /* save first column index in Row [r].shared2.first_column */ + psrc = &A [Row [r].start] ; + Row [r].shared2.first_column = *psrc ; + ASSERT (ROW_IS_ALIVE (r)) ; + /* flag the start of the row with the one's complement of row */ + *psrc = ONES_COMPLEMENT (r) ; + +#ifndef NDEBUG + debug_rows++ ; +#endif /* NDEBUG */ + + } + } + } + + /* === Defragment the rows ============================================== */ + + psrc = pdest ; + while (psrc < pfree) + { + /* find a negative number ... the start of a row */ + if (*psrc++ < 0) + { + psrc-- ; + /* get the row index */ + r = ONES_COMPLEMENT (*psrc) ; + ASSERT (r >= 0 && r < n_row) ; + /* restore first column index */ + *psrc = Row [r].shared2.first_column ; + ASSERT (ROW_IS_ALIVE (r)) ; + + /* move and compact the row */ + ASSERT (pdest <= psrc) ; + Row [r].start = (int) (pdest - &A [0]) ; + length = Row [r].length ; + for (j = 0 ; j < length ; j++) + { + c = *psrc++ ; + if (COL_IS_ALIVE (c)) + { + *pdest++ = c ; + } + } + Row [r].length = (int) (pdest - &A [Row [r].start]) ; + +#ifndef NDEBUG + debug_rows-- ; +#endif /* NDEBUG */ + + } + } + /* ensure we found all the rows */ + ASSERT (debug_rows == 0) ; + + /* === Return the new value of pfree ==================================== */ + + return ((int) (pdest - &A [0])) ; +} + + +/* ========================================================================== */ +/* === clear_mark =========================================================== */ +/* ========================================================================== */ + +/* + Clears the Row [].shared2.mark array, and returns the new tag_mark. + Return value is the new tag_mark. Not user-callable. +*/ + +PRIVATE int clear_mark /* return the new value for tag_mark */ +( + /* === Parameters ======================================================= */ + + int n_row, /* number of rows in A */ + Colamd_Row Row [] /* Row [0 ... n_row-1].shared2.mark is set to zero */ +) +{ + /* === Local variables ================================================== */ + + int r ; + + for (r = 0 ; r < n_row ; r++) + { + if (ROW_IS_ALIVE (r)) + { + Row [r].shared2.mark = 0 ; + } + } + return (1) ; +} + + +/* ========================================================================== */ +/* === print_report ========================================================= */ +/* ========================================================================== */ + +PRIVATE void print_report +( + char *method, + int stats [COLAMD_STATS] +) +{ + + int i1, i2, i3 ; + + if (!stats) + { + PRINTF ("%s: No statistics available.\n", method) ; + return ; + } + + i1 = stats [COLAMD_INFO1] ; + i2 = stats [COLAMD_INFO2] ; + i3 = stats [COLAMD_INFO3] ; + + if (stats [COLAMD_STATUS] >= 0) + { + PRINTF ("%s: OK. ", method) ; + } + else + { + PRINTF ("%s: ERROR. ", method) ; + } + + switch (stats [COLAMD_STATUS]) + { + + case COLAMD_OK_BUT_JUMBLED: + + PRINTF ("Matrix has unsorted or duplicate row indices.\n") ; + + PRINTF ("%s: number of duplicate or out-of-order row indices: %d\n", + method, i3) ; + + PRINTF ("%s: last seen duplicate or out-of-order row index: %d\n", + method, INDEX (i2)) ; + + PRINTF ("%s: last seen in column: %d", + method, INDEX (i1)) ; + + /* no break - fall through to next case instead */ + + case COLAMD_OK: + + PRINTF ("\n") ; + + PRINTF ("%s: number of dense or empty rows ignored: %d\n", + method, stats [COLAMD_DENSE_ROW]) ; + + PRINTF ("%s: number of dense or empty columns ignored: %d\n", + method, stats [COLAMD_DENSE_COL]) ; + + PRINTF ("%s: number of garbage collections performed: %d\n", + method, stats [COLAMD_DEFRAG_COUNT]) ; + break ; + + case COLAMD_ERROR_A_not_present: + + PRINTF ("Array A (row indices of matrix) not present.\n") ; + break ; + + case COLAMD_ERROR_p_not_present: + + PRINTF ("Array p (column pointers for matrix) not present.\n") ; + break ; + + case COLAMD_ERROR_nrow_negative: + + PRINTF ("Invalid number of rows (%d).\n", i1) ; + break ; + + case COLAMD_ERROR_ncol_negative: + + PRINTF ("Invalid number of columns (%d).\n", i1) ; + break ; + + case COLAMD_ERROR_nnz_negative: + + PRINTF ("Invalid number of nonzero entries (%d).\n", i1) ; + break ; + + case COLAMD_ERROR_p0_nonzero: + + PRINTF ("Invalid column pointer, p [0] = %d, must be zero.\n", i1) ; + break ; + + case COLAMD_ERROR_A_too_small: + + PRINTF ("Array A too small.\n") ; + PRINTF (" Need Alen >= %d, but given only Alen = %d.\n", + i1, i2) ; + break ; + + case COLAMD_ERROR_col_length_negative: + + PRINTF + ("Column %d has a negative number of nonzero entries (%d).\n", + INDEX (i1), i2) ; + break ; + + case COLAMD_ERROR_row_index_out_of_bounds: + + PRINTF + ("Row index (row %d) out of bounds (%d to %d) in column %d.\n", + INDEX (i2), INDEX (0), INDEX (i3-1), INDEX (i1)) ; + break ; + + case COLAMD_ERROR_out_of_memory: + + PRINTF ("Out of memory.\n") ; + break ; + + case COLAMD_ERROR_internal_error: + + /* if this happens, there is a bug in the code */ + PRINTF + ("Internal error! Please contact authors (davis@cise.ufl.edu).\n") ; + break ; + } +} + + + + +/* ========================================================================== */ +/* === colamd debugging routines ============================================ */ +/* ========================================================================== */ + +/* When debugging is disabled, the remainder of this file is ignored. */ + +#ifndef NDEBUG + + +/* ========================================================================== */ +/* === debug_structures ===================================================== */ +/* ========================================================================== */ + +/* + At this point, all empty rows and columns are dead. All live columns + are "clean" (containing no dead rows) and simplicial (no supercolumns + yet). Rows may contain dead columns, but all live rows contain at + least one live column. +*/ + +PRIVATE void debug_structures +( + /* === Parameters ======================================================= */ + + int n_row, + int n_col, + Colamd_Row Row [], + Colamd_Col Col [], + int A [], + int n_col2 +) +{ + /* === Local variables ================================================== */ + + int i ; + int c ; + int *cp ; + int *cp_end ; + int len ; + int score ; + int r ; + int *rp ; + int *rp_end ; + int deg ; + + /* === Check A, Row, and Col ============================================ */ + + for (c = 0 ; c < n_col ; c++) + { + if (COL_IS_ALIVE (c)) + { + len = Col [c].length ; + score = Col [c].shared2.score ; + DEBUG4 (("initial live col %5d %5d %5d\n", c, len, score)) ; + ASSERT (len > 0) ; + ASSERT (score >= 0) ; + ASSERT (Col [c].shared1.thickness == 1) ; + cp = &A [Col [c].start] ; + cp_end = cp + len ; + while (cp < cp_end) + { + r = *cp++ ; + ASSERT (ROW_IS_ALIVE (r)) ; + } + } + else + { + i = Col [c].shared2.order ; + ASSERT (i >= n_col2 && i < n_col) ; + } + } + + for (r = 0 ; r < n_row ; r++) + { + if (ROW_IS_ALIVE (r)) + { + i = 0 ; + len = Row [r].length ; + deg = Row [r].shared1.degree ; + ASSERT (len > 0) ; + ASSERT (deg > 0) ; + rp = &A [Row [r].start] ; + rp_end = rp + len ; + while (rp < rp_end) + { + c = *rp++ ; + if (COL_IS_ALIVE (c)) + { + i++ ; + } + } + ASSERT (i > 0) ; + } + } +} + + +/* ========================================================================== */ +/* === debug_deg_lists ====================================================== */ +/* ========================================================================== */ + +/* + Prints the contents of the degree lists. Counts the number of columns + in the degree list and compares it to the total it should have. Also + checks the row degrees. +*/ + +PRIVATE void debug_deg_lists +( + /* === Parameters ======================================================= */ + + int n_row, + int n_col, + Colamd_Row Row [], + Colamd_Col Col [], + int head [], + int min_score, + int should, + int max_deg +) +{ + /* === Local variables ================================================== */ + + int deg ; + int col ; + int have ; + int row ; + + /* === Check the degree lists =========================================== */ + + if (n_col > 10000 && colamd_debug <= 0) + { + return ; + } + have = 0 ; + DEBUG4 (("Degree lists: %d\n", min_score)) ; + for (deg = 0 ; deg <= n_col ; deg++) + { + col = head [deg] ; + if (col == EMPTY) + { + continue ; + } + DEBUG4 (("%d:", deg)) ; + while (col != EMPTY) + { + DEBUG4 ((" %d", col)) ; + have += Col [col].shared1.thickness ; + ASSERT (COL_IS_ALIVE (col)) ; + col = Col [col].shared4.degree_next ; + } + DEBUG4 (("\n")) ; + } + DEBUG4 (("should %d have %d\n", should, have)) ; + ASSERT (should == have) ; + + /* === Check the row degrees ============================================ */ + + if (n_row > 10000 && colamd_debug <= 0) + { + return ; + } + for (row = 0 ; row < n_row ; row++) + { + if (ROW_IS_ALIVE (row)) + { + ASSERT (Row [row].shared1.degree <= max_deg) ; + } + } +} + + +/* ========================================================================== */ +/* === debug_mark =========================================================== */ +/* ========================================================================== */ + +/* + Ensures that the tag_mark is less that the maximum and also ensures that + each entry in the mark array is less than the tag mark. +*/ + +PRIVATE void debug_mark +( + /* === Parameters ======================================================= */ + + int n_row, + Colamd_Row Row [], + int tag_mark, + int max_mark +) +{ + /* === Local variables ================================================== */ + + int r ; + + /* === Check the Row marks ============================================== */ + + ASSERT (tag_mark > 0 && tag_mark <= max_mark) ; + if (n_row > 10000 && colamd_debug <= 0) + { + return ; + } + for (r = 0 ; r < n_row ; r++) + { + ASSERT (Row [r].shared2.mark < tag_mark) ; + } +} + + +/* ========================================================================== */ +/* === debug_matrix ========================================================= */ +/* ========================================================================== */ + +/* + Prints out the contents of the columns and the rows. +*/ + +PRIVATE void debug_matrix +( + /* === Parameters ======================================================= */ + + int n_row, + int n_col, + Colamd_Row Row [], + Colamd_Col Col [], + int A [] +) +{ + /* === Local variables ================================================== */ + + int r ; + int c ; + int *rp ; + int *rp_end ; + int *cp ; + int *cp_end ; + + /* === Dump the rows and columns of the matrix ========================== */ + + if (colamd_debug < 3) + { + return ; + } + DEBUG3 (("DUMP MATRIX:\n")) ; + for (r = 0 ; r < n_row ; r++) + { + DEBUG3 (("Row %d alive? %d\n", r, ROW_IS_ALIVE (r))) ; + if (ROW_IS_DEAD (r)) + { + continue ; + } + DEBUG3 (("start %d length %d degree %d\n", + Row [r].start, Row [r].length, Row [r].shared1.degree)) ; + rp = &A [Row [r].start] ; + rp_end = rp + Row [r].length ; + while (rp < rp_end) + { + c = *rp++ ; + DEBUG4 ((" %d col %d\n", COL_IS_ALIVE (c), c)) ; + } + } + + for (c = 0 ; c < n_col ; c++) + { + DEBUG3 (("Col %d alive? %d\n", c, COL_IS_ALIVE (c))) ; + if (COL_IS_DEAD (c)) + { + continue ; + } + DEBUG3 (("start %d length %d shared1 %d shared2 %d\n", + Col [c].start, Col [c].length, + Col [c].shared1.thickness, Col [c].shared2.score)) ; + cp = &A [Col [c].start] ; + cp_end = cp + Col [c].length ; + while (cp < cp_end) + { + r = *cp++ ; + DEBUG4 ((" %d row %d\n", ROW_IS_ALIVE (r), r)) ; + } + } +} + +PRIVATE void colamd_get_debug +( + char *method +) +{ + colamd_debug = 0 ; /* no debug printing */ + + /* get "D" environment variable, which gives the debug printing level */ + if (getenv ("D")) + { + colamd_debug = atoi (getenv ("D")) ; + } + + DEBUG0 (("%s: debug version, D = %d (THIS WILL BE SLOW!)\n", + method, colamd_debug)) ; +} + +#endif /* NDEBUG */ + diff -r 9f3299378193 -r 57077d0ddc8e liboctave/COLAMD/colamd.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/COLAMD/colamd.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,246 @@ +/* ========================================================================== */ +/* === colamd/symamd prototypes and definitions ============================= */ +/* ========================================================================== */ + +/* + You must include this file (colamd.h) in any routine that uses colamd, + symamd, or the related macros and definitions. + + Authors: + + The authors of the code itself are Stefan I. Larimore and Timothy A. + Davis (davis@cise.ufl.edu), University of Florida. The algorithm was + developed in collaboration with John Gilbert, Xerox PARC, and Esmond + Ng, Oak Ridge National Laboratory. + + Date: + + September 8, 2003. Version 2.3. + + Acknowledgements: + + This work was supported by the National Science Foundation, under + grants DMS-9504974 and DMS-9803599. + + Notice: + + Copyright (c) 1998-2003 by the University of Florida. + All Rights Reserved. + + THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY + EXPRESSED OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + + Permission is hereby granted to use, copy, modify, and/or distribute + this program, provided that the Copyright, this License, and the + Availability of the original version is retained on all copies and made + accessible to the end-user of any code or package that includes COLAMD + or any modified version of COLAMD. + + Availability: + + The colamd/symamd library is available at + + http://www.cise.ufl.edu/research/sparse/colamd/ + + This is the http://www.cise.ufl.edu/research/sparse/colamd/colamd.h + file. It is required by the colamd.c, colamdmex.c, and symamdmex.c + files, and by any C code that calls the routines whose prototypes are + listed below, or that uses the colamd/symamd definitions listed below. + +*/ + +#ifndef COLAMD_H +#define COLAMD_H + +/* ========================================================================== */ +/* === Include files ======================================================== */ +/* ========================================================================== */ + +#include + +/* ========================================================================== */ +/* === Knob and statistics definitions ====================================== */ +/* ========================================================================== */ + +/* size of the knobs [ ] array. Only knobs [0..1] are currently used. */ +#define COLAMD_KNOBS 20 + +/* number of output statistics. Only stats [0..6] are currently used. */ +#define COLAMD_STATS 20 + +/* knobs [0] and stats [0]: dense row knob and output statistic. */ +#define COLAMD_DENSE_ROW 0 + +/* knobs [1] and stats [1]: dense column knob and output statistic. */ +#define COLAMD_DENSE_COL 1 + +/* stats [2]: memory defragmentation count output statistic */ +#define COLAMD_DEFRAG_COUNT 2 + +/* stats [3]: colamd status: zero OK, > 0 warning or notice, < 0 error */ +#define COLAMD_STATUS 3 + +/* stats [4..6]: error info, or info on jumbled columns */ +#define COLAMD_INFO1 4 +#define COLAMD_INFO2 5 +#define COLAMD_INFO3 6 + +/* error codes returned in stats [3]: */ +#define COLAMD_OK (0) +#define COLAMD_OK_BUT_JUMBLED (1) +#define COLAMD_ERROR_A_not_present (-1) +#define COLAMD_ERROR_p_not_present (-2) +#define COLAMD_ERROR_nrow_negative (-3) +#define COLAMD_ERROR_ncol_negative (-4) +#define COLAMD_ERROR_nnz_negative (-5) +#define COLAMD_ERROR_p0_nonzero (-6) +#define COLAMD_ERROR_A_too_small (-7) +#define COLAMD_ERROR_col_length_negative (-8) +#define COLAMD_ERROR_row_index_out_of_bounds (-9) +#define COLAMD_ERROR_out_of_memory (-10) +#define COLAMD_ERROR_internal_error (-999) + +/* ========================================================================== */ +/* === Row and Column structures ============================================ */ +/* ========================================================================== */ + +/* User code that makes use of the colamd/symamd routines need not directly */ +/* reference these structures. They are used only for the COLAMD_RECOMMENDED */ +/* macro. */ + +typedef struct Colamd_Col_struct +{ + int start ; /* index for A of first row in this column, or DEAD */ + /* if column is dead */ + int length ; /* number of rows in this column */ + union + { + int thickness ; /* number of original columns represented by this */ + /* col, if the column is alive */ + int parent ; /* parent in parent tree super-column structure, if */ + /* the column is dead */ + } shared1 ; + union + { + int score ; /* the score used to maintain heap, if col is alive */ + int order ; /* pivot ordering of this column, if col is dead */ + } shared2 ; + union + { + int headhash ; /* head of a hash bucket, if col is at the head of */ + /* a degree list */ + int hash ; /* hash value, if col is not in a degree list */ + int prev ; /* previous column in degree list, if col is in a */ + /* degree list (but not at the head of a degree list) */ + } shared3 ; + union + { + int degree_next ; /* next column, if col is in a degree list */ + int hash_next ; /* next column, if col is in a hash list */ + } shared4 ; + +} Colamd_Col ; + +typedef struct Colamd_Row_struct +{ + int start ; /* index for A of first col in this row */ + int length ; /* number of principal columns in this row */ + union + { + int degree ; /* number of principal & non-principal columns in row */ + int p ; /* used as a row pointer in init_rows_cols () */ + } shared1 ; + union + { + int mark ; /* for computing set differences and marking dead rows*/ + int first_column ;/* first column in row (used in garbage collection) */ + } shared2 ; + +} Colamd_Row ; + +/* ========================================================================== */ +/* === Colamd recommended memory size ======================================= */ +/* ========================================================================== */ + +/* + The recommended length Alen of the array A passed to colamd is given by + the COLAMD_RECOMMENDED (nnz, n_row, n_col) macro. It returns -1 if any + argument is negative. 2*nnz space is required for the row and column + indices of the matrix. COLAMD_C (n_col) + COLAMD_R (n_row) space is + required for the Col and Row arrays, respectively, which are internal to + colamd. An additional n_col space is the minimal amount of "elbow room", + and nnz/5 more space is recommended for run time efficiency. + + This macro is not needed when using symamd. + + Explicit typecast to int added Sept. 23, 2002, COLAMD version 2.2, to avoid + gcc -pedantic warning messages. +*/ + +#define COLAMD_C(n_col) ((int) (((n_col) + 1) * sizeof (Colamd_Col) / sizeof (int))) +#define COLAMD_R(n_row) ((int) (((n_row) + 1) * sizeof (Colamd_Row) / sizeof (int))) + +#define COLAMD_RECOMMENDED(nnz, n_row, n_col) \ +( \ +((nnz) < 0 || (n_row) < 0 || (n_col) < 0) \ +? \ + (-1) \ +: \ + (2 * (nnz) + COLAMD_C (n_col) + COLAMD_R (n_row) + (n_col) + ((nnz) / 5)) \ +) + +/* ========================================================================== */ +/* === Prototypes of user-callable routines ================================= */ +/* ========================================================================== */ + +int colamd_recommended /* returns recommended value of Alen, */ + /* or (-1) if input arguments are erroneous */ +( + int nnz, /* nonzeros in A */ + int n_row, /* number of rows in A */ + int n_col /* number of columns in A */ +) ; + +void colamd_set_defaults /* sets default parameters */ +( /* knobs argument is modified on output */ + double knobs [COLAMD_KNOBS] /* parameter settings for colamd */ +) ; + +int colamd /* returns (1) if successful, (0) otherwise*/ +( /* A and p arguments are modified on output */ + int n_row, /* number of rows in A */ + int n_col, /* number of columns in A */ + int Alen, /* size of the array A */ + int A [], /* row indices of A, of size Alen */ + int p [], /* column pointers of A, of size n_col+1 */ + double knobs [COLAMD_KNOBS],/* parameter settings for colamd */ + int stats [COLAMD_STATS] /* colamd output statistics and error codes */ +) ; + +int symamd /* return (1) if OK, (0) otherwise */ +( + int n, /* number of rows and columns of A */ + int A [], /* row indices of A */ + int p [], /* column pointers of A */ + int perm [], /* output permutation, size n_col+1 */ + double knobs [COLAMD_KNOBS], /* parameters (uses defaults if NULL) */ + int stats [COLAMD_STATS], /* output statistics and error codes */ + void * (*allocate) (size_t, size_t), + /* pointer to calloc (ANSI C) or */ + /* mxCalloc (for MATLAB mexFunction) */ + void (*release) (void *) + /* pointer to free (ANSI C) or */ + /* mxFree (for MATLAB mexFunction) */ +) ; + +void colamd_report +( + int stats [COLAMD_STATS] +) ; + +void symamd_report +( + int stats [COLAMD_STATS] +) ; + +#endif /* COLAMD_H */ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/COLAMD/colamd.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/COLAMD/colamd.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,109 @@ +function [p,stats] = colamd (S, knobs) +%COLAMD Column approximate minimum degree permutation. +% P = COLAMD (S) returns the column approximate minimum degree permutation +% vector for the sparse matrix S. For a non-symmetric matrix S, S (:,P) +% tends to have sparser LU factors than S. The Cholesky factorization of +% S (:,P)' * S (:,P) also tends to be sparser than that of S'*S. COLAMD +% tends to be faster than COLMMD and tends to return a better ordering. +% +% See also COLMMD, COLPERM, SPPARMS, SYMAMD, SYMMMD, SYMRCM. +% +% Usage: P = colamd (S) +% P = colamd (S, knobs) +% [P, stats] = colamd (S) +% [P, stats] = colamd (S, knobs) +% +% knobs is an optional two-element input vector. If S is m-by-n, then +% rows with more than (knobs (1))*n entries are ignored. Columns with +% more than (knobs (2))*m entries are removed prior to ordering, and +% ordered last in the output permutation P. If the knobs parameter is not +% present, then 0.5 is used instead, for both knobs (1) and knobs (2). +% knobs (3) controls the printing of statistics and error messages. +% +% stats is an optional 20-element output vector that provides data about the +% ordering and the validity of the input matrix S. Ordering statistics are +% in stats (1:3). stats (1) and stats (2) are the number of dense or empty +% rows and columns ignored by COLAMD and stats (3) is the number of +% garbage collections performed on the internal data structure used by +% COLAMD (roughly of size 2.2*nnz(S) + 4*m + 7*n integers). +% +% MATLAB built-in functions are intended to generate valid sparse matrices, +% with no duplicate entries, with ascending row indices of the nonzeros +% in each column, with a non-negative number of entries in each column (!) +% and so on. If a matrix is invalid, then COLAMD may or may not be able +% to continue. If there are duplicate entries (a row index appears two or +% more times in the same column) or if the row indices in a column are out +% of order, then COLAMD can correct these errors by ignoring the duplicate +% entries and sorting each column of its internal copy of the matrix S (the +% input matrix S is not repaired, however). If a matrix is invalid in other +% ways then COLAMD cannot continue, an error message is printed, and no +% output arguments (P or stats) are returned. COLAMD is thus a simple way +% to check a sparse matrix to see if it's valid. +% +% stats (4:7) provide information if COLAMD was able to continue. The +% matrix is OK if stats (4) is zero, or 1 if invalid. stats (5) is the +% rightmost column index that is unsorted or contains duplicate entries, +% or zero if no such column exists. stats (6) is the last seen duplicate +% or out-of-order row index in the column index given by stats (5), or zero +% if no such row index exists. stats (7) is the number of duplicate or +% out-of-order row indices. +% +% stats (8:20) is always zero in the current version of COLAMD (reserved +% for future use). +% +% The ordering is followed by a column elimination tree post-ordering. +% +% Authors: +% +% The authors of the code itself are Stefan I. Larimore and Timothy A. +% Davis (davis@cise.ufl.edu), University of Florida. The algorithm was +% developed in collaboration with John Gilbert, Xerox PARC, and Esmond +% Ng, Oak Ridge National Laboratory. +% +% Date: +% +% September 8, 2003. Version 2.3. +% +% Acknowledgements: +% +% This work was supported by the National Science Foundation, under +% grants DMS-9504974 and DMS-9803599. + +% Notice: +% +% Copyright (c) 1998-2003 by the University of Florida. +% All Rights Reserved. +% +% See http://www.cise.ufl.edu/research/sparse/colamd (the colamd.c +% file) for the License. +% +% Availability: +% +% The colamd/symamd library is available at +% +% http://www.cise.ufl.edu/research/sparse/colamd/ +% + +%------------------------------------------------------------------------------- +% Perform the colamd ordering: +%------------------------------------------------------------------------------- + +if (nargout <= 1 & nargin == 1) + p = colamdmex (S) ; +elseif (nargout <= 1 & nargin == 2) + p = colamdmex (S, knobs) ; +elseif (nargout == 2 & nargin == 1) + [p, stats] = colamdmex (S) ; +elseif (nargout == 2 & nargin == 2) + [p, stats] = colamdmex (S, knobs) ; +else + error ('colamd: incorrect number of input and/or output arguments') ; +end + +%------------------------------------------------------------------------------- +% column elimination tree post-ordering: +%------------------------------------------------------------------------------- + +[ignore, q] = sparsfun ('coletree', S (:,p)) ; +p = p (q) ; + diff -r 9f3299378193 -r 57077d0ddc8e liboctave/COLAMD/colamd_demo.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/COLAMD/colamd_demo.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,170 @@ +% Demo for colamd: column approximate minimum degree ordering algorithm. +% +% The following m-files and mexFunctions provide alternative sparse matrix +% ordering methods for MATLAB. They are typically faster (sometimes much +% faster) and typically provide better orderings than their MATLAB counterparts: +% +% colamd a replacement for colmmd. +% +% Typical usage: p = colamd (A) ; +% +% symamd a replacement for symmmd. Based on colamd. +% +% Typical usage: p = symamd (A) ; +% +% For a description of the methods used, see the colamd.c file. +% +% September 8, 2003. Version 2.3. +% http://www.cise.ufl.edu/research/sparse/colamd/ +% + +%------------------------------------------------------------------------------- +% Print the introduction, the help info, and compile the mexFunctions +%------------------------------------------------------------------------------- + +more on + +fprintf (1, '\n-----------------------------------------------------------\n') ; +fprintf (1, 'Colamd/symamd demo.') ; +fprintf (1, '\n-----------------------------------------------------------\n') ; +help colamd_demo ; + +fprintf (1, '\n-----------------------------------------------------------\n') ; +fprintf (1, 'Colamd help information:') ; +fprintf (1, '\n-----------------------------------------------------------\n') ; +help colamd ; + +fprintf (1, '\n-----------------------------------------------------------\n') ; +fprintf (1, 'Symamd help information:') ; +fprintf (1, '\n-----------------------------------------------------------\n') ; +help symamd ; + +fprintf (1, '\n-----------------------------------------------------------\n') ; +fprintf (1, 'colamd and symamd mexFunctions will now be compiled.') ; +fprintf (1, '\n-----------------------------------------------------------\n') ; +s = input ('\n\nHit any key (or type ''n'' to skip compilation): ', 's') ; +if (~strcmp (s, 'n')) + disp ('mex -O colamdmex.c colamd.c') ; mex -O colamdmex.c colamd.c + disp ('mex -O symamdmex.c colamd.c') ; mex -O symamdmex.c colamd.c +end + +%------------------------------------------------------------------------------- +% Solving Ax=b +%------------------------------------------------------------------------------- + +n = 100 ; +fprintf (1, '\n-----------------------------------------------------------\n') ; +fprintf (1, 'Solving Ax=b for a small %d-by-%d random matrix:', n, n) ; +fprintf (1, '\n-----------------------------------------------------------\n') ; +fprintf (1, '\nNOTE: Random sparse matrices are AWFUL test cases.\n') ; +fprintf (1, 'They''re just easy to generate in a demo.\n') ; + +% set up the system + +rand ('state', 0) ; +randn ('state', 0) ; +spparms ('default') ; +A = sprandn (n, n, 5/n) + speye (n) ; +b = (1:n)' ; + +fprintf (1, '\n\nSolving via lu (PAQ = LU), where Q is from colamd:\n') ; +q = colamd (A) ; +I = speye (n) ; +Q = I (:, q) ; +[L,U,P] = lu (A*Q) ; +fl = luflops (L, U) ; +x = Q * (U \ (L \ (P * b))) ; +fprintf (1, '\nFlop count for [L,U,P] = lu (A*Q): %d\n', fl) ; +fprintf (1, 'residual: %e\n', norm (A*x-b)); + +fprintf (1, '\n\nSolving via lu (PAQ = LU), where Q is from colmmd:\n') ; +q = colmmd (A) ; +I = speye (n) ; +Q = I (:, q) ; +[L,U,P] = lu (A*Q) ; +fl = luflops (L, U) ; +x = Q * (U \ (L \ (P * b))) ; +fprintf (1, '\nFlop count for [L,U,P] = lu (A*Q): %d\n', fl) ; +fprintf (1, 'residual: %e\n', norm (A*x-b)); + +fprintf (1, '\n\nSolving via lu (PA = LU), without regard for sparsity:\n') ; +[L,U,P] = lu (A) ; +fl = luflops (L, U) ; +x = U \ (L \ (P * b)) ; +fprintf (1, '\nFlop count for [L,U,P] = lu (A*Q): %d\n', fl) ; +fprintf (1, 'residual: %e\n', norm (A*x-b)); + +%------------------------------------------------------------------------------- +% Large demo for colamd +%------------------------------------------------------------------------------- + +fprintf (1, '\n-----------------------------------------------------------\n') ; +fprintf (1, 'Large demo for colamd (symbolic analysis only):') ; +fprintf (1, '\n-----------------------------------------------------------\n') ; + +rand ('state', 0) ; +randn ('state', 0) ; +spparms ('default') ; +n = 1000 ; +fprintf (1, 'Generating a random %d-by-%d sparse matrix.\n', n, n) ; +A = sprandn (n, n, 5/n) + speye (n) ; + +fprintf (1, '\n\nUnordered matrix:\n') ; +lnz = symbfact (A, 'col') ; +fprintf (1, 'nz in Cholesky factors of A''A: %d\n', sum (lnz)) ; +fprintf (1, 'flop count for Cholesky of A''A: %d\n', sum (lnz.^2)) ; + +tic ; +p = colamd (A) ; +t = toc ; +lnz = symbfact (A (:,p), 'col') ; +fprintf (1, '\n\nColamd run time: %f\n', t) ; +fprintf (1, 'colamd ordering quality: \n') ; +fprintf (1, 'nz in Cholesky factors of A(:,p)''A(:,p): %d\n', sum (lnz)) ; +fprintf (1, 'flop count for Cholesky of A(:,p)''A(:,p): %d\n', sum (lnz.^2)) ; + +tic ; +p = colmmd (A) ; +t = toc ; +lnz = symbfact (A (:,p), 'col') ; +fprintf (1, '\n\nColmmd run time: %f\n', t) ; +fprintf (1, 'colmmd ordering quality: \n') ; +fprintf (1, 'nz in Cholesky factors of A(:,p)''A(:,p): %d\n', sum (lnz)) ; +fprintf (1, 'flop count for Cholesky of A(:,p)''A(:,p): %d\n', sum (lnz.^2)) ; + +%------------------------------------------------------------------------------- +% Large demo for symamd +%------------------------------------------------------------------------------- + +fprintf (1, '\n-----------------------------------------------------------\n') ; +fprintf (1, 'Large demo for symamd (symbolic analysis only):') ; +fprintf (1, '\n-----------------------------------------------------------\n') ; + +fprintf (1, 'Generating a random symmetric %d-by-%d sparse matrix.\n', n, n) ; +A = A+A' ; + +fprintf (1, '\n\nUnordered matrix:\n') ; +lnz = symbfact (A, 'sym') ; +fprintf (1, 'nz in Cholesky factors of A: %d\n', sum (lnz)) ; +fprintf (1, 'flop count for Cholesky of A: %d\n', sum (lnz.^2)) ; + +tic ; +p = symamd (A) ; +t = toc ; +lnz = symbfact (A (p,p), 'sym') ; +fprintf (1, '\n\nSymamd run time: %f\n', t) ; +fprintf (1, 'symamd ordering quality: \n') ; +fprintf (1, 'nz in Cholesky factors of A(p,p): %d\n', sum (lnz)) ; +fprintf (1, 'flop count for Cholesky of A(p,p): %d\n', sum (lnz.^2)) ; + +tic ; +p = symmmd (A) ; +t = toc ; +lnz = symbfact (A (p,p), 'sym') ; +fprintf (1, '\n\nSymmmd run time: %f\n', t) ; +fprintf (1, 'symmmd ordering quality: \n') ; +fprintf (1, 'nz in Cholesky factors of A(p,p): %d\n', sum (lnz)) ; +fprintf (1, 'flop count for Cholesky of A(p,p): %d\n', sum (lnz.^2)) ; + +more off + diff -r 9f3299378193 -r 57077d0ddc8e liboctave/COLAMD/colamd_example.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/COLAMD/colamd_example.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,182 @@ +/* ========================================================================== */ +/* === colamd and symamd example ============================================ */ +/* ========================================================================== */ + +/* + colamd example of use, to order the columns of a 5-by-4 matrix with + 11 nonzero entries in the following nonzero pattern, with default knobs. + + x 0 x 0 + x 0 x x + 0 x x 0 + 0 0 x x + x x 0 0 + + symamd example of use, to order the rows and columns of a 5-by-5 + matrix with 13 nonzero entries in the following nonzero pattern, + with default knobs. + + x x 0 0 0 + x x x x 0 + 0 x x 0 0 + 0 x 0 x x + 0 0 0 x x + + (where x denotes a nonzero value). + + September 8, 2003. Version 2.3. + + See http://www.cise.ufl.edu/research/sparse/colamd/ (the colamd.c file) + for the routines this program calls, and for the License. +*/ + +/* ========================================================================== */ + +#include +#include "colamd.h" + +#define A_NNZ 11 +#define A_NROW 5 +#define A_NCOL 4 +#define ALEN (COLAMD_RECOMMENDED (A_NNZ, A_NCOL, A_NROW)) + +#define B_NNZ 4 +#define B_N 5 + +int main (int argc, char **argv) +{ + + /* ====================================================================== */ + /* input matrix A definition */ + /* ====================================================================== */ + + int A [ALEN] = { + + 0, 1, 4, /* row indices of nonzeros in column 0 */ + 2, 4, /* row indices of nonzeros in column 1 */ + 0, 1, 2, 3, /* row indices of nonzeros in column 2 */ + 1, 3} ; /* row indices of nonzeros in column 3 */ + + int p [ ] = { + + 0, /* column 0 is in A [0..2] */ + 3, /* column 1 is in A [3..4] */ + 5, /* column 2 is in A [5..8] */ + 9, /* column 3 is in A [9..10] */ + A_NNZ} ; /* number of nonzeros in A */ + + /* ====================================================================== */ + /* input matrix B definition */ + /* ====================================================================== */ + + int B [ ] = { /* Note: only strictly lower triangular part */ + /* is included, since symamd ignores the */ + /* diagonal and upper triangular part of B. */ + + 1, /* row indices of nonzeros in column 0 */ + 2, 3, /* row indices of nonzeros in column 1 */ + /* row indices of nonzeros in column 2 (none) */ + 4 /* row indices of nonzeros in column 3 */ + } ; /* row indices of nonzeros in column 4 (none) */ + + int q [ ] = { + + 0, /* column 0 is in B [0] */ + 1, /* column 1 is in B [1..2] */ + 3, /* column 2 is empty */ + 3, /* column 3 is in B [3] */ + 4, /* column 4 is empty */ + B_NNZ} ; /* number of nonzeros in strictly lower B */ + + /* ====================================================================== */ + /* other variable definitions */ + /* ====================================================================== */ + + int perm [B_N+1] ; /* note the size is N+1 */ + int stats [COLAMD_STATS] ; /* for colamd and symamd output statistics */ + + int row, col, pp, length, ok ; + + /* ====================================================================== */ + /* dump the input matrix A */ + /* ====================================================================== */ + + printf ("colamd %d-by-%d input matrix:\n", A_NROW, A_NCOL) ; + for (col = 0 ; col < A_NCOL ; col++) + { + length = p [col+1] - p [col] ; + printf ("Column %d, with %d entries:\n", col, length) ; + for (pp = p [col] ; pp < p [col+1] ; pp++) + { + row = A [pp] ; + printf (" row %d\n", row) ; + } + } + + /* ====================================================================== */ + /* order the matrix. Note that this destroys A and overwrites p */ + /* ====================================================================== */ + + ok = colamd (A_NROW, A_NCOL, ALEN, A, p, (double *) NULL, stats) ; + colamd_report (stats) ; + + if (!ok) + { + printf ("colamd error!\n") ; + exit (1) ; + } + + /* ====================================================================== */ + /* print the column ordering */ + /* ====================================================================== */ + + printf ("colamd column ordering:\n") ; + printf ("1st column: %d\n", p [0]) ; + printf ("2nd column: %d\n", p [1]) ; + printf ("3rd column: %d\n", p [2]) ; + printf ("4th column: %d\n", p [3]) ; + + /* ====================================================================== */ + /* dump the strictly lower triangular part of symmetric input matrix B */ + /* ====================================================================== */ + + printf ("\n\nsymamd %d-by-%d input matrix:\n", B_N, B_N) ; + printf ("Entries in strictly lower triangular part:\n") ; + for (col = 0 ; col < B_N ; col++) + { + length = q [col+1] - q [col] ; + printf ("Column %d, with %d entries:\n", col, length) ; + for (pp = q [col] ; pp < q [col+1] ; pp++) + { + row = B [pp] ; + printf (" row %d\n", row) ; + } + } + + /* ====================================================================== */ + /* order the matrix B. Note that this does not modify B or q. */ + /* ====================================================================== */ + + ok = symamd (B_N, B, q, perm, (double *) NULL, stats, &calloc, &free) ; + symamd_report (stats) ; + + if (!ok) + { + printf ("symamd error!\n") ; + exit (1) ; + } + + /* ====================================================================== */ + /* print the symmetric ordering */ + /* ====================================================================== */ + + printf ("symamd column ordering:\n") ; + printf ("1st row/column: %d\n", perm [0]) ; + printf ("2nd row/column: %d\n", perm [1]) ; + printf ("3rd row/column: %d\n", perm [2]) ; + printf ("4th row/column: %d\n", perm [3]) ; + printf ("5th row/column: %d\n", perm [4]) ; + + exit (0) ; +} + diff -r 9f3299378193 -r 57077d0ddc8e liboctave/COLAMD/colamd_example.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/COLAMD/colamd_example.out Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,48 @@ +colamd 5-by-4 input matrix: +Column 0, with 3 entries: + row 0 + row 1 + row 4 +Column 1, with 2 entries: + row 2 + row 4 +Column 2, with 4 entries: + row 0 + row 1 + row 2 + row 3 +Column 3, with 2 entries: + row 1 + row 3 +colamd: OK. +colamd: number of dense or empty rows ignored: 1 +colamd: number of dense or empty columns ignored: 2 +colamd: number of garbage collections performed: 0 +colamd column ordering: +1st column: 1 +2nd column: 3 +3rd column: 0 +4th column: 2 + + +symamd 5-by-5 input matrix: +Entries in strictly lower triangular part: +Column 0, with 1 entries: + row 1 +Column 1, with 2 entries: + row 2 + row 3 +Column 2, with 0 entries: +Column 3, with 1 entries: + row 4 +Column 4, with 0 entries: +symamd: OK. +symamd: number of dense or empty rows ignored: 0 +symamd: number of dense or empty columns ignored: 0 +symamd: number of garbage collections performed: 0 +symamd column ordering: +1st row/column: 0 +2nd row/column: 2 +3rd row/column: 1 +4th row/column: 3 +5th row/column: 4 diff -r 9f3299378193 -r 57077d0ddc8e liboctave/COLAMD/colamd_test.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/COLAMD/colamd_test.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,521 @@ +function colamd_test (spumoni) +% +% colamd_test (spumoni) +% +% COLAMD and SYMAMD testing function. Here we try to give colamd and symamd +% every possible type of matrix and erroneous input that they may encounter. +% We want either a valid permutation returned or we want them to fail +% gracefully. If the optional spumoni argument is present, additional +% diagnostic messages are printed during the test: +% +% spumoni: +% 0: very little, just a progress meter (default) +% 1: lots +% 2: far too much +% +% You are prompted as to whether or not the colamd and symand routines and +% the test mexFunctions are to be compiled. +% +% Tim Davis +% September 8, 2003. Version 2.3. +% http://www.cise.ufl.edu/research/sparse/colamd/ + +help colamd_test + +s = input (... +'Compile colamd, symand, and the test codes? (y/n, default is yes): ', 's') ; + +do_compile = 1 ; +if (~isempty (s)) + if (s (1) == 'n' | s (1) == 'N') + do_compile = 0 ; + end +end + +if (do_compile) + fprintf ('Compiling colamd, symamd, and test mexFunctions.\n') ; + fprintf ('mex -O colamdmex.c colamd.c\n') ; + mex -O colamdmex.c colamd.c + fprintf ('mex -O symamdmex.c colamd.c\n') ; + mex -O symamdmex.c colamd.c + fprintf ('mex -O colamdtestmex.c colamd.c\n') ; + mex -O colamdtestmex.c colamd.c + fprintf ('mex -O symamdtestmex.c colamd.c\n') ; + mex -O symamdtestmex.c colamd.c + fprintf ('Done compiling.\n') ; +end + +fprintf ('\nThe following codes will be tested:\n') ; +which colamd +which symamd +which colamdmex +which symamdmex + +fprintf ('\nStarting the tests. Please be patient.\n') ; + +rand ('state', 0) ; +randn ('state', 0) ; +if (nargin < 1) + spumoni = 0 ; +end +old = spparms ('spumoni') ; +spparms ('spumoni', spumoni) ; + + +fprintf ('Null matrices') ; +A = zeros (0,0) ; +A = sparse (A) ; + +[p, stats] = colamd (A, [.5 .5 spumoni]) ; +check_perm (p, A) ; + +[p, stats] = symamd (A, [.5 spumoni]) ; +check_perm (p, A) ; + +A = zeros (0, 100) ; +A = sparse (A) ; +[p, stats] = colamd (A, [.5 .5 spumoni]) ; +check_perm (p, A) ; + +A = zeros (100, 0) ; +A = sparse (A) ; +[p, stats] = colamd (A, [.5 .5 spumoni]) ; +check_perm (p, A) ; +fprintf (' OK\n') ; + + +fprintf ('Matrices with a few dense row/cols\n') ; + +for trial = 1:20 + + % random square unsymmetric matrix + A = rand_matrix (1000, 1000, 1, 10, 20) ; + [m n] = size (A) ; + + + for tol = [0 0.001 0.005 0.01:0.01:0.10 0.5:.1:1] + + [p, stats] = colamd (A, [tol tol spumoni]) ; + check_perm (p, A) ; + + B = A + A' ; + [p, stats] = symamd (B, [tol spumoni]) ; + check_perm (p, A) ; + + [p, stats] = colamd (A, [tol 1 spumoni]) ; + check_perm (p, A) ; + + [p, stats] = colamd (A, [1 tol spumoni]) ; + check_perm (p, A) ; + + fprintf ('.') ; + + end +end +fprintf (' OK\n') ; + +fprintf ('General matrices\n') ; +for trial = 1:400 + + % matrix of random mtype + mtype = irand (3) ; + A = rand_matrix (2000, 2000, mtype, 0, 0) ; + [m n] = size (A) ; + p = colamd (A) ; + check_perm (p, A) ; + if (mtype == 3) + p = symamd (A) ; + check_perm (p, A) ; + end + + fprintf ('.') ; +end +fprintf (' OK\n') ; + +fprintf ('Test error handling with invalid inputs\n') ; + +% Check different erroneous input. +for trial = 1:30 + + A = rand_matrix (1000, 1000, 2, 0, 0) ; + [m n] = size (A) ; + + for err = 1:13 + + p = Tcolamd (A, [1 1 spumoni 0 err]) ; + if p ~= -1 + check_perm (p, A) ; + end + + if (err == 1) + % check different (valid) input args to colamd + p = Acolamd (A, spumoni) ; + + p2 = Acolamd (A, spumoni, [.5 .5 spumoni 0 0]) ; + if (any (p ~= p2)) + error ('colamd: mismatch 1!') ; + end + [p2 stats] = Acolamd (A, spumoni) ; + if (any (p ~= p2)) + error ('colamd: mismatch 2!') ; + end + [p2 stats] = Acolamd (A, spumoni, [.5 .5 spumoni 0 0]) ; + if (any (p ~= p2)) + error ('colamd: mismatch 3!') ; + end + end + + B = A'*A ; + p = Tsymamd (B, [1 spumoni err]) ; + if p ~= -1 + check_perm (p, A) ; + end + + if (err == 1) + + % check different (valid) input args to symamd + p = Asymamd (B, spumoni) ; + check_perm (p, A) ; + p2 = Asymamd (B, spumoni, [.5 spumoni 0]) ; + if (any (p ~= p2)) + error ('symamd: mismatch 1!') ; + end + [p2 stats] = Asymamd (B, spumoni) ; + if (any (p ~= p2)) + error ('symamd: mismatch 2!') ; + end + [p2 stats] = Asymamd (B, spumoni, [.5 spumoni 0]) ; + if (any (p ~= p2)) + error ('symamd: mismatch 3!') ; + end + end + + fprintf ('.') ; + end + +end +fprintf (' OK\n') ; + +fprintf ('Matrices with a few empty columns\n') ; + +for trial = 1:400 + + % some are square, some are rectangular + n = 0 ; + while (n < 5) + A = rand_matrix (1000, 1000, irand (2), 0, 0) ; + [m n] = size (A) ; + end + + % Add 5 null columns at random locations. + null_col = randperm (n) ; + null_col = sort (null_col (1:5)) ; + A (:, null_col) = 0 ; + + % Order the matrix and make sure that the null columns are ordered last. + [p, stats] = colamd (A, [1 1 spumoni]) ; + check_perm (p, A) ; + + if (stats (2) ~= 5) + error ('colamd: wrong number of null columns') ; + end + if (any (null_col ~= p ((n-4):n))) + error ('colamd: Null cols are not ordered last in natural order') ; + end + + fprintf ('.') ; + +end +fprintf (' OK\n') ; + +fprintf ('Matrices with a few empty rows and columns\n') ; + +for trial = 1:400 + + % symmetric matrices + n = 0 ; + while (n < 5) + A = rand_matrix (1000, 1000, 3, 0, 0) ; + [m n] = size (A) ; + end + + % Add 5 null columns and rows at random locations. + null_col = randperm (n) ; + null_col = sort (null_col (1:5)) ; + A (:, null_col) = 0 ; + A (null_col, :) = 0 ; + + % Order the matrix and make sure that the null rows/cols are ordered last. + [p,stats] = symamd (A, [1 spumoni]) ; + check_perm (p, A) ; + + % find actual number of null rows and columns + Alo = tril (A, -1) ; + nnull = length (find (sum (Alo') == 0 & sum (Alo) == 0)) ; + + if (stats (2) ~= nnull | nnull < 5) + error ('symamd: wrong number of null columns') ; + end + if (any (null_col ~= p ((n-4):n))) + error ('symamd: Null cols are not ordered last in natural order') ; + end + + fprintf ('.') ; + +end +fprintf (' OK\n') ; + +fprintf ('Matrices with a few empty rows\n') ; + +% Test matrices with null rows inserted. + +for trial = 1:400 + + m = 0 ; + while (m < 5) + A = rand_matrix (1000, 1000, 2, 0, 0) ; + [m n] = size (A) ; + end + + % Add 5 null rows at random locations. + null_row = randperm (m) ; + null_row = sort (null_row (1:5)) ; + A (null_row, :) = 0 ; + + p = colamd (A, [.5 .5 spumoni]) ; + check_perm (p, A) ; + if (stats (1) ~= 5) + error ('colamd: wrong number of null rows') ; + end + fprintf ('.') ; +end +fprintf (' OK\n') ; + + +fprintf ('\ncolamd and symamd: all tests passed\n\n') ; +spparms ('spumoni', old) ; + +%------------------------------------------------------------------------------- +% Acolamd: compare colamd and Tcolamd results +%------------------------------------------------------------------------------- + +function [p,stats] = Acolamd (S, spumoni, knobs) + +if (nargin < 2) + spumoni = 0 ; +end + +if (nargin < 3) + if (nargout == 1) + [p] = colamd (S) ; + [p1] = Tcolamd (S, [.5 .5 spumoni 0 0]) ; + else + [p, stats] = colamd (S) ; + [p1, stats1] = Tcolamd (S, [.5 .5 spumoni 0 0]) ; + end +else + if (nargout == 1) + [p] = colamd (S, knobs (1:3)) ; + [p1] = Tcolamd (S, knobs) ; + else + [p, stats] = colamd (S, knobs (1:3)) ; + [p1, stats1] = Tcolamd (S, knobs) ; + end +end + +check_perm (p, S) ; +check_perm (p1, S) ; + +if (any (p1 ~= p)) + error ('Acolamd mismatch!') ; +end + + +%------------------------------------------------------------------------------- +% Asymamd: compare symamd and Tsymamd results +%------------------------------------------------------------------------------- + +function [p,stats] = Asymamd (S, spumoni, knobs) + +if (nargin < 2) + spumoni = 0 ; +end + +if (nargin < 3) + if (nargout == 1) + [p] = symamd (S) ; + [p1] = Tsymamd (S, [.5 spumoni 0]) ; + else + [p, stats] = symamd (S) ; + [p1, stats1] = Tsymamd (S, [.5 spumoni 0]) ; + end +else + if (nargout == 1) + [p] = symamd (S, knobs (1:2)) ; + [p1] = Tsymamd (S, knobs) ; + else + [p, stats] = symamd (S, knobs (1:2)) ; + [p1, stats1] = Tsymamd (S, knobs) ; + end +end + +if (any (p1 ~= p)) + error ('Asymamd mismatch!') ; +end + + +%------------------------------------------------------------------------------- +% check_perm: check for a valid permutation vector +%------------------------------------------------------------------------------- + +function check_perm (p, A) + +if (isempty (A) & isempty (p)) + % empty permutation vectors of empty matrices are OK + return +end + +if (isempty (p)) + error ('bad permutation: cannot be empty') ; +end + +[m n] = size (A) ; +[pm pn] = size (p) ; +if (pn == 1) + % force p to be a row vector + p = p' ; + [pm pn] = size (p) ; +end + +if (n ~= pn) + error ('bad permutation: wrong size') ; +end + +if (pm ~= 1) ; + % p must be a vector + error ('bad permutation: not a vector') ; +else + if (any (sort (p) - (1:pn))) + error ('bad permutation') ; + end +end + +%------------------------------------------------------------------------------- +% irand: return a random integer between 1 and n +%------------------------------------------------------------------------------- + +function i = irand (n) +i = min (n, 1 + floor (rand * n)) ; + +%------------------------------------------------------------------------------- +% rand_matrix: return a random sparse matrix +%------------------------------------------------------------------------------- + +function A = rand_matrix (nmax, mmax, mtype, drows, dcols) +% +% A = rand_matrix (nmax, mmax, mtype, drows, dcols) +% +% A binary matrix of random size, at most nmax-by-mmax, with drows dense rows +% and dcols dense columns. +% +% mtype 1: square unsymmetric (mmax is ignored) +% mtype 2: rectangular +% mtype 3: symmetric (mmax is ignored) + +n = irand (nmax) ; +if (mtype ~= 2) + % square + m = n ; +else + m = irand (mmax) ; +end + +A = sprand (m, n, 10 / max (m,n)) ; + +if (drows > 0) + % add dense rows + for k = 1:drows + i = irand (m) ; + nz = irand (n) ; + p = randperm (n) ; + p = p (1:nz) ; + A (i,p) = 1 ; + end +end + +if (dcols > 0) + % add dense cols + for k = 1:dcols + j = irand (n) ; + nz = irand (m) ; + p = randperm (m) ; + p = p (1:nz) ; + A (p,j) = 1 ; + end +end + +A = spones (A) ; + +% ensure that there are no empty columns +d = find (full (sum (A)) == 0) ; +A (m,d) = 1 ; + +% ensure that there are no empty rows +d = find (full (sum (A,2)) == 0) ; +A (d,n) = 1 ; + +if (mtype == 3) + % symmetric + A = A + A' + speye (n) ; +end + +A = spones (A) ; + +%------------------------------------------------------------------------------- +% Tcolamd: run colamd in a testing mode +%------------------------------------------------------------------------------- + +function [p,stats] = Tcolamd (S, knobs) + +if (nargout <= 1 & nargin == 1) + p = colamdtestmex (S) ; +elseif (nargout <= 1 & nargin == 2) + p = colamdtestmex (S, knobs) ; +elseif (nargout == 2 & nargin == 1) + [p, stats] = colamdtestmex (S) ; +elseif (nargout == 2 & nargin == 2) + [p, stats] = colamdtestmex (S, knobs) ; +else + error ('colamd: incorrect number of input and/or output arguments') ; +end + +if (p (1) ~= -1) + [ignore, q] = sparsfun ('coletree', S (:,p)) ; + p = p (q) ; + check_perm (p, S) ; +end + +%------------------------------------------------------------------------------- +% Tsymamd: run symamd in a testing mode +%------------------------------------------------------------------------------- + +function [p, stats] = Tsymamd (S, knobs) + +if (nargout <= 1 & nargin == 1) + p = symamdtestmex (S) ; +elseif (nargout <= 1 & nargin == 2) + p = symamdtestmex (S, knobs) ; +elseif (nargout == 2 & nargin == 1) + [p, stats] = symamdtestmex (S) ; +elseif (nargout == 2 & nargin == 2) + [p, stats] = symamdtestmex (S, knobs) ; +else + error ('symamd: incorrect number of input and/or output arguments') ; +end + +if (p (1) ~= -1) + [ignore, q] = sparsfun ('symetree', S (p,p)) ; + p = p (q) ; + check_perm (p, S) ; +end + diff -r 9f3299378193 -r 57077d0ddc8e liboctave/COLAMD/colamdmex.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/COLAMD/colamdmex.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,250 @@ +/* ========================================================================== */ +/* === colamd mexFunction =================================================== */ +/* ========================================================================== */ + +/* + Usage: + + P = colamd (A) ; + + P = colamd (A, knobs) ; + + [ P, stats ] = colamd (A) ; + + [ P, stats ] = colamd (A, knobs) ; + + Returns a permutation vector P such that the LU factorization of A (:,P) + tends to be sparser than that of A. The Cholesky factorization of + (A (:,P))'*(A (:,P)) will also tend to be sparser than that of A'*A. + This routine provides the same functionality as COLMMD, but is much faster + and returns a better permutation vector. Note that the COLMMD m-file in + MATLAB 5.2 also performs a column elimination tree post-ordering. This + mexFunction does not do this post-ordering. This mexFunction is a + replacement for the p = sparsfun ('colmmd', A) operation. + + The knobs and stats vectors are optional: + + knobs (1) rows with more than (knobs (1))*n_col entries + are removed prior to ordering. If knobs is not present, + then the default is used (0.5). + + knobs (2) columns with more than (knobs (2))*n_row entries + are removed prior to ordering, and placed last in the + column permutation. If knobs is not present, + then the default is used (0.5). + + knobs (3) print level, similar to spparms ('spumoni') + + stats (1) the number of dense (or empty) rows ignored + + stats (2) the number of dense (or empty) columms. These + are ordered last, in their natural order. + + stats (3) the number of garbage collections performed. + + stats (4) return status: + + 0: matrix is a valid MATLAB matrix. + + 1: matrix has duplicate entries or unsorted columns. + This should not occur in a valid MATLAB matrix, + but the ordering proceeded anyway by sorting the + row indices in each column and by ignoring the + duplicate row indices in each column. See + stats (5:7) for more information. + + stats (5) highest numbered column that is unsorted or has + duplicate entries (zero if none) + + stats (6) last seen duplicate or unsorted row index + (zero if none) + + stats (7) number of duplicate or unsorted row indices + + Authors: + + The authors of the code itself are Stefan I. Larimore and Timothy A. + Davis (davis@cise.ufl.edu), University of Florida. The algorithm was + developed in collaboration with John Gilbert, Xerox PARC, and Esmond + Ng, Oak Ridge National Laboratory. + + Date: + + September 8, 2003. Version 2.3. + + Acknowledgements: + + This work was supported by the National Science Foundation, under + grants DMS-9504974 and DMS-9803599. + + Notice: + + Copyright (c) 1998-2003 by the University of Florida. + All Rights Reserved. + + See http://www.cise.ufl.edu/research/sparse/colamd (the colamd.c + file) for the License. + + Availability: + + The colamd/symamd library is available at + + http://www.cise.ufl.edu/research/sparse/colamd/ + + This is the http://www.cise.ufl.edu/research/sparse/colamd/colamdmex.c + file. It requires the colamd.c and colamd.h files. + +*/ + +/* ========================================================================== */ +/* === Include files ======================================================== */ +/* ========================================================================== */ + +#include "colamd.h" +#include "mex.h" +#include "matrix.h" +#include +#include + +/* ========================================================================== */ +/* === colamd mexFunction =================================================== */ +/* ========================================================================== */ + +void mexFunction +( + /* === Parameters ======================================================= */ + + int nlhs, /* number of left-hand sides */ + mxArray *plhs [], /* left-hand side matrices */ + int nrhs, /* number of right--hand sides */ + const mxArray *prhs [] /* right-hand side matrices */ +) +{ + /* === Local variables ================================================== */ + + int *A ; /* colamd's copy of the matrix, and workspace */ + int *p ; /* colamd's copy of the column pointers */ + int Alen ; /* size of A */ + int n_col ; /* number of columns of A */ + int n_row ; /* number of rows of A */ + int nnz ; /* number of entries in A */ + int full ; /* TRUE if input matrix full, FALSE if sparse */ + double knobs [COLAMD_KNOBS] ; /* colamd user-controllable parameters */ + double *out_perm ; /* output permutation vector */ + double *out_stats ; /* output stats vector */ + double *in_knobs ; /* input knobs vector */ + int i ; /* loop counter */ + mxArray *Ainput ; /* input matrix handle */ + int spumoni ; /* verbosity variable */ + int stats [COLAMD_STATS] ; /* stats for colamd */ + + /* === Check inputs ===================================================== */ + + if (nrhs < 1 || nrhs > 2 || nlhs < 0 || nlhs > 2) + { + mexErrMsgTxt ( + "colamd: incorrect number of input and/or output arguments") ; + } + + /* === Get knobs ======================================================== */ + + colamd_set_defaults (knobs) ; + spumoni = 0 ; + + /* check for user-passed knobs */ + if (nrhs == 2) + { + in_knobs = mxGetPr (prhs [1]) ; + i = mxGetNumberOfElements (prhs [1]) ; + if (i > 0) knobs [COLAMD_DENSE_ROW] = in_knobs [COLAMD_DENSE_ROW] ; + if (i > 1) knobs [COLAMD_DENSE_COL] = in_knobs [COLAMD_DENSE_COL] ; + if (i > 2) spumoni = (int) in_knobs [2] ; + } + + /* print knob settings if spumoni is set */ + if (spumoni > 0) + { + mexPrintf ("colamd: dense row fraction: %f\n", + knobs [COLAMD_DENSE_ROW]) ; + mexPrintf ("colamd: dense col fraction: %f\n", + knobs [COLAMD_DENSE_COL]) ; + } + + /* === If A is full, convert to a sparse matrix ========================= */ + + Ainput = (mxArray *) prhs [0] ; + if (mxGetNumberOfDimensions (Ainput) != 2) + { + mexErrMsgTxt ("colamd: input matrix must be 2-dimensional") ; + } + full = !mxIsSparse (Ainput) ; + if (full) + { + mexCallMATLAB (1, &Ainput, 1, (mxArray **) prhs, "sparse") ; + } + + /* === Allocate workspace for colamd ==================================== */ + + /* get size of matrix */ + n_row = mxGetM (Ainput) ; + n_col = mxGetN (Ainput) ; + + /* get column pointer vector so we can find nnz */ + p = (int *) mxCalloc (n_col+1, sizeof (int)) ; + (void) memcpy (p, mxGetJc (Ainput), (n_col+1)*sizeof (int)) ; + nnz = p [n_col] ; + Alen = colamd_recommended (nnz, n_row, n_col) ; + + /* === Copy input matrix into workspace ================================= */ + + A = (int *) mxCalloc (Alen, sizeof (int)) ; + (void) memcpy (A, mxGetIr (Ainput), nnz*sizeof (int)) ; + + if (full) + { + mxDestroyArray (Ainput) ; + } + + /* === Order the columns (destroys A) =================================== */ + + if (!colamd (n_row, n_col, Alen, A, p, knobs, stats)) + { + colamd_report (stats) ; + mexErrMsgTxt ("colamd error!") ; + } + mxFree (A) ; + + /* === Return the permutation vector ==================================== */ + + plhs [0] = mxCreateDoubleMatrix (1, n_col, mxREAL) ; + out_perm = mxGetPr (plhs [0]) ; + for (i = 0 ; i < n_col ; i++) + { + /* colamd is 0-based, but MATLAB expects this to be 1-based */ + out_perm [i] = p [i] + 1 ; + } + mxFree (p) ; + + /* === Return the stats vector ========================================== */ + + /* print stats if spumoni > 0 */ + if (spumoni > 0) + { + colamd_report (stats) ; + } + + if (nlhs == 2) + { + plhs [1] = mxCreateDoubleMatrix (1, COLAMD_STATS, mxREAL) ; + out_stats = mxGetPr (plhs [1]) ; + for (i = 0 ; i < COLAMD_STATS ; i++) + { + out_stats [i] = stats [i] ; + } + + /* fix stats (5) and (6), for 1-based information on jumbled matrix. */ + /* note that this correction doesn't occur if symamd returns FALSE */ + out_stats [COLAMD_INFO1] ++ ; + out_stats [COLAMD_INFO2] ++ ; + } +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/COLAMD/colamdtestmex.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/COLAMD/colamdtestmex.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,594 @@ +/* ========================================================================== */ +/* === colamdtest mexFunction =============================================== */ +/* ========================================================================== */ + +/* + This MATLAB mexFunction is for testing only. It is not meant for + production use. See colamdmex.c instead. + + Usage: + + [ P, stats ] = colamdtest (A, knobs) ; + + Returns a permutation vector P such that the LU factorization of A (:,P) + tends to be sparser than that of A. The Cholesky factorization of + (A (:,P))'*(A (:,P)) will also tend to be sparser than that of A'*A. + This routine provides the same functionality as COLMMD, but is much faster + and returns a better permutation vector. Note that the COLMMD m-file in + MATLAB 5.2 also performs a column elimination tree post-ordering. This + mexFunction does not do this post-ordering. This mexFunction is a + replacement for the p = sparsfun ('colmmd', A) operation. + + The knobs and stats vectors are optional: + + knobs (1) rows with more than (knobs (1))*n_col entries + are removed prior to ordering. If knobs is not present, + then the default is used (0.5). + + knobs (2) columns with more than (knobs (2))*n_row entries + are removed prior to ordering, and placed last in the + column permutation. If knobs is not present, + then the default is used (0.5). + + knobs (3) print level, similar to spparms ('spumoni') + + knobs (4) for testing only. Controls the workspace used by + colamd. + + knobs (5) for testing only. Controls how the input matrix is + jumbled prior to calling colamd, to test its error + handling capability. + + stats (1) the number of dense (or empty) rows ignored + + stats (2) the number of dense (or empty) columms. These + are ordered last, in their natural order. + + stats (3) the number of garbage collections performed. + + stats (4) return status: + + 0: matrix is a valid MATLAB matrix. + + 1: matrix has duplicate entries or unsorted columns. + This should not occur in a valid MATLAB matrix, + but the ordering proceeded anyway by sorting the + row indices in each column and by ignoring the + duplicate row indices in each column. See + stats (5:7) for more information. + + stats (5) highest numbered column that is unsorted or has + duplicate entries (zero if none) + + stats (6) last seen duplicate or unsorted row index + (zero if none) + + stats (7) number of duplicate or unsorted row indices + + Authors: + + The authors of the code itself are Stefan I. Larimore and Timothy A. + Davis (davis@cise.ufl.edu), University of Florida. The algorithm was + developed in collaboration with John Gilbert, Xerox PARC, and Esmond + Ng, Oak Ridge National Laboratory. + + Date: + + September 8, 2003. Version 2.3. + + Acknowledgements: + + This work was supported by the National Science Foundation, under + grants DMS-9504974 and DMS-9803599. + + Notice: + + Copyright (c) 1998-2003 by the University of Florida. + All Rights Reserved. + + See http://www.cise.ufl.edu/research/sparse/colamd (the colamd.c + file) for the License. + + Availability: + + The colamd/symamd library is available at + + http://www.cise.ufl.edu/research/sparse/colamd/ + + This is the + http://www.cise.ufl.edu/research/sparse/colamd/colamdtestmex.c + file. It requires the colamd.c and colamd.h files. + +*/ + +/* ========================================================================== */ +/* === Include files ======================================================== */ +/* ========================================================================== */ + +#include "colamd.h" +#include "mex.h" +#include "matrix.h" +#include +#include + +static void dump_matrix +( + int A [ ], + int p [ ], + int n_row, + int n_col, + int Alen, + int limit +) ; + +/* ========================================================================== */ +/* === colamd mexFunction =================================================== */ +/* ========================================================================== */ + +void mexFunction +( + /* === Parameters ======================================================= */ + + int nlhs, /* number of left-hand sides */ + mxArray *plhs [], /* left-hand side matrices */ + int nrhs, /* number of right--hand sides */ + const mxArray *prhs [] /* right-hand side matrices */ +) +{ + /* === Local variables ================================================== */ + + int *A ; /* colamd's copy of the matrix, and workspace */ + int *p ; /* colamd's copy of the column pointers */ + int Alen ; /* size of A */ + int n_col ; /* number of columns of A */ + int n_row ; /* number of rows of A */ + int nnz ; /* number of entries in A */ + int full ; /* TRUE if input matrix full, FALSE if sparse */ + double knobs [COLAMD_KNOBS] ; /* colamd user-controllable parameters */ + double *out_perm ; /* output permutation vector */ + double *out_stats ; /* output stats vector */ + double *in_knobs ; /* input knobs vector */ + int i ; /* loop counter */ + mxArray *Ainput ; /* input matrix handle */ + int spumoni ; /* verbosity variable */ + int stats2 [COLAMD_STATS] ; /* stats for colamd */ + + int *cp, *cp_end, result, col, length ; + int *stats ; + stats = stats2 ; + + /* === Check inputs ===================================================== */ + + if (nrhs < 1 || nrhs > 2 || nlhs < 0 || nlhs > 2) + { + mexErrMsgTxt ( + "colamd: incorrect number of input and/or output arguments") ; + } + + if (nrhs != 2) + { + mexErrMsgTxt ("colamdtest: knobs are required") ; + } + /* for testing we require all 5 knobs */ + if (mxGetNumberOfElements (prhs [1]) < 5) + { + mexErrMsgTxt ("colamd: must have all 5 knobs for testing") ; + } + + /* === Get knobs ======================================================== */ + + colamd_set_defaults (knobs) ; + spumoni = 0 ; + + /* check for user-passed knobs */ + if (nrhs == 2) + { + in_knobs = mxGetPr (prhs [1]) ; + i = mxGetNumberOfElements (prhs [1]) ; + if (i > 0) knobs [COLAMD_DENSE_ROW] = in_knobs [COLAMD_DENSE_ROW] ; + if (i > 1) knobs [COLAMD_DENSE_COL] = in_knobs [COLAMD_DENSE_COL] ; + if (i > 2) spumoni = (int) in_knobs [2] ; + } + + /* print knob settings if spumoni is set */ + if (spumoni > 0) + { + mexPrintf ("colamd: dense row fraction: %f\n", + knobs [COLAMD_DENSE_ROW]) ; + mexPrintf ("colamd: dense col fraction: %f\n", + knobs [COLAMD_DENSE_COL]) ; + } + + /* === If A is full, convert to a sparse matrix ========================= */ + + Ainput = (mxArray *) prhs [0] ; + if (mxGetNumberOfDimensions (Ainput) != 2) + { + mexErrMsgTxt ("colamd: input matrix must be 2-dimensional") ; + } + full = !mxIsSparse (Ainput) ; + if (full) + { + mexCallMATLAB (1, &Ainput, 1, (mxArray **) prhs, "sparse") ; + } + + /* === Allocate workspace for colamd ==================================== */ + + /* get size of matrix */ + n_row = mxGetM (Ainput) ; + n_col = mxGetN (Ainput) ; + + /* get column pointer vector so we can find nnz */ + p = (int *) mxCalloc (n_col+1, sizeof (int)) ; + (void) memcpy (p, mxGetJc (Ainput), (n_col+1)*sizeof (int)) ; + nnz = p [n_col] ; + Alen = colamd_recommended (nnz, n_row, n_col) ; + + +/* === Modify size of Alen if testing ======================================= */ + +/* + knobs [3] amount of workspace given to colamd. + < 0 : TIGHT memory + > 0 : MIN + knob [3] - 1 + == 0 : RECOMMENDED memory +*/ + +/* Here only for testing */ +#ifdef MIN +#undef MIN +#endif +#define MIN(a,b) (((a) < (b)) ? (a) : (b)) +#define COLAMD_MIN_MEMORY(nnz,n_row,n_col) \ + (2 * (nnz) + COLAMD_C (n_col) + COLAMD_R (n_row)) + + /* get knob [3], if negative */ + if (in_knobs [3] < 0) + { + Alen = COLAMD_MIN_MEMORY (nnz, n_row, n_col) + n_col ; + } + else if (in_knobs [3] > 0) + { + Alen = COLAMD_MIN_MEMORY (nnz, n_row, n_col) + in_knobs [3] - 1 ; + } + + /* otherwise, we use the recommended amount set above */ + + /* === Copy input matrix into workspace ================================= */ + + A = (int *) mxCalloc (Alen, sizeof (int)) ; + (void) memcpy (A, mxGetIr (Ainput), nnz*sizeof (int)) ; + + if (full) + { + mxDestroyArray (Ainput) ; + } + + +/* === Jumble matrix ======================================================== */ + +/* + knobs [4] FOR TESTING ONLY: Specifies how to jumble matrix + 0 : No jumbling + 1 : Make n_row less than zero + 2 : Make first pointer non-zero + 3 : Make column pointers not non-decreasing + 4 : Make a column pointer greater or equal to Alen + 5 : Make row indices not strictly increasing + 6 : Make a row index greater or equal to n_row + 7 : Set A = NULL + 8 : Set p = NULL + 9 : Repeat row index + 10: make row indices not sorted + 11: jumble columns massively (note this changes + the pattern of the matrix A.) + 12: Set stats = NULL + 13: Make n_col less than zero +*/ + + /* jumble appropriately */ + switch ((int) in_knobs [4]) + { + + case 0 : + if (spumoni > 0) + { + mexPrintf ("colamdtest: no errors expected\n") ; + } + result = 1 ; /* no errors */ + break ; + + case 1 : + if (spumoni > 0) + { + mexPrintf ("colamdtest: nrow out of range\n") ; + } + result = 0 ; /* nrow out of range */ + n_row = -1 ; + break ; + + case 2 : + if (spumoni > 0) + { + mexPrintf ("colamdtest: p [0] nonzero\n") ; + } + result = 0 ; /* p [0] must be zero */ + p [0] = 1 ; + break ; + + case 3 : + if (spumoni > 0) + { + mexPrintf ("colamdtest: negative length last column\n") ; + } + result = (n_col == 0) ; /* p must be monotonically inc. */ + p [n_col] = p [0] ; + break ; + + case 4 : + if (spumoni > 0) + { + mexPrintf ("colamdtest: Alen too small\n") ; + } + result = 0 ; /* out of memory */ + p [n_col] = Alen ; + break ; + + case 5 : + if (spumoni > 0) + { + mexPrintf ("colamdtest: row index out of range (-1)\n") ; + } + if (nnz > 0) /* row index out of range */ + { + result = 0 ; + A [nnz-1] = -1 ; + } + else + { + if (spumoni > 0) + { + mexPrintf ("Note: no row indices to put out of range\n") ; + } + result = 1 ; + } + break ; + + case 6 : + if (spumoni > 0) + { + mexPrintf ("colamdtest: row index out of range (n_row)\n") ; + } + if (nnz > 0) /* row index out of range */ + { + if (spumoni > 0) + { + mexPrintf ("Changing A[nnz-1] from %d to %d\n", + A [nnz-1], n_row) ; + } + result = 0 ; + A [nnz-1] = n_row ; + } + else + { + if (spumoni > 0) + { + mexPrintf ("Note: no row indices to put out of range\n") ; + } + result = 1 ; + } + break ; + + case 7 : + if (spumoni > 0) + { + mexPrintf ("colamdtest: A not present\n") ; + } + result = 0 ; /* A not present */ + A = (int *) NULL ; + break ; + + case 8 : + if (spumoni > 0) + { + mexPrintf ("colamdtest: p not present\n") ; + } + result = 0 ; /* p not present */ + p = (int *) NULL ; + break ; + + case 9 : + if (spumoni > 0) + { + mexPrintf ("colamdtest: duplicate row index\n") ; + } + result = 1 ; /* duplicate row index */ + + for (col = 0 ; col < n_col ; col++) + { + length = p [col+1] - p [col] ; + if (length > 1) + { + A [p [col]] = A [p [col] + 1] ; + if (spumoni > 0) + { + mexPrintf ("Made duplicate row %d in col %d\n", + A [p [col] + 1], col) ; + } + break ; + } + } + + if (spumoni > 1) + { + dump_matrix (A, p, n_row, n_col, Alen, col+2) ; + } + break ; + + case 10 : + if (spumoni > 0) + { + mexPrintf ("colamdtest: unsorted column\n") ; + } + result = 1 ; /* jumbled columns */ + + for (col = 0 ; col < n_col ; col++) + { + length = p [col+1] - p [col] ; + if (length > 1) + { + i = A[p [col]] ; + A [p [col]] = A[p [col] + 1] ; + A [p [col] + 1] = i ; + if (spumoni > 0) + { + mexPrintf ("Unsorted column %d \n", col) ; + } + break ; + } + } + + if (spumoni > 1) + { + dump_matrix (A, p, n_row, n_col, Alen, col+2) ; + } + break ; + + case 11 : + if (spumoni > 0) + { + mexPrintf ("colamdtest: massive jumbling\n") ; + } + result = 1 ; /* massive jumbling, but no errors */ + srand (1) ; + for (i = 0 ; i < n_col ; i++) + { + cp = &A [p [i]] ; + cp_end = &A [p [i+1]] ; + while (cp < cp_end) + { + *cp++ = rand() % n_row ; + } + } + if (spumoni > 1) + { + dump_matrix (A, p, n_row, n_col, Alen, n_col) ; + } + break ; + + case 12 : + if (spumoni > 0) + { + mexPrintf ("colamdtest: stats not present\n") ; + } + result = 0 ; /* stats not present */ + stats = (int *) NULL ; + break ; + + case 13 : + if (spumoni > 0) + { + mexPrintf ("colamdtest: ncol out of range\n") ; + } + result = 0 ; /* ncol out of range */ + n_col = -1 ; + break ; + + } + + + /* === Order the columns (destroys A) =================================== */ + + if (!colamd (n_row, n_col, Alen, A, p, knobs, stats)) + { + + /* return p = -1 if colamd failed */ + plhs [0] = mxCreateDoubleMatrix (1, 1, mxREAL) ; + out_perm = mxGetPr (plhs [0]) ; + out_perm [0] = -1 ; + mxFree (p) ; + mxFree (A) ; + + if (spumoni > 0 || result) + { + colamd_report (stats) ; + } + + if (result) + { + mexErrMsgTxt ("colamd should have returned TRUE\n") ; + } + + return ; + /* mexErrMsgTxt ("colamd error!") ; */ + } + + if (!result) + { + colamd_report (stats) ; + mexErrMsgTxt ("colamd should have returned FALSE\n") ; + } + mxFree (A) ; + + /* === Return the permutation vector ==================================== */ + + plhs [0] = mxCreateDoubleMatrix (1, n_col, mxREAL) ; + out_perm = mxGetPr (plhs [0]) ; + for (i = 0 ; i < n_col ; i++) + { + /* colamd is 0-based, but MATLAB expects this to be 1-based */ + out_perm [i] = p [i] + 1 ; + } + mxFree (p) ; + + /* === Return the stats vector ========================================== */ + + /* print stats if spumoni > 0 */ + if (spumoni > 0) + { + colamd_report (stats) ; + } + + if (nlhs == 2) + { + plhs [1] = mxCreateDoubleMatrix (1, COLAMD_STATS, mxREAL) ; + out_stats = mxGetPr (plhs [1]) ; + for (i = 0 ; i < COLAMD_STATS ; i++) + { + out_stats [i] = stats [i] ; + } + + /* fix stats (5) and (6), for 1-based information on jumbled matrix. */ + /* note that this correction doesn't occur if symamd returns FALSE */ + out_stats [COLAMD_INFO1] ++ ; + out_stats [COLAMD_INFO2] ++ ; + } +} + + +static void dump_matrix +( + int A [ ], + int p [ ], + int n_row, + int n_col, + int Alen, + int limit +) +{ + int col, k, row ; + + mexPrintf ("dump matrix: nrow %d ncol %d Alen %d\n", n_row, n_col, Alen) ; + + for (col = 0 ; col < MIN (n_col, limit) ; col++) + { + mexPrintf ("column %d, p[col] %d, p [col+1] %d, length %d\n", + col, p [col], p [col+1], p [col+1] - p [col]) ; + for (k = p [col] ; k < p [col+1] ; k++) + { + row = A [k] ; + mexPrintf (" %d", row) ; + } + mexPrintf ("\n") ; + } +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/COLAMD/luflops.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/COLAMD/luflops.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,29 @@ +function fl = luflops (L, U) +% +% fl = luflops (L,U) +% +% Given a sparse LU factorization (L and U), return the flop count required +% by a conventional LU factorization algorithm to compute it. L and U can +% be either sparse or full matrices. L must be lower triangular and U must +% be upper triangular. Do not attempt to use this on the permuted L from +% [L,U] = lu (A). Instead, use [L,U,P] = lu (A) or [L,U,P,Q] = lu (A). +% +% Note that there is a subtle undercount in this estimate. Suppose A is +% completely dense, but during LU factorization exact cancellation occurs, +% causing some of the entries in L and U to become identically zero. The +% flop count returned by this routine is an undercount. There is a simple +% way to fix this (L = spones (L) + spones (tril (A))), but the fix is partial. +% It can also occur that some entry in L is a "symbolic" fill-in (zero in +% A, but a fill-in entry and thus must be computed), but numerically +% zero. The only way to get a reliable LU factorization would be to do a +% purely symbolic factorization of A. This cannot be done with +% symbfact (A, 'col'). +% +% See NA Digest, Vol 00, #50, Tuesday, Dec. 5, 2000 +% +% Tim Davis, Sept. 23, 2002. Written for MATLAB 6.5. + +Lnz = full (sum (spones (L))) - 1 ; % off diagonal nz in cols of L +Unz = full (sum (spones (U')))' - 1 ; % off diagonal nz in rows of U +fl = 2*Lnz*Unz + sum (Lnz) ; + diff -r 9f3299378193 -r 57077d0ddc8e liboctave/COLAMD/symamd.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/COLAMD/symamd.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,108 @@ +function [p, stats] = symamd (S, knobs) +%SYMAMD Symmetric approximate minimum degree permutation. +% P = SYMAMD (S) for a symmetric positive definite matrix S, returns the +% permutation vector p such that S(p,p) tends to have a sparser Cholesky +% factor than S. Sometimes SYMAMD works well for symmetric indefinite +% matrices too. SYMAMD tends to be faster than SYMMMD and tends to return +% a better ordering. The matrix S is assumed to be symmetric; only the +% strictly lower triangular part is referenced. S must be square. +% +% See also COLMMD, COLPERM, SPPARMS, COLAMD, SYMMMD, SYMRCM. +% +% Usage: P = symamd (S) +% P = symamd (S, knobs) +% [P, stats] = symamd (S) +% [P, stats] = symamd (S, knobs) +% +% knobs is an optional input argument. If S is n-by-n, then rows and +% columns with more than knobs(1)*n entries are removed prior to ordering, +% and ordered last in the output permutation P. If the knobs parameter is not +% present, then the default of 0.5 is used instead. knobs (2) controls the +% printing of statistics and error messages. +% +% stats is an optional 20-element output vector that provides data about the +% ordering and the validity of the input matrix S. Ordering statistics are +% in stats (1:3). stats (1) = stats (2) is the number of dense or empty +% rows and columns ignored by SYMAMD and stats (3) is the number of +% garbage collections performed on the internal data structure used by +% SYMAMD (roughly of size 8.4*nnz(tril(S,-1)) + 9*n integers). +% +% MATLAB built-in functions are intended to generate valid sparse matrices, +% with no duplicate entries, with ascending row indices of the nonzeros +% in each column, with a non-negative number of entries in each column (!) +% and so on. If a matrix is invalid, then SYMAMD may or may not be able +% to continue. If there are duplicate entries (a row index appears two or +% more times in the same column) or if the row indices in a column are out +% of order, then SYMAMD can correct these errors by ignoring the duplicate +% entries and sorting each column of its internal copy of the matrix S (the +% input matrix S is not repaired, however). If a matrix is invalid in other +% ways then SYMAMD cannot continue, an error message is printed, and no +% output arguments (P or stats) are returned. SYMAMD is thus a simple way +% to check a sparse matrix to see if it's valid. +% +% stats (4:7) provide information if SYMAMD was able to continue. The +% matrix is OK if stats (4) is zero, or 1 if invalid. stats (5) is the +% rightmost column index that is unsorted or contains duplicate entries, +% or zero if no such column exists. stats (6) is the last seen duplicate +% or out-of-order row index in the column index given by stats (5), or zero +% if no such row index exists. stats (7) is the number of duplicate or +% out-of-order row indices. +% +% stats (8:20) is always zero in the current version of SYMAMD (reserved +% for future use). +% +% The ordering is followed by a column elimination tree post-ordering. +% +% Authors: +% +% The authors of the code itself are Stefan I. Larimore and Timothy A. +% Davis (davis@cise.ufl.edu), University of Florida. The algorithm was +% developed in collaboration with John Gilbert, Xerox PARC, and Esmond +% Ng, Oak Ridge National Laboratory. +% +% Date: +% +% September 8, 2003. Version 2.3. +% +% Acknowledgements: +% +% This work was supported by the National Science Foundation, under +% grants DMS-9504974 and DMS-9803599. + +% Notice: +% Copyright (c) 1998-2003 by the University of Florida. +% All Rights Reserved. +% +% See http://www.cise.ufl.edu/research/sparse/colamd (the colamd.c +% file) for the License. +% +% Availability: +% +% The colamd/symamd library is available at +% +% http://www.cise.ufl.edu/research/sparse/colamd/ +% + +%------------------------------------------------------------------------------- +% perform the symamd ordering: +%------------------------------------------------------------------------------- + +if (nargout <= 1 & nargin == 1) + p = symamdmex (S) ; +elseif (nargout <= 1 & nargin == 2) + p = symamdmex (S, knobs) ; +elseif (nargout == 2 & nargin == 1) + [p, stats] = symamdmex (S) ; +elseif (nargout == 2 & nargin == 2) + [p, stats] = symamdmex (S, knobs) ; +else + error ('symamd: incorrect number of input and/or output arguments') ; +end + +%------------------------------------------------------------------------------- +% symmetric elimination tree post-ordering: +%------------------------------------------------------------------------------- + +[ignore, q] = sparsfun ('symetree', S (p,p)) ; +p = p (q) ; + diff -r 9f3299378193 -r 57077d0ddc8e liboctave/COLAMD/symamdmex.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/COLAMD/symamdmex.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,241 @@ +/* ========================================================================== */ +/* === symamd mexFunction =================================================== */ +/* ========================================================================== */ + +/* + Usage: + + P = symamd (A) ; + + P = symamd (A, knobs) ; + + [ P, stats ] = symamd (A) ; + + [ P, stats ] = symamd (A, knobs) ; + + Returns a permutation vector P such that the Cholesky factorization of + A (P,P) tends to be sparser than that of A. This routine provides the same + functionality as SYMMMD, but tends to be much faster and tends to return a + better permutation vector. Note that the SYMMMD m-file in + MATLAB 5.2 also performs a symmetric elimination tree post-ordering. This + mexFunction does not do this post-ordering. This mexFunction is a + replacement for the p = sparsfun ('symmmd', A) operation. + + A must be square, and is assummed to have a symmetric nonzero pattern. + Only the nonzero pattern of the lower triangular portion of A is accessed. + This routine constructs a matrix M such that the nonzero pattern of M'M is + equal to A (assuming A has symmetric pattern), and then performs a column + ordering of M using colamd. + + The knobs and stats vectors are optional: + + knobs (1) rows and columns with more than (knobs(1))*n entries + are removed prior to ordering, and placed last in + the output ordering. If knobs is not present, then the + default of 0.5 is used. + + knobs (2) print level, similar to spparms ('spumoni') + + stats (1) the number of dense (or empty) rows and columms. These + are ordered last, in their natural order. + + stats (2) (same as stats (1)) + + stats (3) the number of garbage collections performed. + + stats (4) return status: + + 0: matrix is a valid MATLAB matrix. + + 1: matrix has duplicate entries or unsorted columns. + This should not occur in a valid MATLAB matrix, + but the ordering proceeded anyway by ignoring the + duplicate row indices in each column. See + stats (5:7) for more information. + + stats (5) highest numbered column that is unsorted or has + duplicate entries (zero if none) + + stats (6) last seen duplicate or unsorted row index + (zero if none) + + stats (7) number of duplicate or unsorted row indices + + Authors: + + The authors of the code itself are Stefan I. Larimore and Timothy A. + Davis (davis@cise.ufl.edu), University of Florida. The algorithm was + developed in collaboration with John Gilbert, Xerox PARC, and Esmond + Ng, Oak Ridge National Laboratory. + + Date: + + September 8, 2003. Version 2.3. + + Acknowledgements: + + This work was supported by the National Science Foundation, under + grants DMS-9504974 and DMS-9803599. + + Notice: + + Copyright (c) 1998-2003 by the University of Florida. + All Rights Reserved. + + See http://www.cise.ufl.edu/research/sparse/colamd (the colamd.c + file) for the License. + + Availability: + + The colamd/symamd library is available at + + http://www.cise.ufl.edu/research/sparse/colamd/ + + This is the http://www.cise.ufl.edu/research/sparse/colamd/symamdmex.c + file. It requires the colamd.c and colamd.h files. + +*/ + +/* ========================================================================== */ +/* === Include files ======================================================== */ +/* ========================================================================== */ + +#include "colamd.h" +#include "mex.h" +#include "matrix.h" +#include + +/* ========================================================================== */ +/* === symamd mexFunction =================================================== */ +/* ========================================================================== */ + +void mexFunction +( + /* === Parameters ======================================================= */ + + int nlhs, /* number of left-hand sides */ + mxArray *plhs [], /* left-hand side matrices */ + int nrhs, /* number of right--hand sides */ + const mxArray *prhs [] /* right-hand side matrices */ +) +{ + /* === Local variables ================================================== */ + + int *perm ; /* column ordering of M and ordering of A */ + int *A ; /* row indices of input matrix A */ + int *p ; /* column pointers of input matrix A */ + int n_col ; /* number of columns of A */ + int n_row ; /* number of rows of A */ + int full ; /* TRUE if input matrix full, FALSE if sparse */ + double knobs [COLAMD_KNOBS] ; /* colamd user-controllable parameters */ + double *out_perm ; /* output permutation vector */ + double *out_stats ; /* output stats vector */ + double *in_knobs ; /* input knobs vector */ + int i ; /* loop counter */ + mxArray *Ainput ; /* input matrix handle */ + int spumoni ; /* verbosity variable */ + int stats [COLAMD_STATS] ; /* stats for symamd */ + + /* === Check inputs ===================================================== */ + + if (nrhs < 1 || nrhs > 2 || nlhs < 0 || nlhs > 2) + { + mexErrMsgTxt ( + "symamd: incorrect number of input and/or output arguments.") ; + } + + /* === Get knobs ======================================================== */ + + colamd_set_defaults (knobs) ; + spumoni = 0 ; + + /* check for user-passed knobs */ + if (nrhs == 2) + { + in_knobs = mxGetPr (prhs [1]) ; + i = mxGetNumberOfElements (prhs [1]) ; + if (i > 0) knobs [COLAMD_DENSE_ROW] = in_knobs [COLAMD_DENSE_ROW] ; + if (i > 1) spumoni = (int) in_knobs [1] ; + } + + /* print knob settings if spumoni > 0 */ + if (spumoni > 0) + { + mexPrintf ("symamd: dense row/col fraction: %f\n", + knobs [COLAMD_DENSE_ROW]) ; + } + + /* === If A is full, convert to a sparse matrix ========================= */ + + Ainput = (mxArray *) prhs [0] ; + if (mxGetNumberOfDimensions (Ainput) != 2) + { + mexErrMsgTxt ("symamd: input matrix must be 2-dimensional.") ; + } + full = !mxIsSparse (Ainput) ; + if (full) + { + mexCallMATLAB (1, &Ainput, 1, (mxArray **) prhs, "sparse") ; + } + + /* === Allocate workspace for symamd ==================================== */ + + /* get size of matrix */ + n_row = mxGetM (Ainput) ; + n_col = mxGetN (Ainput) ; + if (n_col != n_row) + { + mexErrMsgTxt ("symamd: matrix must be square.") ; + } + + A = mxGetIr (Ainput) ; + p = mxGetJc (Ainput) ; + perm = (int *) mxCalloc (n_col+1, sizeof (int)) ; + + /* === Order the rows and columns of A (does not destroy A) ============= */ + + if (!symamd (n_col, A, p, perm, knobs, stats, &mxCalloc, &mxFree)) + { + symamd_report (stats) ; + mexErrMsgTxt ("symamd error!") ; + } + + if (full) + { + mxDestroyArray (Ainput) ; + } + + /* === Return the permutation vector ==================================== */ + + plhs [0] = mxCreateDoubleMatrix (1, n_col, mxREAL) ; + out_perm = mxGetPr (plhs [0]) ; + for (i = 0 ; i < n_col ; i++) + { + /* symamd is 0-based, but MATLAB expects this to be 1-based */ + out_perm [i] = perm [i] + 1 ; + } + mxFree (perm) ; + + /* === Return the stats vector ========================================== */ + + /* print stats if spumoni > 0 */ + if (spumoni > 0) + { + symamd_report (stats) ; + } + + if (nlhs == 2) + { + plhs [1] = mxCreateDoubleMatrix (1, COLAMD_STATS, mxREAL) ; + out_stats = mxGetPr (plhs [1]) ; + for (i = 0 ; i < COLAMD_STATS ; i++) + { + out_stats [i] = stats [i] ; + } + + /* fix stats (5) and (6), for 1-based information on jumbled matrix. */ + /* note that this correction doesn't occur if symamd returns FALSE */ + out_stats [COLAMD_INFO1] ++ ; + out_stats [COLAMD_INFO2] ++ ; + } +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/COLAMD/symamdtestmex.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/COLAMD/symamdtestmex.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,575 @@ +/* ========================================================================== */ +/* === symamdtest mexFunction =============================================== */ +/* ========================================================================== */ + +/* + This MATLAB mexFunction is for testing only. It is not meant for + production use. See symamdmex.c instead. + + Usage: + + [ P, stats ] = symamdtest (A, knobs) ; + + Returns a permutation vector P such that the Cholesky factorization of + A (P,P) tends to be sparser than that of A. This routine provides the same + functionality as SYMMMD, but tends to be much faster and tends to return a + better permutation vector. Note that the SYMMMD m-file in + MATLAB 5.2 also performs a symmetric elimination tree post-ordering. This + mexFunction does not do this post-ordering. This mexFunction is a + replacement for the p = sparsfun ('symmmd', A) operation. + + A must be square, and is assummed to have a symmetric nonzero pattern. + Only the nonzero pattern of the lower triangular portion of A is accessed. + This routine constructs a matrix M such that the nonzero pattern of M'M is + equal to A (assuming A has symmetric pattern), and then performs a column + ordering of M using colamd. + + The knobs and stats vectors are optional: + + knobs (1) rows and columns with more than (knobs(1))*n entries + are removed prior to ordering, and placed last in + the output ordering. If knobs is not present, then the + default of 0.5 is used. + + knobs (2) print level, similar to spparms ('spumoni') + + knobs (3) for testing only. Controls how the input matrix is + jumbled prior to calling symamd, to test its error + handling capability. + + stats (1) the number of dense (or empty) rows and columms. These + are ordered last, in their natural order. + + stats (2) (same as stats (1)) + + stats (3) the number of garbage collections performed. + + stats (4) return status: + + 0: matrix is a valid MATLAB matrix. + + 1: matrix has duplicate entries or unsorted columns. + This should not occur in a valid MATLAB matrix, + but the ordering proceeded anyway by ignoring the + duplicate row indices in each column. See + stats (5:7) for more information. + + stats (5) highest numbered column that is unsorted or has + duplicate entries (zero if none) + + stats (6) last seen duplicate or unsorted row index + (zero if none) + + stats (7) number of duplicate or unsorted row indices + + Authors: + + The authors of the code itself are Stefan I. Larimore and Timothy A. + Davis (davis@cise.ufl.edu), University of Florida. The algorithm was + developed in collaboration with John Gilbert, Xerox PARC, and Esmond + Ng, Oak Ridge National Laboratory. + + Date: + + September 8, 2003. Version 2.3. + + Acknowledgements: + + This work was supported by the National Science Foundation, under + grants DMS-9504974 and DMS-9803599. + + Notice: + + Copyright (c) 1998-2003 by the University of Florida. + All Rights Reserved. + + See http://www.cise.ufl.edu/research/sparse/colamd (the colamd.c + file) for the License. + + Availability: + + The colamd/symamd library is available at + + http://www.cise.ufl.edu/research/sparse/colamd/ + + This is the + http://www.cise.ufl.edu/research/sparse/colamd/symamdtestmex.c + file. It requires the colamd.c and colamd.h files. + +*/ + +/* ========================================================================== */ +/* === Include files ======================================================== */ +/* ========================================================================== */ + +#include "colamd.h" +#include "mex.h" +#include "matrix.h" +#include +#include + +static void dump_matrix +( + int A [ ], + int p [ ], + int n_row, + int n_col, + int Alen, + int limit +) ; + +/* ========================================================================== */ +/* === symamd mexFunction =================================================== */ +/* ========================================================================== */ + +void mexFunction +( + /* === Parameters ======================================================= */ + + int nlhs, /* number of left-hand sides */ + mxArray *plhs [], /* left-hand side matrices */ + int nrhs, /* number of right--hand sides */ + const mxArray *prhs [] /* right-hand side matrices */ +) +{ + /* === Local variables ================================================== */ + + int *perm ; /* column ordering of M and ordering of A */ + int *A ; /* row indices of input matrix A */ + int *p ; /* column pointers of input matrix A */ + int n_col ; /* number of columns of A */ + int n_row ; /* number of rows of A */ + int full ; /* TRUE if input matrix full, FALSE if sparse */ + double knobs [COLAMD_KNOBS] ; /* colamd user-controllable parameters */ + double *out_perm ; /* output permutation vector */ + double *out_stats ; /* output stats vector */ + double *in_knobs ; /* input knobs vector */ + int i ; /* loop counter */ + mxArray *Ainput ; /* input matrix handle */ + int spumoni ; /* verbosity variable */ + int stats2 [COLAMD_STATS] ; /* stats for symamd */ + + int *cp, *cp_end, result, nnz, col, length ; + int *stats ; + stats = stats2 ; + + /* === Check inputs ===================================================== */ + + if (nrhs < 1 || nrhs > 2 || nlhs < 0 || nlhs > 2) + { + mexErrMsgTxt ( + "symamd: incorrect number of input and/or output arguments.") ; + } + + if (nrhs != 2) + { + mexErrMsgTxt ("symamdtest: knobs are required") ; + } + /* for testing we require all 3 knobs */ + if (mxGetNumberOfElements (prhs [1]) < 3) + { + mexErrMsgTxt ("symamdtest: must have all 3 knobs for testing") ; + } + + /* === Get knobs ======================================================== */ + + colamd_set_defaults (knobs) ; + spumoni = 0 ; + + /* check for user-passed knobs */ + if (nrhs == 2) + { + in_knobs = mxGetPr (prhs [1]) ; + i = mxGetNumberOfElements (prhs [1]) ; + if (i > 0) knobs [COLAMD_DENSE_ROW] = in_knobs [COLAMD_DENSE_ROW] ; + if (i > 1) spumoni = (int) in_knobs [1] ; + } + + /* print knob settings if spumoni > 0 */ + if (spumoni > 0) + { + mexPrintf ("symamd: dense row/col fraction: %f\n", + knobs [COLAMD_DENSE_ROW]) ; + } + + /* === If A is full, convert to a sparse matrix ========================= */ + + Ainput = (mxArray *) prhs [0] ; + if (mxGetNumberOfDimensions (Ainput) != 2) + { + mexErrMsgTxt ("symamd: input matrix must be 2-dimensional.") ; + } + full = !mxIsSparse (Ainput) ; + if (full) + { + mexCallMATLAB (1, &Ainput, 1, (mxArray **) prhs, "sparse") ; + } + + /* === Allocate workspace for symamd ==================================== */ + + /* get size of matrix */ + n_row = mxGetM (Ainput) ; + n_col = mxGetN (Ainput) ; + if (n_col != n_row) + { + mexErrMsgTxt ("symamd: matrix must be square.") ; + } + + /* p = mxGetJc (Ainput) ; */ + p = (int *) mxCalloc (n_col+1, sizeof (int)) ; + (void) memcpy (p, mxGetJc (Ainput), (n_col+1)*sizeof (int)) ; + + nnz = p [n_col] ; + if (spumoni > 0) + { + mexPrintf ("symamdtest: nnz %d\n", nnz) ; + } + + /* A = mxGetIr (Ainput) ; */ + A = (int *) mxCalloc (nnz+1, sizeof (int)) ; + (void) memcpy (A, mxGetIr (Ainput), nnz*sizeof (int)) ; + + perm = (int *) mxCalloc (n_col+1, sizeof (int)) ; + +/* === Jumble matrix ======================================================== */ + + +/* + knobs [2] FOR TESTING ONLY: Specifies how to jumble matrix + 0 : No jumbling + 1 : (no errors) + 2 : Make first pointer non-zero + 3 : Make column pointers not non-decreasing + 4 : (no errors) + 5 : Make row indices not strictly increasing + 6 : Make a row index greater or equal to n_row + 7 : Set A = NULL + 8 : Set p = NULL + 9 : Repeat row index + 10: make row indices not sorted + 11: jumble columns massively (note this changes + the pattern of the matrix A.) + 12: Set stats = NULL + 13: Make n_col less than zero +*/ + + /* jumble appropriately */ + switch ((int) in_knobs [2]) + { + + case 0 : + if (spumoni > 0) + { + mexPrintf ("symamdtest: no errors expected\n") ; + } + result = 1 ; /* no errors */ + break ; + + case 1 : + if (spumoni > 0) + { + mexPrintf ("symamdtest: no errors expected (1)\n") ; + } + result = 1 ; + break ; + + case 2 : + if (spumoni > 0) + { + mexPrintf ("symamdtest: p [0] nonzero\n") ; + } + result = 0 ; /* p [0] must be zero */ + p [0] = 1 ; + break ; + + case 3 : + if (spumoni > 0) + { + mexPrintf ("symamdtest: negative length last column\n") ; + } + result = (n_col == 0) ; /* p must be monotonically inc. */ + p [n_col] = p [0] ; + break ; + + case 4 : + if (spumoni > 0) + { + mexPrintf ("symamdtest: no errors expected (4)\n") ; + } + result = 1 ; + break ; + + case 5 : + if (spumoni > 0) + { + mexPrintf ("symamdtest: row index out of range (-1)\n") ; + } + if (nnz > 0) /* row index out of range */ + { + result = 0 ; + A [nnz-1] = -1 ; + } + else + { + if (spumoni > 0) + { + mexPrintf ("Note: no row indices to put out of range\n") ; + } + result = 1 ; + } + break ; + + case 6 : + if (spumoni > 0) + { + mexPrintf ("symamdtest: row index out of range (ncol)\n") ; + } + if (nnz > 0) /* row index out of range */ + { + result = 0 ; + A [nnz-1] = n_col ; + } + else + { + if (spumoni > 0) + { + mexPrintf ("Note: no row indices to put out of range\n") ; + } + result = 1 ; + } + break ; + + case 7 : + if (spumoni > 0) + { + mexPrintf ("symamdtest: A not present\n") ; + } + result = 0 ; /* A not present */ + A = (int *) NULL ; + break ; + + case 8 : + if (spumoni > 0) + { + mexPrintf ("symamdtest: p not present\n") ; + } + result = 0 ; /* p not present */ + p = (int *) NULL ; + break ; + + case 9 : + if (spumoni > 0) + { + mexPrintf ("symamdtest: duplicate row index\n") ; + } + result = 1 ; /* duplicate row index */ + + for (col = 0 ; col < n_col ; col++) + { + length = p [col+1] - p [col] ; + if (length > 1) + { + A [p [col+1]-2] = A [p [col+1] - 1] ; + if (spumoni > 0) + { + mexPrintf ("Made duplicate row %d in col %d\n", + A [p [col+1] - 1], col) ; + } + break ; + } + } + + if (spumoni > 1) + { + dump_matrix (A, p, n_row, n_col, nnz, col+2) ; + } + break ; + + case 10 : + if (spumoni > 0) + { + mexPrintf ("symamdtest: unsorted column\n") ; + } + result = 1 ; /* jumbled columns */ + + for (col = 0 ; col < n_col ; col++) + { + length = p [col+1] - p [col] ; + if (length > 1) + { + i = A[p [col]] ; + A [p [col]] = A[p [col] + 1] ; + A [p [col] + 1] = i ; + if (spumoni > 0) + { + mexPrintf ("Unsorted column %d \n", col) ; + } + break ; + } + } + + if (spumoni > 1) + { + dump_matrix (A, p, n_row, n_col, nnz, col+2) ; + } + break ; + + case 11 : + if (spumoni > 0) + { + mexPrintf ("symamdtest: massive jumbling\n") ; + } + result = 1 ; /* massive jumbling, but no errors */ + srand (1) ; + for (i = 0 ; i < n_col ; i++) + { + cp = &A [p [i]] ; + cp_end = &A [p [i+1]] ; + while (cp < cp_end) + { + *cp++ = rand() % n_row ; + } + } + if (spumoni > 1) + { + dump_matrix (A, p, n_row, n_col, nnz, n_col) ; + } + break ; + + case 12 : + if (spumoni > 0) + { + mexPrintf ("symamdtest: stats not present\n") ; + } + result = 0 ; /* stats not present */ + stats = (int *) NULL ; + break ; + + case 13 : + if (spumoni > 0) + { + mexPrintf ("symamdtest: ncol out of range\n") ; + } + result = 0 ; /* ncol out of range */ + n_col = -1 ; + break ; + + } + + /* === Order the rows and columns of A (does not destroy A) ============= */ + + if (!symamd (n_col, A, p, perm, knobs, stats, &mxCalloc, &mxFree)) + { + + /* return p = -1 if colamd failed */ + plhs [0] = mxCreateDoubleMatrix (1, 1, mxREAL) ; + out_perm = mxGetPr (plhs [0]) ; + out_perm [0] = -1 ; + mxFree (p) ; + mxFree (A) ; + + if (spumoni > 0 || result) + { + symamd_report (stats) ; + } + + if (result) + { + mexErrMsgTxt ("symamd should have returned TRUE\n") ; + } + + return ; + /* mexErrMsgTxt ("symamd error!") ; */ + } + + if (!result) + { + symamd_report (stats) ; + mexErrMsgTxt ("symamd should have returned FALSE\n") ; + } + + if (full) + { + mxDestroyArray (Ainput) ; + } + + /* === Return the permutation vector ==================================== */ + + plhs [0] = mxCreateDoubleMatrix (1, n_col, mxREAL) ; + out_perm = mxGetPr (plhs [0]) ; + for (i = 0 ; i < n_col ; i++) + { + /* symamd is 0-based, but MATLAB expects this to be 1-based */ + out_perm [i] = perm [i] + 1 ; + } + mxFree (perm) ; + + /* === Return the stats vector ========================================== */ + + /* print stats if spumoni > 0 */ + if (spumoni > 0) + { + symamd_report (stats) ; + } + + if (nlhs == 2) + { + plhs [1] = mxCreateDoubleMatrix (1, COLAMD_STATS, mxREAL) ; + out_stats = mxGetPr (plhs [1]) ; + for (i = 0 ; i < COLAMD_STATS ; i++) + { + out_stats [i] = stats [i] ; + } + + /* fix stats (5) and (6), for 1-based information on jumbled matrix. */ + /* note that this correction doesn't occur if symamd returns FALSE */ + out_stats [COLAMD_INFO1] ++ ; + out_stats [COLAMD_INFO2] ++ ; + } +} + + +#ifdef MIN +#undef MIN +#endif +#define MIN(a,b) (((a) < (b)) ? (a) : (b)) + + +static void dump_matrix +( + int A [ ], + int p [ ], + int n_row, + int n_col, + int Alen, + int limit +) +{ + int col, k, row ; + + mexPrintf ("dump matrix: nrow %d ncol %d Alen %d\n", n_row, n_col, Alen) ; + + if (!A) + { + mexPrintf ("A not present\n") ; + return ; + } + + if (!p) + { + mexPrintf ("p not present\n") ; + return ; + } + + for (col = 0 ; col < MIN (n_col, limit) ; col++) + { + mexPrintf ("column %d, p[col] %d, p [col+1] %d, length %d\n", + col, p [col], p [col+1], p [col+1] - p [col]) ; + for (k = p [col] ; k < p [col+1] ; k++) + { + row = A [k] ; + mexPrintf (" %d", row) ; + } + mexPrintf ("\n") ; + } +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/CSparse.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/CSparse.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,6496 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include +#include + +#include "quit.h" +#include "lo-ieee.h" +#include "lo-mappers.h" +#include "f77-fcn.h" +#include "dRowVector.h" + +#include "CSparse.h" +#include "boolSparse.h" +#include "dSparse.h" +#include "oct-spparms.h" +#include "SparseCmplxLU.h" + +// External UMFPACK functions in C +extern "C" { +#include "umfpack.h" +} + +// Fortran functions we call. +extern "C" +{ + F77_RET_T + F77_FUNC (zgbtrf, ZGBTRF) (const int&, const int&, const int&, + const int&, Complex*, const int&, int*, int&); + + F77_RET_T + F77_FUNC (zgbtrs, ZGBTRS) (F77_CONST_CHAR_ARG_DECL, const int&, + const int&, const int&, const int&, + const Complex*, const int&, + const int*, Complex*, const int&, int& + F77_CHAR_ARG_LEN_DECL); + + F77_RET_T + F77_FUNC (zgbcon, ZGBCON) (F77_CONST_CHAR_ARG_DECL, const int&, + const int&, const int&, Complex*, + const int&, const int*, const double&, + double&, Complex*, double*, int& + F77_CHAR_ARG_LEN_DECL); + + F77_RET_T + F77_FUNC (zpbtrf, ZPBTRF) (F77_CONST_CHAR_ARG_DECL, const int&, + const int&, Complex*, const int&, int& + F77_CHAR_ARG_LEN_DECL); + + F77_RET_T + F77_FUNC (zpbtrs, ZPBTRS) (F77_CONST_CHAR_ARG_DECL, const int&, + const int&, const int&, Complex*, const int&, + Complex*, const int&, int& + F77_CHAR_ARG_LEN_DECL); + + F77_RET_T + F77_FUNC (zpbcon, ZPBCON) (F77_CONST_CHAR_ARG_DECL, const int&, + const int&, Complex*, const int&, + const double&, double&, Complex*, int*, int& + F77_CHAR_ARG_LEN_DECL); + + F77_RET_T + F77_FUNC (zgttrf, ZGTTRF) (const int&, Complex*, Complex*, Complex*, + Complex*, int*, int&); + + F77_RET_T + F77_FUNC (zgttrs, ZGTTRS) (F77_CONST_CHAR_ARG_DECL, const int&, + const int&, const Complex*, const Complex*, + const Complex*, const Complex*, const int*, + Complex *, const int&, int& + F77_CHAR_ARG_LEN_DECL); + + F77_RET_T + F77_FUNC (zptsv, ZPTSV) (const int&, const int&, Complex*, Complex*, + Complex*, const int&, int&); + + F77_RET_T + F77_FUNC (zgtsv, ZGTSV) (const int&, const int&, Complex*, Complex*, + Complex*, Complex*, const int&, int&); +} + +SparseComplexMatrix::SparseComplexMatrix (const SparseMatrix& a) + : MSparse (a.rows (), a.cols (), a.nnz ()) +{ + int nc = cols (); + int nz = nnz (); + + for (int i = 0; i < nc + 1; i++) + cidx (i) = a.cidx (i); + + for (int i = 0; i < nz; i++) + { + data (i) = a.data (i); + ridx (i) = a.ridx (i); + } +} + +SparseComplexMatrix::SparseComplexMatrix (const SparseBoolMatrix& a) + : MSparse (a.rows (), a.cols (), a.nnz ()) +{ + int nc = cols (); + int nz = nnz (); + + for (int i = 0; i < nc + 1; i++) + cidx (i) = a.cidx (i); + + for (int i = 0; i < nz; i++) + { + data (i) = a.data (i); + ridx (i) = a.ridx (i); + } +} + +bool +SparseComplexMatrix::operator == (const SparseComplexMatrix& a) const +{ + int nr = rows (); + int nc = cols (); + int nz = nnz (); + int nr_a = a.rows (); + int nc_a = a.cols (); + int nz_a = a.nnz (); + + if (nr != nr_a || nc != nc_a || nz != nz_a) + return false; + + for (int i = 0; i < nc + 1; i++) + if (cidx(i) != a.cidx(i)) + return false; + + for (int i = 0; i < nz; i++) + if (data(i) != a.data(i) || ridx(i) != a.ridx(i)) + return false; + + return true; +} + +bool +SparseComplexMatrix::operator != (const SparseComplexMatrix& a) const +{ + return !(*this == a); +} + +bool +SparseComplexMatrix::is_hermitian (void) const +{ + int nr = rows (); + int nc = cols (); + + if (is_square () && nr > 0) + { + for (int i = 0; i < nr; i++) + for (int j = i; j < nc; j++) + if (elem (i, j) != conj (elem (j, i))) + return false; + + return true; + } + + return false; +} + +static const Complex Complex_NaN_result (octave_NaN, octave_NaN); + +SparseComplexMatrix +SparseComplexMatrix::max (int dim) const +{ + Array2 dummy_idx; + return max (dummy_idx, dim); +} + +SparseComplexMatrix +SparseComplexMatrix::max (Array2& idx_arg, int dim) const +{ + SparseComplexMatrix result; + dim_vector dv = dims (); + + if (dv.numel () == 0 || dim > dv.length () || dim < 0) + return result; + + int nr = dv(0); + int nc = dv(1); + + if (dim == 0) + { + idx_arg.resize (1, nc); + int nel = 0; + for (int j = 0; j < nc; j++) + { + Complex tmp_max; + double abs_max = octave_NaN; + int idx_j = 0; + for (int i = cidx(j); i < cidx(j+1); i++) + { + if (ridx(i) != idx_j) + break; + else + idx_j++; + } + + if (idx_j != nr) + { + tmp_max = 0.; + abs_max = 0.; + } + + for (int i = cidx(j); i < cidx(j+1); i++) + { + Complex tmp = data (i); + + if (octave_is_NaN_or_NA (tmp)) + continue; + + double abs_tmp = ::abs (tmp); + + if (octave_is_NaN_or_NA (abs_max) || abs_tmp > abs_max) + { + idx_j = ridx (i); + tmp_max = tmp; + abs_max = abs_tmp; + } + } + + idx_arg.elem (j) = octave_is_NaN_or_NA (tmp_max) ? 0 : idx_j; + if (abs_max != 0.) + nel++; + } + + result = SparseComplexMatrix (1, nc, nel); + + int ii = 0; + result.xcidx (0) = 0; + for (int j = 0; j < nc; j++) + { + Complex tmp = elem (idx_arg(j), j); + if (tmp != 0.) + { + result.xdata (ii) = tmp; + result.xridx (ii++) = 0; + } + result.xcidx (j+1) = ii; + } + } + else + { + idx_arg.resize (nr, 1, 0); + + for (int i = cidx(0); i < cidx(1); i++) + idx_arg.elem(ridx(i)) = -1; + + for (int j = 0; j < nc; j++) + for (int i = 0; i < nr; i++) + { + if (idx_arg.elem(i) != -1) + continue; + bool found = false; + for (int k = cidx(j); k < cidx(j+1); k++) + if (ridx(k) == i) + { + found = true; + break; + } + + if (!found) + idx_arg.elem(i) = j; + + } + + for (int j = 0; j < nc; j++) + { + for (int i = cidx(j); i < cidx(j+1); i++) + { + int ir = ridx (i); + int ix = idx_arg.elem (ir); + Complex tmp = data (i); + + if (octave_is_NaN_or_NA (tmp)) + continue; + else if (ix == -1 || ::abs(tmp) > ::abs(elem (ir, ix))) + idx_arg.elem (ir) = j; + } + } + + int nel = 0; + for (int j = 0; j < nr; j++) + if (idx_arg.elem(j) == -1 || elem (j, idx_arg.elem (j)) != 0.) + nel++; + + result = SparseComplexMatrix (nr, 1, nel); + + int ii = 0; + result.xcidx (0) = 0; + result.xcidx (1) = nel; + for (int j = 0; j < nr; j++) + { + if (idx_arg(j) == -1) + { + idx_arg(j) = 0; + result.xdata (ii) = Complex_NaN_result; + result.xridx (ii++) = j; + } + else + { + Complex tmp = elem (j, idx_arg(j)); + if (tmp != 0.) + { + result.xdata (ii) = tmp; + result.xridx (ii++) = j; + } + } + } + } + + return result; +} + +SparseComplexMatrix +SparseComplexMatrix::min (int dim) const +{ + Array2 dummy_idx; + return min (dummy_idx, dim); +} + +SparseComplexMatrix +SparseComplexMatrix::min (Array2& idx_arg, int dim) const +{ + SparseComplexMatrix result; + dim_vector dv = dims (); + + if (dv.numel () == 0 || dim > dv.length () || dim < 0) + return result; + + int nr = dv(0); + int nc = dv(1); + + if (dim == 0) + { + idx_arg.resize (1, nc); + int nel = 0; + for (int j = 0; j < nc; j++) + { + Complex tmp_min; + double abs_min = octave_NaN; + int idx_j = 0; + for (int i = cidx(j); i < cidx(j+1); i++) + { + if (ridx(i) != idx_j) + break; + else + idx_j++; + } + + if (idx_j != nr) + { + tmp_min = 0.; + abs_min = 0.; + } + + for (int i = cidx(j); i < cidx(j+1); i++) + { + Complex tmp = data (i); + + if (octave_is_NaN_or_NA (tmp)) + continue; + + double abs_tmp = ::abs (tmp); + + if (octave_is_NaN_or_NA (abs_min) || abs_tmp < abs_min) + { + idx_j = ridx (i); + tmp_min = tmp; + abs_min = abs_tmp; + } + } + + idx_arg.elem (j) = octave_is_NaN_or_NA (tmp_min) ? 0 : idx_j; + if (abs_min != 0.) + nel++; + } + + result = SparseComplexMatrix (1, nc, nel); + + int ii = 0; + result.xcidx (0) = 0; + for (int j = 0; j < nc; j++) + { + Complex tmp = elem (idx_arg(j), j); + if (tmp != 0.) + { + result.xdata (ii) = tmp; + result.xridx (ii++) = 0; + } + result.xcidx (j+1) = ii; + } + } + else + { + idx_arg.resize (nr, 1, 0); + + for (int i = cidx(0); i < cidx(1); i++) + idx_arg.elem(ridx(i)) = -1; + + for (int j = 0; j < nc; j++) + for (int i = 0; i < nr; i++) + { + if (idx_arg.elem(i) != -1) + continue; + bool found = false; + for (int k = cidx(j); k < cidx(j+1); k++) + if (ridx(k) == i) + { + found = true; + break; + } + + if (!found) + idx_arg.elem(i) = j; + + } + + for (int j = 0; j < nc; j++) + { + for (int i = cidx(j); i < cidx(j+1); i++) + { + int ir = ridx (i); + int ix = idx_arg.elem (ir); + Complex tmp = data (i); + + if (octave_is_NaN_or_NA (tmp)) + continue; + else if (ix == -1 || ::abs(tmp) < ::abs(elem (ir, ix))) + idx_arg.elem (ir) = j; + } + } + + int nel = 0; + for (int j = 0; j < nr; j++) + if (idx_arg.elem(j) == -1 || elem (j, idx_arg.elem (j)) != 0.) + nel++; + + result = SparseComplexMatrix (nr, 1, nel); + + int ii = 0; + result.xcidx (0) = 0; + result.xcidx (1) = nel; + for (int j = 0; j < nr; j++) + { + if (idx_arg(j) == -1) + { + idx_arg(j) = 0; + result.xdata (ii) = Complex_NaN_result; + result.xridx (ii++) = j; + } + else + { + Complex tmp = elem (j, idx_arg(j)); + if (tmp != 0.) + { + result.xdata (ii) = tmp; + result.xridx (ii++) = j; + } + } + } + } + + return result; +} + +// destructive insert/delete/reorder operations + +SparseComplexMatrix& +SparseComplexMatrix::insert (const SparseMatrix& a, int r, int c) +{ + SparseComplexMatrix tmp (a); + return insert (a, r, c); +} + +SparseComplexMatrix& +SparseComplexMatrix::insert (const SparseComplexMatrix& a, int r, int c) +{ + MSparse::insert (a, r, c); + return *this; +} + +SparseComplexMatrix +SparseComplexMatrix::concat (const SparseComplexMatrix& rb, + const Array& ra_idx) +{ + // Don't use numel to avoid all possiblity of an overflow + if (rb.rows () > 0 && rb.cols () > 0) + insert (rb, ra_idx(0), ra_idx(1)); + return *this; +} + +SparseComplexMatrix +SparseComplexMatrix::concat (const SparseMatrix& rb, const Array& ra_idx) +{ + SparseComplexMatrix tmp (rb); + if (rb.rows () > 0 && rb.cols () > 0) + insert (tmp, ra_idx(0), ra_idx(1)); + return *this; +} + +ComplexMatrix +SparseComplexMatrix::matrix_value (void) const +{ + int nr = rows (); + int nc = cols (); + ComplexMatrix retval (nr, nc, Complex (0.0, 0.0)); + + for (int j = 0; j < nc; j++) + for (int i = cidx(j); i < cidx(j+1); i++) + retval.elem (ridx(i), j) = data (i); + + return retval; +} + +SparseComplexMatrix +SparseComplexMatrix::hermitian (void) const +{ + int nr = rows (); + int nc = cols (); + int nz = nnz (); + SparseComplexMatrix retval (nc, nr, nz); + + retval.cidx(0) = 0; + for (int i = 0, iidx = 0; i < nr; i++) + { + for (int j = 0; j < nc; j++) + for (int k = cidx(j); k < cidx(j+1); k++) + if (ridx(k) == i) + { + retval.data(iidx) = conj (data(k)); + retval.ridx(iidx++) = j; + } + retval.cidx(i+1) = iidx; + } + + return retval; +} + +SparseComplexMatrix +conj (const SparseComplexMatrix& a) +{ + int nr = a.rows (); + int nc = a.cols (); + int nz = a.nnz (); + SparseComplexMatrix retval (nc, nr, nz); + + for (int i = 0; i < nc + 1; i++) + retval.cidx (i) = a.cidx (i); + + for (int i = 0; i < nz; i++) + { + retval.data (i) = conj (a.data (i)); + retval.ridx (i) = a.ridx (i); + } + + return retval; +} + +SparseComplexMatrix +SparseComplexMatrix::inverse (void) const +{ + int info; + double rcond; + return inverse (info, rcond, 0, 0); +} + +SparseComplexMatrix +SparseComplexMatrix::inverse (int& info) const +{ + double rcond; + return inverse (info, rcond, 0, 0); +} + +SparseComplexMatrix +SparseComplexMatrix::inverse (int& info, double& rcond, int force, + int calc_cond) const +{ + info = -1; + (*current_liboctave_error_handler) + ("SparseComplexMatrix::inverse not implemented yet"); + return SparseComplexMatrix (); +} + +ComplexDET +SparseComplexMatrix::determinant (void) const +{ + int info; + double rcond; + return determinant (info, rcond, 0); +} + +ComplexDET +SparseComplexMatrix::determinant (int& info) const +{ + double rcond; + return determinant (info, rcond, 0); +} + +ComplexDET +SparseComplexMatrix::determinant (int& err, double& rcond, int calc_cond) const +{ + ComplexDET retval; + + int nr = rows (); + int nc = cols (); + + if (nr == 0 || nc == 0 || nr != nc) + { + Complex d[2]; + d[0] = 1.0; + d[1] = 0.0; + retval = ComplexDET (d); + } + else + { + err = 0; + + // Setup the control parameters + Matrix Control (UMFPACK_CONTROL, 1); + double *control = Control.fortran_vec (); + umfpack_zi_defaults (control); + + double tmp = Voctave_sparse_controls.get_key ("spumoni"); + if (!xisnan (tmp)) + Control (UMFPACK_PRL) = tmp; + + tmp = Voctave_sparse_controls.get_key ("piv_tol"); + if (!xisnan (tmp)) + { + Control (UMFPACK_SYM_PIVOT_TOLERANCE) = tmp; + Control (UMFPACK_PIVOT_TOLERANCE) = tmp; + } + + // Set whether we are allowed to modify Q or not + tmp = Voctave_sparse_controls.get_key ("autoamd"); + if (!xisnan (tmp)) + Control (UMFPACK_FIXQ) = tmp; + + // Turn-off UMFPACK scaling for LU + Control (UMFPACK_SCALE) = UMFPACK_SCALE_NONE; + + umfpack_zi_report_control (control); + + const int *Ap = cidx (); + const int *Ai = ridx (); + const Complex *Ax = data (); + + umfpack_zi_report_matrix (nr, nc, Ap, Ai, + X_CAST (const double *, Ax), + NULL, 1, control); + + void *Symbolic; + Matrix Info (1, UMFPACK_INFO); + double *info = Info.fortran_vec (); + int status = umfpack_zi_qsymbolic + (nr, nc, Ap, Ai, X_CAST (const double *, Ax), NULL, + NULL, &Symbolic, control, info); + + if (status < 0) + { + (*current_liboctave_error_handler) + ("SparseComplexMatrix::determinant symbolic factorization failed"); + + umfpack_zi_report_status (control, status); + umfpack_zi_report_info (control, info); + + umfpack_zi_free_symbolic (&Symbolic) ; + } + else + { + umfpack_zi_report_symbolic (Symbolic, control); + + void *Numeric; + status = umfpack_zi_numeric (Ap, Ai, X_CAST (const double *, Ax), + NULL, Symbolic, &Numeric, + control, info) ; + umfpack_zi_free_symbolic (&Symbolic) ; + + rcond = Info (UMFPACK_RCOND); + + if (status < 0) + { + (*current_liboctave_error_handler) + ("SparseComplexMatrix::determinant numeric factorization failed"); + + umfpack_zi_report_status (control, status); + umfpack_zi_report_info (control, info); + + umfpack_zi_free_numeric (&Numeric); + } + else + { + umfpack_zi_report_numeric (Numeric, control); + + Complex d[2]; + double d_exponent; + + status = umfpack_zi_get_determinant + (X_CAST (double *, &d[0]), NULL, &d_exponent, + Numeric, info); + d[1] = d_exponent; + + if (status < 0) + { + (*current_liboctave_error_handler) + ("SparseComplexMatrix::determinant error calculating determinant"); + + umfpack_zi_report_status (control, status); + umfpack_zi_report_info (control, info); + + umfpack_zi_free_numeric (&Numeric); + } + else + retval = ComplexDET (d); + } + } + } + + return retval; +} + +ComplexMatrix +SparseComplexMatrix::dsolve (SparseType &mattype, const Matrix& b, int& err, + double& rcond, solve_singularity_handler) const +{ + ComplexMatrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + int typ = mattype.type (); + mattype.info (); + + if (typ == SparseType::Diagonal || + typ == SparseType::Permuted_Diagonal) + { + retval.resize (b.rows (), b.cols()); + if (typ == SparseType::Diagonal) + for (int j = 0; j < b.cols(); j++) + for (int i = 0; i < nr; i++) + retval(i,j) = b(i,j) / data (i); + else + for (int j = 0; j < b.cols(); j++) + for (int i = 0; i < nr; i++) + retval(i,j) = b(ridx(i),j) / data (i); + + double dmax = 0., dmin = octave_Inf; + for (int i = 0; i < nr; i++) + { + double tmp = ::abs(data(i)); + if (tmp > dmax) + dmax = tmp; + if (tmp < dmin) + dmin = tmp; + } + rcond = dmin / dmax; + } + else + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +SparseComplexMatrix +SparseComplexMatrix::dsolve (SparseType &mattype, const SparseMatrix& b, + int& err, double& rcond, solve_singularity_handler) const +{ + SparseComplexMatrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + int typ = mattype.type (); + mattype.info (); + + if (typ == SparseType::Diagonal || + typ == SparseType::Permuted_Diagonal) + { + int b_nr = b.rows (); + int b_nc = b.cols (); + int b_nz = b.nnz (); + retval = SparseComplexMatrix (b_nr, b_nc, b_nz); + + retval.xcidx(0) = 0; + int ii = 0; + if (typ == SparseType::Diagonal) + for (int j = 0; j < b.cols(); j++) + { + for (int i = b.cidx(j); i < b.cidx(j+1); i++) + { + retval.xridx (ii) = b.ridx(i); + retval.xdata (ii++) = b.data(i) / data (b.ridx (i)); + } + retval.xcidx(j+1) = ii; + } + else + for (int j = 0; j < b.cols(); j++) + { + for (int i = 0; i < nr; i++) + { + bool found = false; + int k; + for (k = b.cidx(j); k < b.cidx(j+1); k++) + if (ridx(i) == b.ridx(k)) + { + found = true; + break; + } + if (found) + { + retval.xridx (ii) = i; + retval.xdata (ii++) = b.data(k) / data (i); + } + } + retval.xcidx(j+1) = ii; + } + + double dmax = 0., dmin = octave_Inf; + for (int i = 0; i < nr; i++) + { + double tmp = ::abs(data(i)); + if (tmp > dmax) + dmax = tmp; + if (tmp < dmin) + dmin = tmp; + } + rcond = dmin / dmax; + } + else + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +ComplexMatrix +SparseComplexMatrix::dsolve (SparseType &mattype, const ComplexMatrix& b, + int& err, double& rcond, solve_singularity_handler) const +{ + ComplexMatrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + int typ = mattype.type (); + mattype.info (); + + if (typ == SparseType::Diagonal || + typ == SparseType::Permuted_Diagonal) + { + retval.resize (b.rows (), b.cols()); + if (typ == SparseType::Diagonal) + for (int j = 0; j < b.cols(); j++) + for (int i = 0; i < nr; i++) + retval(i,j) = b(i,j) / data (i); + else + for (int j = 0; j < b.cols(); j++) + for (int i = 0; i < nr; i++) + retval(i,j) = b(ridx(i),j) / data (i); + + double dmax = 0., dmin = octave_Inf; + for (int i = 0; i < nr; i++) + { + double tmp = ::abs(data(i)); + if (tmp > dmax) + dmax = tmp; + if (tmp < dmin) + dmin = tmp; + } + rcond = dmin / dmax; + } + else + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +SparseComplexMatrix +SparseComplexMatrix::dsolve (SparseType &mattype, const SparseComplexMatrix& b, + int& err, double& rcond, + solve_singularity_handler) const +{ + SparseComplexMatrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + int typ = mattype.type (); + mattype.info (); + + if (typ == SparseType::Diagonal || + typ == SparseType::Permuted_Diagonal) + { + int b_nr = b.rows (); + int b_nc = b.cols (); + int b_nz = b.nnz (); + retval = SparseComplexMatrix (b_nr, b_nc, b_nz); + + retval.xcidx(0) = 0; + int ii = 0; + if (typ == SparseType::Diagonal) + for (int j = 0; j < b.cols(); j++) + { + for (int i = b.cidx(j); i < b.cidx(j+1); i++) + { + retval.xridx (ii) = b.ridx(i); + retval.xdata (ii++) = b.data(i) / data (b.ridx (i)); + } + retval.xcidx(j+1) = ii; + } + else + for (int j = 0; j < b.cols(); j++) + { + for (int i = 0; i < nr; i++) + { + bool found = false; + int k; + for (k = b.cidx(j); k < b.cidx(j+1); k++) + if (ridx(i) == b.ridx(k)) + { + found = true; + break; + } + if (found) + { + retval.xridx (ii) = i; + retval.xdata (ii++) = b.data(k) / data (i); + } + } + retval.xcidx(j+1) = ii; + } + + double dmax = 0., dmin = octave_Inf; + for (int i = 0; i < nr; i++) + { + double tmp = ::abs(data(i)); + if (tmp > dmax) + dmax = tmp; + if (tmp < dmin) + dmin = tmp; + } + rcond = dmin / dmax; + } + else + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +ComplexMatrix +SparseComplexMatrix::utsolve (SparseType &mattype, const Matrix& b, int& err, + double& rcond, + solve_singularity_handler sing_handler) const +{ + ComplexMatrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + int typ = mattype.type (); + mattype.info (); + + if (typ == SparseType::Permuted_Upper || + typ == SparseType::Upper) + { + double anorm = 0.; + double ainvnorm = 0.; + int b_cols = b.cols (); + rcond = 0.; + + // Calculate the 1-norm of matrix for rcond calculation + for (int j = 0; j < nr; j++) + { + double atmp = 0.; + for (int i = cidx(j); i < cidx(j+1); i++) + atmp += ::abs(data(i)); + if (atmp > anorm) + anorm = atmp; + } + + if (typ == SparseType::Permuted_Upper) + { + retval.resize (b.rows (), b.cols ()); + OCTAVE_LOCAL_BUFFER (Complex, work, nr); + int *p_perm = mattype.triangular_row_perm (); + int *q_perm = mattype.triangular_col_perm (); + + (*current_liboctave_warning_handler) + ("SparseComplexMatrix::solve XXX FIXME XXX permuted triangular code not tested"); + + for (int j = 0; j < b_cols; j++) + { + for (int i = 0; i < nr; i++) + work[i] = b(i,j); + + for (int k = nr-1; k >= 0; k--) + { + int iidx = q_perm[k]; + if (work[iidx] != 0.) + { + if (ridx(cidx(iidx+1)-1) != iidx) + { + err = -2; + goto triangular_error; + } + + Complex tmp = work[iidx] / data(cidx(iidx+1)-1); + work[iidx] = tmp; + for (int i = cidx(iidx); i < cidx(iidx+1)-1; i++) + { + int idx2 = q_perm[ridx(i)]; + work[idx2] = + work[idx2] - tmp * data(i); + } + } + } + + for (int i = 0; i < nr; i++) + retval (i, j) = work[p_perm[i]]; + } + + // Calculation of 1-norm of inv(*this) + for (int i = 0; i < nr; i++) + work[i] = 0.; + + for (int j = 0; j < nr; j++) + { + work[q_perm[j]] = 1.; + + for (int k = j; k >= 0; k--) + { + int iidx = q_perm[k]; + + if (work[iidx] != 0.) + { + Complex tmp = work[iidx] / data(cidx(iidx+1)-1); + work[iidx] = tmp; + for (int i = cidx(iidx); i < cidx(iidx+1)-1; i++) + { + int idx2 = q_perm[ridx(i)]; + work[idx2] = work[idx2] - tmp * data(i); + } + } + } + double atmp = 0; + for (int i = 0; i < j+1; i++) + { + atmp += ::abs(work[i]); + work[i] = 0.; + } + if (atmp > ainvnorm) + ainvnorm = atmp; + } + } + else + { + retval = ComplexMatrix (b); + Complex *x_vec = retval.fortran_vec (); + + for (int j = 0; j < b_cols; j++) + { + int offset = j * nr; + for (int k = nr-1; k >= 0; k--) + { + if (x_vec[k+offset] != 0.) + { + if (ridx(cidx(k+1)-1) != k) + { + err = -2; + goto triangular_error; + } + + Complex tmp = x_vec[k+offset] / + data(cidx(k+1)-1); + x_vec[k+offset] = tmp; + for (int i = cidx(k); i < cidx(k+1)-1; i++) + { + int iidx = ridx(i); + x_vec[iidx+offset] = + x_vec[iidx+offset] - tmp * data(i); + } + } + } + } + + // Calculation of 1-norm of inv(*this) + OCTAVE_LOCAL_BUFFER (Complex, work, nr); + for (int i = 0; i < nr; i++) + work[i] = 0.; + + for (int j = 0; j < nr; j++) + { + work[j] = 1.; + + for (int k = j; k >= 0; k--) + { + if (work[k] != 0.) + { + Complex tmp = work[k] / data(cidx(k+1)-1); + work[k] = tmp; + for (int i = cidx(k); i < cidx(k+1)-1; i++) + { + int iidx = ridx(i); + work[iidx] = work[iidx] - tmp * data(i); + } + } + } + double atmp = 0; + for (int i = 0; i < j+1; i++) + { + atmp += ::abs(work[i]); + work[i] = 0.; + } + if (atmp > ainvnorm) + ainvnorm = atmp; + } + } + + rcond = 1. / ainvnorm / anorm; + + triangular_error: + if (err != 0) + { + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("SparseComplexMatrix::solve matrix singular to machine precision, rcond = %g", + rcond); + } + + volatile double rcond_plus_one = rcond + 1.0; + + if (rcond_plus_one == 1.0 || xisnan (rcond)) + { + err = -2; + + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("matrix singular to machine precision, rcond = %g", + rcond); + } + } + else + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +SparseComplexMatrix +SparseComplexMatrix::utsolve (SparseType &mattype, const SparseMatrix& b, + int& err, double& rcond, + solve_singularity_handler sing_handler) const +{ + SparseComplexMatrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + int typ = mattype.type (); + mattype.info (); + + if (typ == SparseType::Permuted_Upper || + typ == SparseType::Upper) + { + double anorm = 0.; + double ainvnorm = 0.; + rcond = 0.; + + // Calculate the 1-norm of matrix for rcond calculation + for (int j = 0; j < nr; j++) + { + double atmp = 0.; + for (int i = cidx(j); i < cidx(j+1); i++) + atmp += ::abs(data(i)); + if (atmp > anorm) + anorm = atmp; + } + + int b_nr = b.rows (); + int b_nc = b.cols (); + int b_nz = b.nnz (); + retval = SparseComplexMatrix (b_nr, b_nc, b_nz); + retval.xcidx(0) = 0; + int ii = 0; + int x_nz = b_nz; + + if (typ == SparseType::Permuted_Upper) + { + OCTAVE_LOCAL_BUFFER (Complex, work, nr); + int *p_perm = mattype.triangular_row_perm (); + int *q_perm = mattype.triangular_col_perm (); + + (*current_liboctave_warning_handler) + ("SparseComplexMatrix::solve XXX FIXME XXX permuted triangular code not tested"); + + for (int j = 0; j < b_nc; j++) + { + for (int i = 0; i < nr; i++) + work[i] = 0.; + for (int i = b.cidx(j); i < b.cidx(j+1); i++) + work[b.ridx(i)] = b.data(i); + + for (int k = nr-1; k >= 0; k--) + { + int iidx = q_perm[k]; + if (work[iidx] != 0.) + { + if (ridx(cidx(iidx+1)-1) != iidx) + { + err = -2; + goto triangular_error; + } + + Complex tmp = work[iidx] / data(cidx(iidx+1)-1); + work[iidx] = tmp; + for (int i = cidx(iidx); i < cidx(iidx+1)-1; i++) + { + int idx2 = q_perm[ridx(i)]; + work[idx2] = + work[idx2] - tmp * data(i); + } + } + } + + // Count non-zeros in work vector and adjust space in + // retval if needed + int new_nnz = 0; + for (int i = 0; i < nr; i++) + if (work[i] != 0.) + new_nnz++; + + if (ii + new_nnz > x_nz) + { + // Resize the sparse matrix + int sz = new_nnz * (b_nc - j) + x_nz; + retval.change_capacity (sz); + x_nz = sz; + } + + for (int i = 0; i < nr; i++) + if (work[p_perm[i]] != 0.) + { + retval.xridx(ii) = i; + retval.xdata(ii++) = work[p_perm[i]]; + } + retval.xcidx(j+1) = ii; + } + + retval.maybe_compress (); + + // Calculation of 1-norm of inv(*this) + for (int i = 0; i < nr; i++) + work[i] = 0.; + + for (int j = 0; j < nr; j++) + { + work[q_perm[j]] = 1.; + + for (int k = j; k >= 0; k--) + { + int iidx = q_perm[k]; + + if (work[iidx] != 0.) + { + Complex tmp = work[iidx] / data(cidx(iidx+1)-1); + work[iidx] = tmp; + for (int i = cidx(iidx); i < cidx(iidx+1)-1; i++) + { + int idx2 = q_perm[ridx(i)]; + work[idx2] = work[idx2] - tmp * data(i); + } + } + } + double atmp = 0; + for (int i = 0; i < j+1; i++) + { + atmp += ::abs(work[i]); + work[i] = 0.; + } + if (atmp > ainvnorm) + ainvnorm = atmp; + } + } + else + { + OCTAVE_LOCAL_BUFFER (Complex, work, nr); + + for (int j = 0; j < b_nc; j++) + { + for (int i = 0; i < nr; i++) + work[i] = 0.; + for (int i = b.cidx(j); i < b.cidx(j+1); i++) + work[b.ridx(i)] = b.data(i); + + for (int k = nr-1; k >= 0; k--) + { + if (work[k] != 0.) + { + if (ridx(cidx(k+1)-1) != k) + { + err = -2; + goto triangular_error; + } + + Complex tmp = work[k] / data(cidx(k+1)-1); + work[k] = tmp; + for (int i = cidx(k); i < cidx(k+1)-1; i++) + { + int iidx = ridx(i); + work[iidx] = work[iidx] - tmp * data(i); + } + } + } + + // Count non-zeros in work vector and adjust space in + // retval if needed + int new_nnz = 0; + for (int i = 0; i < nr; i++) + if (work[i] != 0.) + new_nnz++; + + if (ii + new_nnz > x_nz) + { + // Resize the sparse matrix + int sz = new_nnz * (b_nc - j) + x_nz; + retval.change_capacity (sz); + x_nz = sz; + } + + for (int i = 0; i < nr; i++) + if (work[i] != 0.) + { + retval.xridx(ii) = i; + retval.xdata(ii++) = work[i]; + } + retval.xcidx(j+1) = ii; + } + + retval.maybe_compress (); + + // Calculation of 1-norm of inv(*this) + for (int i = 0; i < nr; i++) + work[i] = 0.; + + for (int j = 0; j < nr; j++) + { + work[j] = 1.; + + for (int k = j; k >= 0; k--) + { + if (work[k] != 0.) + { + Complex tmp = work[k] / data(cidx(k+1)-1); + work[k] = tmp; + for (int i = cidx(k); i < cidx(k+1)-1; i++) + { + int iidx = ridx(i); + work[iidx] = work[iidx] - tmp * data(i); + } + } + } + double atmp = 0; + for (int i = 0; i < j+1; i++) + { + atmp += ::abs(work[i]); + work[i] = 0.; + } + if (atmp > ainvnorm) + ainvnorm = atmp; + } + } + + rcond = 1. / ainvnorm / anorm; + + triangular_error: + if (err != 0) + { + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("SparseComplexMatrix::solve matrix singular to machine precision, rcond = %g", + rcond); + } + + volatile double rcond_plus_one = rcond + 1.0; + + if (rcond_plus_one == 1.0 || xisnan (rcond)) + { + err = -2; + + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("matrix singular to machine precision, rcond = %g", + rcond); + } + } + else + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + return retval; +} + +ComplexMatrix +SparseComplexMatrix::utsolve (SparseType &mattype, const ComplexMatrix& b, + int& err, double& rcond, + solve_singularity_handler sing_handler) const +{ + ComplexMatrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + int typ = mattype.type (); + mattype.info (); + + if (typ == SparseType::Permuted_Upper || + typ == SparseType::Upper) + { + double anorm = 0.; + double ainvnorm = 0.; + int b_nc = b.cols (); + rcond = 0.; + + // Calculate the 1-norm of matrix for rcond calculation + for (int j = 0; j < nr; j++) + { + double atmp = 0.; + for (int i = cidx(j); i < cidx(j+1); i++) + atmp += ::abs(data(i)); + if (atmp > anorm) + anorm = atmp; + } + + if (typ == SparseType::Permuted_Upper) + { + retval.resize (b.rows (), b.cols ()); + OCTAVE_LOCAL_BUFFER (Complex, work, nr); + int *p_perm = mattype.triangular_row_perm (); + int *q_perm = mattype.triangular_col_perm (); + + (*current_liboctave_warning_handler) + ("SparseComplexMatrix::solve XXX FIXME XXX permuted triangular code not tested"); + + for (int j = 0; j < b_nc; j++) + { + for (int i = 0; i < nr; i++) + work[i] = b(i,j); + + for (int k = nr-1; k >= 0; k--) + { + int iidx = q_perm[k]; + if (work[iidx] != 0.) + { + if (ridx(cidx(iidx+1)-1) != iidx) + { + err = -2; + goto triangular_error; + } + + Complex tmp = work[iidx] / data(cidx(iidx+1)-1); + work[iidx] = tmp; + for (int i = cidx(iidx); i < cidx(iidx+1)-1; i++) + { + int idx2 = q_perm[ridx(i)]; + work[idx2] = + work[idx2] - tmp * data(i); + } + } + } + + for (int i = 0; i < nr; i++) + retval (i, j) = work[p_perm[i]]; + + } + + // Calculation of 1-norm of inv(*this) + for (int i = 0; i < nr; i++) + work[i] = 0.; + + for (int j = 0; j < nr; j++) + { + work[q_perm[j]] = 1.; + + for (int k = j; k >= 0; k--) + { + int iidx = q_perm[k]; + + if (work[iidx] != 0.) + { + Complex tmp = work[iidx] / data(cidx(iidx+1)-1); + work[iidx] = tmp; + for (int i = cidx(iidx); i < cidx(iidx+1)-1; i++) + { + int idx2 = q_perm[ridx(i)]; + work[idx2] = work[idx2] - tmp * data(i); + } + } + } + double atmp = 0; + for (int i = 0; i < j+1; i++) + { + atmp += ::abs(work[i]); + work[i] = 0.; + } + if (atmp > ainvnorm) + ainvnorm = atmp; + } + } + else + { + retval = b; + Complex *x_vec = retval.fortran_vec (); + + for (int j = 0; j < b_nc; j++) + { + int offset = j * nr; + for (int k = nr-1; k >= 0; k--) + { + if (x_vec[k+offset] != 0.) + { + if (ridx(cidx(k+1)-1) != k) + { + err = -2; + goto triangular_error; + } + + Complex tmp = x_vec[k+offset] / + data(cidx(k+1)-1); + x_vec[k+offset] = tmp; + for (int i = cidx(k); i < cidx(k+1)-1; i++) + { + int iidx = ridx(i); + x_vec[iidx+offset] = + x_vec[iidx+offset] - tmp * data(i); + } + } + } + } + + // Calculation of 1-norm of inv(*this) + OCTAVE_LOCAL_BUFFER (Complex, work, nr); + for (int i = 0; i < nr; i++) + work[i] = 0.; + + for (int j = 0; j < nr; j++) + { + work[j] = 1.; + + for (int k = j; k >= 0; k--) + { + if (work[k] != 0.) + { + Complex tmp = work[k] / data(cidx(k+1)-1); + work[k] = tmp; + for (int i = cidx(k); i < cidx(k+1)-1; i++) + { + int iidx = ridx(i); + work[iidx] = work[iidx] - tmp * data(i); + } + } + } + double atmp = 0; + for (int i = 0; i < j+1; i++) + { + atmp += ::abs(work[i]); + work[i] = 0.; + } + if (atmp > ainvnorm) + ainvnorm = atmp; + } + } + + rcond = 1. / ainvnorm / anorm; + + triangular_error: + if (err != 0) + { + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("SparseComplexMatrix::solve matrix singular to machine precision, rcond = %g", + rcond); + } + + volatile double rcond_plus_one = rcond + 1.0; + + if (rcond_plus_one == 1.0 || xisnan (rcond)) + { + err = -2; + + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("matrix singular to machine precision, rcond = %g", + rcond); + } + } + else + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +SparseComplexMatrix +SparseComplexMatrix::utsolve (SparseType &mattype, const SparseComplexMatrix& b, + int& err, double& rcond, + solve_singularity_handler sing_handler) const +{ + SparseComplexMatrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + int typ = mattype.type (); + mattype.info (); + + if (typ == SparseType::Permuted_Upper || + typ == SparseType::Upper) + { + double anorm = 0.; + double ainvnorm = 0.; + rcond = 0.; + + // Calculate the 1-norm of matrix for rcond calculation + for (int j = 0; j < nr; j++) + { + double atmp = 0.; + for (int i = cidx(j); i < cidx(j+1); i++) + atmp += ::abs(data(i)); + if (atmp > anorm) + anorm = atmp; + } + + int b_nr = b.rows (); + int b_nc = b.cols (); + int b_nz = b.nnz (); + retval = SparseComplexMatrix (b_nr, b_nc, b_nz); + retval.xcidx(0) = 0; + int ii = 0; + int x_nz = b_nz; + + if (typ == SparseType::Permuted_Upper) + { + OCTAVE_LOCAL_BUFFER (Complex, work, nr); + int *p_perm = mattype.triangular_row_perm (); + int *q_perm = mattype.triangular_col_perm (); + + (*current_liboctave_warning_handler) + ("SparseComplexMatrix::solve XXX FIXME XXX permuted triangular code not tested"); + + for (int j = 0; j < b_nc; j++) + { + for (int i = 0; i < nr; i++) + work[i] = 0.; + for (int i = b.cidx(j); i < b.cidx(j+1); i++) + work[b.ridx(i)] = b.data(i); + + for (int k = nr-1; k >= 0; k--) + { + int iidx = q_perm[k]; + if (work[iidx] != 0.) + { + if (ridx(cidx(iidx+1)-1) != iidx) + { + err = -2; + goto triangular_error; + } + + Complex tmp = work[iidx] / data(cidx(iidx+1)-1); + work[iidx] = tmp; + for (int i = cidx(iidx); i < cidx(iidx+1)-1; i++) + { + int idx2 = q_perm[ridx(i)]; + work[idx2] = + work[idx2] - tmp * data(i); + } + } + } + + // Count non-zeros in work vector and adjust space in + // retval if needed + int new_nnz = 0; + for (int i = 0; i < nr; i++) + if (work[i] != 0.) + new_nnz++; + + if (ii + new_nnz > x_nz) + { + // Resize the sparse matrix + int sz = new_nnz * (b_nc - j) + x_nz; + retval.change_capacity (sz); + x_nz = sz; + } + + for (int i = 0; i < nr; i++) + if (work[p_perm[i]] != 0.) + { + retval.xridx(ii) = i; + retval.xdata(ii++) = work[p_perm[i]]; + } + retval.xcidx(j+1) = ii; + } + + retval.maybe_compress (); + + // Calculation of 1-norm of inv(*this) + for (int i = 0; i < nr; i++) + work[i] = 0.; + + for (int j = 0; j < nr; j++) + { + work[q_perm[j]] = 1.; + + for (int k = j; k >= 0; k--) + { + int iidx = q_perm[k]; + + if (work[iidx] != 0.) + { + Complex tmp = work[iidx] / data(cidx(iidx+1)-1); + work[iidx] = tmp; + for (int i = cidx(iidx); i < cidx(iidx+1)-1; i++) + { + int idx2 = q_perm[ridx(i)]; + work[idx2] = work[idx2] - tmp * data(i); + } + } + } + double atmp = 0; + for (int i = 0; i < j+1; i++) + { + atmp += ::abs(work[i]); + work[i] = 0.; + } + if (atmp > ainvnorm) + ainvnorm = atmp; + } + } + else + { + OCTAVE_LOCAL_BUFFER (Complex, work, nr); + + for (int j = 0; j < b_nc; j++) + { + for (int i = 0; i < nr; i++) + work[i] = 0.; + for (int i = b.cidx(j); i < b.cidx(j+1); i++) + work[b.ridx(i)] = b.data(i); + + for (int k = nr-1; k >= 0; k--) + { + if (work[k] != 0.) + { + if (ridx(cidx(k+1)-1) != k) + { + err = -2; + goto triangular_error; + } + + Complex tmp = work[k] / data(cidx(k+1)-1); + work[k] = tmp; + for (int i = cidx(k); i < cidx(k+1)-1; i++) + { + int iidx = ridx(i); + work[iidx] = work[iidx] - tmp * data(i); + } + } + } + + // Count non-zeros in work vector and adjust space in + // retval if needed + int new_nnz = 0; + for (int i = 0; i < nr; i++) + if (work[i] != 0.) + new_nnz++; + + if (ii + new_nnz > x_nz) + { + // Resize the sparse matrix + int sz = new_nnz * (b_nc - j) + x_nz; + retval.change_capacity (sz); + x_nz = sz; + } + + for (int i = 0; i < nr; i++) + if (work[i] != 0.) + { + retval.xridx(ii) = i; + retval.xdata(ii++) = work[i]; + } + retval.xcidx(j+1) = ii; + } + + retval.maybe_compress (); + + // Calculation of 1-norm of inv(*this) + for (int i = 0; i < nr; i++) + work[i] = 0.; + + for (int j = 0; j < nr; j++) + { + work[j] = 1.; + + for (int k = j; k >= 0; k--) + { + if (work[k] != 0.) + { + Complex tmp = work[k] / data(cidx(k+1)-1); + work[k] = tmp; + for (int i = cidx(k); i < cidx(k+1)-1; i++) + { + int iidx = ridx(i); + work[iidx] = work[iidx] - tmp * data(i); + } + } + } + double atmp = 0; + for (int i = 0; i < j+1; i++) + { + atmp += ::abs(work[i]); + work[i] = 0.; + } + if (atmp > ainvnorm) + ainvnorm = atmp; + } + } + + rcond = 1. / ainvnorm / anorm; + + triangular_error: + if (err != 0) + { + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("SparseComplexMatrix::solve matrix singular to machine precision, rcond = %g", + rcond); + } + + volatile double rcond_plus_one = rcond + 1.0; + + if (rcond_plus_one == 1.0 || xisnan (rcond)) + { + err = -2; + + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("matrix singular to machine precision, rcond = %g", + rcond); + } + } + else + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +ComplexMatrix +SparseComplexMatrix::ltsolve (SparseType &mattype, const Matrix& b, int& err, + double& rcond, solve_singularity_handler sing_handler) const +{ + ComplexMatrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + int typ = mattype.type (); + mattype.info (); + + if (typ == SparseType::Permuted_Lower || + typ == SparseType::Lower) + { + double anorm = 0.; + double ainvnorm = 0.; + int b_cols = b.cols (); + rcond = 0.; + + // Calculate the 1-norm of matrix for rcond calculation + for (int j = 0; j < nr; j++) + { + double atmp = 0.; + for (int i = cidx(j); i < cidx(j+1); i++) + atmp += ::abs(data(i)); + if (atmp > anorm) + anorm = atmp; + } + + if (typ == SparseType::Permuted_Lower) + { + retval.resize (b.rows (), b.cols ()); + OCTAVE_LOCAL_BUFFER (Complex, work, nr); + int *p_perm = mattype.triangular_row_perm (); + int *q_perm = mattype.triangular_col_perm (); + + (*current_liboctave_warning_handler) + ("SparseComplexMatrix::solve XXX FIXME XXX permuted triangular code not tested"); + + for (int j = 0; j < b_cols; j++) + { + for (int i = 0; i < nr; i++) + work[i] = b(i,j); + + for (int k = 0; k < nr; k++) + { + int iidx = q_perm[k]; + if (work[iidx] != 0.) + { + if (ridx(cidx(iidx)) != iidx) + { + err = -2; + goto triangular_error; + } + + Complex tmp = work[iidx] / data(cidx(iidx+1)-1); + work[iidx] = tmp; + for (int i = cidx(iidx)+1; i < cidx(iidx+1); i++) + { + int idx2 = q_perm[ridx(i)]; + work[idx2] = + work[idx2] - tmp * data(i); + } + } + } + + for (int i = 0; i < nr; i++) + retval (i, j) = work[p_perm[i]]; + + } + + // Calculation of 1-norm of inv(*this) + for (int i = 0; i < nr; i++) + work[i] = 0.; + + for (int j = 0; j < nr; j++) + { + work[q_perm[j]] = 1.; + + for (int k = 0; k < nr; k++) + { + int iidx = q_perm[k]; + + if (work[iidx] != 0.) + { + Complex tmp = work[iidx] / data(cidx(iidx+1)-1); + work[iidx] = tmp; + for (int i = cidx(iidx)+1; i < cidx(iidx+1); i++) + { + int idx2 = q_perm[ridx(i)]; + work[idx2] = work[idx2] - tmp * data(i); + } + } + } + double atmp = 0; + for (int i = 0; i < j+1; i++) + { + atmp += ::abs(work[i]); + work[i] = 0.; + } + if (atmp > ainvnorm) + ainvnorm = atmp; + } + } + else + { + retval = ComplexMatrix (b); + Complex *x_vec = retval.fortran_vec (); + + for (int j = 0; j < b_cols; j++) + { + int offset = j * nr; + for (int k = 0; k < nr; k++) + { + if (x_vec[k+offset] != 0.) + { + if (ridx(cidx(k)) != k) + { + err = -2; + goto triangular_error; + } + + Complex tmp = x_vec[k+offset] / + data(cidx(k)); + x_vec[k+offset] = tmp; + for (int i = cidx(k)+1; i < cidx(k+1); i++) + { + int iidx = ridx(i); + x_vec[iidx+offset] = + x_vec[iidx+offset] - tmp * data(i); + } + } + } + } + + // Calculation of 1-norm of inv(*this) + OCTAVE_LOCAL_BUFFER (Complex, work, nr); + for (int i = 0; i < nr; i++) + work[i] = 0.; + + for (int j = 0; j < nr; j++) + { + work[j] = 1.; + + for (int k = j; k < nr; k++) + { + + if (work[k] != 0.) + { + Complex tmp = work[k] / data(cidx(k)); + work[k] = tmp; + for (int i = cidx(k)+1; i < cidx(k+1); i++) + { + int iidx = ridx(i); + work[iidx] = work[iidx] - tmp * data(i); + } + } + } + double atmp = 0; + for (int i = j; i < nr; i++) + { + atmp += ::abs(work[i]); + work[i] = 0.; + } + if (atmp > ainvnorm) + ainvnorm = atmp; + } + } + + rcond = 1. / ainvnorm / anorm; + + triangular_error: + if (err != 0) + { + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("SparseComplexMatrix::solve matrix singular to machine precision, rcond = %g", + rcond); + } + + volatile double rcond_plus_one = rcond + 1.0; + + if (rcond_plus_one == 1.0 || xisnan (rcond)) + { + err = -2; + + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("matrix singular to machine precision, rcond = %g", + rcond); + } + } + else + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +SparseComplexMatrix +SparseComplexMatrix::ltsolve (SparseType &mattype, const SparseMatrix& b, + int& err, double& rcond, + solve_singularity_handler sing_handler) const +{ + SparseComplexMatrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + int typ = mattype.type (); + mattype.info (); + + if (typ == SparseType::Permuted_Lower || + typ == SparseType::Lower) + { + double anorm = 0.; + double ainvnorm = 0.; + rcond = 0.; + + // Calculate the 1-norm of matrix for rcond calculation + for (int j = 0; j < nr; j++) + { + double atmp = 0.; + for (int i = cidx(j); i < cidx(j+1); i++) + atmp += ::abs(data(i)); + if (atmp > anorm) + anorm = atmp; + } + + int b_nr = b.rows (); + int b_nc = b.cols (); + int b_nz = b.nnz (); + retval = SparseComplexMatrix (b_nr, b_nc, b_nz); + retval.xcidx(0) = 0; + int ii = 0; + int x_nz = b_nz; + + if (typ == SparseType::Permuted_Lower) + { + OCTAVE_LOCAL_BUFFER (Complex, work, nr); + int *p_perm = mattype.triangular_row_perm (); + int *q_perm = mattype.triangular_col_perm (); + + (*current_liboctave_warning_handler) + ("SparseComplexMatrix::solve XXX FIXME XXX permuted triangular code not tested"); + + for (int j = 0; j < b_nc; j++) + { + for (int i = 0; i < nr; i++) + work[i] = 0.; + for (int i = b.cidx(j); i < b.cidx(j+1); i++) + work[b.ridx(i)] = b.data(i); + + for (int k = 0; k < nr; k++) + { + int iidx = q_perm[k]; + if (work[iidx] != 0.) + { + if (ridx(cidx(iidx)) != iidx) + { + err = -2; + goto triangular_error; + } + + Complex tmp = work[iidx] / data(cidx(iidx+1)-1); + work[iidx] = tmp; + for (int i = cidx(iidx)+1; i < cidx(iidx+1); i++) + { + int idx2 = q_perm[ridx(i)]; + work[idx2] = + work[idx2] - tmp * data(i); + } + } + } + + // Count non-zeros in work vector and adjust space in + // retval if needed + int new_nnz = 0; + for (int i = 0; i < nr; i++) + if (work[i] != 0.) + new_nnz++; + + if (ii + new_nnz > x_nz) + { + // Resize the sparse matrix + int sz = new_nnz * (b_nc - j) + x_nz; + retval.change_capacity (sz); + x_nz = sz; + } + + for (int i = 0; i < nr; i++) + if (work[p_perm[i]] != 0.) + { + retval.xridx(ii) = i; + retval.xdata(ii++) = work[p_perm[i]]; + } + retval.xcidx(j+1) = ii; + } + + retval.maybe_compress (); + + // Calculation of 1-norm of inv(*this) + for (int i = 0; i < nr; i++) + work[i] = 0.; + + for (int j = 0; j < nr; j++) + { + work[q_perm[j]] = 1.; + + for (int k = 0; k < nr; k++) + { + int iidx = q_perm[k]; + + if (work[iidx] != 0.) + { + Complex tmp = work[iidx] / data(cidx(iidx+1)-1); + work[iidx] = tmp; + for (int i = cidx(iidx)+1; i < cidx(iidx+1); i++) + { + int idx2 = q_perm[ridx(i)]; + work[idx2] = work[idx2] - tmp * data(i); + } + } + } + double atmp = 0; + for (int i = 0; i < j+1; i++) + { + atmp += ::abs(work[i]); + work[i] = 0.; + } + if (atmp > ainvnorm) + ainvnorm = atmp; + } + } + else + { + OCTAVE_LOCAL_BUFFER (Complex, work, nr); + + for (int j = 0; j < b_nc; j++) + { + for (int i = 0; i < nr; i++) + work[i] = 0.; + for (int i = b.cidx(j); i < b.cidx(j+1); i++) + work[b.ridx(i)] = b.data(i); + + for (int k = 0; k < nr; k++) + { + if (work[k] != 0.) + { + if (ridx(cidx(k)) != k) + { + err = -2; + goto triangular_error; + } + + Complex tmp = work[k] / data(cidx(k)); + work[k] = tmp; + for (int i = cidx(k)+1; i < cidx(k+1); i++) + { + int iidx = ridx(i); + work[iidx] = work[iidx] - tmp * data(i); + } + } + } + + // Count non-zeros in work vector and adjust space in + // retval if needed + int new_nnz = 0; + for (int i = 0; i < nr; i++) + if (work[i] != 0.) + new_nnz++; + + if (ii + new_nnz > x_nz) + { + // Resize the sparse matrix + int sz = new_nnz * (b_nc - j) + x_nz; + retval.change_capacity (sz); + x_nz = sz; + } + + for (int i = 0; i < nr; i++) + if (work[i] != 0.) + { + retval.xridx(ii) = i; + retval.xdata(ii++) = work[i]; + } + retval.xcidx(j+1) = ii; + } + + retval.maybe_compress (); + + // Calculation of 1-norm of inv(*this) + for (int i = 0; i < nr; i++) + work[i] = 0.; + + for (int j = 0; j < nr; j++) + { + work[j] = 1.; + + for (int k = j; k < nr; k++) + { + + if (work[k] != 0.) + { + Complex tmp = work[k] / data(cidx(k)); + work[k] = tmp; + for (int i = cidx(k)+1; i < cidx(k+1); i++) + { + int iidx = ridx(i); + work[iidx] = work[iidx] - tmp * data(i); + } + } + } + double atmp = 0; + for (int i = j; i < nr; i++) + { + atmp += ::abs(work[i]); + work[i] = 0.; + } + if (atmp > ainvnorm) + ainvnorm = atmp; + } + + } + + rcond = 1. / ainvnorm / anorm; + + triangular_error: + if (err != 0) + { + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("SparseComplexMatrix::solve matrix singular to machine precision, rcond = %g", + rcond); + } + + volatile double rcond_plus_one = rcond + 1.0; + + if (rcond_plus_one == 1.0 || xisnan (rcond)) + { + err = -2; + + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("matrix singular to machine precision, rcond = %g", + rcond); + } + } + else + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +ComplexMatrix +SparseComplexMatrix::ltsolve (SparseType &mattype, const ComplexMatrix& b, + int& err, double& rcond, + solve_singularity_handler sing_handler) const +{ + ComplexMatrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + int typ = mattype.type (); + mattype.info (); + + if (typ == SparseType::Permuted_Lower || + typ == SparseType::Lower) + { + double anorm = 0.; + double ainvnorm = 0.; + int b_nc = b.cols (); + rcond = 0.; + + // Calculate the 1-norm of matrix for rcond calculation + for (int j = 0; j < nr; j++) + { + double atmp = 0.; + for (int i = cidx(j); i < cidx(j+1); i++) + atmp += ::abs(data(i)); + if (atmp > anorm) + anorm = atmp; + } + + if (typ == SparseType::Permuted_Lower) + { + retval.resize (b.rows (), b.cols ()); + OCTAVE_LOCAL_BUFFER (Complex, work, nr); + int *p_perm = mattype.triangular_row_perm (); + int *q_perm = mattype.triangular_col_perm (); + + (*current_liboctave_warning_handler) + ("SparseComplexMatrix::solve XXX FIXME XXX permuted triangular code not tested"); + + for (int j = 0; j < b_nc; j++) + { + for (int i = 0; i < nr; i++) + work[i] = b(i,j); + + for (int k = 0; k < nr; k++) + { + int iidx = q_perm[k]; + if (work[iidx] != 0.) + { + if (ridx(cidx(iidx)) != iidx) + { + err = -2; + goto triangular_error; + } + + Complex tmp = work[iidx] / data(cidx(iidx+1)-1); + work[iidx] = tmp; + for (int i = cidx(iidx)+1; i < cidx(iidx+1); i++) + { + int idx2 = q_perm[ridx(i)]; + work[idx2] = + work[idx2] - tmp * data(i); + } + } + } + + for (int i = 0; i < nr; i++) + retval (i, j) = work[p_perm[i]]; + + } + + // Calculation of 1-norm of inv(*this) + for (int i = 0; i < nr; i++) + work[i] = 0.; + + for (int j = 0; j < nr; j++) + { + work[q_perm[j]] = 1.; + + for (int k = 0; k < nr; k++) + { + int iidx = q_perm[k]; + + if (work[iidx] != 0.) + { + Complex tmp = work[iidx] / data(cidx(iidx+1)-1); + work[iidx] = tmp; + for (int i = cidx(iidx)+1; i < cidx(iidx+1); i++) + { + int idx2 = q_perm[ridx(i)]; + work[idx2] = work[idx2] - tmp * data(i); + } + } + } + double atmp = 0; + for (int i = 0; i < j+1; i++) + { + atmp += ::abs(work[i]); + work[i] = 0.; + } + if (atmp > ainvnorm) + ainvnorm = atmp; + } + } + else + { + retval = b; + Complex *x_vec = retval.fortran_vec (); + + for (int j = 0; j < b_nc; j++) + { + int offset = j * nr; + for (int k = 0; k < nr; k++) + { + if (x_vec[k+offset] != 0.) + { + if (ridx(cidx(k)) != k) + { + err = -2; + goto triangular_error; + } + + Complex tmp = x_vec[k+offset] / + data(cidx(k)); + x_vec[k+offset] = tmp; + for (int i = cidx(k)+1; i < cidx(k+1); i++) + { + int iidx = ridx(i); + x_vec[iidx+offset] = + x_vec[iidx+offset] - tmp * data(i); + } + } + } + } + + // Calculation of 1-norm of inv(*this) + OCTAVE_LOCAL_BUFFER (Complex, work, nr); + for (int i = 0; i < nr; i++) + work[i] = 0.; + + for (int j = 0; j < nr; j++) + { + work[j] = 1.; + + for (int k = j; k < nr; k++) + { + + if (work[k] != 0.) + { + Complex tmp = work[k] / data(cidx(k)); + work[k] = tmp; + for (int i = cidx(k)+1; i < cidx(k+1); i++) + { + int iidx = ridx(i); + work[iidx] = work[iidx] - tmp * data(i); + } + } + } + double atmp = 0; + for (int i = j; i < nr; i++) + { + atmp += ::abs(work[i]); + work[i] = 0.; + } + if (atmp > ainvnorm) + ainvnorm = atmp; + } + + } + + rcond = 1. / ainvnorm / anorm; + + triangular_error: + if (err != 0) + { + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("SparseComplexMatrix::solve matrix singular to machine precision, rcond = %g", + rcond); + } + + volatile double rcond_plus_one = rcond + 1.0; + + if (rcond_plus_one == 1.0 || xisnan (rcond)) + { + err = -2; + + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("matrix singular to machine precision, rcond = %g", + rcond); + } + } + else + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +SparseComplexMatrix +SparseComplexMatrix::ltsolve (SparseType &mattype, const SparseComplexMatrix& b, + int& err, double& rcond, + solve_singularity_handler sing_handler) const +{ + SparseComplexMatrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + int typ = mattype.type (); + mattype.info (); + + if (typ == SparseType::Permuted_Lower || + typ == SparseType::Lower) + { + double anorm = 0.; + double ainvnorm = 0.; + rcond = 0.; + + // Calculate the 1-norm of matrix for rcond calculation + for (int j = 0; j < nr; j++) + { + double atmp = 0.; + for (int i = cidx(j); i < cidx(j+1); i++) + atmp += ::abs(data(i)); + if (atmp > anorm) + anorm = atmp; + } + + int b_nr = b.rows (); + int b_nc = b.cols (); + int b_nz = b.nnz (); + retval = SparseComplexMatrix (b_nr, b_nc, b_nz); + retval.xcidx(0) = 0; + int ii = 0; + int x_nz = b_nz; + + if (typ == SparseType::Permuted_Lower) + { + OCTAVE_LOCAL_BUFFER (Complex, work, nr); + int *p_perm = mattype.triangular_row_perm (); + int *q_perm = mattype.triangular_col_perm (); + + (*current_liboctave_warning_handler) + ("SparseComplexMatrix::solve XXX FIXME XXX permuted triangular code not tested"); + + for (int j = 0; j < b_nc; j++) + { + for (int i = 0; i < nr; i++) + work[i] = 0.; + for (int i = b.cidx(j); i < b.cidx(j+1); i++) + work[b.ridx(i)] = b.data(i); + + for (int k = 0; k < nr; k++) + { + int iidx = q_perm[k]; + if (work[iidx] != 0.) + { + if (ridx(cidx(iidx)) != iidx) + { + err = -2; + goto triangular_error; + } + + Complex tmp = work[iidx] / data(cidx(iidx+1)-1); + work[iidx] = tmp; + for (int i = cidx(iidx)+1; i < cidx(iidx+1); i++) + { + int idx2 = q_perm[ridx(i)]; + work[idx2] = + work[idx2] - tmp * data(i); + } + } + } + + // Count non-zeros in work vector and adjust space in + // retval if needed + int new_nnz = 0; + for (int i = 0; i < nr; i++) + if (work[i] != 0.) + new_nnz++; + + if (ii + new_nnz > x_nz) + { + // Resize the sparse matrix + int sz = new_nnz * (b_nc - j) + x_nz; + retval.change_capacity (sz); + x_nz = sz; + } + + for (int i = 0; i < nr; i++) + if (work[p_perm[i]] != 0.) + { + retval.xridx(ii) = i; + retval.xdata(ii++) = work[p_perm[i]]; + } + retval.xcidx(j+1) = ii; + } + + retval.maybe_compress (); + + // Calculation of 1-norm of inv(*this) + for (int i = 0; i < nr; i++) + work[i] = 0.; + + for (int j = 0; j < nr; j++) + { + work[q_perm[j]] = 1.; + + for (int k = 0; k < nr; k++) + { + int iidx = q_perm[k]; + + if (work[iidx] != 0.) + { + Complex tmp = work[iidx] / data(cidx(iidx+1)-1); + work[iidx] = tmp; + for (int i = cidx(iidx)+1; i < cidx(iidx+1); i++) + { + int idx2 = q_perm[ridx(i)]; + work[idx2] = work[idx2] - tmp * data(i); + } + } + } + double atmp = 0; + for (int i = 0; i < j+1; i++) + { + atmp += ::abs(work[i]); + work[i] = 0.; + } + if (atmp > ainvnorm) + ainvnorm = atmp; + } + } + else + { + OCTAVE_LOCAL_BUFFER (Complex, work, nr); + + for (int j = 0; j < b_nc; j++) + { + for (int i = 0; i < nr; i++) + work[i] = 0.; + for (int i = b.cidx(j); i < b.cidx(j+1); i++) + work[b.ridx(i)] = b.data(i); + + for (int k = 0; k < nr; k++) + { + if (work[k] != 0.) + { + if (ridx(cidx(k)) != k) + { + err = -2; + goto triangular_error; + } + + Complex tmp = work[k] / data(cidx(k)); + work[k] = tmp; + for (int i = cidx(k)+1; i < cidx(k+1); i++) + { + int iidx = ridx(i); + work[iidx] = work[iidx] - tmp * data(i); + } + } + } + + // Count non-zeros in work vector and adjust space in + // retval if needed + int new_nnz = 0; + for (int i = 0; i < nr; i++) + if (work[i] != 0.) + new_nnz++; + + if (ii + new_nnz > x_nz) + { + // Resize the sparse matrix + int sz = new_nnz * (b_nc - j) + x_nz; + retval.change_capacity (sz); + x_nz = sz; + } + + for (int i = 0; i < nr; i++) + if (work[i] != 0.) + { + retval.xridx(ii) = i; + retval.xdata(ii++) = work[i]; + } + retval.xcidx(j+1) = ii; + } + + retval.maybe_compress (); + + // Calculation of 1-norm of inv(*this) + for (int i = 0; i < nr; i++) + work[i] = 0.; + + for (int j = 0; j < nr; j++) + { + work[j] = 1.; + + for (int k = j; k < nr; k++) + { + + if (work[k] != 0.) + { + Complex tmp = work[k] / data(cidx(k)); + work[k] = tmp; + for (int i = cidx(k)+1; i < cidx(k+1); i++) + { + int iidx = ridx(i); + work[iidx] = work[iidx] - tmp * data(i); + } + } + } + double atmp = 0; + for (int i = j; i < nr; i++) + { + atmp += ::abs(work[i]); + work[i] = 0.; + } + if (atmp > ainvnorm) + ainvnorm = atmp; + } + + } + + rcond = 1. / ainvnorm / anorm; + + triangular_error: + if (err != 0) + { + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("SparseComplexMatrix::solve matrix singular to machine precision, rcond = %g", + rcond); + } + + volatile double rcond_plus_one = rcond + 1.0; + + if (rcond_plus_one == 1.0 || xisnan (rcond)) + { + err = -2; + + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("matrix singular to machine precision, rcond = %g", + rcond); + } + } + else + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +ComplexMatrix +SparseComplexMatrix::trisolve (SparseType &mattype, const Matrix& b, int& err, + double& rcond, + solve_singularity_handler sing_handler) const +{ + ComplexMatrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + volatile int typ = mattype.type (); + mattype.info (); + + if (typ == SparseType::Tridiagonal_Hermitian) + { + OCTAVE_LOCAL_BUFFER (Complex, D, nr); + OCTAVE_LOCAL_BUFFER (Complex, DL, nr - 1); + + if (mattype.is_dense ()) + { + int ii = 0; + + for (int j = 0; j < nc-1; j++) + { + D[j] = data(ii++); + DL[j] = data(ii); + ii += 2; + } + D[nc-1] = data(ii); + } + else + { + D[0] = 0.; + for (int i = 0; i < nr - 1; i++) + { + D[i+1] = 0.; + DL[i] = 0.; + } + + for (int j = 0; j < nc; j++) + for (int i = cidx(j); i < cidx(j+1); i++) + { + if (ridx(i) == j) + D[j] = data(i); + else if (ridx(i) == j + 1) + DL[j] = data(i); + } + } + + int b_nc = b.cols(); + retval = ComplexMatrix (b); + Complex *result = retval.fortran_vec (); + + F77_XFCN (zptsv, ZPTSV, (nr, b_nc, D, DL, result, + b.rows(), err)); + + if (f77_exception_encountered) + (*current_liboctave_error_handler) + ("unrecoverable error in zptsv"); + else if (err != 0) + { + err = 0; + mattype.mark_as_unsymmetric (); + typ = SparseType::Tridiagonal; + } + else + rcond = 1.; + } + + if (typ == SparseType::Tridiagonal) + { + OCTAVE_LOCAL_BUFFER (Complex, DU, nr - 1); + OCTAVE_LOCAL_BUFFER (Complex, D, nr); + OCTAVE_LOCAL_BUFFER (Complex, DL, nr - 1); + + if (mattype.is_dense ()) + { + int ii = 0; + + for (int j = 0; j < nc-1; j++) + { + D[j] = data(ii++); + DL[j] = data(ii++); + DU[j] = data(ii++); + } + D[nc-1] = data(ii); + } + else + { + D[0] = 0.; + for (int i = 0; i < nr - 1; i++) + { + D[i+1] = 0.; + DL[i] = 0.; + DU[i] = 0.; + } + + for (int j = 0; j < nc; j++) + for (int i = cidx(j); i < cidx(j+1); i++) + { + if (ridx(i) == j) + D[j] = data(i); + else if (ridx(i) == j + 1) + DL[j] = data(i); + else if (ridx(i) == j - 1) + DU[j] = data(i); + } + } + + int b_nc = b.cols(); + retval = ComplexMatrix (b); + Complex *result = retval.fortran_vec (); + + F77_XFCN (zgtsv, ZGTSV, (nr, b_nc, DL, D, DU, result, + b.rows(), err)); + + if (f77_exception_encountered) + (*current_liboctave_error_handler) + ("unrecoverable error in zgtsv"); + else if (err != 0) + { + rcond = 0.; + err = -2; + + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("matrix singular to machine precision"); + + } + else + rcond = 1.; + } + else if (typ != SparseType::Tridiagonal_Hermitian) + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +SparseComplexMatrix +SparseComplexMatrix::trisolve (SparseType &mattype, const SparseMatrix& b, + int& err, double& rcond, + solve_singularity_handler sing_handler) const +{ + SparseComplexMatrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + int typ = mattype.type (); + mattype.info (); + + // Note can't treat symmetric case as there is no dpttrf function + if (typ == SparseType::Tridiagonal || + typ == SparseType::Tridiagonal_Hermitian) + { + OCTAVE_LOCAL_BUFFER (Complex, DU2, nr - 2); + OCTAVE_LOCAL_BUFFER (Complex, DU, nr - 1); + OCTAVE_LOCAL_BUFFER (Complex, D, nr); + OCTAVE_LOCAL_BUFFER (Complex, DL, nr - 1); + Array ipvt (nr); + int *pipvt = ipvt.fortran_vec (); + + if (mattype.is_dense ()) + { + int ii = 0; + + for (int j = 0; j < nc-1; j++) + { + D[j] = data(ii++); + DL[j] = data(ii++); + DU[j] = data(ii++); + } + D[nc-1] = data(ii); + } + else + { + D[0] = 0.; + for (int i = 0; i < nr - 1; i++) + { + D[i+1] = 0.; + DL[i] = 0.; + DU[i] = 0.; + } + + for (int j = 0; j < nc; j++) + for (int i = cidx(j); i < cidx(j+1); i++) + { + if (ridx(i) == j) + D[j] = data(i); + else if (ridx(i) == j + 1) + DL[j] = data(i); + else if (ridx(i) == j - 1) + DU[j] = data(i); + } + } + + F77_XFCN (zgttrf, ZGTTRF, (nr, DL, D, DU, DU2, pipvt, err)); + + if (f77_exception_encountered) + (*current_liboctave_error_handler) + ("unrecoverable error in zgttrf"); + else + { + rcond = 0.0; + if (err != 0) + { + err = -2; + + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("matrix singular to machine precision"); + + } + else + { + char job = 'N'; + volatile int x_nz = b.nnz (); + int b_nc = b.cols (); + retval = SparseComplexMatrix (nr, b_nc, x_nz); + retval.xcidx(0) = 0; + volatile int ii = 0; + + OCTAVE_LOCAL_BUFFER (Complex, work, nr); + + for (volatile int j = 0; j < b_nc; j++) + { + for (int i = 0; i < nr; i++) + work[i] = 0.; + for (int i = b.cidx(j); i < b.cidx(j+1); i++) + work[b.ridx(i)] = b.data(i); + + F77_XFCN (zgttrs, ZGTTRS, + (F77_CONST_CHAR_ARG2 (&job, 1), + nr, 1, DL, D, DU, DU2, pipvt, + work, b.rows (), err + F77_CHAR_ARG_LEN (1))); + + if (f77_exception_encountered) + { + (*current_liboctave_error_handler) + ("unrecoverable error in zgttrs"); + break; + } + + // Count non-zeros in work vector and adjust + // space in retval if needed + int new_nnz = 0; + for (int i = 0; i < nr; i++) + if (work[i] != 0.) + new_nnz++; + + if (ii + new_nnz > x_nz) + { + // Resize the sparse matrix + int sz = new_nnz * (b_nc - j) + x_nz; + retval.change_capacity (sz); + x_nz = sz; + } + + for (int i = 0; i < nr; i++) + if (work[i] != 0.) + { + retval.xridx(ii) = i; + retval.xdata(ii++) = work[i]; + } + retval.xcidx(j+1) = ii; + } + + retval.maybe_compress (); + } + } + } + else if (typ != SparseType::Tridiagonal_Hermitian) + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +ComplexMatrix +SparseComplexMatrix::trisolve (SparseType &mattype, const ComplexMatrix& b, + int& err, double& rcond, + solve_singularity_handler sing_handler) const +{ + ComplexMatrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + volatile int typ = mattype.type (); + mattype.info (); + + // Note can't treat symmetric case as there is no dpttrf function + if (typ == SparseType::Tridiagonal_Hermitian) + { + OCTAVE_LOCAL_BUFFER (Complex, D, nr); + OCTAVE_LOCAL_BUFFER (Complex, DL, nr - 1); + + if (mattype.is_dense ()) + { + int ii = 0; + + for (int j = 0; j < nc-1; j++) + { + D[j] = data(ii++); + DL[j] = data(ii); + ii += 2; + } + D[nc-1] = data(ii); + } + else + { + D[0] = 0.; + for (int i = 0; i < nr - 1; i++) + { + D[i+1] = 0.; + DL[i] = 0.; + } + + for (int j = 0; j < nc; j++) + for (int i = cidx(j); i < cidx(j+1); i++) + { + if (ridx(i) == j) + D[j] = data(i); + else if (ridx(i) == j + 1) + DL[j] = data(i); + } + } + + int b_nr = b.rows (); + int b_nc = b.cols(); + rcond = 1.; + + retval = ComplexMatrix (b); + Complex *result = retval.fortran_vec (); + + F77_XFCN (zptsv, ZPTSV, (nr, b_nc, D, DL, result, + b_nr, err)); + + if (f77_exception_encountered) + { + (*current_liboctave_error_handler) + ("unrecoverable error in zptsv"); + err = -1; + } + else if (err != 0) + { + err = 0; + mattype.mark_as_unsymmetric (); + typ = SparseType::Tridiagonal; + } + } + + if (typ == SparseType::Tridiagonal) + { + OCTAVE_LOCAL_BUFFER (Complex, DU, nr - 1); + OCTAVE_LOCAL_BUFFER (Complex, D, nr); + OCTAVE_LOCAL_BUFFER (Complex, DL, nr - 1); + + if (mattype.is_dense ()) + { + int ii = 0; + + for (int j = 0; j < nc-1; j++) + { + D[j] = data(ii++); + DL[j] = data(ii++); + DU[j] = data(ii++); + } + D[nc-1] = data(ii); + } + else + { + D[0] = 0.; + for (int i = 0; i < nr - 1; i++) + { + D[i+1] = 0.; + DL[i] = 0.; + DU[i] = 0.; + } + + for (int j = 0; j < nc; j++) + for (int i = cidx(j); i < cidx(j+1); i++) + { + if (ridx(i) == j) + D[j] = data(i); + else if (ridx(i) == j + 1) + DL[j] = data(i); + else if (ridx(i) == j - 1) + DU[j] = data(i); + } + } + + int b_nr = b.rows(); + int b_nc = b.cols(); + rcond = 1.; + + retval = ComplexMatrix (b); + Complex *result = retval.fortran_vec (); + + F77_XFCN (zgtsv, ZGTSV, (nr, b_nc, DL, D, DU, result, + b_nr, err)); + + if (f77_exception_encountered) + { + (*current_liboctave_error_handler) + ("unrecoverable error in zgtsv"); + err = -1; + } + else if (err != 0) + { + rcond = 0.; + err = -2; + + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("matrix singular to machine precision"); + } + } + else if (typ != SparseType::Tridiagonal_Hermitian) + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +SparseComplexMatrix +SparseComplexMatrix::trisolve (SparseType &mattype, + const SparseComplexMatrix& b, int& err, double& rcond, + solve_singularity_handler sing_handler) const +{ + SparseComplexMatrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + int typ = mattype.type (); + mattype.info (); + + // Note can't treat symmetric case as there is no dpttrf function + if (typ == SparseType::Tridiagonal || + typ == SparseType::Tridiagonal_Hermitian) + { + OCTAVE_LOCAL_BUFFER (Complex, DU2, nr - 2); + OCTAVE_LOCAL_BUFFER (Complex, DU, nr - 1); + OCTAVE_LOCAL_BUFFER (Complex, D, nr); + OCTAVE_LOCAL_BUFFER (Complex, DL, nr - 1); + Array ipvt (nr); + int *pipvt = ipvt.fortran_vec (); + + if (mattype.is_dense ()) + { + int ii = 0; + + for (int j = 0; j < nc-1; j++) + { + D[j] = data(ii++); + DL[j] = data(ii++); + DU[j] = data(ii++); + } + D[nc-1] = data(ii); + } + else + { + D[0] = 0.; + for (int i = 0; i < nr - 1; i++) + { + D[i+1] = 0.; + DL[i] = 0.; + DU[i] = 0.; + } + + for (int j = 0; j < nc; j++) + for (int i = cidx(j); i < cidx(j+1); i++) + { + if (ridx(i) == j) + D[j] = data(i); + else if (ridx(i) == j + 1) + DL[j] = data(i); + else if (ridx(i) == j - 1) + DU[j] = data(i); + } + } + + F77_XFCN (zgttrf, ZGTTRF, (nr, DL, D, DU, DU2, pipvt, err)); + + if (f77_exception_encountered) + (*current_liboctave_error_handler) + ("unrecoverable error in zgttrf"); + else + { + rcond = 0.0; + if (err != 0) + { + err = -2; + + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("matrix singular to machine precision"); + } + else + { + rcond = 1.; + char job = 'N'; + int b_nr = b.rows (); + int b_nc = b.cols (); + OCTAVE_LOCAL_BUFFER (Complex, Bx, b_nr); + + // Take a first guess that the number of non-zero terms + // will be as many as in b + volatile int x_nz = b.nnz (); + volatile int ii = 0; + retval = SparseComplexMatrix (b_nr, b_nc, x_nz); + + retval.xcidx(0) = 0; + for (volatile int j = 0; j < b_nc; j++) + { + + for (int i = 0; i < b_nr; i++) + Bx[i] = b (i,j); + + F77_XFCN (zgttrs, ZGTTRS, + (F77_CONST_CHAR_ARG2 (&job, 1), + nr, 1, DL, D, DU, DU2, pipvt, + Bx, b_nr, err + F77_CHAR_ARG_LEN (1))); + + if (f77_exception_encountered) + { + (*current_liboctave_error_handler) + ("unrecoverable error in zgttrs"); + break; + } + + if (err != 0) + { + (*current_liboctave_error_handler) + ("SparseComplexMatrix::solve solve failed"); + + err = -1; + break; + } + + // Count non-zeros in work vector and adjust + // space in retval if needed + int new_nnz = 0; + for (int i = 0; i < nr; i++) + if (Bx[i] != 0.) + new_nnz++; + + if (ii + new_nnz > x_nz) + { + // Resize the sparse matrix + int sz = new_nnz * (b_nc - j) + x_nz; + retval.change_capacity (sz); + x_nz = sz; + } + + for (int i = 0; i < nr; i++) + if (Bx[i] != 0.) + { + retval.xridx(ii) = i; + retval.xdata(ii++) = Bx[i]; + } + + retval.xcidx(j+1) = ii; + } + + retval.maybe_compress (); + } + } + } + else if (typ != SparseType::Tridiagonal_Hermitian) + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +ComplexMatrix +SparseComplexMatrix::bsolve (SparseType &mattype, const Matrix& b, int& err, + double& rcond, + solve_singularity_handler sing_handler) const +{ + ComplexMatrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + volatile int typ = mattype.type (); + mattype.info (); + + if (typ == SparseType::Banded_Hermitian) + { + int n_lower = mattype.nlower (); + int ldm = n_lower + 1; + ComplexMatrix m_band (ldm, nc); + Complex *tmp_data = m_band.fortran_vec (); + + if (! mattype.is_dense ()) + { + int ii = 0; + + for (int j = 0; j < ldm; j++) + for (int i = 0; i < nc; i++) + tmp_data[ii++] = 0.; + } + + for (int j = 0; j < nc; j++) + for (int i = cidx(j); i < cidx(j+1); i++) + { + int ri = ridx (i); + if (ri >= j) + m_band(ri - j, j) = data(i); + } + + // Calculate the norm of the matrix, for later use. + // double anorm = m_band.abs().sum().row(0).max(); + + char job = 'L'; + F77_XFCN (zpbtrf, ZPBTRF, (F77_CONST_CHAR_ARG2 (&job, 1), + nr, n_lower, tmp_data, ldm, err + F77_CHAR_ARG_LEN (1))); + + if (f77_exception_encountered) + (*current_liboctave_error_handler) + ("unrecoverable error in zpbtrf"); + else + { + rcond = 0.0; + if (err != 0) + { + // Matrix is not positive definite!! Fall through to + // unsymmetric banded solver. + mattype.mark_as_unsymmetric (); + typ = SparseType::Banded; + err = 0; + } + else + { + // Unfortunately, the time to calculate the condition + // number is dominant for narrow banded matrices and + // so we rely on the "err" flag from xPBTRF to flag + // singularity. The commented code below is left here + // for reference + + //Array z (3 * nr); + //Complex *pz = z.fortran_vec (); + //Array iz (nr); + //int *piz = iz.fortran_vec (); + // + //F77_XFCN (zpbcon, ZGBCON, + // (F77_CONST_CHAR_ARG2 (&job, 1), + // nr, n_lower, tmp_data, ldm, + // anorm, rcond, pz, piz, err + // F77_CHAR_ARG_LEN (1))); + // + // + //if (f77_exception_encountered) + // (*current_liboctave_error_handler) + // ("unrecoverable error in zpbcon"); + // + //if (err != 0) + // err = -2; + // + //volatile double rcond_plus_one = rcond + 1.0; + // + //if (rcond_plus_one == 1.0 || xisnan (rcond)) + // { + // err = -2; + // + // if (sing_handler) + // sing_handler (rcond); + // else + // (*current_liboctave_error_handler) + // ("matrix singular to machine precision, rcond = %g", + // rcond); + // } + //else + // REST OF CODE, EXCEPT rcond=1 + + rcond = 1.; + retval = ComplexMatrix (b); + Complex *result = retval.fortran_vec (); + + int b_nc = b.cols (); + + F77_XFCN (zpbtrs, ZPBTRS, + (F77_CONST_CHAR_ARG2 (&job, 1), + nr, n_lower, b_nc, tmp_data, + ldm, result, b.rows(), err + F77_CHAR_ARG_LEN (1))); + + if (f77_exception_encountered) + (*current_liboctave_error_handler) + ("unrecoverable error in zpbtrs"); + + if (err != 0) + { + (*current_liboctave_error_handler) + ("SparseMatrix::solve solve failed"); + err = -1; + } + } + } + } + + if (typ == SparseType::Banded) + { + // Create the storage for the banded form of the sparse matrix + int n_upper = mattype.nupper (); + int n_lower = mattype.nlower (); + int ldm = n_upper + 2 * n_lower + 1; + + ComplexMatrix m_band (ldm, nc); + Complex *tmp_data = m_band.fortran_vec (); + + if (! mattype.is_dense ()) + { + int ii = 0; + + for (int j = 0; j < ldm; j++) + for (int i = 0; i < nc; i++) + tmp_data[ii++] = 0.; + } + + for (int j = 0; j < nc; j++) + for (int i = cidx(j); i < cidx(j+1); i++) + m_band(ridx(i) - j + n_lower + n_upper, j) = data(i); + + Array ipvt (nr); + int *pipvt = ipvt.fortran_vec (); + + F77_XFCN (zgbtrf, ZGBTRF, (nr, nr, n_lower, n_upper, tmp_data, + ldm, pipvt, err)); + + if (f77_exception_encountered) + (*current_liboctave_error_handler) + ("unrecoverable error in zgbtrf"); + else + { + // Throw-away extra info LAPACK gives so as to not + // change output. + rcond = 0.0; + if (err != 0) + { + err = -2; + + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("matrix singular to machine precision"); + + } + else + { + char job = '1'; + + // Unfortunately, the time to calculate the condition + // number is dominant for narrow banded matrices and + // so we rely on the "err" flag from xPBTRF to flag + // singularity. The commented code below is left here + // for reference + + //F77_XFCN (zgbcon, ZGBCON, + // (F77_CONST_CHAR_ARG2 (&job, 1), + // nc, n_lower, n_upper, tmp_data, ldm, pipvt, + // anorm, rcond, pz, piz, err + // F77_CHAR_ARG_LEN (1))); + // + //if (f77_exception_encountered) + // (*current_liboctave_error_handler) + // ("unrecoverable error in zgbcon"); + // + // if (err != 0) + // err = -2; + // + //volatile double rcond_plus_one = rcond + 1.0; + // + //if (rcond_plus_one == 1.0 || xisnan (rcond)) + // { + // err = -2; + // + // if (sing_handler) + // sing_handler (rcond); + // else + // (*current_liboctave_error_handler) + // ("matrix singular to machine precision, rcond = %g", + // rcond); + // } + //else + // REST OF CODE, EXCEPT rcond=1 + + rcond = 1.; + retval = ComplexMatrix (b); + Complex *result = retval.fortran_vec (); + + int b_nc = b.cols (); + + job = 'N'; + F77_XFCN (zgbtrs, ZGBTRS, + (F77_CONST_CHAR_ARG2 (&job, 1), + nr, n_lower, n_upper, b_nc, tmp_data, + ldm, pipvt, result, b.rows(), err + F77_CHAR_ARG_LEN (1))); + + if (f77_exception_encountered) + (*current_liboctave_error_handler) + ("unrecoverable error in zgbtrs"); + } + } + } + else if (typ != SparseType::Banded_Hermitian) + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +SparseComplexMatrix +SparseComplexMatrix::bsolve (SparseType &mattype, const SparseMatrix& b, + int& err, double& rcond, + solve_singularity_handler sing_handler) const +{ + SparseComplexMatrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + volatile int typ = mattype.type (); + mattype.info (); + + if (typ == SparseType::Banded_Hermitian) + { + int n_lower = mattype.nlower (); + int ldm = n_lower + 1; + + ComplexMatrix m_band (ldm, nc); + Complex *tmp_data = m_band.fortran_vec (); + + if (! mattype.is_dense ()) + { + int ii = 0; + + for (int j = 0; j < ldm; j++) + for (int i = 0; i < nc; i++) + tmp_data[ii++] = 0.; + } + + for (int j = 0; j < nc; j++) + for (int i = cidx(j); i < cidx(j+1); i++) + { + int ri = ridx (i); + if (ri >= j) + m_band(ri - j, j) = data(i); + } + + char job = 'L'; + F77_XFCN (zpbtrf, ZPBTRF, (F77_CONST_CHAR_ARG2 (&job, 1), + nr, n_lower, tmp_data, ldm, err + F77_CHAR_ARG_LEN (1))); + + if (f77_exception_encountered) + (*current_liboctave_error_handler) + ("unrecoverable error in zpbtrf"); + else + { + rcond = 0.0; + if (err != 0) + { + mattype.mark_as_unsymmetric (); + typ = SparseType::Banded; + err = 0; + } + else + { + rcond = 1.; + int b_nr = b.rows (); + int b_nc = b.cols (); + OCTAVE_LOCAL_BUFFER (Complex, Bx, b_nr); + + // Take a first guess that the number of non-zero terms + // will be as many as in b + volatile int x_nz = b.nnz (); + volatile int ii = 0; + retval = SparseComplexMatrix (b_nr, b_nc, x_nz); + + retval.xcidx(0) = 0; + for (volatile int j = 0; j < b_nc; j++) + { + for (int i = 0; i < b_nr; i++) + Bx[i] = b.elem (i, j); + + F77_XFCN (zpbtrs, ZPBTRS, + (F77_CONST_CHAR_ARG2 (&job, 1), + nr, n_lower, 1, tmp_data, + ldm, Bx, b_nr, err + F77_CHAR_ARG_LEN (1))); + + if (f77_exception_encountered) + { + (*current_liboctave_error_handler) + ("unrecoverable error in dpbtrs"); + err = -1; + break; + } + + if (err != 0) + { + (*current_liboctave_error_handler) + ("SparseComplexMatrix::solve solve failed"); + err = -1; + break; + } + + for (int i = 0; i < b_nr; i++) + { + Complex tmp = Bx[i]; + if (tmp != 0.0) + { + if (ii == x_nz) + { + // Resize the sparse matrix + int sz = x_nz * (b_nc - j) / b_nc; + sz = (sz > 10 ? sz : 10) + x_nz; + retval.change_capacity (sz); + x_nz = sz; + } + retval.xdata(ii) = tmp; + retval.xridx(ii++) = i; + } + } + retval.xcidx(j+1) = ii; + } + + retval.maybe_compress (); + } + } + } + + if (typ == SparseType::Banded) + { + // Create the storage for the banded form of the sparse matrix + int n_upper = mattype.nupper (); + int n_lower = mattype.nlower (); + int ldm = n_upper + 2 * n_lower + 1; + + ComplexMatrix m_band (ldm, nc); + Complex *tmp_data = m_band.fortran_vec (); + + if (! mattype.is_dense ()) + { + int ii = 0; + + for (int j = 0; j < ldm; j++) + for (int i = 0; i < nc; i++) + tmp_data[ii++] = 0.; + } + + for (int j = 0; j < nc; j++) + for (int i = cidx(j); i < cidx(j+1); i++) + m_band(ridx(i) - j + n_lower + n_upper, j) = data(i); + + Array ipvt (nr); + int *pipvt = ipvt.fortran_vec (); + + F77_XFCN (zgbtrf, ZGBTRF, (nr, nr, n_lower, n_upper, tmp_data, + ldm, pipvt, err)); + + if (f77_exception_encountered) + (*current_liboctave_error_handler) + ("unrecoverable error in zgbtrf"); + else + { + rcond = 0.0; + if (err != 0) + { + err = -2; + + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("matrix singular to machine precision"); + + } + else + { + char job = 'N'; + volatile int x_nz = b.nnz (); + int b_nc = b.cols (); + retval = SparseComplexMatrix (nr, b_nc, x_nz); + retval.xcidx(0) = 0; + volatile int ii = 0; + + OCTAVE_LOCAL_BUFFER (Complex, work, nr); + + for (volatile int j = 0; j < b_nc; j++) + { + for (int i = 0; i < nr; i++) + work[i] = 0.; + for (int i = b.cidx(j); i < b.cidx(j+1); i++) + work[b.ridx(i)] = b.data(i); + + F77_XFCN (zgbtrs, ZGBTRS, + (F77_CONST_CHAR_ARG2 (&job, 1), + nr, n_lower, n_upper, 1, tmp_data, + ldm, pipvt, work, b.rows (), err + F77_CHAR_ARG_LEN (1))); + + if (f77_exception_encountered) + { + (*current_liboctave_error_handler) + ("unrecoverable error in zgbtrs"); + break; + } + + // Count non-zeros in work vector and adjust + // space in retval if needed + int new_nnz = 0; + for (int i = 0; i < nr; i++) + if (work[i] != 0.) + new_nnz++; + + if (ii + new_nnz > x_nz) + { + // Resize the sparse matrix + int sz = new_nnz * (b_nc - j) + x_nz; + retval.change_capacity (sz); + x_nz = sz; + } + + for (int i = 0; i < nr; i++) + if (work[i] != 0.) + { + retval.xridx(ii) = i; + retval.xdata(ii++) = work[i]; + } + retval.xcidx(j+1) = ii; + } + + retval.maybe_compress (); + } + } + } + else if (typ != SparseType::Banded_Hermitian) + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +ComplexMatrix +SparseComplexMatrix::bsolve (SparseType &mattype, const ComplexMatrix& b, + int& err, double& rcond, + solve_singularity_handler sing_handler) const +{ + ComplexMatrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + volatile int typ = mattype.type (); + mattype.info (); + + if (typ == SparseType::Banded_Hermitian) + { + int n_lower = mattype.nlower (); + int ldm = n_lower + 1; + + ComplexMatrix m_band (ldm, nc); + Complex *tmp_data = m_band.fortran_vec (); + + if (! mattype.is_dense ()) + { + int ii = 0; + + for (int j = 0; j < ldm; j++) + for (int i = 0; i < nc; i++) + tmp_data[ii++] = 0.; + } + + for (int j = 0; j < nc; j++) + for (int i = cidx(j); i < cidx(j+1); i++) + { + int ri = ridx (i); + if (ri >= j) + m_band(ri - j, j) = data(i); + } + + char job = 'L'; + F77_XFCN (zpbtrf, ZPBTRF, (F77_CONST_CHAR_ARG2 (&job, 1), + nr, n_lower, tmp_data, ldm, err + F77_CHAR_ARG_LEN (1))); + + if (f77_exception_encountered) + (*current_liboctave_error_handler) + ("unrecoverable error in zpbtrf"); + else + { + rcond = 0.0; + if (err != 0) + { + // Matrix is not positive definite!! Fall through to + // unsymmetric banded solver. + mattype.mark_as_unsymmetric (); + typ = SparseType::Banded; + err = 0; + } + else + { + rcond = 1.; + int b_nr = b.rows (); + int b_nc = b.cols (); + retval = ComplexMatrix (b); + Complex *result = retval.fortran_vec (); + + F77_XFCN (zpbtrs, ZPBTRS, + (F77_CONST_CHAR_ARG2 (&job, 1), + nr, n_lower, b_nc, tmp_data, + ldm, result, b_nr, err + F77_CHAR_ARG_LEN (1))); + + if (f77_exception_encountered) + { + (*current_liboctave_error_handler) + ("unrecoverable error in zpbtrs"); + err = -1; + } + + if (err != 0) + { + (*current_liboctave_error_handler) + ("SparseComplexMatrix::solve solve failed"); + err = -1; + } + } + } + } + + if (typ == SparseType::Banded) + { + // Create the storage for the banded form of the sparse matrix + int n_upper = mattype.nupper (); + int n_lower = mattype.nlower (); + int ldm = n_upper + 2 * n_lower + 1; + + ComplexMatrix m_band (ldm, nc); + Complex *tmp_data = m_band.fortran_vec (); + + if (! mattype.is_dense ()) + { + int ii = 0; + + for (int j = 0; j < ldm; j++) + for (int i = 0; i < nc; i++) + tmp_data[ii++] = 0.; + } + + for (int j = 0; j < nc; j++) + for (int i = cidx(j); i < cidx(j+1); i++) + m_band(ridx(i) - j + n_lower + n_upper, j) = data(i); + + Array ipvt (nr); + int *pipvt = ipvt.fortran_vec (); + + F77_XFCN (zgbtrf, ZGBTRF, (nr, nr, n_lower, n_upper, tmp_data, + ldm, pipvt, err)); + + if (f77_exception_encountered) + (*current_liboctave_error_handler) + ("unrecoverable error in zgbtrf"); + else + { + rcond = 0.0; + if (err != 0) + { + err = -2; + + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("matrix singular to machine precision"); + + } + else + { + char job = 'N'; + int b_nc = b.cols (); + retval = ComplexMatrix (b); + Complex *result = retval.fortran_vec (); + + F77_XFCN (zgbtrs, ZGBTRS, + (F77_CONST_CHAR_ARG2 (&job, 1), + nr, n_lower, n_upper, b_nc, tmp_data, + ldm, pipvt, result, b.rows (), err + F77_CHAR_ARG_LEN (1))); + + if (f77_exception_encountered) + { + (*current_liboctave_error_handler) + ("unrecoverable error in dgbtrs"); + } + } + } + } + else if (typ != SparseType::Banded_Hermitian) + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +SparseComplexMatrix +SparseComplexMatrix::bsolve (SparseType &mattype, const SparseComplexMatrix& b, + int& err, double& rcond, + solve_singularity_handler sing_handler) const +{ + SparseComplexMatrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + volatile int typ = mattype.type (); + mattype.info (); + + if (typ == SparseType::Banded_Hermitian) + { + int n_lower = mattype.nlower (); + int ldm = n_lower + 1; + + ComplexMatrix m_band (ldm, nc); + Complex *tmp_data = m_band.fortran_vec (); + + if (! mattype.is_dense ()) + { + int ii = 0; + + for (int j = 0; j < ldm; j++) + for (int i = 0; i < nc; i++) + tmp_data[ii++] = 0.; + } + + for (int j = 0; j < nc; j++) + for (int i = cidx(j); i < cidx(j+1); i++) + { + int ri = ridx (i); + if (ri >= j) + m_band(ri - j, j) = data(i); + } + + char job = 'L'; + F77_XFCN (zpbtrf, ZPBTRF, (F77_CONST_CHAR_ARG2 (&job, 1), + nr, n_lower, tmp_data, ldm, err + F77_CHAR_ARG_LEN (1))); + + if (f77_exception_encountered) + (*current_liboctave_error_handler) + ("unrecoverable error in zpbtrf"); + else + { + rcond = 0.0; + if (err != 0) + { + // Matrix is not positive definite!! Fall through to + // unsymmetric banded solver. + mattype.mark_as_unsymmetric (); + typ = SparseType::Banded; + + err = 0; + } + else + { + rcond = 1.; + int b_nr = b.rows (); + int b_nc = b.cols (); + OCTAVE_LOCAL_BUFFER (Complex, Bx, b_nr); + + // Take a first guess that the number of non-zero terms + // will be as many as in b + volatile int x_nz = b.nnz (); + volatile int ii = 0; + retval = SparseComplexMatrix (b_nr, b_nc, x_nz); + + retval.xcidx(0) = 0; + for (volatile int j = 0; j < b_nc; j++) + { + + for (int i = 0; i < b_nr; i++) + Bx[i] = b (i,j); + + F77_XFCN (zpbtrs, ZPBTRS, + (F77_CONST_CHAR_ARG2 (&job, 1), + nr, n_lower, 1, tmp_data, + ldm, Bx, b_nr, err + F77_CHAR_ARG_LEN (1))); + + if (f77_exception_encountered) + { + (*current_liboctave_error_handler) + ("unrecoverable error in zpbtrs"); + err = -1; + break; + } + + if (err != 0) + { + (*current_liboctave_error_handler) + ("SparseMatrix::solve solve failed"); + err = -1; + break; + } + + + // Count non-zeros in work vector and adjust + // space in retval if needed + int new_nnz = 0; + for (int i = 0; i < nr; i++) + if (Bx[i] != 0.) + new_nnz++; + + if (ii + new_nnz > x_nz) + { + // Resize the sparse matrix + int sz = new_nnz * (b_nc - j) + x_nz; + retval.change_capacity (sz); + x_nz = sz; + } + + for (int i = 0; i < nr; i++) + if (Bx[i] != 0.) + { + retval.xridx(ii) = i; + retval.xdata(ii++) = Bx[i]; + } + + retval.xcidx(j+1) = ii; + } + + retval.maybe_compress (); + } + } + } + + if (typ == SparseType::Banded) + { + // Create the storage for the banded form of the sparse matrix + int n_upper = mattype.nupper (); + int n_lower = mattype.nlower (); + int ldm = n_upper + 2 * n_lower + 1; + + ComplexMatrix m_band (ldm, nc); + Complex *tmp_data = m_band.fortran_vec (); + + if (! mattype.is_dense ()) + { + int ii = 0; + + for (int j = 0; j < ldm; j++) + for (int i = 0; i < nc; i++) + tmp_data[ii++] = 0.; + } + + for (int j = 0; j < nc; j++) + for (int i = cidx(j); i < cidx(j+1); i++) + m_band(ridx(i) - j + n_lower + n_upper, j) = data(i); + + Array ipvt (nr); + int *pipvt = ipvt.fortran_vec (); + + F77_XFCN (zgbtrf, ZGBTRF, (nr, nr, n_lower, n_upper, tmp_data, + ldm, pipvt, err)); + + if (f77_exception_encountered) + (*current_liboctave_error_handler) + ("unrecoverable error in xgbtrf"); + else + { + rcond = 0.0; + if (err != 0) + { + err = -2; + + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("matrix singular to machine precision"); + + } + else + { + char job = 'N'; + volatile int x_nz = b.nnz (); + int b_nc = b.cols (); + retval = SparseComplexMatrix (nr, b_nc, x_nz); + retval.xcidx(0) = 0; + volatile int ii = 0; + + OCTAVE_LOCAL_BUFFER (Complex, Bx, nr); + + for (volatile int j = 0; j < b_nc; j++) + { + for (int i = 0; i < nr; i++) + Bx[i] = 0.; + + for (int i = b.cidx(j); i < b.cidx(j+1); i++) + Bx[b.ridx(i)] = b.data(i); + + F77_XFCN (zgbtrs, ZGBTRS, + (F77_CONST_CHAR_ARG2 (&job, 1), + nr, n_lower, n_upper, 1, tmp_data, + ldm, pipvt, Bx, b.rows (), err + F77_CHAR_ARG_LEN (1))); + + if (f77_exception_encountered) + { + (*current_liboctave_error_handler) + ("unrecoverable error in dgbtrs"); + break; + } + + // Count non-zeros in work vector and adjust + // space in retval if needed + int new_nnz = 0; + for (int i = 0; i < nr; i++) + if (Bx[i] != 0.) + new_nnz++; + + if (ii + new_nnz > x_nz) + { + // Resize the sparse matrix + int sz = new_nnz * (b_nc - j) + x_nz; + retval.change_capacity (sz); + x_nz = sz; + } + + for (int i = 0; i < nr; i++) + if (Bx[i] != 0.) + { + retval.xridx(ii) = i; + retval.xdata(ii++) = Bx[i]; + } + retval.xcidx(j+1) = ii; + } + + retval.maybe_compress (); + } + } + } + else if (typ != SparseType::Banded_Hermitian) + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +void * +SparseComplexMatrix::factorize (int& err, double &rcond, Matrix &Control, + Matrix &Info, + solve_singularity_handler sing_handler) const +{ + // The return values + void *Numeric; + err = 0; + + // Setup the control parameters + Control = Matrix (UMFPACK_CONTROL, 1); + double *control = Control.fortran_vec (); + umfpack_zi_defaults (control); + + double tmp = Voctave_sparse_controls.get_key ("spumoni"); + if (!xisnan (tmp)) + Control (UMFPACK_PRL) = tmp; + tmp = Voctave_sparse_controls.get_key ("piv_tol"); + if (!xisnan (tmp)) + { + Control (UMFPACK_SYM_PIVOT_TOLERANCE) = tmp; + Control (UMFPACK_PIVOT_TOLERANCE) = tmp; + } + + // Set whether we are allowed to modify Q or not + tmp = Voctave_sparse_controls.get_key ("autoamd"); + if (!xisnan (tmp)) + Control (UMFPACK_FIXQ) = tmp; + + umfpack_zi_report_control (control); + + const int *Ap = cidx (); + const int *Ai = ridx (); + const Complex *Ax = data (); + int nr = rows (); + int nc = cols (); + + umfpack_zi_report_matrix (nr, nc, Ap, Ai, X_CAST (const double *, Ax), + NULL, 1, control); + + void *Symbolic; + Info = Matrix (1, UMFPACK_INFO); + double *info = Info.fortran_vec (); + int status = umfpack_zi_qsymbolic (nr, nc, Ap, Ai, + X_CAST (const double *, Ax), + NULL, NULL, &Symbolic, control, info); + + if (status < 0) + { + (*current_liboctave_error_handler) + ("SparseComplexMatrix::solve symbolic factorization failed"); + err = -1; + + umfpack_zi_report_status (control, status); + umfpack_zi_report_info (control, info); + + umfpack_zi_free_symbolic (&Symbolic) ; + } + else + { + umfpack_zi_report_symbolic (Symbolic, control); + + status = umfpack_zi_numeric (Ap, Ai, X_CAST (const double *, Ax), NULL, + Symbolic, &Numeric, control, info) ; + umfpack_zi_free_symbolic (&Symbolic) ; + +#ifdef HAVE_LSSOLVE + rcond = Info (UMFPACK_RCOND); + volatile double rcond_plus_one = rcond + 1.0; + + if (status == UMFPACK_WARNING_singular_matrix || + rcond_plus_one == 1.0 || xisnan (rcond)) + { + umfpack_zi_report_numeric (Numeric, control); + + err = -2; + + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("SparseComplexMatrix::solve matrix singular to machine precision, rcond = %g", + rcond); + + } + else +#endif + if (status < 0) + { + (*current_liboctave_error_handler) + ("SparseComplexMatrix::solve numeric factorization failed"); + + umfpack_zi_report_status (control, status); + umfpack_zi_report_info (control, info); + + err = -1; + } + else + { + umfpack_zi_report_numeric (Numeric, control); + } + } + + if (err != 0) + umfpack_zi_free_numeric (&Numeric); + + return Numeric; +} + +ComplexMatrix +SparseComplexMatrix::fsolve (SparseType &mattype, const Matrix& b, int& err, + double& rcond, + solve_singularity_handler sing_handler) const +{ + ComplexMatrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + volatile int typ = mattype.type (); + mattype.info (); + + if (typ == SparseType::Hermitian) + { + // XXX FIXME XXX Write the cholesky solver and only fall + // through if cholesky factorization fails + + (*current_liboctave_warning_handler) + ("SparseMatrix::solve XXX FIXME XXX Cholesky code not done"); + + mattype.mark_as_unsymmetric (); + typ = SparseType::Full; + } + + if (typ == SparseType::Full) + { + Matrix Control, Info; + void *Numeric = factorize (err, rcond, Control, Info, + sing_handler); + + if (err == 0) + { + int b_nr = b.rows (); + int b_nc = b.cols (); + int status = 0; + double *control = Control.fortran_vec (); + double *info = Info.fortran_vec (); + const int *Ap = cidx (); + const int *Ai = ridx (); + const Complex *Ax = data (); + const double *Bx = b.fortran_vec (); + OCTAVE_LOCAL_BUFFER (double, Bz, b_nr); + for (int i = 0; i < b_nr; i++) + Bz[i] = 0.; + + retval.resize (b_nr, b_nc); + Complex *Xx = retval.fortran_vec (); + + for (int j = 0, iidx = 0; j < b_nc; j++, iidx += b_nr) + { + status = umfpack_zi_solve (UMFPACK_A, Ap, Ai, + X_CAST (const double *, Ax), + NULL, + X_CAST (double *, &Xx[iidx]), + NULL, + &Bx[iidx], Bz, Numeric, + control, info); + if (status < 0) + { + (*current_liboctave_error_handler) + ("SparseComplexMatrix::solve solve failed"); + + umfpack_zi_report_status (control, status); + + err = -1; + + break; + } + } + +#ifndef HAVE_LSSOLVE + rcond = Info (UMFPACK_RCOND); + volatile double rcond_plus_one = rcond + 1.0; + + if (status == UMFPACK_WARNING_singular_matrix || + rcond_plus_one == 1.0 || xisnan (rcond)) + { + err = -2; + + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("SparseComplexMatrix::solve matrix singular to machine precision, rcond = %g", + rcond); + + } +#endif + + umfpack_zi_report_info (control, info); + + umfpack_zi_free_numeric (&Numeric); + } + } + else if (typ != SparseType::Hermitian) + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +SparseComplexMatrix +SparseComplexMatrix::fsolve (SparseType &mattype, const SparseMatrix& b, + int& err, double& rcond, + solve_singularity_handler sing_handler) const +{ + SparseComplexMatrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + int typ = mattype.type (); + mattype.info (); + + if (typ == SparseType::Hermitian) + { + // XXX FIXME XXX Write the cholesky solver and only fall + // through if cholesky factorization fails + + (*current_liboctave_warning_handler) + ("SparseMatrix::solve XXX FIXME XXX Cholesky code not done"); + + mattype.mark_as_unsymmetric (); + typ = SparseType::Full; + } + + if (typ == SparseType::Full) + { + Matrix Control, Info; + void *Numeric = factorize (err, rcond, Control, Info, sing_handler); + + if (err == 0) + { + int b_nr = b.rows (); + int b_nc = b.cols (); + int status = 0; + double *control = Control.fortran_vec (); + double *info = Info.fortran_vec (); + const int *Ap = cidx (); + const int *Ai = ridx (); + const Complex *Ax = data (); + + OCTAVE_LOCAL_BUFFER (double, Bx, b_nr); + OCTAVE_LOCAL_BUFFER (double, Bz, b_nr); + for (int i = 0; i < b_nr; i++) + Bz[i] = 0.; + + // Take a first guess that the number of non-zero terms + // will be as many as in b + int x_nz = b.nnz (); + int ii = 0; + retval = SparseComplexMatrix (b_nr, b_nc, x_nz); + + OCTAVE_LOCAL_BUFFER (Complex, Xx, b_nr); + + retval.xcidx(0) = 0; + for (int j = 0; j < b_nc; j++) + { + + for (int i = 0; i < b_nr; i++) + Bx[i] = b.elem (i, j); + + status = umfpack_zi_solve (UMFPACK_A, Ap, Ai, + X_CAST (const double *, Ax), + NULL, + X_CAST (double *, Xx), NULL, + Bx, Bz, Numeric, control, + info); + if (status < 0) + { + (*current_liboctave_error_handler) + ("SparseComplexMatrix::solve solve failed"); + + umfpack_zi_report_status (control, status); + + err = -1; + + break; + } + + for (int i = 0; i < b_nr; i++) + { + Complex tmp = Xx[i]; + if (tmp != 0.0) + { + if (ii == x_nz) + { + // Resize the sparse matrix + int sz = x_nz * (b_nc - j) / b_nc; + sz = (sz > 10 ? sz : 10) + x_nz; + retval.change_capacity (sz); + x_nz = sz; + } + retval.xdata(ii) = tmp; + retval.xridx(ii++) = i; + } + } + retval.xcidx(j+1) = ii; + } + + retval.maybe_compress (); + +#ifndef HAVE_LSSOLVE + rcond = Info (UMFPACK_RCOND); + volatile double rcond_plus_one = rcond + 1.0; + + if (status == UMFPACK_WARNING_singular_matrix || + rcond_plus_one == 1.0 || xisnan (rcond)) + { + err = -2; + + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("SparseComplexMatrix::solve matrix singular to machine precision, rcond = %g", + rcond); + + } +#endif + + umfpack_zi_report_info (control, info); + + umfpack_zi_free_numeric (&Numeric); + } + } + else if (typ != SparseType::Hermitian) + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +ComplexMatrix +SparseComplexMatrix::fsolve (SparseType &mattype, const ComplexMatrix& b, + int& err, double& rcond, + solve_singularity_handler sing_handler) const +{ + ComplexMatrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + int typ = mattype.type (); + mattype.info (); + + if (typ == SparseType::Hermitian) + { + // XXX FIXME XXX Write the cholesky solver and only fall + // through if cholesky factorization fails + + (*current_liboctave_warning_handler) + ("SparseMatrix::solve XXX FIXME XXX Cholesky code not done"); + + mattype.mark_as_unsymmetric (); + typ = SparseType::Full; + } + + if (typ == SparseType::Full) + { + Matrix Control, Info; + void *Numeric = factorize (err, rcond, Control, Info, sing_handler); + + if (err == 0) + { + int b_nr = b.rows (); + int b_nc = b.cols (); + int status = 0; + double *control = Control.fortran_vec (); + double *info = Info.fortran_vec (); + const int *Ap = cidx (); + const int *Ai = ridx (); + const Complex *Ax = data (); + const Complex *Bx = b.fortran_vec (); + + retval.resize (b_nr, b_nc); + Complex *Xx = retval.fortran_vec (); + + for (int j = 0, iidx = 0; j < b_nc; j++, iidx += b_nr) + { + status = + umfpack_zi_solve (UMFPACK_A, Ap, Ai, + X_CAST (const double *, Ax), + NULL, X_CAST (double *, &Xx[iidx]), + NULL, X_CAST (const double *, &Bx[iidx]), + NULL, Numeric, control, info); + + if (status < 0) + { + (*current_liboctave_error_handler) + ("SparseComplexMatrix::solve solve failed"); + + umfpack_zi_report_status (control, status); + + err = -1; + + break; + } + } + +#ifndef HAVE_LSSOLVE + rcond = Info (UMFPACK_RCOND); + volatile double rcond_plus_one = rcond + 1.0; + + if (status == UMFPACK_WARNING_singular_matrix || + rcond_plus_one == 1.0 || xisnan (rcond)) + { + err = -2; + + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("SparseComplexMatrix::solve matrix singular to machine precision, rcond = %g", + rcond); + + } +#endif + + umfpack_zi_report_info (control, info); + + umfpack_zi_free_numeric (&Numeric); + } + } + else if (typ != SparseType::Hermitian) + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +SparseComplexMatrix +SparseComplexMatrix::fsolve (SparseType &mattype, const SparseComplexMatrix& b, + int& err, double& rcond, + solve_singularity_handler sing_handler) const +{ + SparseComplexMatrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + int typ = mattype.type (); + mattype.info (); + + if (typ == SparseType::Hermitian) + { + // XXX FIXME XXX Write the cholesky solver and only fall + // through if cholesky factorization fails + + (*current_liboctave_warning_handler) + ("SparseMatrix::solve XXX FIXME XXX Cholesky code not done"); + + mattype.mark_as_unsymmetric (); + typ = SparseType::Full; + } + + if (typ == SparseType::Full) + { + Matrix Control, Info; + void *Numeric = factorize (err, rcond, Control, Info, sing_handler); + + if (err == 0) + { + int b_nr = b.rows (); + int b_nc = b.cols (); + int status = 0; + double *control = Control.fortran_vec (); + double *info = Info.fortran_vec (); + const int *Ap = cidx (); + const int *Ai = ridx (); + const Complex *Ax = data (); + + OCTAVE_LOCAL_BUFFER (Complex, Bx, b_nr); + + // Take a first guess that the number of non-zero terms + // will be as many as in b + int x_nz = b.nnz (); + int ii = 0; + retval = SparseComplexMatrix (b_nr, b_nc, x_nz); + + OCTAVE_LOCAL_BUFFER (Complex, Xx, b_nr); + + retval.xcidx(0) = 0; + for (int j = 0; j < b_nc; j++) + { + for (int i = 0; i < b_nr; i++) + Bx[i] = b (i,j); + + status = umfpack_zi_solve (UMFPACK_A, Ap, Ai, + X_CAST (const double *, Ax), + NULL, X_CAST (double *, Xx), + NULL, X_CAST (double *, Bx), + NULL, Numeric, control, info); + + if (status < 0) + { + (*current_liboctave_error_handler) + ("SparseComplexMatrix::solve solve failed"); + + umfpack_zi_report_status (control, status); + + err = -1; + + break; + } + + for (int i = 0; i < b_nr; i++) + { + Complex tmp = Xx[i]; + if (tmp != 0.0) + { + if (ii == x_nz) + { + // Resize the sparse matrix + int sz = x_nz * (b_nc - j) / b_nc; + sz = (sz > 10 ? sz : 10) + x_nz; + retval.change_capacity (sz); + x_nz = sz; + } + retval.xdata(ii) = tmp; + retval.xridx(ii++) = i; + } + } + retval.xcidx(j+1) = ii; + } + + retval.maybe_compress (); + +#ifndef HAVE_LSSOLVE + rcond = Info (UMFPACK_RCOND); + volatile double rcond_plus_one = rcond + 1.0; + + if (status == UMFPACK_WARNING_singular_matrix || + rcond_plus_one == 1.0 || xisnan (rcond)) + { + err = -2; + + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("SparseComplexMatrix::solve matrix singular to machine precision, rcond = %g", + rcond); + + } +#endif + + umfpack_zi_report_info (control, info); + + umfpack_zi_free_numeric (&Numeric); + } + } + else if (typ != SparseType::Hermitian) + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +ComplexMatrix +SparseComplexMatrix::solve (SparseType &mattype, const Matrix& b) const +{ + int info; + double rcond; + return solve (mattype, b, info, rcond, 0); +} + +ComplexMatrix +SparseComplexMatrix::solve (SparseType &mattype, const Matrix& b, + int& info) const +{ + double rcond; + return solve (mattype, b, info, rcond, 0); +} + +ComplexMatrix +SparseComplexMatrix::solve (SparseType &mattype, const Matrix& b, int& info, + double& rcond) const +{ + return solve (mattype, b, info, rcond, 0); +} + +ComplexMatrix +SparseComplexMatrix::solve (SparseType &mattype, const Matrix& b, int& err, + double& rcond, + solve_singularity_handler sing_handler) const +{ + int typ = mattype.type (); + + if (typ == SparseType::Unknown) + typ = mattype.type (*this); + + if (typ == SparseType::Diagonal || typ == SparseType::Permuted_Diagonal) + return dsolve (mattype, b, err, rcond, sing_handler); + else if (typ == SparseType::Upper || typ == SparseType::Permuted_Upper) + return utsolve (mattype, b, err, rcond, sing_handler); + else if (typ == SparseType::Lower || typ == SparseType::Permuted_Lower) + return ltsolve (mattype, b, err, rcond, sing_handler); + else if (typ == SparseType::Banded || typ == SparseType::Banded_Hermitian) + return bsolve (mattype, b, err, rcond, sing_handler); + else if (typ == SparseType::Tridiagonal || + typ == SparseType::Tridiagonal_Hermitian) + return trisolve (mattype, b, err, rcond, sing_handler); + else if (typ == SparseType::Full || typ == SparseType::Hermitian) + return fsolve (mattype, b, err, rcond, sing_handler); + else + { + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + return ComplexMatrix (); + } +} + +SparseComplexMatrix +SparseComplexMatrix::solve (SparseType &mattype, const SparseMatrix& b) const +{ + int info; + double rcond; + return solve (mattype, b, info, rcond, 0); +} + +SparseComplexMatrix +SparseComplexMatrix::solve (SparseType &mattype, const SparseMatrix& b, + int& info) const +{ + double rcond; + return solve (mattype, b, info, rcond, 0); +} + +SparseComplexMatrix +SparseComplexMatrix::solve (SparseType &mattype, const SparseMatrix& b, + int& info, double& rcond) const +{ + return solve (mattype, b, info, rcond, 0); +} + +SparseComplexMatrix +SparseComplexMatrix::solve (SparseType &mattype, const SparseMatrix& b, + int& err, double& rcond, + solve_singularity_handler sing_handler) const +{ + int typ = mattype.type (); + + if (typ == SparseType::Unknown) + typ = mattype.type (*this); + + if (typ == SparseType::Diagonal || typ == SparseType::Permuted_Diagonal) + return dsolve (mattype, b, err, rcond, sing_handler); + else if (typ == SparseType::Upper || typ == SparseType::Permuted_Upper) + return utsolve (mattype, b, err, rcond, sing_handler); + else if (typ == SparseType::Lower || typ == SparseType::Permuted_Lower) + return ltsolve (mattype, b, err, rcond, sing_handler); + else if (typ == SparseType::Banded || typ == SparseType::Banded_Hermitian) + return bsolve (mattype, b, err, rcond, sing_handler); + else if (typ == SparseType::Tridiagonal || + typ == SparseType::Tridiagonal_Hermitian) + return trisolve (mattype, b, err, rcond, sing_handler); + else if (typ == SparseType::Full || typ == SparseType::Hermitian) + return fsolve (mattype, b, err, rcond, sing_handler); + else + { + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + return SparseComplexMatrix (); + } +} + +ComplexMatrix +SparseComplexMatrix::solve (SparseType &mattype, const ComplexMatrix& b) const +{ + int info; + double rcond; + return solve (mattype, b, info, rcond, 0); +} + +ComplexMatrix +SparseComplexMatrix::solve (SparseType &mattype, const ComplexMatrix& b, + int& info) const +{ + double rcond; + return solve (mattype, b, info, rcond, 0); +} + +ComplexMatrix +SparseComplexMatrix::solve (SparseType &mattype, const ComplexMatrix& b, + int& info, double& rcond) const +{ + return solve (mattype, b, info, rcond, 0); +} + +ComplexMatrix +SparseComplexMatrix::solve (SparseType &mattype, const ComplexMatrix& b, + int& err, double& rcond, + solve_singularity_handler sing_handler) const +{ + int typ = mattype.type (); + + if (typ == SparseType::Unknown) + typ = mattype.type (*this); + + if (typ == SparseType::Diagonal || typ == SparseType::Permuted_Diagonal) + return dsolve (mattype, b, err, rcond, sing_handler); + else if (typ == SparseType::Upper || typ == SparseType::Permuted_Upper) + return utsolve (mattype, b, err, rcond, sing_handler); + else if (typ == SparseType::Lower || typ == SparseType::Permuted_Lower) + return ltsolve (mattype, b, err, rcond, sing_handler); + else if (typ == SparseType::Banded || typ == SparseType::Banded_Hermitian) + return bsolve (mattype, b, err, rcond, sing_handler); + else if (typ == SparseType::Tridiagonal || + typ == SparseType::Tridiagonal_Hermitian) + return trisolve (mattype, b, err, rcond, sing_handler); + else if (typ == SparseType::Full || typ == SparseType::Hermitian) + return fsolve (mattype, b, err, rcond, sing_handler); + else + { + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + return ComplexMatrix (); + } +} + +SparseComplexMatrix +SparseComplexMatrix::solve (SparseType &mattype, + const SparseComplexMatrix& b) const +{ + int info; + double rcond; + return solve (mattype, b, info, rcond, 0); +} + +SparseComplexMatrix +SparseComplexMatrix::solve (SparseType &mattype, const SparseComplexMatrix& b, + int& info) const +{ + double rcond; + return solve (mattype, b, info, rcond, 0); +} + +SparseComplexMatrix +SparseComplexMatrix::solve (SparseType &mattype, const SparseComplexMatrix& b, + int& info, double& rcond) const +{ + return solve (mattype, b, info, rcond, 0); +} + +SparseComplexMatrix +SparseComplexMatrix::solve (SparseType &mattype, const SparseComplexMatrix& b, + int& err, double& rcond, + solve_singularity_handler sing_handler) const +{ + int typ = mattype.type (); + + if (typ == SparseType::Unknown) + typ = mattype.type (*this); + + if (typ == SparseType::Diagonal || typ == SparseType::Permuted_Diagonal) + return dsolve (mattype, b, err, rcond, sing_handler); + else if (typ == SparseType::Upper || typ == SparseType::Permuted_Upper) + return utsolve (mattype, b, err, rcond, sing_handler); + else if (typ == SparseType::Lower || typ == SparseType::Permuted_Lower) + return ltsolve (mattype, b, err, rcond, sing_handler); + else if (typ == SparseType::Banded || typ == SparseType::Banded_Hermitian) + return bsolve (mattype, b, err, rcond, sing_handler); + else if (typ == SparseType::Tridiagonal || + typ == SparseType::Tridiagonal_Hermitian) + return trisolve (mattype, b, err, rcond, sing_handler); + else if (typ == SparseType::Full || typ == SparseType::Hermitian) + return fsolve (mattype, b, err, rcond, sing_handler); + else + { + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + return SparseComplexMatrix (); + } +} + +ComplexColumnVector +SparseComplexMatrix::solve (SparseType &mattype, const ColumnVector& b) const +{ + int info; double rcond; + return solve (mattype, b, info, rcond); +} + +ComplexColumnVector +SparseComplexMatrix::solve (SparseType &mattype, const ColumnVector& b, + int& info) const +{ + double rcond; + return solve (mattype, b, info, rcond); +} + +ComplexColumnVector +SparseComplexMatrix::solve (SparseType &mattype, const ColumnVector& b, + int& info, double& rcond) const +{ + return solve (mattype, b, info, rcond, 0); +} + +ComplexColumnVector +SparseComplexMatrix::solve (SparseType &mattype, const ColumnVector& b, + int& info, double& rcond, + solve_singularity_handler sing_handler) const +{ + Matrix tmp (b); + return solve (mattype, tmp, info, rcond, sing_handler).column (0); +} + +ComplexColumnVector +SparseComplexMatrix::solve (SparseType &mattype, + const ComplexColumnVector& b) const +{ + int info; + double rcond; + return solve (mattype, b, info, rcond, 0); +} + +ComplexColumnVector +SparseComplexMatrix::solve (SparseType &mattype, const ComplexColumnVector& b, + int& info) const +{ + double rcond; + return solve (mattype, b, info, rcond, 0); +} + +ComplexColumnVector +SparseComplexMatrix::solve (SparseType &mattype, const ComplexColumnVector& b, + int& info, double& rcond) const +{ + return solve (mattype, b, info, rcond, 0); +} + +ComplexColumnVector +SparseComplexMatrix::solve (SparseType &mattype, const ComplexColumnVector& b, + int& info, double& rcond, + solve_singularity_handler sing_handler) const +{ + ComplexMatrix tmp (b); + return solve (mattype, tmp, info, rcond, sing_handler).column (0); +} + +ComplexMatrix +SparseComplexMatrix::solve (const Matrix& b) const +{ + int info; + double rcond; + return solve (b, info, rcond, 0); +} + +ComplexMatrix +SparseComplexMatrix::solve (const Matrix& b, int& info) const +{ + double rcond; + return solve (b, info, rcond, 0); +} + +ComplexMatrix +SparseComplexMatrix::solve (const Matrix& b, int& info, + double& rcond) const +{ + return solve (b, info, rcond, 0); +} + +ComplexMatrix +SparseComplexMatrix::solve (const Matrix& b, int& err, + double& rcond, + solve_singularity_handler sing_handler) const +{ + SparseType mattype (*this); + return solve (mattype, b, err, rcond, sing_handler); +} + +SparseComplexMatrix +SparseComplexMatrix::solve (const SparseMatrix& b) const +{ + int info; + double rcond; + return solve (b, info, rcond, 0); +} + +SparseComplexMatrix +SparseComplexMatrix::solve (const SparseMatrix& b, + int& info) const +{ + double rcond; + return solve (b, info, rcond, 0); +} + +SparseComplexMatrix +SparseComplexMatrix::solve (const SparseMatrix& b, + int& info, double& rcond) const +{ + return solve (b, info, rcond, 0); +} + +SparseComplexMatrix +SparseComplexMatrix::solve (const SparseMatrix& b, + int& err, double& rcond, + solve_singularity_handler sing_handler) const +{ + SparseType mattype (*this); + return solve (mattype, b, err, rcond, sing_handler); +} + +ComplexMatrix +SparseComplexMatrix::solve (const ComplexMatrix& b, + int& info) const +{ + double rcond; + return solve (b, info, rcond, 0); +} + +ComplexMatrix +SparseComplexMatrix::solve (const ComplexMatrix& b, + int& info, double& rcond) const +{ + return solve (b, info, rcond, 0); +} + +ComplexMatrix +SparseComplexMatrix::solve (const ComplexMatrix& b, + int& err, double& rcond, + solve_singularity_handler sing_handler) const +{ + SparseType mattype (*this); + return solve (mattype, b, err, rcond, sing_handler); +} + +SparseComplexMatrix +SparseComplexMatrix::solve (const SparseComplexMatrix& b) const +{ + int info; + double rcond; + return solve (b, info, rcond, 0); +} + +SparseComplexMatrix +SparseComplexMatrix::solve (const SparseComplexMatrix& b, + int& info) const +{ + double rcond; + return solve (b, info, rcond, 0); +} + +SparseComplexMatrix +SparseComplexMatrix::solve (const SparseComplexMatrix& b, + int& info, double& rcond) const +{ + return solve (b, info, rcond, 0); +} + +SparseComplexMatrix +SparseComplexMatrix::solve (const SparseComplexMatrix& b, + int& err, double& rcond, + solve_singularity_handler sing_handler) const +{ + SparseType mattype (*this); + return solve (mattype, b, err, rcond, sing_handler); +} + +ComplexColumnVector +SparseComplexMatrix::solve (const ColumnVector& b) const +{ + int info; double rcond; + return solve (b, info, rcond); +} + +ComplexColumnVector +SparseComplexMatrix::solve (const ColumnVector& b, int& info) const +{ + double rcond; + return solve (b, info, rcond); +} + +ComplexColumnVector +SparseComplexMatrix::solve (const ColumnVector& b, int& info, + double& rcond) const +{ + return solve (b, info, rcond, 0); +} + +ComplexColumnVector +SparseComplexMatrix::solve (const ColumnVector& b, int& info, double& rcond, + solve_singularity_handler sing_handler) const +{ + Matrix tmp (b); + return solve (tmp, info, rcond, sing_handler).column (0); +} + +ComplexColumnVector +SparseComplexMatrix::solve (const ComplexColumnVector& b) const +{ + int info; + double rcond; + return solve (b, info, rcond, 0); +} + +ComplexColumnVector +SparseComplexMatrix::solve (const ComplexColumnVector& b, int& info) const +{ + double rcond; + return solve (b, info, rcond, 0); +} + +ComplexColumnVector +SparseComplexMatrix::solve (const ComplexColumnVector& b, int& info, + double& rcond) const +{ + return solve (b, info, rcond, 0); +} + +ComplexColumnVector +SparseComplexMatrix::solve (const ComplexColumnVector& b, int& info, + double& rcond, + solve_singularity_handler sing_handler) const +{ + ComplexMatrix tmp (b); + return solve (tmp, info, rcond, sing_handler).column (0); +} + +ComplexMatrix +SparseComplexMatrix::lssolve (const Matrix& b) const +{ + int info; + int rank; + return lssolve (b, info, rank); +} + +ComplexMatrix +SparseComplexMatrix::lssolve (const Matrix& b, int& info) const +{ + int rank; + return lssolve (b, info, rank); +} + +ComplexMatrix +SparseComplexMatrix::lssolve (const Matrix& b, int& info, int& rank) const +{ + info = -1; + (*current_liboctave_error_handler) + ("SparseComplexMatrix::lssolve not implemented yet"); + return ComplexMatrix (); +} + +SparseComplexMatrix +SparseComplexMatrix::lssolve (const SparseMatrix& b) const +{ + int info; + int rank; + return lssolve (b, info, rank); +} + +SparseComplexMatrix +SparseComplexMatrix::lssolve (const SparseMatrix& b, int& info) const +{ + int rank; + return lssolve (b, info, rank); +} + +SparseComplexMatrix +SparseComplexMatrix::lssolve (const SparseMatrix& b, int& info, + int& rank) const +{ + info = -1; + (*current_liboctave_error_handler) + ("SparseComplexMatrix::lssolve not implemented yet"); + return SparseComplexMatrix (); +} + +ComplexMatrix +SparseComplexMatrix::lssolve (const ComplexMatrix& b) const +{ + int info; + int rank; + return lssolve (b, info, rank); +} + +ComplexMatrix +SparseComplexMatrix::lssolve (const ComplexMatrix& b, int& info) const +{ + int rank; + return lssolve (b, info, rank); +} + +ComplexMatrix +SparseComplexMatrix::lssolve (const ComplexMatrix& b, int& info, + int& rank) const +{ + info = -1; + (*current_liboctave_error_handler) + ("SparseComplexMatrix::lssolve not implemented yet"); + return ComplexMatrix (); +} + +SparseComplexMatrix +SparseComplexMatrix::lssolve (const SparseComplexMatrix& b) const +{ + int info; + int rank; + return lssolve (b, info, rank); +} + +SparseComplexMatrix +SparseComplexMatrix::lssolve (const SparseComplexMatrix& b, int& info) const +{ + int rank; + return lssolve (b, info, rank); +} + +SparseComplexMatrix +SparseComplexMatrix::lssolve (const SparseComplexMatrix& b, int& info, + int& rank) const +{ + info = -1; + (*current_liboctave_error_handler) + ("SparseComplexMatrix::lssolve not implemented yet"); + return SparseComplexMatrix (); +} + +ComplexColumnVector +SparseComplexMatrix::lssolve (const ColumnVector& b) const +{ + int info; + int rank; + return lssolve (b, info, rank); +} + +ComplexColumnVector +SparseComplexMatrix::lssolve (const ColumnVector& b, int& info) const +{ + int rank; + return lssolve (b, info, rank); +} + +ComplexColumnVector +SparseComplexMatrix::lssolve (const ColumnVector& b, int& info, int& rank) const +{ + info = -1; + (*current_liboctave_error_handler) + ("SparseComplexMatrix::lssolve not implemented yet"); + return ComplexColumnVector (); +} + +ComplexColumnVector +SparseComplexMatrix::lssolve (const ComplexColumnVector& b) const +{ + int info; + int rank; + return lssolve (b, info, rank); +} + +ComplexColumnVector +SparseComplexMatrix::lssolve (const ComplexColumnVector& b, int& info) const +{ + int rank; + return lssolve (b, info, rank); +} + +ComplexColumnVector +SparseComplexMatrix::lssolve (const ComplexColumnVector& b, int& info, + int& rank) const +{ + info = -1; + (*current_liboctave_error_handler) + ("SparseComplexMatrix::lssolve not implemented yet"); + return ComplexColumnVector (); +} + +// unary operations +SparseBoolMatrix +SparseComplexMatrix::operator ! (void) const +{ + int nr = rows (); + int nc = cols (); + int nz1 = nnz (); + int nz2 = nr*nc - nz1; + + SparseBoolMatrix r (nr, nc, nz2); + + int ii = 0; + int jj = 0; + r.cidx (0) = 0; + for (int i = 0; i < nc; i++) + { + for (int j = 0; j < nr; j++) + { + if (jj < cidx(i+1) && ridx(jj) == j) + jj++; + else + { + r.data(ii) = true; + r.ridx(ii++) = j; + } + } + r.cidx (i+1) = ii; + } + + return r; +} + +SparseComplexMatrix +SparseComplexMatrix::squeeze (void) const +{ + return MSparse::squeeze (); +} + +SparseComplexMatrix +SparseComplexMatrix::index (idx_vector& i, int resize_ok) const +{ + return MSparse::index (i, resize_ok); +} + +SparseComplexMatrix +SparseComplexMatrix::index (idx_vector& i, idx_vector& j, int resize_ok) const +{ + return MSparse::index (i, j, resize_ok); +} + +SparseComplexMatrix +SparseComplexMatrix::index (Array& ra_idx, int resize_ok) const +{ + return MSparse::index (ra_idx, resize_ok); +} +SparseComplexMatrix +SparseComplexMatrix::reshape (const dim_vector& new_dims) const +{ + return MSparse::reshape (new_dims); +} + +SparseComplexMatrix +SparseComplexMatrix::permute (const Array& vec, bool inv) const +{ + return MSparse::permute (vec, inv); +} + +SparseComplexMatrix +SparseComplexMatrix::ipermute (const Array& vec) const +{ + return MSparse::ipermute (vec); +} + +// other operations + +SparseComplexMatrix +SparseComplexMatrix::map (c_c_Mapper f) const +{ + int nr = rows (); + int nc = cols (); + int nz = nnz (); + bool f_zero = (f(0.0) == 0.0); + + // Count number of non-zero elements + int nel = (f_zero ? 0 : nr*nc - nz); + for (int i = 0; i < nz; i++) + if (f (data(i)) != 0.0) + nel++; + + SparseComplexMatrix retval (nr, nc, nel); + + if (f_zero) + { + int ii = 0; + for (int j = 0; j < nc; j++) + { + for (int i = 0; i < nr; i++) + { + Complex tmp = f (elem (i, j)); + if (tmp != 0.0) + { + retval.data(ii) = tmp; + retval.ridx(ii++) = i; + } + } + retval.cidx(j+1) = ii; + } + } + else + { + int ii = 0; + for (int j = 0; j < nc; j++) + { + for (int i = cidx(j); i < cidx(j+1); i++) + { + retval.data(ii) = f (elem(i)); + retval.ridx(ii++) = ridx(i); + } + retval.cidx(j+1) = ii; + } + } + + return retval; +} + +SparseMatrix +SparseComplexMatrix::map (d_c_Mapper f) const +{ + int nr = rows (); + int nc = cols (); + int nz = nnz (); + bool f_zero = (f(0.0) == 0.0); + + // Count number of non-zero elements + int nel = (f_zero ? 0 : nr*nc - nz); + for (int i = 0; i < nz; i++) + if (f (data(i)) != 0.0) + nel++; + + SparseMatrix retval (nr, nc, nel); + + if (f_zero) + { + int ii = 0; + for (int j = 0; j < nc; j++) + { + for (int i = 0; i < nr; i++) + { + double tmp = f (elem (i, j)); + if (tmp != 0.0) + { + retval.data(ii) = tmp; + retval.ridx(ii++) = i; + } + } + retval.cidx(j+1) = ii; + } + } + else + { + int ii = 0; + for (int j = 0; j < nc; j++) + { + for (int i = cidx(j); i < cidx(j+1); i++) + { + retval.data(ii) = f (elem(i)); + retval.ridx(ii++) = ridx(i); + } + retval.cidx(j+1) = ii; + } + } + + return retval; +} + +SparseBoolMatrix +SparseComplexMatrix::map (b_c_Mapper f) const +{ + int nr = rows (); + int nc = cols (); + int nz = nnz (); + bool f_zero = f(0.0); + + // Count number of non-zero elements + int nel = (f_zero ? 0 : nr*nc - nz); + for (int i = 0; i < nz; i++) + if (f (data(i)) != 0.0) + nel++; + + SparseBoolMatrix retval (nr, nc, nel); + + if (f_zero) + { + int ii = 0; + for (int j = 0; j < nc; j++) + { + for (int i = 0; i < nr; i++) + { + bool tmp = f (elem (i, j)); + if (tmp) + { + retval.data(ii) = tmp; + retval.ridx(ii++) = i; + } + } + retval.cidx(j+1) = ii; + } + } + else + { + int ii = 0; + for (int j = 0; j < nc; j++) + { + for (int i = cidx(j); i < cidx(j+1); i++) + { + retval.data(ii) = f (elem(i)); + retval.ridx(ii++) = ridx(i); + } + retval.cidx(j+1) = ii; + } + } + + return retval; +} + +SparseComplexMatrix& +SparseComplexMatrix::apply (c_c_Mapper f) +{ + *this = map (f); + return *this; +} + +bool +SparseComplexMatrix::any_element_is_inf_or_nan (void) const +{ + int nel = nnz (); + + for (int i = 0; i < nel; i++) + { + Complex val = data (i); + if (xisinf (val) || xisnan (val)) + return true; + } + + return false; +} + +// Return true if no elements have imaginary components. + +bool +SparseComplexMatrix::all_elements_are_real (void) const +{ + int nel = nnz (); + + for (int i = 0; i < nel; i++) + { + double ip = imag (data (i)); + + if (ip != 0.0 || lo_ieee_signbit (ip)) + return false; + } + + return true; +} + +// Return nonzero if any element of CM has a non-integer real or +// imaginary part. Also extract the largest and smallest (real or +// imaginary) values and return them in MAX_VAL and MIN_VAL. + +bool +SparseComplexMatrix::all_integers (double& max_val, double& min_val) const +{ + int nel = nnz (); + + if (nel == 0) + return false; + + max_val = real(data (0)); + min_val = real(data (0)); + + for (int i = 0; i < nel; i++) + { + Complex val = data (i); + + double r_val = real (val); + double i_val = imag (val); + + if (r_val > max_val) + max_val = r_val; + + if (i_val > max_val) + max_val = i_val; + + if (r_val < min_val) + min_val = r_val; + + if (i_val < min_val) + min_val = i_val; + + if (D_NINT (r_val) != r_val || D_NINT (i_val) != i_val) + return false; + } + + return true; +} + +bool +SparseComplexMatrix::too_large_for_float (void) const +{ + int nel = nnz (); + + for (int i = 0; i < nel; i++) + { + Complex val = data (i); + + double r_val = real (val); + double i_val = imag (val); + + if (r_val > FLT_MAX + || i_val > FLT_MAX + || r_val < FLT_MIN + || i_val < FLT_MIN) + return true; + } + + return false; +} + +// XXX FIXME XXX Do these really belong here? Maybe they should be +// in a base class? + +SparseBoolMatrix +SparseComplexMatrix::all (int dim) const +{ + SPARSE_ALL_OP (dim); +} + +SparseBoolMatrix +SparseComplexMatrix::any (int dim) const +{ + SPARSE_ANY_OP (dim); +} + +SparseComplexMatrix +SparseComplexMatrix::cumprod (int dim) const +{ + SPARSE_CUMPROD (SparseComplexMatrix, Complex, cumprod); +} + +SparseComplexMatrix +SparseComplexMatrix::cumsum (int dim) const +{ + SPARSE_CUMSUM (SparseComplexMatrix, Complex, cumsum); +} + +SparseComplexMatrix +SparseComplexMatrix::prod (int dim) const +{ + SPARSE_REDUCTION_OP (SparseComplexMatrix, Complex, *=, 1.0, 1.0); +} + +SparseComplexMatrix +SparseComplexMatrix::sum (int dim) const +{ + SPARSE_REDUCTION_OP (SparseComplexMatrix, Complex, +=, 0.0, 0.0); +} + +SparseComplexMatrix +SparseComplexMatrix::sumsq (int dim) const +{ +#define ROW_EXPR \ + Complex d = elem (i, j); \ + tmp [i] += d * conj (d) + +#define COL_EXPR \ + Complex d = elem (i, j); \ + tmp [j] += d * conj (d) + + SPARSE_BASE_REDUCTION_OP (SparseComplexMatrix, Complex, ROW_EXPR, + COL_EXPR, 0.0, 0.0); + +#undef ROW_EXPR +#undef COL_EXPR +} + +SparseMatrix SparseComplexMatrix::abs (void) const +{ + int nz = nnz (); + int nc = cols (); + + SparseMatrix retval (rows(), nc, nz); + + for (int i = 0; i < nc + 1; i++) + retval.cidx (i) = cidx (i); + + for (int i = 0; i < nz; i++) + { + retval.data (i) = ::abs (data (i)); + retval.ridx (i) = ridx (i); + } + + return retval; +} + +SparseComplexMatrix +SparseComplexMatrix::diag (int k) const +{ + int nnr = rows (); + int nnc = cols (); + + if (k > 0) + nnc -= k; + else if (k < 0) + nnr += k; + + SparseComplexMatrix d; + + if (nnr > 0 && nnc > 0) + { + int ndiag = (nnr < nnc) ? nnr : nnc; + + // Count the number of non-zero elements + int nel = 0; + if (k > 0) + { + for (int i = 0; i < ndiag; i++) + if (elem (i, i+k) != 0.) + nel++; + } + else if ( k < 0) + { + for (int i = 0; i < ndiag; i++) + if (elem (i-k, i) != 0.) + nel++; + } + else + { + for (int i = 0; i < ndiag; i++) + if (elem (i, i) != 0.) + nel++; + } + + d = SparseComplexMatrix (ndiag, 1, nel); + d.xcidx (0) = 0; + d.xcidx (1) = nel; + + int ii = 0; + if (k > 0) + { + for (int i = 0; i < ndiag; i++) + { + Complex tmp = elem (i, i+k); + if (tmp != 0.) + { + d.xdata (ii) = tmp; + d.xridx (ii++) = i; + } + } + } + else if ( k < 0) + { + for (int i = 0; i < ndiag; i++) + { + Complex tmp = elem (i-k, i); + if (tmp != 0.) + { + d.xdata (ii) = tmp; + d.xridx (ii++) = i; + } + } + } + else + { + for (int i = 0; i < ndiag; i++) + { + Complex tmp = elem (i, i); + if (tmp != 0.) + { + d.xdata (ii) = tmp; + d.xridx (ii++) = i; + } + } + } + } + else + (*current_liboctave_error_handler) + ("diag: requested diagonal out of range"); + + return d; +} + +std::ostream& +operator << (std::ostream& os, const SparseComplexMatrix& a) +{ + int nc = a.cols (); + + // add one to the printed indices to go from + // zero-based to one-based arrays + for (int j = 0; j < nc; j++) { + OCTAVE_QUIT; + for (int i = a.cidx(j); i < a.cidx(j+1); i++) { + os << a.ridx(i) + 1 << " " << j + 1 << " "; + octave_write_complex (os, a.data(i)); + os << "\n"; + } + } + + return os; +} + +std::istream& +operator >> (std::istream& is, SparseComplexMatrix& a) +{ + int nr = a.rows (); + int nc = a.cols (); + int nz = a.nnz (); + + if (nr < 1 || nc < 1) + is.clear (std::ios::badbit); + else + { + int itmp, jtmp, jold = 0; + Complex tmp; + int ii = 0; + + a.cidx (0) = 0; + for (int i = 0; i < nz; i++) + { + is >> itmp; + itmp--; + is >> jtmp; + jtmp--; + tmp = octave_read_complex (is); + + if (is) + { + if (jold != jtmp) + { + for (int j = jold; j < jtmp; j++) + a.cidx(j+1) = ii; + + jold = jtmp; + } + a.data (ii) = tmp; + a.ridx (ii++) = itmp; + } + else + goto done; + } + + for (int j = jold; j < nc; j++) + a.cidx(j+1) = ii; + } + + done: + + return is; +} + +SparseComplexMatrix +operator * (const SparseComplexMatrix& m, const SparseMatrix& a) +{ + SparseComplexMatrix tmp (a); + return m * tmp; +} + +SparseComplexMatrix +operator * (const SparseMatrix& m, const SparseComplexMatrix& a) +{ + SparseComplexMatrix tmp (m); + return tmp * a; +} + +SparseComplexMatrix +operator * (const SparseComplexMatrix& m, const SparseComplexMatrix& a) +{ +#ifdef HAVE_SPARSE_BLAS + // XXX FIXME XXX Isn't there a sparse BLAS ?? +#else + // Use Andy's sparse matrix multiply function + SPARSE_SPARSE_MUL (SparseComplexMatrix, Complex); +#endif +} + +// XXX FIXME XXX -- it would be nice to share code among the min/max +// functions below. + +#define EMPTY_RETURN_CHECK(T) \ + if (nr == 0 || nc == 0) \ + return T (nr, nc); + +SparseComplexMatrix +min (const Complex& c, const SparseComplexMatrix& m) +{ + SparseComplexMatrix result; + + int nr = m.rows (); + int nc = m.columns (); + + EMPTY_RETURN_CHECK (SparseComplexMatrix); + + if (abs(c) == 0.) + return SparseComplexMatrix (nr, nc); + else + { + result = SparseComplexMatrix (m); + + for (int j = 0; j < nc; j++) + for (int i = m.cidx(j); i < m.cidx(j+1); i++) + result.data(i) = xmin(c, m.data(i)); + } + + return result; +} + +SparseComplexMatrix +min (const SparseComplexMatrix& m, const Complex& c) +{ + return min (c, m); +} + +SparseComplexMatrix +min (const SparseComplexMatrix& a, const SparseComplexMatrix& b) +{ + SparseComplexMatrix r; + + if ((a.rows() == b.rows()) && (a.cols() == b.cols())) + { + int a_nr = a.rows (); + int a_nc = a.cols (); + + int b_nr = b.rows (); + int b_nc = b.cols (); + + if (a_nr == 0 || b_nc == 0 || a.nnz () == 0 || b.nnz () == 0) + return SparseComplexMatrix (a_nr, a_nc); + + if (a_nr != b_nr || a_nc != b_nc) + gripe_nonconformant ("min", a_nr, a_nc, b_nr, b_nc); + else + { + r = SparseComplexMatrix (a_nr, a_nc, (a.nnz () + b.nnz ())); + + int jx = 0; + r.cidx (0) = 0; + for (int i = 0 ; i < a_nc ; i++) + { + int ja = a.cidx(i); + int ja_max = a.cidx(i+1); + bool ja_lt_max= ja < ja_max; + + int jb = b.cidx(i); + int jb_max = b.cidx(i+1); + bool jb_lt_max = jb < jb_max; + + while (ja_lt_max || jb_lt_max ) + { + OCTAVE_QUIT; + if ((! jb_lt_max) || + (ja_lt_max && (a.ridx(ja) < b.ridx(jb)))) + { + Complex tmp = xmin (a.data(ja), 0.); + if (tmp != 0.) + { + r.ridx(jx) = a.ridx(ja); + r.data(jx) = tmp; + jx++; + } + ja++; + ja_lt_max= ja < ja_max; + } + else if (( !ja_lt_max ) || + (jb_lt_max && (b.ridx(jb) < a.ridx(ja)) ) ) + { + Complex tmp = xmin (0., b.data(jb)); + if (tmp != 0.) + { + r.ridx(jx) = b.ridx(jb); + r.data(jx) = tmp; + jx++; + } + jb++; + jb_lt_max= jb < jb_max; + } + else + { + Complex tmp = xmin (a.data(ja), b.data(jb)); + if (tmp != 0.) + { + r.data(jx) = tmp; + r.ridx(jx) = a.ridx(ja); + jx++; + } + ja++; + ja_lt_max= ja < ja_max; + jb++; + jb_lt_max= jb < jb_max; + } + } + r.cidx(i+1) = jx; + } + + r.maybe_compress (); + } + } + else + (*current_liboctave_error_handler) ("matrix size mismatch"); + + return r; +} + +SparseComplexMatrix +max (const Complex& c, const SparseComplexMatrix& m) +{ + SparseComplexMatrix result; + + int nr = m.rows (); + int nc = m.columns (); + + EMPTY_RETURN_CHECK (SparseComplexMatrix); + + // Count the number of non-zero elements + if (xmax(c, 0.) != 0.) + { + result = SparseComplexMatrix (nr, nc, c); + for (int j = 0; j < nc; j++) + for (int i = m.cidx(j); i < m.cidx(j+1); i++) + result.xdata(m.ridx(i) + j * nr) = xmax (c, m.data(i)); + } + else + result = SparseComplexMatrix (m); + + return result; +} + +SparseComplexMatrix +max (const SparseComplexMatrix& m, const Complex& c) +{ + return max (c, m); +} + +SparseComplexMatrix +max (const SparseComplexMatrix& a, const SparseComplexMatrix& b) +{ + SparseComplexMatrix r; + + if ((a.rows() == b.rows()) && (a.cols() == b.cols())) + { + int a_nr = a.rows (); + int a_nc = a.cols (); + + int b_nr = b.rows (); + int b_nc = b.cols (); + + if (a_nr == 0 || b_nc == 0) + return SparseComplexMatrix (a_nr, a_nc); + if (a.nnz () == 0) + return SparseComplexMatrix (b); + if (b.nnz () == 0) + return SparseComplexMatrix (a); + + if (a_nr != b_nr || a_nc != b_nc) + gripe_nonconformant ("min", a_nr, a_nc, b_nr, b_nc); + else + { + r = SparseComplexMatrix (a_nr, a_nc, (a.nnz () + b.nnz ())); + + int jx = 0; + r.cidx (0) = 0; + for (int i = 0 ; i < a_nc ; i++) + { + int ja = a.cidx(i); + int ja_max = a.cidx(i+1); + bool ja_lt_max= ja < ja_max; + + int jb = b.cidx(i); + int jb_max = b.cidx(i+1); + bool jb_lt_max = jb < jb_max; + + while (ja_lt_max || jb_lt_max ) + { + OCTAVE_QUIT; + if ((! jb_lt_max) || + (ja_lt_max && (a.ridx(ja) < b.ridx(jb)))) + { + Complex tmp = xmax (a.data(ja), 0.); + if (tmp != 0.) + { + r.ridx(jx) = a.ridx(ja); + r.data(jx) = tmp; + jx++; + } + ja++; + ja_lt_max= ja < ja_max; + } + else if (( !ja_lt_max ) || + (jb_lt_max && (b.ridx(jb) < a.ridx(ja)) ) ) + { + Complex tmp = xmax (0., b.data(jb)); + if (tmp != 0.) + { + r.ridx(jx) = b.ridx(jb); + r.data(jx) = tmp; + jx++; + } + jb++; + jb_lt_max= jb < jb_max; + } + else + { + Complex tmp = xmax (a.data(ja), b.data(jb)); + if (tmp != 0.) + { + r.data(jx) = tmp; + r.ridx(jx) = a.ridx(ja); + jx++; + } + ja++; + ja_lt_max= ja < ja_max; + jb++; + jb_lt_max= jb < jb_max; + } + } + r.cidx(i+1) = jx; + } + + r.maybe_compress (); + } + } + else + (*current_liboctave_error_handler) ("matrix size mismatch"); + + return r; +} + +SPARSE_SMS_CMP_OPS (SparseComplexMatrix, 0.0, real, Complex, + 0.0, real) +SPARSE_SMS_BOOL_OPS (SparseComplexMatrix, Complex, 0.0) + +SPARSE_SSM_CMP_OPS (Complex, 0.0, real, SparseComplexMatrix, + 0.0, real) +SPARSE_SSM_BOOL_OPS (Complex, SparseComplexMatrix, 0.0) + +SPARSE_SMSM_CMP_OPS (SparseComplexMatrix, 0.0, real, SparseComplexMatrix, + 0.0, real) +SPARSE_SMSM_BOOL_OPS (SparseComplexMatrix, SparseComplexMatrix, 0.0) + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/CSparse.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/CSparse.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,431 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#if !defined (octave_CSparse_h) +#define octave_CSparse_h 1 + +#include "dMatrix.h" +#include "dNDArray.h" +#include "CNDArray.h" +#include "dColVector.h" +#include "CColVector.h" +#include "oct-cmplx.h" + +#include "CmplxDET.h" +#include "MSparse.h" +#include "MSparse-defs.h" +#include "Sparse-op-defs.h" +#include "SparseType.h" + +class SparseMatrix; +class SparseBoolMatrix; + +class +SparseComplexMatrix : public MSparse +{ +public: + + typedef void (*solve_singularity_handler) (double rcond); + + SparseComplexMatrix (void) : MSparse () { } + + SparseComplexMatrix (int r, int c) : MSparse (r, c) { } + + explicit SparseComplexMatrix (int r, int c, Complex val) + : MSparse (r, c, val) { } + + SparseComplexMatrix (int r, int c, double val) + : MSparse (r, c, Complex (val)) { } + + SparseComplexMatrix (const SparseComplexMatrix& a) + : MSparse (a) { } + + SparseComplexMatrix (const SparseComplexMatrix& a, const dim_vector& dv) + : MSparse (a, dv) { } + + SparseComplexMatrix (const MSparse& a) : MSparse (a) { } + + explicit SparseComplexMatrix (const ComplexMatrix& a) + : MSparse (a) { } + + explicit SparseComplexMatrix (const ComplexNDArray& a) + : MSparse (a) { } + + explicit SparseComplexMatrix (const Array a, const Array& r, + const Array& c, int nr = -1, + int nc = -1, bool sum_terms = true) + : MSparse (a, r, c, nr, nc, sum_terms) { } + + explicit SparseComplexMatrix (const Array a, + const Array& r, + const Array& c, int nr = -1, + int nc = -1, bool sum_terms = true) + : MSparse (a, r, c, nr, nc, sum_terms) { } + + explicit SparseComplexMatrix (const SparseMatrix& a); + + explicit SparseComplexMatrix (const SparseBoolMatrix& a); + + SparseComplexMatrix (int r, int c, int num_nz) + : MSparse (r, c, num_nz) { } + + SparseComplexMatrix& operator = (const SparseComplexMatrix& a) + { + MSparse::operator = (a); + return *this; + } + + bool operator == (const SparseComplexMatrix& a) const; + bool operator != (const SparseComplexMatrix& a) const; + + bool is_hermitian (void) const; + + SparseComplexMatrix max (int dim = 0) const; + SparseComplexMatrix max (Array2& index, int dim = 0) const; + SparseComplexMatrix min (int dim = 0) const; + SparseComplexMatrix min (Array2& index, int dim = 0) const; + + SparseComplexMatrix& insert (const SparseComplexMatrix& a, int r, int c); + SparseComplexMatrix& insert (const SparseMatrix& a, int r, int c); + + SparseComplexMatrix concat (const SparseComplexMatrix& rb, + const Array& ra_idx); + SparseComplexMatrix concat (const SparseMatrix& rb, + const Array& ra_idx); + + ComplexMatrix matrix_value (void) const; + + SparseComplexMatrix hermitian (void) const; // complex conjugate transpose + SparseComplexMatrix transpose (void) const + { return MSparse::transpose (); } + + friend SparseComplexMatrix conj (const SparseComplexMatrix& a); + + SparseComplexMatrix inverse (void) const; + SparseComplexMatrix inverse (int& info) const; + SparseComplexMatrix inverse (int& info, double& rcond, int force = 0, + int calc_cond = 1) const; + + ComplexDET determinant (void) const; + ComplexDET determinant (int& info) const; + ComplexDET determinant (int& info, double& rcond, + int calc_cond = 1) const; + +private: + // Diagonal matrix solvers + ComplexMatrix dsolve (SparseType &typ, const Matrix& b, int& info, + double& rcond, solve_singularity_handler sing_handler) const; + + ComplexMatrix dsolve (SparseType &typ, const ComplexMatrix& b, int& info, + double& rcond, solve_singularity_handler sing_handler) const; + + SparseComplexMatrix dsolve (SparseType &typ, const SparseMatrix& b, int& info, + double& rcond, solve_singularity_handler sing_handler) const; + + SparseComplexMatrix dsolve (SparseType &typ, const SparseComplexMatrix& b, + int& info, double& rcond, + solve_singularity_handler sing_handler) const; + + // Upper triangular matrix solvers + ComplexMatrix utsolve (SparseType &typ, const Matrix& b, int& info, + double& rcond, solve_singularity_handler sing_handler) const; + + ComplexMatrix utsolve (SparseType &typ, const ComplexMatrix& b, int& info, + double& rcond, solve_singularity_handler sing_handler) const; + + SparseComplexMatrix utsolve (SparseType &typ, const SparseMatrix& b, int& info, + double& rcond, solve_singularity_handler sing_handler) const; + + SparseComplexMatrix utsolve (SparseType &typ, const SparseComplexMatrix& b, + int& info, double& rcond, + solve_singularity_handler sing_handler) const; + + // Lower triangular matrix solvers + ComplexMatrix ltsolve (SparseType &typ, const Matrix& b, int& info, + double& rcond, solve_singularity_handler sing_handler) const; + + ComplexMatrix ltsolve (SparseType &typ, const ComplexMatrix& b, int& info, + double& rcond, solve_singularity_handler sing_handler) const; + + SparseComplexMatrix ltsolve (SparseType &typ, const SparseMatrix& b, int& info, + double& rcond, solve_singularity_handler sing_handler) const; + + SparseComplexMatrix ltsolve (SparseType &typ, const SparseComplexMatrix& b, + int& info, double& rcond, + solve_singularity_handler sing_handler) const; + + // Tridiagonal matrix solvers + ComplexMatrix trisolve (SparseType &typ, const Matrix& b, int& info, + double& rcond, solve_singularity_handler sing_handler) const; + + ComplexMatrix trisolve (SparseType &typ, const ComplexMatrix& b, int& info, + double& rcond, solve_singularity_handler sing_handler) const; + + SparseComplexMatrix trisolve (SparseType &typ, const SparseMatrix& b, int& info, + double& rcond, solve_singularity_handler sing_handler) const; + + SparseComplexMatrix trisolve (SparseType &typ, const SparseComplexMatrix& b, + int& info, double& rcond, + solve_singularity_handler sing_handler) const; + + // Banded matrix solvers (umfpack/cholesky) + ComplexMatrix bsolve (SparseType &typ, const Matrix& b, int& info, + double& rcond, solve_singularity_handler sing_handler) const; + + ComplexMatrix bsolve (SparseType &typ, const ComplexMatrix& b, int& info, + double& rcond, solve_singularity_handler sing_handler) const; + + SparseComplexMatrix bsolve (SparseType &typ, const SparseMatrix& b, int& info, + double& rcond, solve_singularity_handler sing_handler) const; + + SparseComplexMatrix bsolve (SparseType &typ, const SparseComplexMatrix& b, + int& info, double& rcond, + solve_singularity_handler sing_handler) const; + + // Full matrix solvers (umfpack/cholesky) + void * factorize (int& err, double &rcond, Matrix &Control, Matrix &Info, + solve_singularity_handler sing_handler) const; + + ComplexMatrix fsolve (SparseType &typ, const Matrix& b, int& info, + double& rcond, solve_singularity_handler sing_handler) const; + + ComplexMatrix fsolve (SparseType &typ, const ComplexMatrix& b, int& info, + double& rcond, solve_singularity_handler sing_handler) const; + + SparseComplexMatrix fsolve (SparseType &typ, const SparseMatrix& b, int& info, + double& rcond, solve_singularity_handler sing_handler) const; + + SparseComplexMatrix fsolve (SparseType &typ, const SparseComplexMatrix& b, + int& info, double& rcond, + solve_singularity_handler sing_handler) const; + +public: + // Generic interface to solver with no probing of type + ComplexMatrix solve (SparseType &typ, const Matrix& b) const; + ComplexMatrix solve (SparseType &typ, const Matrix& b, int& info) const; + ComplexMatrix solve (SparseType &typ, const Matrix& b, int& info, + double& rcond) const; + ComplexMatrix solve (SparseType &typ, const Matrix& b, int& info, + double& rcond, solve_singularity_handler sing_handler) const; + + ComplexMatrix solve (SparseType &typ, const ComplexMatrix& b) const; + ComplexMatrix solve (SparseType &typ, const ComplexMatrix& b, + int& info) const; + ComplexMatrix solve (SparseType &typ, const ComplexMatrix& b, int& info, + double& rcond) const; + ComplexMatrix solve (SparseType &typ, const ComplexMatrix& b, int& info, + double& rcond, solve_singularity_handler sing_handler) const; + + SparseComplexMatrix solve (SparseType &typ, const SparseMatrix& b) const; + SparseComplexMatrix solve (SparseType &typ, const SparseMatrix& b, + int& info) const; + SparseComplexMatrix solve (SparseType &typ, const SparseMatrix& b, int& info, + double& rcond) const; + SparseComplexMatrix solve (SparseType &typ, const SparseMatrix& b, int& info, + double& rcond, solve_singularity_handler sing_handler) const; + + SparseComplexMatrix solve (SparseType &typ, + const SparseComplexMatrix& b) const; + SparseComplexMatrix solve (SparseType &typ, const SparseComplexMatrix& b, + int& info) const; + SparseComplexMatrix solve (SparseType &typ, const SparseComplexMatrix& b, + int& info, double& rcond) const; + SparseComplexMatrix solve (SparseType &typ, const SparseComplexMatrix& b, int& info, + double& rcond, solve_singularity_handler sing_handler) const; + + ComplexColumnVector solve (SparseType &typ, const ColumnVector& b) const; + ComplexColumnVector solve (SparseType &typ, const ColumnVector& b, + int& info) const; + ComplexColumnVector solve (SparseType &typ, const ColumnVector& b, + int& info, double& rcond) const; + ComplexColumnVector solve (SparseType &typ, const ColumnVector& b, int& info, + double& rcond, solve_singularity_handler sing_handler) const; + + ComplexColumnVector solve (SparseType &typ, + const ComplexColumnVector& b) const; + ComplexColumnVector solve (SparseType &typ, + const ComplexColumnVector& b, int& info) const; + ComplexColumnVector solve (SparseType &typ, const ComplexColumnVector& b, + int& info, double& rcond) const; + ComplexColumnVector solve (SparseType &typ, const ComplexColumnVector& b, + int& info, double& rcond, + solve_singularity_handler sing_handler) const; + + // Generic interface to solver with probing of type + ComplexMatrix solve (const Matrix& b) const; + ComplexMatrix solve (const Matrix& b, int& info) const; + ComplexMatrix solve (const Matrix& b, int& info, double& rcond) const; + ComplexMatrix solve (const Matrix& b, int& info, double& rcond, + solve_singularity_handler sing_handler) const; + + ComplexMatrix solve (const ComplexMatrix& b) const; + ComplexMatrix solve (const ComplexMatrix& b, int& info) const; + ComplexMatrix solve (const ComplexMatrix& b, int& info, + double& rcond) const; + ComplexMatrix solve (const ComplexMatrix& b, int& info, double& rcond, + solve_singularity_handler sing_handler) const; + + SparseComplexMatrix solve (const SparseMatrix& b) const; + SparseComplexMatrix solve (const SparseMatrix& b, int& info) const; + SparseComplexMatrix solve (const SparseMatrix& b, int& info, + double& rcond) const; + SparseComplexMatrix solve (const SparseMatrix& b, int& info, + double& rcond, + solve_singularity_handler sing_handler) const; + + SparseComplexMatrix solve (const SparseComplexMatrix& b) const; + SparseComplexMatrix solve (const SparseComplexMatrix& b, int& info) const; + SparseComplexMatrix solve (const SparseComplexMatrix& b, int& info, + double& rcond) const; + SparseComplexMatrix solve (const SparseComplexMatrix& b, int& info, + double& rcond, + solve_singularity_handler sing_handler) const; + + ComplexColumnVector solve (const ColumnVector& b) const; + ComplexColumnVector solve (const ColumnVector& b, int& info) const; + ComplexColumnVector solve (const ColumnVector& b, int& info, + double& rcond) const; + ComplexColumnVector solve (const ColumnVector& b, int& info, double& rcond, + solve_singularity_handler sing_handler) const; + + ComplexColumnVector solve (const ComplexColumnVector& b) const; + ComplexColumnVector solve (const ComplexColumnVector& b, int& info) const; + ComplexColumnVector solve (const ComplexColumnVector& b, int& info, + double& rcond) const; + ComplexColumnVector solve (const ComplexColumnVector& b, int& info, + double& rcond, + solve_singularity_handler sing_handler) const; + + ComplexMatrix lssolve (const Matrix& b) const; + ComplexMatrix lssolve (const Matrix& b, int& info) const; + ComplexMatrix lssolve (const Matrix& b, int& info, int& rank) const; + + ComplexMatrix lssolve (const ComplexMatrix& b) const; + ComplexMatrix lssolve (const ComplexMatrix& b, int& info) const; + ComplexMatrix lssolve (const ComplexMatrix& b, int& info, + int& rank) const; + + SparseComplexMatrix lssolve (const SparseMatrix& b) const; + SparseComplexMatrix lssolve (const SparseMatrix& b, int& info) const; + SparseComplexMatrix lssolve (const SparseMatrix& b, int& info, + int& rank) const; + + SparseComplexMatrix lssolve (const SparseComplexMatrix& b) const; + SparseComplexMatrix lssolve (const SparseComplexMatrix& b, + int& info) const; + SparseComplexMatrix lssolve (const SparseComplexMatrix& b, int& info, + int& rank) const; + + ComplexColumnVector lssolve (const ColumnVector& b) const; + ComplexColumnVector lssolve (const ColumnVector& b, int& info) const; + ComplexColumnVector lssolve (const ColumnVector& b, int& info, + int& rank) const; + + ComplexColumnVector lssolve (const ComplexColumnVector& b) const; + ComplexColumnVector lssolve (const ComplexColumnVector& b, int& info) const; + ComplexColumnVector lssolve (const ComplexColumnVector& b, int& info, + int& rank) const; + + SparseComplexMatrix squeeze (void) const; + + SparseComplexMatrix index (idx_vector& i, int resize_ok) const; + + SparseComplexMatrix index (idx_vector& i, idx_vector& j, int resize_ok) const; + + SparseComplexMatrix index (Array& ra_idx, int resize_ok) const; + + SparseComplexMatrix reshape (const dim_vector& new_dims) const; + + SparseComplexMatrix permute (const Array& vec, bool inv = false) const; + + SparseComplexMatrix ipermute (const Array& vec) const; + + SparseComplexMatrix map (c_c_Mapper f) const; + SparseMatrix map (d_c_Mapper f) const; + SparseBoolMatrix map (b_c_Mapper f) const; + + SparseComplexMatrix& apply (c_c_Mapper f); + + bool any_element_is_inf_or_nan (void) const; + bool all_elements_are_real (void) const; + bool all_integers (double& max_val, double& min_val) const; + bool too_large_for_float (void) const; + + SparseBoolMatrix operator ! (void) const; + + SparseBoolMatrix all (int dim = -1) const; + SparseBoolMatrix any (int dim = -1) const; + + SparseComplexMatrix cumprod (int dim = -1) const; + SparseComplexMatrix cumsum (int dim = -1) const; + SparseComplexMatrix prod (int dim = -1) const; + SparseComplexMatrix sum (int dim = -1) const; + SparseComplexMatrix sumsq (int dim = -1) const; + SparseMatrix abs (void) const; + + SparseComplexMatrix diag (int k = 0) const; + + // i/o + friend std::ostream& operator << (std::ostream& os, + const SparseComplexMatrix& a); + friend std::istream& operator >> (std::istream& is, + SparseComplexMatrix& a); +}; + +extern SparseComplexMatrix operator * (const SparseMatrix&, + const SparseComplexMatrix&); +extern SparseComplexMatrix operator * (const SparseComplexMatrix&, + const SparseMatrix&); +extern SparseComplexMatrix operator * (const SparseComplexMatrix&, + const SparseComplexMatrix&); + +extern SparseComplexMatrix min (const Complex& c, + const SparseComplexMatrix& m); +extern SparseComplexMatrix min (const SparseComplexMatrix& m, + const Complex& c); +extern SparseComplexMatrix min (const SparseComplexMatrix& a, + const SparseComplexMatrix& b); + +extern SparseComplexMatrix max (const Complex& c, + const SparseComplexMatrix& m); +extern SparseComplexMatrix max (const SparseComplexMatrix& m, + const Complex& c); +extern SparseComplexMatrix max (const SparseComplexMatrix& a, + const SparseComplexMatrix& b); + +SPARSE_SMS_CMP_OP_DECLS (SparseComplexMatrix, Complex) +SPARSE_SMS_BOOL_OP_DECLS (SparseComplexMatrix, Complex) + +SPARSE_SSM_CMP_OP_DECLS (Complex, SparseComplexMatrix) +SPARSE_SSM_BOOL_OP_DECLS (Complex, SparseComplexMatrix) + +SPARSE_SMSM_CMP_OP_DECLS (SparseComplexMatrix, SparseComplexMatrix) +SPARSE_SMSM_BOOL_OP_DECLS (SparseComplexMatrix, SparseComplexMatrix) + +SPARSE_FORWARD_DEFS (MSparse, SparseComplexMatrix, ComplexMatrix, Complex) + +#endif + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/ChangeLog --- a/liboctave/ChangeLog Fri Feb 25 17:42:55 2005 +0000 +++ b/liboctave/ChangeLog Fri Feb 25 19:55:28 2005 +0000 @@ -1,3 +1,219 @@ +2005-02-25 John W. Eaton + + Sparse merge. + + 2005-02-13 David Bateman + + * CSparse.cc (SparseComplexMatrix:dsolve, SparseComplexMatrix:utsolve, + SparseComplexMatrix::ltsolve, SparseComplexMatrix::trisolve, + SparseComplexMatrix::bsolve, SparseComplexMatrix:fsolve): Split sparse + solver into separate functions for the diagonal, upper, lower + triangular, tridiagonal, banded and full cases. + (SparseComplexMatrix::solve): rewrite to call the above function. One + version that probes the matrix type and another that assumes the type + is passed. + + * dSparse.cc (SparseMatrix:dsolve, SparseMatrix:utsolve, + SparseMatrix::ltsolve, SparseMatrix::trisolve, + SparseMatrix::bsolve, SparseMatrix:fsolve): Likewise + (SparseMatrix::solve): Likewise + + * CSparse.h (dsolve, utsolve, ltsolve, trisolve, bsolve, fsolve): + Declaration of new functions + * dSparse.h (dsolve, utsolve, ltsolve, trisolve, bsolve, fsolve): + Likewise + + * CSparse.cc (operator !): Reverse the sense of the test. + * dSpase.cc (operator !): Likewise + + * dSparse.h (type, band_size, is_dense, triangular_row_perm, + triangular_col_perm, sparse_info): Remove matrix type code + * CSparse.h (type, band_size, is_dense, triangular_row_perm, + triangular_col_perm, sparse_info): Likewise + * boolSparse.h (type, band_size, is_dense, triangular_row_perm, + triangular_col_perm, sparse_info): Likewise + * MSparse.h (type, band_size, is_dense, triangular_row_perm, + triangular_col_perm, sparse_info): Likewise + * Sparse.h (type, band_size, is_dense, triangular_row_perm, + triangular_col_perm, sparse_info, matrix_type): Likewise + + * Sparse.cc (type, sparse_info, band_size): Remove type code + + * SparseType.h: New class for the matrix type used in solvers + * SparseType.cc: methods of sparse matrix type class + + * Makefile.in: Add SparseType.cc + + 2005-02-01 David Bateman + + * UMFPACK: Update to version 4.4 + * UMFPACK.patch: Version 4.4 contains most of the previous patch. Only + keep octave specific test files + + 2005-01-23 David Bateman + + * dSparse.cc (SparseMatrix::solve): Include tridiagonal, cholesky + tridiagonal and banded cholesky solvers. Remove calculation of + condition number for banded solvers. + * CSparse.cc (SparseComplexMatrix::solve): ditto. + + * Sparse.h (int type (int) const, bool is_dense (void) const): + new functions. + * MSparse.h (int type (int) const, bool is_dense (void) const): ditto + * dSparse.h (int type (int) const, bool is_dense (void) const): ditto + * CSparse.h (int type (int) const, bool is_dense (void) const): ditto + * boolSparse.h (int type (int) const, bool is_dense (void) const): + ditto + + * Sparse.cc (int Sparse::type (int) const, + bool Sparse::is_dense (void) const): New functions definition + + * Sparse.h (matrix_type typ): Move caching of matrix type to SparseRep, + so it actually is cached, but disable + + * oct-spparms.cc (SparseParams::init_keys): Change spmoni to spumoni + for compatiability + + 2005-01-18 David Bateman + + * Array.cc (Array::insert (const Array&, const Array&)): + Modify calculation of number elements to skip between copied blocks. + + 2005-01-07 David Bateman + + * Sparse.h : Reverse definitions of numel and nelem. + * Sparse.cc (assign1): Use numel and not nelem + * Sparse-op-def.h: Replace all uses of nelem with numel + + 2005-01-07 David Bateman + + * dbleDET.h: Make SparseMatrix a friend of the class DET + * CmplexDET.h: Make SparseComplexMatrix a friend of the class + ComplexDET + * dSparse.cc (SparseMatrix::determinant): Replace use of SparseDET + by DET + * dSparse.h (determinant): ditto + * CSparse.cc (SparseComplexMatrix::determinant): Replace use of + SparseComplexDET by ComplexDET + * CSparse.h (determinant): ditto + * SparsedbleDET.h, SparsedbleDET.cc, SparseCmplxDET.h, + SparseCmplxDET.cc: delete files + * Makefile.in: Delete reference to SparsedbleDET.h, SparsedbleDET.cc, + SparseCmplxDET.h andSparseCmplxDET.cc. + + * CSparse.cc (SparseComplexMatrix::solve): Store matrix type in + local variable to avoid variable shadowing. + * dSparse.cc (SparseMatrix::solve): ditto. + + * boolSparse.cc boolSparse.h CSparse.cc CSparse.h dSparse.cc + dSparse.h MSparse.cc MSparse-C.cc MSparse-d.cc MSparse-defs.h + MSparse.h oct-spparms.cc oct-spparms.h Sparse-b.cc Sparse.cc + Sparse-C.cc SparseCmplxLU.cc SparseCmplxLU.h SparsedbleLU.cc + SparsedbleLU.h Sparse-d.cc Sparse.h Sparse-op-defs.h sparse-sort.cc + sparse-sort.h: Remove additional licensing clause with authors + permission. + + 2004-12-30 John W. Eaton + + * MSparse.cc (SPARSE_A2S_OP_2, SPARSE_SA2_OP_2): + Loop counter is int, not size_t. + + * oct-spparms.cc (SparseParams::operator =): Return *this. + + * Sparse-op-defs.h (SPARSE_SPARSE_MUL): Delete unused variable tmpval. + + * dSparse.cc (operator << (ostream&, const SparseMatrix&), atan2): + Delete unused variables. + (SparseMatrix::solve): Avoid warnings about uninitialized + variables and variables that might be clobbered by longjmp. + + * CSparse.cc (operator << (ostream&, const SparseComplexMatrix&), + min, max): Delete unused variables. + (SparseComplexMatrix::solve): Avoid warnings about uninitialized + variables and variables that might be clobbered by longjmp. + + * Makefile.in (UMFPACK_SPECIAL): Include .d files in the list. + + * Sparse-op-defs.h (SPARSE_SMS_BIN_OP_2, SPARSE_SSM_BIN_OP_2): + Loop counter is int, not size_t. + + * CSparse.cc (SparseComplexMatrix::hermitian): Avoid shadow warnings. + * Sparse.cc (Sparse::Sparse, Sparse::type, assign): Likewise. + + * Sparse.h (Sparse::SparseRep): Order data members and initializer + lists consistently. + + * mx-base.h: Include boolSparse.h, dSparse.h, and CSparse.h. + + 2004-12-29 John W. Eaton + + * COLAMD.files (COLAMD_EXTRAS): New variable. + * UMFPACK.files (UMFPACK_EXTRAS): New variable. + * Makefile.in (DISTFILES): Add $(COLAMD_EXTRAS) and + $(UMFPACK_EXTRAS) to the list. + (DISTDIRS): New variable. + (dist): Handle $(DISTDIRS). + + Merge of sparse code from David Bateman and + Andy Adler . + + * Makefile.in (VPATH): ADD @srcdir@/COLAMD to the list. + + * Makefile.in (MAKEDEPS): Include $(COLAMD_SRC) and $(UMFPACK_SRC) + without directory prefix. + + * Makefile.in (LIBOCTAVE_OBJECTS): Add $(COLAMD_OBJ) and + $(UMFPACK_OBJ) to the list. + + * COLAMD: New directory. + * COLAMD.files: New file. + * Makefile.in: Include COLAMD.files. + (SOURCES): Add $(COLAMD_SOURCES) to the list. + (LIBOCTAVE_OBJECTS): Add $(COLAMD_OBJECTS) to the list. + (INCLUDES): Add $(COLAMD_INCLUDES) to the list. + + * UMFPACK: New directory. + * UMFPACK.patch, UMFPACK.README, UMFPACK.files, UMFPACK.rules: + New files. + * Makefile.in: Include UMFPACK.files and UMFPACK.rules. + (SOURCES): Add $(UMFPACK_SOURCES) to the list. + (LIBOCTAVE_OBJECTS): Add $(UMFPACK_OBJECTS) to the list. + (INCLUDES): Add $(UMFPACK_INCLUDES) to the list. + + * Makefile.in (SPARSE_MX_OP_INC): New variable. + (INCLUDES): Add it to the list. + (SPARSE_MX_OP_SRC): New variable. + (LIBOCTAVE_CXX_SOURCES): Add it to the list. + (distclean): Remove $(SPARSE_MX_OP_INC) and $(SPARSE_MX_OP_SRC). + (stamp-prereq): Depend on $(SPARSE_MX_OP_INC) and $(SPARSE_MX_OP_SRC). + + * sparse-mk-ops.awk, sparse-mx-ops: New files. + * Makefile.in (DISTFILES): Add them to the lists. + + * oct-spparms.h, sparse-sort.h: New files. + * Makefile.in (INCLUDES): Add them to the list. + + * oct-spparms.cc, sparse-sort.cc: New files. + * Makefile.in (LIBOCTAVE_CXX_SOURCES): Add them to the list. + + * sparse-base-lu.cc: New file. + * Makefile.in (TEMPLATE_SRC): Add it to the list. + + * boolSparse.cc, CSparse.cc, dSparse.cc, MSparse.cc, Sparse.cc, + SparseCmplxDET.cc, SparseCmplxLU.cc, SparsedbleDET.cc, + SparsedbleLU.cc: New files. + * Makefile.in (MATRIX_SRC): Add them to the list. + + * boolSparse.h, CSparse.h, dSparse.h, MSparse-defs.h, MSparse.h, + Sparse.h, oct-spparms.h, sparse-base-lu.h, SparseCmplxDET.h, + SparseCmplxLU.h, SparsedbleDET.h, SparsedbleLU.h, + Sparse-op-defs.h: New files. + * Makefile.in (MATRIX_INC): Add them to the appropriate lists. + + * MSparse-d.cc, MSparse-C.cc, Sparse-b.cc, Sparse-d.cc, + Sparse-C.cc: New files. + * Makefile.in (TI_SRC): Add them to the list. + 2005-02-18 John W. Eaton * file-ops.cc (file_ops::canonicalize_file_name) [HAVE_RESOLVEPATH]: diff -r 9f3299378193 -r 57077d0ddc8e liboctave/CmplxDET.h --- a/liboctave/CmplxDET.h Fri Feb 25 17:42:55 2005 +0000 +++ b/liboctave/CmplxDET.h Fri Feb 25 19:55:28 2005 +0000 @@ -31,6 +31,7 @@ ComplexDET { friend class ComplexMatrix; +friend class SparseComplexMatrix; public: diff -r 9f3299378193 -r 57077d0ddc8e liboctave/MSparse-C.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/MSparse-C.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,39 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "oct-cmplx.h" + +#include "MSparse.h" +#include "MSparse.cc" + +template class MSparse; + +INSTANTIATE_SPARSE_FRIENDS (Complex); + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/MSparse-d.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/MSparse-d.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,37 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "MSparse.h" +#include "MSparse.cc" + +template class MSparse; + +INSTANTIATE_SPARSE_FRIENDS (double); + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/MSparse-defs.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/MSparse-defs.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,217 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#if !defined (octave_MSparse_defs_h) +#define octave_MSparse_defs_h 1 + +// Nothing like a little CPP abuse to brighten everyone's day. + +// A macro that can be used to declare and instantiate OP= operators. +#define SPARSE_OP_ASSIGN_DECL(A_T, E_T, OP, PFX, LTGT, RHS_T) \ + PFX A_T& \ + operator OP LTGT (A_T&, const RHS_T&) + +// All the OP= operators that we care about. +#define SPARSE_OP_ASSIGN_DECLS(A_T, E_T, PFX, LTGT, RHS_T) \ + SPARSE_OP_ASSIGN_DECL (A_T, E_T, +=, PFX, LTGT, RHS_T); \ + SPARSE_OP_ASSIGN_DECL (A_T, E_T, -=, PFX, LTGT, RHS_T); + +// Generate forward declarations for OP= operators. +#define SPARSE_OP_ASSIGN_FWD_DECLS(A_T, RHS_T) \ + SPARSE_OP_ASSIGN_DECLS (A_T, T, template , , RHS_T) + +// Generate friend declarations for the OP= operators. +#define SPARSE_OP_ASSIGN_FRIENDS(A_T, RHS_T) \ + SPARSE_OP_ASSIGN_DECLS (A_T, T, friend, <>, RHS_T) + +// Instantiate the OP= operators. +#define SPARSE_OP_ASSIGN_DEFS(A_T, E_T, RHS_T) \ + SPARSE_OP_ASSIGN_DECLS (A_T, E_T, template, , RHS_T) + +// A function that can be used to forward OP= operations from derived +// classes back to us. +#define SPARSE_OP_ASSIGN_FWD_FCN(R, F, T, C_X, X_T, C_Y, Y_T) \ + inline R \ + F (X_T& x, const Y_T& y) \ + { \ + return R (F (C_X (x), C_Y (y))); \ + } + +// All the OP= operators that we care about forwarding. +#define SPARSE_OP_ASSIGN_FWD_DEFS(R, T, C_X, X_T, C_Y, Y_T) \ + SPARSE_OP_ASSIGN_FWD_FCN (R, operator +=, T, C_X, X_T, C_Y, Y_T) \ + SPARSE_OP_ASSIGN_FWD_FCN (R, operator -=, T, C_X, X_T, C_Y, Y_T) + +// A macro that can be used to declare and instantiate unary operators. +#define SPARSE_UNOP(A_T, E_T, F, PFX, LTGT) \ + PFX A_T \ + F LTGT (const A_T&) + +// All the unary operators that we care about. +#define SPARSE_UNOP_DECLS(A_T, E_T, PFX, LTGT) \ + SPARSE_UNOP (A_T, E_T, operator +, PFX, LTGT); \ + SPARSE_UNOP (A_T, E_T, operator -, PFX, LTGT); + +// Generate forward declarations for unary operators. +#define SPARSE_UNOP_FWD_DECLS(A_T) \ + SPARSE_UNOP_DECLS (A_T, T, template , ) + +// Generate friend declarations for the unary operators. +#define SPARSE_UNOP_FRIENDS(A_T) \ + SPARSE_UNOP_DECLS (A_T, T, friend, <>) + +// Instantiate the unary operators. +#define SPARSE_UNOP_DEFS(A_T, E_T) \ + SPARSE_UNOP_DECLS (A_T, E_T, template, ) + +// A function that can be used to forward unary operations from derived +// classes back to us. +#define SPARSE_UNOP_FWD_FCN(R, F, T, C_X, X_T) \ + inline R \ + F (const X_T& x) \ + { \ + return R (F (C_X (x))); \ + } + +// All the unary operators that we care about forwarding. +#define SPARSE_UNOP_FWD_DEFS(R, T, C_X, X_T) \ + SPARSE_UNOP_FWD_FCN (R, operator +, T, C_X, X_T) \ + SPARSE_UNOP_FWD_FCN (R, operator -, T, C_X, X_T) + +// A macro that can be used to declare and instantiate binary operators. +#define SPARSE_BINOP_DECL(A_T, E_T, F, PFX, LTGT, X_T, Y_T) \ + PFX A_T \ + F LTGT (const X_T&, const Y_T&) + +// All the binary operators that we care about. We have two +// sets of macros since the MArray OP MArray operations use functions +// (product and quotient) instead of operators (*, /). +#define SPARSE_BINOP_DECLS(A_T, F_T, E_T, PFX, LTGT, X_T, Y_T) \ + SPARSE_BINOP_DECL (F_T, E_T, operator +, PFX, LTGT, X_T, Y_T); \ + SPARSE_BINOP_DECL (F_T, E_T, operator -, PFX, LTGT, X_T, Y_T); \ + SPARSE_BINOP_DECL (A_T, E_T, operator *, PFX, LTGT, X_T, Y_T); \ + SPARSE_BINOP_DECL (A_T, E_T, operator /, PFX, LTGT, X_T, Y_T); + +#define SPARSE_AA_BINOP_DECLS(A_T, E_T, PFX, LTGT) \ + SPARSE_BINOP_DECL (A_T, E_T, operator +, PFX, LTGT, A_T, A_T); \ + SPARSE_BINOP_DECL (A_T, E_T, operator -, PFX, LTGT, A_T, A_T); \ + SPARSE_BINOP_DECL (A_T, E_T, quotient, PFX, LTGT, A_T, A_T); \ + SPARSE_BINOP_DECL (A_T, E_T, product, PFX, LTGT, A_T, A_T); + +// Generate forward declarations for binary operators. +#define SPARSE_BINOP_FWD_DECLS(A_T, F_T) \ + SPARSE_BINOP_DECLS (A_T, F_T, T, template , , A_T, T) \ + SPARSE_BINOP_DECLS (A_T, F_T, T, template , , T, A_T) \ + SPARSE_AA_BINOP_DECLS (A_T, T, template , ) + +// Generate friend declarations for the binary operators. +#define SPARSE_BINOP_FRIENDS(A_T, F_T) \ + SPARSE_BINOP_DECLS (A_T, F_T, T, friend, <>, A_T, T) \ + SPARSE_BINOP_DECLS (A_T, F_T, T, friend, <>, T, A_T) \ + SPARSE_AA_BINOP_DECLS (A_T, T, friend, <>) + +// Instantiate the binary operators. +#define SPARSE_BINOP_DEFS(A_T, F_T, E_T) \ + SPARSE_BINOP_DECLS (A_T, F_T, E_T, template, , A_T, E_T) \ + SPARSE_BINOP_DECLS (A_T, F_T, E_T, template, , E_T, A_T) \ + SPARSE_AA_BINOP_DECLS (A_T, E_T, template, ) + +// A function that can be used to forward binary operations from derived +// classes back to us. +#define SPARSE_BINOP_FWD_FCN(R, F, T, C_X, X_T, C_Y, Y_T) \ + inline R \ + F (const X_T& x, const Y_T& y) \ + { \ + return R (F (C_X (x), C_Y (y))); \ + } + +// The binary operators that we care about forwarding. We have two +// sets of macros since the MSparse OP MSparse operations use functions +// (product and quotient) instead of operators (*, /). +#define SPARSE_BINOP_FWD_DEFS(R, F, T, C_X, X_T, C_Y, Y_T) \ + SPARSE_BINOP_FWD_FCN (F, operator +, T, C_X, X_T, C_Y, Y_T) \ + SPARSE_BINOP_FWD_FCN (F, operator -, T, C_X, X_T, C_Y, Y_T) \ + SPARSE_BINOP_FWD_FCN (R, operator *, T, C_X, X_T, C_Y, Y_T) \ + SPARSE_BINOP_FWD_FCN (R, operator /, T, C_X, X_T, C_Y, Y_T) + +#define SPARSE_AA_BINOP_FWD_DEFS(R, T, C_X, X_T, C_Y, Y_T) \ + SPARSE_BINOP_FWD_FCN (R, operator +, T, C_X, X_T, C_Y, Y_T) \ + SPARSE_BINOP_FWD_FCN (R, operator -, T, C_X, X_T, C_Y, Y_T) \ + SPARSE_BINOP_FWD_FCN (R, product, T, C_X, X_T, C_Y, Y_T) \ + SPARSE_BINOP_FWD_FCN (R, quotient, T, C_X, X_T, C_Y, Y_T) + +// Forward declarations for the MSparse operators. +#define SPARSE_OPS_FORWARD_DECLS(A_T, F_T) \ + template \ + class A_T; \ + \ + /* SPARSE_OP_ASSIGN_FWD_DECLS (A_T, T) */ \ + SPARSE_OP_ASSIGN_FWD_DECLS (A_T, A_T) \ + SPARSE_UNOP_FWD_DECLS (A_T) \ + SPARSE_BINOP_FWD_DECLS (A_T, F_T) + +// Friend declarations for the MSparse operators. +#define SPARSE_OPS_FRIEND_DECLS(A_T, F_T) \ + /* SPARSE_OP_ASSIGN_FRIENDS (A_T, T) */ \ + SPARSE_OP_ASSIGN_FRIENDS (A_T, A_T) \ + SPARSE_UNOP_FRIENDS (A_T) \ + SPARSE_BINOP_FRIENDS (A_T, F_T) + +// The following macros are for external use. + +// Instantiate all the MSparse friends for MSparse element type T. +#define INSTANTIATE_SPARSE_FRIENDS(T) \ + /* SPARSE_OP_ASSIGN_DEFS (MSparse, T, T) */ \ + SPARSE_OP_ASSIGN_DEFS (MSparse, T, MSparse) \ + SPARSE_UNOP_DEFS (MSparse, T) \ + SPARSE_BINOP_DEFS (MSparse, MArray2, T) + +// Define all the MSparse forwarding functions for return type R and +// MSparse element type T +#define SPARSE_FORWARD_DEFS(B, R, F, T) \ + /* SPARSE_OP_ASSIGN_FWD_DEFS */ \ + /* (R, T, dynamic_cast&>, R, , T) */ \ + \ + SPARSE_OP_ASSIGN_FWD_DEFS \ + (R, T, \ + dynamic_cast&>, R, dynamic_cast&>, R) \ + \ + SPARSE_UNOP_FWD_DEFS \ + (R, T, dynamic_cast&>, R) \ + \ + SPARSE_BINOP_FWD_DEFS \ + (R, F, T, dynamic_cast&>, R, , T) \ + \ + SPARSE_BINOP_FWD_DEFS \ + (R, F, T, , T, dynamic_cast&>, R) \ + \ + SPARSE_AA_BINOP_FWD_DEFS \ + (R, T, dynamic_cast&>, R, dynamic_cast&>, R) + +// Now we have all the definitions we need. + +#endif + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/MSparse.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/MSparse.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,506 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "quit.h" +#include "lo-error.h" +#include "MArray2.h" +#include "Array-util.h" + +#include "MSparse.h" +#include "MSparse-defs.h" + +// sparse array with math ops. + +// Element by element MSparse by MSparse ops. + +template +MSparse& +operator += (MSparse& a, const MSparse& b) +{ + MSparse r; + + int a_nr = a.rows (); + int a_nc = a.cols (); + + int b_nr = b.rows (); + int b_nc = b.cols (); + + if (a_nr != b_nr || a_nc != b_nc) + gripe_nonconformant ("operator +=" , a_nr, a_nc, b_nr, b_nc); + else + { + r = MSparse (a_nr, a_nc, (a.nnz () + b.nnz ())); + + int jx = 0; + for (int i = 0 ; i < a_nc ; i++) + { + int ja = a.cidx(i); + int ja_max = a.cidx(i+1); + bool ja_lt_max= ja < ja_max; + + int jb = b.cidx(i); + int jb_max = b.cidx(i+1); + bool jb_lt_max = jb < jb_max; + + while (ja_lt_max || jb_lt_max ) + { + OCTAVE_QUIT; + if ((! jb_lt_max) || + (ja_lt_max && (a.ridx(ja) < b.ridx(jb)))) + { + r.ridx(jx) = a.ridx(ja); + r.data(jx) = a.data(ja) + 0.; + jx++; + ja++; + ja_lt_max= ja < ja_max; + } + else if (( !ja_lt_max ) || + (jb_lt_max && (b.ridx(jb) < a.ridx(ja)) ) ) + { + r.ridx(jx) = b.ridx(jb); + r.data(jx) = 0. + b.data(jb); + jx++; + jb++; + jb_lt_max= jb < jb_max; + } + else + { + if ((a.data(ja) + b.data(jb)) != 0.) + { + r.data(jx) = a.data(ja) + b.data(jb); + r.ridx(jx) = a.ridx(ja); + jx++; + } + ja++; + ja_lt_max= ja < ja_max; + jb++; + jb_lt_max= jb < jb_max; + } + } + r.cidx(i+1) = jx; + } + + a = r.maybe_compress (); + } + + return a; +} + +template +MSparse& +operator -= (MSparse& a, const MSparse& b) +{ + MSparse r; + + int a_nr = a.rows (); + int a_nc = a.cols (); + + int b_nr = b.rows (); + int b_nc = b.cols (); + + if (a_nr != b_nr || a_nc != b_nc) + gripe_nonconformant ("operator -=" , a_nr, a_nc, b_nr, b_nc); + else + { + r = MSparse (a_nr, a_nc, (a.nnz () + b.nnz ())); + + int jx = 0; + for (int i = 0 ; i < a_nc ; i++) + { + int ja = a.cidx(i); + int ja_max = a.cidx(i+1); + bool ja_lt_max= ja < ja_max; + + int jb = b.cidx(i); + int jb_max = b.cidx(i+1); + bool jb_lt_max = jb < jb_max; + + while (ja_lt_max || jb_lt_max ) + { + OCTAVE_QUIT; + if ((! jb_lt_max) || + (ja_lt_max && (a.ridx(ja) < b.ridx(jb)))) + { + r.ridx(jx) = a.ridx(ja); + r.data(jx) = a.data(ja) - 0.; + jx++; + ja++; + ja_lt_max= ja < ja_max; + } + else if (( !ja_lt_max ) || + (jb_lt_max && (b.ridx(jb) < a.ridx(ja)) ) ) + { + r.ridx(jx) = b.ridx(jb); + r.data(jx) = 0. - b.data(jb); + jx++; + jb++; + jb_lt_max= jb < jb_max; + } + else + { + if ((a.data(ja) - b.data(jb)) != 0.) + { + r.data(jx) = a.data(ja) - b.data(jb); + r.ridx(jx) = a.ridx(ja); + jx++; + } + ja++; + ja_lt_max= ja < ja_max; + jb++; + jb_lt_max= jb < jb_max; + } + } + r.cidx(i+1) = jx; + } + + a = r.maybe_compress (); + } + + return a; +} + +// Element by element MSparse by scalar ops. + +#define SPARSE_A2S_OP_1(OP) \ + template \ + MArray2 \ + operator OP (const MSparse& a, const T& s) \ + { \ + int nr = a.rows (); \ + int nc = a.cols (); \ + \ + MArray2 r (nr, nc, (0.0 OP s)); \ + \ + for (int j = 0; j < nc; j++) \ + for (int i = a.cidx(j); i < a.cidx(j+1); i++) \ + r.elem (a.ridx (i), j) = a.data (i) OP s; \ + return r; \ + } + +#define SPARSE_A2S_OP_2(OP) \ + template \ + MSparse \ + operator OP (const MSparse& a, const T& s) \ + { \ + int nr = a.rows (); \ + int nc = a.cols (); \ + int nz = a.nnz (); \ + \ + MSparse r (nr, nc, nz); \ + \ + for (int i = 0; i < nz; i++) \ + { \ + r.data(i) = a.data(i) OP s; \ + r.ridx(i) = a.ridx(i); \ + } \ + for (int i = 0; i < nc + 1; i++) \ + r.cidx(i) = a.cidx(i); \ + r.maybe_compress (true); \ + return r; \ + } + + +SPARSE_A2S_OP_1 (+) +SPARSE_A2S_OP_1 (-) +SPARSE_A2S_OP_2 (*) +SPARSE_A2S_OP_2 (/) + +// Element by element scalar by MSparse ops. + +#define SPARSE_SA2_OP_1(OP) \ + template \ + MArray2 \ + operator OP (const T& s, const MSparse& a) \ + { \ + int nr = a.rows (); \ + int nc = a.cols (); \ + \ + MArray2 r (nr, nc, (s OP 0.0)); \ + \ + for (int j = 0; j < nc; j++) \ + for (int i = a.cidx(j); i < a.cidx(j+1); i++) \ + r.elem (a.ridx (i), j) = s OP a.data (i); \ + return r; \ + } + +#define SPARSE_SA2_OP_2(OP) \ + template \ + MSparse \ + operator OP (const T& s, const MSparse& a) \ + { \ + int nr = a.rows (); \ + int nc = a.cols (); \ + int nz = a.nnz (); \ + \ + MSparse r (nr, nc, nz); \ + \ + for (int i = 0; i < nz; i++) \ + { \ + r.data(i) = s OP a.data(i); \ + r.ridx(i) = a.ridx(i); \ + } \ + for (int i = 0; i < nc + 1; i++) \ + r.cidx(i) = a.cidx(i); \ + r.maybe_compress (true); \ + return r; \ + } + +SPARSE_SA2_OP_1 (+) +SPARSE_SA2_OP_1 (-) +SPARSE_SA2_OP_2 (*) +SPARSE_SA2_OP_2 (/) + +// Element by element MSparse by MSparse ops. + +#define SPARSE_A2A2_OP(OP) \ + template \ + MSparse \ + operator OP (const MSparse& a, const MSparse& b) \ + { \ + MSparse r; \ + \ + int a_nr = a.rows (); \ + int a_nc = a.cols (); \ + \ + int b_nr = b.rows (); \ + int b_nc = b.cols (); \ + \ + if (a_nr != b_nr || a_nc != b_nc) \ + gripe_nonconformant ("operator " # OP, a_nr, a_nc, b_nr, b_nc); \ + else \ + { \ + r = MSparse (a_nr, a_nc, (a.nnz () + b.nnz ())); \ + \ + int jx = 0; \ + r.cidx (0) = 0; \ + for (int i = 0 ; i < a_nc ; i++) \ + { \ + int ja = a.cidx(i); \ + int ja_max = a.cidx(i+1); \ + bool ja_lt_max= ja < ja_max; \ + \ + int jb = b.cidx(i); \ + int jb_max = b.cidx(i+1); \ + bool jb_lt_max = jb < jb_max; \ + \ + while (ja_lt_max || jb_lt_max ) \ + { \ + OCTAVE_QUIT; \ + if ((! jb_lt_max) || \ + (ja_lt_max && (a.ridx(ja) < b.ridx(jb)))) \ + { \ + r.ridx(jx) = a.ridx(ja); \ + r.data(jx) = a.data(ja) OP 0.; \ + jx++; \ + ja++; \ + ja_lt_max= ja < ja_max; \ + } \ + else if (( !ja_lt_max ) || \ + (jb_lt_max && (b.ridx(jb) < a.ridx(ja)) ) ) \ + { \ + r.ridx(jx) = b.ridx(jb); \ + r.data(jx) = 0. OP b.data(jb); \ + jx++; \ + jb++; \ + jb_lt_max= jb < jb_max; \ + } \ + else \ + { \ + if ((a.data(ja) OP b.data(jb)) != 0.) \ + { \ + r.data(jx) = a.data(ja) OP b.data(jb); \ + r.ridx(jx) = a.ridx(ja); \ + jx++; \ + } \ + ja++; \ + ja_lt_max= ja < ja_max; \ + jb++; \ + jb_lt_max= jb < jb_max; \ + } \ + } \ + r.cidx(i+1) = jx; \ + } \ + \ + r.maybe_compress (); \ + } \ + \ + return r; \ + } + +#define SPARSE_A2A2_FCN_1(FCN, OP) \ + template \ + MSparse \ + FCN (const MSparse& a, const MSparse& b) \ + { \ + MSparse r; \ + \ + int a_nr = a.rows (); \ + int a_nc = a.cols (); \ + \ + int b_nr = b.rows (); \ + int b_nc = b.cols (); \ + \ + if (a_nr != b_nr || a_nc != b_nc) \ + gripe_nonconformant (#FCN, a_nr, a_nc, b_nr, b_nc); \ + else \ + { \ + r = MSparse (a_nr, a_nc, (a.nnz() > b.nnz() ? a.nnz() : b.nnz())); \ + \ + int jx = 0; \ + r.cidx (0) = 0; \ + for (int i = 0 ; i < a_nc ; i++) \ + { \ + int ja = a.cidx(i); \ + int ja_max = a.cidx(i+1); \ + bool ja_lt_max= ja < ja_max; \ + \ + int jb = b.cidx(i); \ + int jb_max = b.cidx(i+1); \ + bool jb_lt_max = jb < jb_max; \ + \ + while (ja_lt_max || jb_lt_max ) \ + { \ + OCTAVE_QUIT; \ + if ((! jb_lt_max) || \ + (ja_lt_max && (a.ridx(ja) < b.ridx(jb)))) \ + { \ + ja++; ja_lt_max= ja < ja_max; \ + } \ + else if (( !ja_lt_max ) || \ + (jb_lt_max && (b.ridx(jb) < a.ridx(ja)) ) ) \ + { \ + jb++; jb_lt_max= jb < jb_max; \ + } \ + else \ + { \ + if ((a.data(ja) OP b.data(jb)) != 0.) \ + { \ + r.data(jx) = a.data(ja) OP b.data(jb); \ + r.ridx(jx) = a.ridx(ja); \ + jx++; \ + } \ + ja++; ja_lt_max= ja < ja_max; \ + jb++; jb_lt_max= jb < jb_max; \ + } \ + } \ + r.cidx(i+1) = jx; \ + } \ + \ + r.maybe_compress (); \ + } \ + \ + return r; \ + } + +#define SPARSE_A2A2_FCN_2(FCN, OP) \ + template \ + MSparse \ + FCN (const MSparse& a, const MSparse& b) \ + { \ + MSparse r; \ + T Zero = T (); \ + \ + int a_nr = a.rows (); \ + int a_nc = a.cols (); \ + \ + int b_nr = b.rows (); \ + int b_nc = b.cols (); \ + \ + if (a_nr != b_nr || a_nc != b_nc) \ + gripe_nonconformant (#FCN, a_nr, a_nc, b_nr, b_nc); \ + else \ + { \ + r = MSparse( a_nr, a_nc, (Zero OP Zero)); \ + \ + for (int i = 0 ; i < a_nc ; i++) \ + { \ + int ja = a.cidx(i); \ + int ja_max = a.cidx(i+1); \ + bool ja_lt_max= ja < ja_max; \ + \ + int jb = b.cidx(i); \ + int jb_max = b.cidx(i+1); \ + bool jb_lt_max = jb < jb_max; \ + \ + while (ja_lt_max || jb_lt_max ) \ + { \ + OCTAVE_QUIT; \ + if ((! jb_lt_max) || \ + (ja_lt_max && (a.ridx(ja) < b.ridx(jb)))) \ + { \ + r.elem (a.ridx(ja),i) = a.data(ja) OP Zero; \ + ja++; ja_lt_max= ja < ja_max; \ + } \ + else if (( !ja_lt_max ) || \ + (jb_lt_max && (b.ridx(jb) < a.ridx(ja)) ) ) \ + { \ + r.elem (b.ridx(jb),i) = Zero OP b.data(jb); \ + jb++; jb_lt_max= jb < jb_max; \ + } \ + else \ + { \ + r.elem (a.ridx(ja),i) = a.data(ja) OP b.data(jb); \ + ja++; ja_lt_max= ja < ja_max; \ + jb++; jb_lt_max= jb < jb_max; \ + } \ + } \ + } \ + \ + r.maybe_compress (true); \ + } \ + \ + return r; \ + } + +SPARSE_A2A2_OP (+) +SPARSE_A2A2_OP (-) +SPARSE_A2A2_FCN_1 (product, *) +SPARSE_A2A2_FCN_2 (quotient, /) + +// Unary MSparse ops. + +template +MSparse +operator + (const MSparse& a) +{ + return a; +} + +template +MSparse +operator - (const MSparse& a) +{ + MSparse retval (a); + int nz = a.nnz (); + for (int i = 0; i < nz; i++) + retval.data(i) = - retval.data(i); + return retval; +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/MSparse.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/MSparse.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,116 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#if !defined (octave_MSparse_h) +#define octave_MSparse_h 1 + +#include "MArray2.h" + +#include "Sparse.h" + +// Two dimensional sparse array with math ops. + +// But first, some preprocessor abuse... + +#include "MSparse-defs.h" + +SPARSE_OPS_FORWARD_DECLS (MSparse, MArray2) + +template +class +MSparse : public Sparse +{ +public: + + MSparse (void) : Sparse () { } + + MSparse (int n, int m) : Sparse (n, m) { } + + MSparse (const MSparse& a) : Sparse (a) { } + + MSparse (const MSparse& a, const dim_vector& dv) : Sparse (a, dv) { } + + MSparse (const Sparse& a) : Sparse (a) { } + + MSparse (const Array a, const Array& r, + const Array& c, int nr = -1, + int nc = -1, bool sum_terms = true) + : Sparse (a, r, c, nr, nc, sum_terms) { } + + MSparse (const Array a, const Array& r, + const Array& c, int nr = -1, + int nc = -1, bool sum_terms = true) + : Sparse (a, r, c, nr, nc, sum_terms) { } + + explicit MSparse (int r, int c, T val) : Sparse (r, c, val) { } + + MSparse (int r, int c, int num_nz) : Sparse (r, c, num_nz) { } + + ~MSparse (void) { } + + MSparse& operator = (const MSparse& a) + { + Sparse::operator = (a); + return *this; + } + + MSparse& insert (const Sparse& a, int r, int c) + { + Sparse::insert (a, r, c); + return *this; + } + + MSparse transpose (void) const { return Sparse::transpose (); } + + MSparse squeeze (void) const { return Sparse::squeeze (); } + + MSparse index (idx_vector& i, int resize_ok) const + { return Sparse::index (i, resize_ok); } + + MSparse index (idx_vector& i, idx_vector& j, int resize_ok) const + { return Sparse::index (i, j, resize_ok); } + + MSparse index (Array& ra_idx, int resize_ok) const + { return Sparse::index (ra_idx, resize_ok); } + + MSparse reshape (const dim_vector& new_dims) const + { return Sparse::reshape (new_dims); } + + MSparse permute (const Array& vec, bool inv = false) const + { return Sparse::permute (vec, inv); } + + MSparse ipermute (const Array& vec) const + { return Sparse::ipermute (vec); } + + + // Currently, the OPS functions don't need to be friends, but that + // may change. + + // SPARSE_OPS_FRIEND_DECLS (MSparse, MArray2) +}; + +#endif + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/Makefile.in --- a/liboctave/Makefile.in Fri Feb 25 17:42:55 2005 +0000 +++ b/liboctave/Makefile.in Fri Feb 25 19:55:28 2005 +0000 @@ -10,7 +10,7 @@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ -VPATH = @srcdir@ +VPATH = @srcdir@:@srcdir@/COLAMD include $(TOPDIR)/Makeconf @@ -22,6 +22,10 @@ -L../libcruft -L../glob -L. $(RLD_FLAG) \ $(LIBCRUFT) $(BLAS_LIBS) $(FFTW_LIBS) $(LIBREADLINE) -lglob $(LIBS) $(FLIBS) +include $(srcdir)/COLAMD.files + +include $(srcdir)/UMFPACK.files + MATRIX_INC := Array.h Array2.h Array3.h ArrayN.h DiagArray2.h \ Array-flags.h Array-util.h ArrayN-idx.h MArray-defs.h \ MArray.h MArray2.h MDiagArray2.h Matrix.h MArrayN.h \ @@ -33,6 +37,9 @@ chMatrix.h chNDArray.h dColVector.h dDiagMatrix.h dMatrix.h \ dNDArray.h dRowVector.h dbleAEPBAL.h dbleCHOL.h dbleDET.h \ dbleHESS.h dbleLU.h dbleQR.h dbleQRP.h dbleSCHUR.h dbleSVD.h \ + boolSparse.h CSparse.h dSparse.h MSparse-defs.h MSparse.h \ + Sparse.h oct-spparms.h sparse-base-lu.h SparseCmplxLU.h \ + SparsedbleLU.h Sparse-op-defs.h SparseType.h \ int8NDArray.h uint8NDArray.h int16NDArray.h uint16NDArray.h \ int32NDArray.h uint32NDArray.h int64NDArray.h uint64NDArray.h \ intNDArray.h @@ -41,6 +48,8 @@ VX_OP_INC := $(shell $(AWK) -f $(srcdir)/mk-ops.awk prefix=vx list_h_files=1 $(srcdir)/vx-ops) +SPARSE_MX_OP_INC := $(shell $(AWK) -f $(srcdir)/sparse-mk-ops.awk prefix=smx list_h_files=1 $(srcdir)/sparse-mx-ops) + OPTS_INC_DATA := DASPK-opts.in DASRT-opts.in DASSL-opts.in \ LSODE-opts.in NLEqn-opts.in ODESSA-opts.in Quad-opts.in @@ -58,21 +67,24 @@ lo-sysdep.h lo-utils.h mach-info.h oct-alloc.h oct-cmplx.h \ oct-env.h oct-fftw.h oct-getopt.h oct-group.h oct-inttypes.h \ oct-passwd.h oct-rand.h oct-rl-edit.h oct-rl-hist.h \ - oct-shlib.h oct-sort.h oct-syscalls.h oct-time.h pathlen.h \ - pathsearch.h prog-args.h so-array.h statdefs.h str-vec.h \ - sun-utils.h sysdir.h systime.h syswait.h \ + oct-shlib.h oct-sort.h oct-spparms.h oct-syscalls.h \ + oct-time.h pathlen.h pathsearch.h prog-args.h so-array.h \ + sparse-sort.h statdefs.h str-vec.h sun-utils.h sysdir.h \ + systime.h syswait.h \ $(OPTS_INC) \ $(MATRIX_INC) \ $(MX_OP_INC) \ - $(VX_OP_INC) + $(VX_OP_INC) \ + $(SPARSE_MX_OP_INC) TEMPLATE_SRC := Array.cc ArrayN.cc DiagArray2.cc \ MArray.cc MArray2.cc MArrayN.cc MDiagArray2.cc \ - base-lu.cc oct-sort.cc + base-lu.cc oct-sort.cc sparse-base-lu.cc TI_SRC := Array-C.cc Array-b.cc Array-ch.cc Array-i.cc Array-d.cc \ Array-s.cc Array-so.cc Array-str.cc Array-idx-vec.cc \ MArray-C.cc MArray-ch.cc MArray-i.cc MArray-d.cc MArray-s.cc \ + MSparse-C.cc MSparse-d.cc Sparse-C.cc Sparse-b.cc Sparse-d.cc \ oct-inttypes.cc MATRIX_SRC := Array-flags.cc Array-util.cc CColVector.cc \ @@ -83,7 +95,9 @@ chNDArray.cc dColVector.cc dDiagMatrix.cc dMatrix.cc \ dNDArray.cc dRowVector.cc dbleAEPBAL.cc dbleCHOL.cc \ dbleDET.cc dbleHESS.cc dbleLU.cc dbleQR.cc dbleQRP.cc \ - dbleSCHUR.cc dbleSVD.cc \ + dbleSCHUR.cc dbleSVD.cc boolSparse.cc CSparse.cc dSparse.cc \ + MSparse.cc Sparse.cc SparseCmplxLU.cc SparsedbleLU.cc \ + SparseType.cc \ int8NDArray.cc uint8NDArray.cc int16NDArray.cc uint16NDArray.cc \ int32NDArray.cc uint32NDArray.cc int64NDArray.cc uint64NDArray.cc @@ -91,6 +105,8 @@ VX_OP_SRC := $(shell $(AWK) -f $(srcdir)/mk-ops.awk prefix=vx list_cc_files=1 $(srcdir)/vx-ops) +SPARSE_MX_OP_SRC := $(shell $(AWK) -f $(srcdir)/sparse-mk-ops.awk prefix=smx list_cc_files=1 $(srcdir)/sparse-mx-ops) + LIBOCTAVE_CXX_SOURCES := Bounds.cc CollocWt.cc \ DASPK.cc DASRT.cc DASSL.cc FEGrid.cc LinConst.cc \ LPsolve.cc LSODE.cc NLEqn.cc ODES.cc ODESSA.cc \ @@ -99,12 +115,14 @@ lo-ieee.cc lo-mappers.cc lo-specfun.cc lo-sysdep.cc \ lo-utils.cc mach-info.cc oct-alloc.cc oct-env.cc \ oct-fftw.cc oct-group.cc oct-passwd.cc oct-rand.cc oct-shlib.cc \ - oct-syscalls.cc oct-time.cc prog-args.cc so-array.cc str-vec.cc \ + oct-spparms.cc oct-syscalls.cc oct-time.cc prog-args.cc \ + so-array.cc sparse-sort.cc str-vec.cc \ $(TEMPLATE_SRC) \ $(TI_SRC) \ $(MATRIX_SRC) \ $(MX_OP_SRC) \ - $(VX_OP_SRC) + $(VX_OP_SRC) \ + $(SPARSE_MX_OP_SRC) LIBOCTAVE_C_SOURCES := f2c-main.c filemode.c getopt.c getopt1.c \ lo-cieee.c lo-cutils.c mkdir.c oct-getopt.c rename.c \ @@ -135,17 +153,25 @@ INCLUDES_FOR_INSTALL := $(INCLUDES) $(TEMPLATE_SRC) $(EXTRAS) DISTFILES := Makefile.in ChangeLog mk-ops.awk mx-ops vx-ops \ - $(SOURCES) $(INCLUDES) $(EXTRAS) $(OPTS_INC_DATA) + sparse-mk-ops.awk sparse-mx-ops \ + $(SOURCES) $(INCLUDES) $(EXTRAS) $(OPTS_INC_DATA) \ + $(COLAMD_EXTRAS) $(UMFPACK_EXTRAS) + +# Complete directory trees to distribute. +DISTDIRS := COLAMD UMFPACK ifeq ($(SHARED_LIBS), true) BINDISTLIBS = liboctave/liboctave BINDISTFILES = liboctave.$(SHLEXT_VER) endif -MAKEDEPS_1 := $(patsubst %.cc, %.d, $(SOURCES)) +MAKEDEPS_2 := $(SOURCES) $(COLAMD_SRC) +MAKEDEPS_1 := $(patsubst %.cc, %.d, $(MAKEDEPS_2)) MAKEDEPS := $(patsubst %.c, %.d, $(MAKEDEPS_1)) LIBOCTAVE_OBJECTS := \ + $(COLAMD_OBJ) \ + $(UMFPACK_OBJ) \ $(LIBOCTAVE_CXX_SOURCES:.cc=.o) \ $(LIBOCTAVE_C_SOURCES:.c=.o) \ $(LIBOCT_READLINE_CXX_SOURCES:.cc=.o) \ @@ -161,11 +187,20 @@ endif endif +UMFPACK_SPECIAL_1 := CSparse.o dSparse.o SparseCmplxLU.o SparsedbleLU.o +UMFPACK_SPECIAL := \ + $(UMFPACK_SPECIAL_1) \ + $(addprefix pic/, $(UMFPACK_SPECIAL_1)) \ + $(UMFPACK_SPECIAL_1:.o=.d) +$(UMFPACK_SPECIAL): INCFLAGS += $(UMFPACK_INCFLAGS) + all: libraries .PHONY: all objects: $(OBJECTS) +include $(srcdir)/UMFPACK.rules + stmp-pic: pic @if [ -f stmp-pic ]; then \ true; \ @@ -182,7 +217,9 @@ mkdir pic; \ fi -stamp-prereq: $(OPTS_INC) $(VX_OP_INC) $(VX_OP_SRC) $(MX_OP_INC) $(MX_OP_SRC) mx-ops.h +stamp-prereq: $(OPTS_INC) $(VX_OP_INC) $(VX_OP_SRC) \ + $(MX_OP_INC) $(MX_OP_SRC) mx-ops.h \ + $(SPARSE_MX_OP_INC) $(SPARSE_MX_OP_SRC) touch stamp-prereq ifeq ($(SHARED_LIBS), true) @@ -296,6 +333,7 @@ distclean: clean rm -f Makefile so_locations stamp-prereq $(OPTS_INC) rm -f mx-ops.h $(MX_OP_INC) $(VX_OP_INC) $(MX_OP_SRC) $(VX_OP_SRC) + rm -f $(SPARSE_MX_OP_INC) $(SPARSE_MX_OP_SRC) .PHONY: distclean maintainer-clean: distclean @@ -304,6 +342,7 @@ dist: stamp-prereq ln $(DISTFILES) ../`cat ../.fname`/liboctave + for dir in $(DISTDIRS); do ln -s ../../liboctave/$$dir ../`cat ../.fname/liboctave`; done .PHONY: dist bin-dist: @@ -326,6 +365,9 @@ $(MX_OP_INC) $(MX_OP_SRC) : $(srcdir)/mk-ops.awk mx-ops $(AWK) -f $(srcdir)/mk-ops.awk prefix=mx $(srcdir)/mx-ops +$(SPARSE_MX_OP_INC) $(SPARSE_MX_OP_SRC) : $(srcdir)/sparse-mk-ops.awk sparse-mx-ops + $(AWK) -f $(srcdir)/sparse-mk-ops.awk prefix=smx $(srcdir)/sparse-mx-ops + mx-ops.h : $(srcdir)/mk-ops.awk mx-ops $(AWK) -f $(srcdir)/mk-ops.awk prefix=mx make_inclusive_header=mx-ops.h $(srcdir)/mx-ops > $@-t $(top_srcdir)/move-if-change $@-t $@ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/Sparse-C.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/Sparse-C.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,45 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +// Instantiate Sparse matrix of complex values. + +#include "oct-cmplx.h" + +#include "Sparse.h" +#include "Sparse.cc" + +INSTANTIATE_SPARSE_AND_ASSIGN (Complex); + +INSTANTIATE_SPARSE_ASSIGN (Complex, double); + +#if 0 +template std::ostream& operator << (std::ostream&, const Sparse&); +#endif + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/Sparse-b.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/Sparse-b.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,41 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +// Instantiate Sparse matrix of double values. + +#include "Sparse.h" +#include "Sparse.cc" + +INSTANTIATE_SPARSE_AND_ASSIGN (bool); + +#if 0 +template std::ostream& operator << (std::ostream&, const Sparse&); +#endif + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/Sparse-d.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/Sparse-d.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,41 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +// Instantiate Sparse matrix of double values. + +#include "Sparse.h" +#include "Sparse.cc" + +INSTANTIATE_SPARSE_AND_ASSIGN (double); + +#if 0 +template std::ostream& operator << (std::ostream&, const Sparse&); +#endif + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/Sparse-op-defs.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/Sparse-op-defs.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,1609 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#if !defined (octave_sparse_op_defs_h) +#define octave_sparse_op_defs_h 1 + +#include "Array-util.h" + +#define SPARSE_BIN_OP_DECL(R, OP, X, Y) \ + extern R OP (const X&, const Y&) + +#define SPARSE_CMP_OP_DECL(OP, X, Y) \ + extern SparseBoolMatrix OP (const X&, const Y&) + +#define SPARSE_BOOL_OP_DECL(OP, X, Y) \ + extern SparseBoolMatrix OP (const X&, const Y&) + +// matrix by scalar operations. + +#define SPARSE_SMS_BIN_OP_DECLS(R1, R2, M, S) \ + SPARSE_BIN_OP_DECL (R1, operator +, M, S); \ + SPARSE_BIN_OP_DECL (R1, operator -, M, S); \ + SPARSE_BIN_OP_DECL (R2, operator *, M, S); \ + SPARSE_BIN_OP_DECL (R2, operator /, M, S); + +#define SPARSE_SMS_BIN_OP_1(R, F, OP, M, S) \ + R \ + F (const M& m, const S& s) \ + { \ + int nr = m.rows (); \ + int nc = m.cols (); \ + \ + R r (nr, nc, (0.0 OP s)); \ + \ + for (int j = 0; j < nc; j++) \ + for (int i = m.cidx (j); i < m.cidx (j+1); i++) \ + r.elem (m.ridx (i), j) = m.data (i) OP s; \ + return r; \ + } + +#define SPARSE_SMS_BIN_OP_2(R, F, OP, M, S) \ + R \ + F (const M& m, const S& s) \ + { \ + int nr = m.rows (); \ + int nc = m.cols (); \ + int nz = m.nnz (); \ + \ + R r (nr, nc, nz); \ + \ + for (int i = 0; i < nz; i++) \ + { \ + r.data(i) = m.data(i) OP s; \ + r.ridx(i) = m.ridx(i); \ + } \ + for (int i = 0; i < nc + 1; i++) \ + r.cidx(i) = m.cidx(i); \ + \ + r.maybe_compress (true); \ + return r; \ + } + +#define SPARSE_SMS_BIN_OPS(R1, R2, M, S) \ + SPARSE_SMS_BIN_OP_1 (R1, operator +, +, M, S) \ + SPARSE_SMS_BIN_OP_1 (R1, operator -, -, M, S) \ + SPARSE_SMS_BIN_OP_2 (R2, operator *, *, M, S) \ + SPARSE_SMS_BIN_OP_2 (R2, operator /, /, M, S) + +#define SPARSE_SMS_CMP_OP_DECLS(M, S) \ + SPARSE_CMP_OP_DECL (mx_el_lt, M, S); \ + SPARSE_CMP_OP_DECL (mx_el_le, M, S); \ + SPARSE_CMP_OP_DECL (mx_el_ge, M, S); \ + SPARSE_CMP_OP_DECL (mx_el_gt, M, S); \ + SPARSE_CMP_OP_DECL (mx_el_eq, M, S); \ + SPARSE_CMP_OP_DECL (mx_el_ne, M, S); + +#define SPARSE_SMS_EQNE_OP_DECLS(M, S) \ + SPARSE_CMP_OP_DECL (mx_el_eq, M, S); \ + SPARSE_CMP_OP_DECL (mx_el_ne, M, S); + +#define SPARSE_SMS_CMP_OP(F, OP, M, MZ, MC, S, SZ, SC) \ + SparseBoolMatrix \ + F (const M& m, const S& s) \ + { \ + /* Count num of non-zero elements */ \ + int nel = 0; \ + int nz = m.nnz (); \ + if (MC (MZ) OP SC (s)) \ + nel += m.numel() - nz; \ + for (int i = 0; i < nz; i++) \ + if (MC (m.data (i)) OP SC (s)) \ + nel++; \ + \ + int nr = m.rows (); \ + int nc = m.cols (); \ + SparseBoolMatrix r (nr, nc, nel); \ + \ + if (nr > 0 && nc > 0) \ + { \ + if (MC (MZ) OP SC (s)) \ + { \ + int ii = 0; \ + r.cidx (0) = 0; \ + for (int j = 0; j < nc; j++) \ + { \ + for (int i = 0; i < nr; i++) \ + { \ + bool el = MC (m.elem(i, j)) OP SC (s); \ + if (el) \ + { \ + r.data(ii) = el; \ + r.ridx(ii++) = i; \ + } \ + } \ + r.cidx(j+1) = ii; \ + } \ + } \ + else \ + { \ + int ii = 0; \ + r.cidx (0) = 0; \ + for (int j = 0; j < nc; j++) \ + { \ + for (int i = m.cidx(j); i < m.cidx(j+1); i++) \ + { \ + bool el = MC (m.data(i)) OP SC (s); \ + if (el) \ + { \ + r.data(ii) = el; \ + r.ridx(ii++) = m.ridx(i); \ + } \ + } \ + r.cidx(j+1) = ii; \ + } \ + } \ + } \ + return r; \ + } + +#define SPARSE_SMS_CMP_OPS(M, MZ, CM, S, SZ, CS) \ + SPARSE_SMS_CMP_OP (mx_el_lt, <, M, MZ, CM, S, SZ, CS) \ + SPARSE_SMS_CMP_OP (mx_el_le, <=, M, MZ, CM, S, SZ, CS) \ + SPARSE_SMS_CMP_OP (mx_el_ge, >=, M, MZ, CM, S, SZ, CS) \ + SPARSE_SMS_CMP_OP (mx_el_gt, >, M, MZ, CM, S, SZ, CS) \ + SPARSE_SMS_CMP_OP (mx_el_eq, ==, M, MZ, , S, SZ, ) \ + SPARSE_SMS_CMP_OP (mx_el_ne, !=, M, MZ, , S, SZ, ) + +#define SPARSE_SMS_EQNE_OPS(M, MZ, CM, S, SZ, CS) \ + SPARSE_SMS_CMP_OP (mx_el_eq, ==, M, MZ, , S, SZ, ) \ + SPARSE_SMS_CMP_OP (mx_el_ne, !=, M, MZ, , S, SZ, ) + +#define SPARSE_SMS_BOOL_OP_DECLS(M, S) \ + SPARSE_BOOL_OP_DECL (mx_el_and, M, S); \ + SPARSE_BOOL_OP_DECL (mx_el_or, M, S); + +#define SPARSE_SMS_BOOL_OP(F, OP, M, S, LHS_ZERO, RHS_ZERO) \ + SparseBoolMatrix \ + F (const M& m, const S& s) \ + { \ + /* Count num of non-zero elements */ \ + int nel = 0; \ + int nz = m.nnz (); \ + if (LHS_ZERO OP (s != RHS_ZERO)) \ + nel += m.numel() - nz; \ + for (int i = 0; i < nz; i++) \ + if ((m.data(i) != LHS_ZERO) OP (s != RHS_ZERO))\ + nel++; \ + \ + int nr = m.rows (); \ + int nc = m.cols (); \ + SparseBoolMatrix r (nr, nc, nel); \ + \ + if (nr > 0 && nc > 0) \ + { \ + if (LHS_ZERO OP (s != RHS_ZERO)) \ + { \ + int ii = 0; \ + r.cidx (0) = 0; \ + for (int j = 0; j < nc; j++) \ + { \ + for (int i = 0; i < nr; i++) \ + { \ + bool el = (m.elem(i, j) != LHS_ZERO) OP (s != RHS_ZERO); \ + if (el) \ + { \ + r.data(ii) = el; \ + r.ridx(ii++) = i; \ + } \ + } \ + r.cidx(j+1) = ii; \ + } \ + } \ + else \ + { \ + int ii = 0; \ + r.cidx (0) = 0; \ + for (int j = 0; j < nc; j++) \ + { \ + for (int i = m.cidx(j); i < m.cidx(j+1); i++) \ + { \ + bool el = (m.data(i) != LHS_ZERO) OP (s != RHS_ZERO); \ + if (el) \ + { \ + r.data(ii) = el; \ + r.ridx(ii++) = m.ridx(i); \ + } \ + } \ + r.cidx(j+1) = ii; \ + } \ + } \ + } \ + return r; \ + } + +#define SPARSE_SMS_BOOL_OPS2(M, S, LHS_ZERO, RHS_ZERO) \ + SPARSE_SMS_BOOL_OP (mx_el_and, &&, M, S, LHS_ZERO, RHS_ZERO) \ + SPARSE_SMS_BOOL_OP (mx_el_or, ||, M, S, LHS_ZERO, RHS_ZERO) + +#define SPARSE_SMS_BOOL_OPS(M, S, ZERO) \ + SPARSE_SMS_BOOL_OPS2(M, S, ZERO, ZERO) + +#define SPARSE_SMS_OP_DECLS(R1, R2, M, S) \ + SPARSE_SMS_BIN_OP_DECLS (R1, R2, M, S) \ + SPARSE_SMS_CMP_OP_DECLS (M, S) \ + SPARSE_SMS_BOOL_OP_DECLS (M, S) + +// scalar by matrix operations. + +#define SPARSE_SSM_BIN_OP_DECLS(R1, R2, S, M) \ + SPARSE_BIN_OP_DECL (R1, operator +, S, M); \ + SPARSE_BIN_OP_DECL (R1, operator -, S, M); \ + SPARSE_BIN_OP_DECL (R2, operator *, S, M); \ + SPARSE_BIN_OP_DECL (R2, operator /, S, M); + +#define SPARSE_SSM_BIN_OP_1(R, F, OP, S, M) \ + R \ + F (const S& s, const M& m) \ + { \ + int nr = m.rows (); \ + int nc = m.cols (); \ + \ + R r (nr, nc, (s OP 0.0)); \ + \ + for (int j = 0; j < nc; j++) \ + for (int i = m.cidx (j); i < m.cidx (j+1); i++) \ + r.elem (m.ridx (i), j) = s OP m.data (i); \ + \ + return r; \ + } + +#define SPARSE_SSM_BIN_OP_2(R, F, OP, S, M) \ + R \ + F (const S& s, const M& m) \ + { \ + int nr = m.rows (); \ + int nc = m.cols (); \ + int nz = m.nnz (); \ + \ + R r (nr, nc, nz); \ + \ + for (int i = 0; i < nz; i++) \ + { \ + r.data(i) = s OP m.data(i); \ + r.ridx(i) = m.ridx(i); \ + } \ + for (int i = 0; i < nc + 1; i++) \ + r.cidx(i) = m.cidx(i); \ + \ + r.maybe_compress(true); \ + return r; \ + } + +#define SPARSE_SSM_BIN_OPS(R1, R2, S, M) \ + SPARSE_SSM_BIN_OP_1 (R1, operator +, +, S, M) \ + SPARSE_SSM_BIN_OP_1 (R1, operator -, -, S, M) \ + SPARSE_SSM_BIN_OP_2 (R2, operator *, *, S, M) \ + SPARSE_SSM_BIN_OP_2 (R2, operator /, /, S, M) + +#define SPARSE_SSM_CMP_OP_DECLS(S, M) \ + SPARSE_CMP_OP_DECL (mx_el_lt, S, M); \ + SPARSE_CMP_OP_DECL (mx_el_le, S, M); \ + SPARSE_CMP_OP_DECL (mx_el_ge, S, M); \ + SPARSE_CMP_OP_DECL (mx_el_gt, S, M); \ + SPARSE_CMP_OP_DECL (mx_el_eq, S, M); \ + SPARSE_CMP_OP_DECL (mx_el_ne, S, M); + +#define SPARSE_SSM_EQNE_OP_DECLS(S, M) \ + SPARSE_CMP_OP_DECL (mx_el_eq, S, M); \ + SPARSE_CMP_OP_DECL (mx_el_ne, S, M); + +#define SPARSE_SSM_CMP_OP(F, OP, S, SZ, SC, M, MZ, MC) \ + SparseBoolMatrix \ + F (const S& s, const M& m) \ + { \ + /* Count num of non-zero elements */ \ + int nel = 0; \ + int nz = m.nnz (); \ + if (SC (s) OP MC (MZ)) \ + nel += m.numel() - nz; \ + for (int i = 0; i < nz; i++) \ + if (SC (s) OP MC (m.data (i))) \ + nel++; \ + \ + int nr = m.rows (); \ + int nc = m.cols (); \ + SparseBoolMatrix r (nr, nc, nel); \ + \ + if (nr > 0 && nc > 0) \ + { \ + if (SC (s) OP MC (MZ))\ + { \ + int ii = 0; \ + r.cidx (0) = 0; \ + for (int j = 0; j < nc; j++) \ + { \ + for (int i = 0; i < nr; i++) \ + { \ + bool el = SC (s) OP MC (m.elem(i, j)); \ + if (el) \ + { \ + r.data(ii) = el; \ + r.ridx(ii++) = i; \ + } \ + } \ + r.cidx(j+1) = ii; \ + } \ + } \ + else \ + { \ + int ii = 0; \ + r.cidx (0) = 0; \ + for (int j = 0; j < nc; j++) \ + { \ + for (int i = m.cidx(j); i < m.cidx(j+1); i++) \ + { \ + bool el = SC (s) OP MC (m.data(i)); \ + if (el) \ + { \ + r.data(ii) = el; \ + r.ridx(ii++) = m.ridx(i); \ + } \ + } \ + r.cidx(j+1) = ii; \ + } \ + } \ + } \ + return r; \ + } + +#define SPARSE_SSM_CMP_OPS(S, SZ, SC, M, MZ, MC) \ + SPARSE_SSM_CMP_OP (mx_el_lt, <, S, SZ, SC, M, MZ, MC) \ + SPARSE_SSM_CMP_OP (mx_el_le, <=, S, SZ, SC, M, MZ, MC) \ + SPARSE_SSM_CMP_OP (mx_el_ge, >=, S, SZ, SC, M, MZ, MC) \ + SPARSE_SSM_CMP_OP (mx_el_gt, >, S, SZ, SC, M, MZ, MC) \ + SPARSE_SSM_CMP_OP (mx_el_eq, ==, S, SZ, , M, MZ, ) \ + SPARSE_SSM_CMP_OP (mx_el_ne, !=, S, SZ, , M, MZ, ) + +#define SPARSE_SSM_EQNE_OPS(S, SZ, SC, M, MZ, MC) \ + SPARSE_SSM_CMP_OP (mx_el_eq, ==, S, SZ, , M, MZ, ) \ + SPARSE_SSM_CMP_OP (mx_el_ne, !=, S, SZ, , M, MZ, ) + +#define SPARSE_SSM_BOOL_OP_DECLS(S, M) \ + SPARSE_BOOL_OP_DECL (mx_el_and, S, M); \ + SPARSE_BOOL_OP_DECL (mx_el_or, S, M); \ + +#define SPARSE_SSM_BOOL_OP(F, OP, S, M, LHS_ZERO, RHS_ZERO) \ + SparseBoolMatrix \ + F (const S& s, const M& m) \ + { \ + /* Count num of non-zero elements */ \ + int nel = 0; \ + int nz = m.nnz (); \ + if ((s != LHS_ZERO) OP RHS_ZERO) \ + nel += m.numel() - nz; \ + for (int i = 0; i < nz; i++) \ + if ((s != LHS_ZERO) OP m.data(i) != RHS_ZERO) \ + nel++; \ + \ + int nr = m.rows (); \ + int nc = m.cols (); \ + SparseBoolMatrix r (nr, nc, nel); \ + \ + if (nr > 0 && nc > 0) \ + { \ + if ((s != LHS_ZERO) OP RHS_ZERO) \ + { \ + int ii = 0; \ + r.cidx (0) = 0; \ + for (int j = 0; j < nc; j++) \ + { \ + for (int i = 0; i < nr; i++) \ + { \ + bool el = (s != LHS_ZERO) OP (m.elem(i, j) != RHS_ZERO); \ + if (el) \ + { \ + r.data(ii) = el; \ + r.ridx(ii++) = i; \ + } \ + } \ + r.cidx(j+1) = ii; \ + } \ + } \ + else \ + { \ + int ii = 0; \ + r.cidx (0) = 0; \ + for (int j = 0; j < nc; j++) \ + { \ + for (int i = m.cidx(j); i < m.cidx(j+1); i++) \ + { \ + bool el = (s != LHS_ZERO) OP (m.data(i) != RHS_ZERO); \ + if (el) \ + { \ + r.data(ii) = el; \ + r.ridx(ii++) = m.ridx(i); \ + } \ + } \ + r.cidx(j+1) = ii; \ + } \ + } \ + } \ + return r; \ + } + +#define SPARSE_SSM_BOOL_OPS2(S, M, LHS_ZERO, RHS_ZERO) \ + SPARSE_SSM_BOOL_OP (mx_el_and, &&, S, M, LHS_ZERO, RHS_ZERO) \ + SPARSE_SSM_BOOL_OP (mx_el_or, ||, S, M, LHS_ZERO, RHS_ZERO) + +#define SPARSE_SSM_BOOL_OPS(S, M, ZERO) \ + SPARSE_SSM_BOOL_OPS2(S, M, ZERO, ZERO) + +#define SPARSE_SSM_OP_DECLS(R1, R2, S, M) \ + SPARSE_SSM_BIN_OP_DECLS (R1, R2, S, M) \ + SPARSE_SSM_CMP_OP_DECLS (S, M) \ + SPARSE_SSM_BOOL_OP_DECLS (S, M) \ + +// matrix by matrix operations. + +#define SPARSE_SMSM_BIN_OP_DECLS(R1, R2, M1, M2) \ + SPARSE_BIN_OP_DECL (R1, operator +, M1, M2); \ + SPARSE_BIN_OP_DECL (R1, operator -, M1, M2); \ + SPARSE_BIN_OP_DECL (R2, product, M1, M2); \ + SPARSE_BIN_OP_DECL (R2, quotient, M1, M2); + +#define SPARSE_SMSM_BIN_OP_1(R, F, OP, M1, M2) \ + R \ + F (const M1& m1, const M2& m2) \ + { \ + R r; \ + \ + int m1_nr = m1.rows (); \ + int m1_nc = m1.cols (); \ + \ + int m2_nr = m2.rows (); \ + int m2_nc = m2.cols (); \ + \ + if (m1_nr != m2_nr || m1_nc != m2_nc) \ + gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \ + else \ + { \ + r = R (m1_nr, m1_nc, (m1.nnz () + m2.nnz ())); \ + \ + int jx = 0; \ + r.cidx (0) = 0; \ + for (int i = 0 ; i < m1_nc ; i++) \ + { \ + int ja = m1.cidx(i); \ + int ja_max = m1.cidx(i+1); \ + bool ja_lt_max= ja < ja_max; \ + \ + int jb = m2.cidx(i); \ + int jb_max = m2.cidx(i+1); \ + bool jb_lt_max = jb < jb_max; \ + \ + while (ja_lt_max || jb_lt_max ) \ + { \ + OCTAVE_QUIT; \ + if ((! jb_lt_max) || \ + (ja_lt_max && (m1.ridx(ja) < m2.ridx(jb)))) \ + { \ + r.ridx(jx) = m1.ridx(ja); \ + r.data(jx) = m1.data(ja) OP 0.; \ + jx++; \ + ja++; \ + ja_lt_max= ja < ja_max; \ + } \ + else if (( !ja_lt_max ) || \ + (jb_lt_max && (m2.ridx(jb) < m1.ridx(ja)) ) ) \ + { \ + r.ridx(jx) = m2.ridx(jb); \ + r.data(jx) = 0. OP m2.data(jb); \ + jx++; \ + jb++; \ + jb_lt_max= jb < jb_max; \ + } \ + else \ + { \ + if ((m1.data(ja) OP m2.data(jb)) != 0.) \ + { \ + r.data(jx) = m1.data(ja) OP m2.data(jb); \ + r.ridx(jx) = m1.ridx(ja); \ + jx++; \ + } \ + ja++; \ + ja_lt_max= ja < ja_max; \ + jb++; \ + jb_lt_max= jb < jb_max; \ + } \ + } \ + r.cidx(i+1) = jx; \ + } \ + \ + r.maybe_compress (); \ + } \ + \ + return r; \ + } + +#define SPARSE_SMSM_BIN_OP_2(R, F, OP, M1, M2) \ + R \ + F (const M1& m1, const M2& m2) \ + { \ + R r; \ + \ + int m1_nr = m1.rows (); \ + int m1_nc = m1.cols (); \ + \ + int m2_nr = m2.rows (); \ + int m2_nc = m2.cols (); \ + \ + if (m1_nr != m2_nr || m1_nc != m2_nc) \ + gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \ + else \ + { \ + r = R (m1_nr, m1_nc, (m1.nnz () > m2.nnz () ? m1.nnz () : m2.nnz ())); \ + \ + int jx = 0; \ + r.cidx (0) = 0; \ + for (int i = 0 ; i < m1_nc ; i++) \ + { \ + int ja = m1.cidx(i); \ + int ja_max = m1.cidx(i+1); \ + bool ja_lt_max= ja < ja_max; \ + \ + int jb = m2.cidx(i); \ + int jb_max = m2.cidx(i+1); \ + bool jb_lt_max = jb < jb_max; \ + \ + while (ja_lt_max || jb_lt_max ) \ + { \ + OCTAVE_QUIT; \ + if ((! jb_lt_max) || \ + (ja_lt_max && (m1.ridx(ja) < m2.ridx(jb)))) \ + { \ + ja++; ja_lt_max= ja < ja_max; \ + } \ + else if (( !ja_lt_max ) || \ + (jb_lt_max && (m2.ridx(jb) < m1.ridx(ja)) ) ) \ + { \ + jb++; jb_lt_max= jb < jb_max; \ + } \ + else \ + { \ + if ((m1.data(ja) OP m2.data(jb)) != 0.) \ + { \ + r.data(jx) = m1.data(ja) OP m2.data(jb); \ + r.ridx(jx) = m1.ridx(ja); \ + jx++; \ + } \ + ja++; ja_lt_max= ja < ja_max; \ + jb++; jb_lt_max= jb < jb_max; \ + } \ + } \ + r.cidx(i+1) = jx; \ + } \ + \ + r.maybe_compress (); \ + } \ + \ + return r; \ + } + +#define SPARSE_SMSM_BIN_OP_3(R, F, OP, M1, M2) \ + R \ + F (const M1& m1, const M2& m2) \ + { \ + R r; \ + \ + int m1_nr = m1.rows (); \ + int m1_nc = m1.cols (); \ + \ + int m2_nr = m2.rows (); \ + int m2_nc = m2.cols (); \ + \ + if (m1_nr != m2_nr || m1_nc != m2_nc) \ + gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \ + else \ + { \ + \ + /* XXX FIXME XXX Kludge... Always double/Complex, so Complex () */ \ + r = R (m1_nr, m1_nc, (Complex () OP Complex ())); \ + \ + for (int i = 0 ; i < m1_nc ; i++) \ + { \ + int ja = m1.cidx(i); \ + int ja_max = m1.cidx(i+1); \ + bool ja_lt_max= ja < ja_max; \ + \ + int jb = m2.cidx(i); \ + int jb_max = m2.cidx(i+1); \ + bool jb_lt_max = jb < jb_max; \ + \ + while (ja_lt_max || jb_lt_max ) \ + { \ + OCTAVE_QUIT; \ + if ((! jb_lt_max) || \ + (ja_lt_max && (m1.ridx(ja) < m2.ridx(jb)))) \ + { \ + /* keep those kludges coming */ \ + r.elem(m1.ridx(ja),i) = m1.data(ja) OP Complex (); \ + ja++; \ + ja_lt_max= ja < ja_max; \ + } \ + else if (( !ja_lt_max ) || \ + (jb_lt_max && (m2.ridx(jb) < m1.ridx(ja)) ) ) \ + { \ + /* keep those kludges coming */ \ + r.elem(m2.ridx(jb),i) = Complex () OP m2.data(jb); \ + jb++; \ + jb_lt_max= jb < jb_max; \ + } \ + else \ + { \ + r.elem(m1.ridx(ja),i) = m1.data(ja) OP m2.data(jb); \ + ja++; \ + ja_lt_max= ja < ja_max; \ + jb++; \ + jb_lt_max= jb < jb_max; \ + } \ + } \ + } \ + r.maybe_compress (true); \ + } \ + \ + return r; \ + } + +// Note that SM ./ SM needs to take into account the NaN and Inf values +// implied by the division by zero. +// XXX FIXME XXX Are the NaNs double(NaN) or Complex(NaN,Nan) in the complex +// case? +#define SPARSE_SMSM_BIN_OPS(R1, R2, M1, M2) \ + SPARSE_SMSM_BIN_OP_1 (R1, operator +, +, M1, M2) \ + SPARSE_SMSM_BIN_OP_1 (R1, operator -, -, M1, M2) \ + SPARSE_SMSM_BIN_OP_2 (R2, product, *, M1, M2) \ + SPARSE_SMSM_BIN_OP_3 (R2, quotient, /, M1, M2) + +#define SPARSE_SMSM_CMP_OP_DECLS(M1, M2) \ + SPARSE_CMP_OP_DECL (mx_el_lt, M1, M2); \ + SPARSE_CMP_OP_DECL (mx_el_le, M1, M2); \ + SPARSE_CMP_OP_DECL (mx_el_ge, M1, M2); \ + SPARSE_CMP_OP_DECL (mx_el_gt, M1, M2); \ + SPARSE_CMP_OP_DECL (mx_el_eq, M1, M2); \ + SPARSE_CMP_OP_DECL (mx_el_ne, M1, M2); + +#define SPARSE_SMSM_EQNE_OP_DECLS(M1, M2) \ + SPARSE_CMP_OP_DECL (mx_el_eq, M1, M2); \ + SPARSE_CMP_OP_DECL (mx_el_ne, M1, M2); + +#define SPARSE_SMSM_CMP_OP(F, OP, M1, C1, M2, C2) \ + SparseBoolMatrix \ + F (const M1& m1, const M2& m2) \ + { \ + SparseBoolMatrix r; \ + \ + int m1_nr = m1.rows (); \ + int m1_nc = m1.cols (); \ + \ + int m2_nr = m2.rows (); \ + int m2_nc = m2.cols (); \ + \ + if (m1_nr == m2_nr && m1_nc == m2_nc) \ + { \ + if (m1_nr != 0 || m1_nc != 0) \ + { \ + /* Count num of non-zero elements */ \ + int nel = 0; \ + for (int j = 0; j < m1_nc; j++) \ + for (int i = 0; i < m1_nr; i++) \ + if (C1 (m1.elem(i, j)) OP C2 (m2.elem(i, j))) \ + nel++; \ + \ + r = SparseBoolMatrix (m1_nr, m1_nc, nel); \ + \ + int ii = 0; \ + r.cidx (0) = 0; \ + for (int j = 0; j < m1_nc; j++) \ + { \ + for (int i = 0; i < m1_nr; i++) \ + { \ + bool el = C1 (m1.elem(i, j)) OP C2 (m2.elem(i, j)); \ + if (el) \ + { \ + r.data(ii) = el; \ + r.ridx(ii++) = i; \ + } \ + } \ + r.cidx(j+1) = ii; \ + } \ + } \ + } \ + else \ + { \ + if ((m1_nr != 0 || m1_nc != 0) && (m2_nr != 0 || m2_nc != 0)) \ + gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \ + } \ + return r; \ + } + +#define SPARSE_SMSM_CMP_OPS(M1, Z1, C1, M2, Z2, C2) \ + SPARSE_SMSM_CMP_OP (mx_el_lt, <, M1, C1, M2, C2) \ + SPARSE_SMSM_CMP_OP (mx_el_le, <=, M1, C1, M2, C2) \ + SPARSE_SMSM_CMP_OP (mx_el_ge, >=, M1, C1, M2, C2) \ + SPARSE_SMSM_CMP_OP (mx_el_gt, >, M1, C1, M2, C2) \ + SPARSE_SMSM_CMP_OP (mx_el_eq, ==, M1, , M2, ) \ + SPARSE_SMSM_CMP_OP (mx_el_ne, !=, M1, , M2, ) + +#define SPARSE_SMSM_EQNE_OPS(M1, Z1, C1, M2, Z2, C2) \ + SPARSE_SMSM_CMP_OP (mx_el_eq, ==, M1, , M2, ) \ + SPARSE_SMSM_CMP_OP (mx_el_ne, !=, M1, , M2, ) + +#define SPARSE_SMSM_BOOL_OP_DECLS(M1, M2) \ + SPARSE_BOOL_OP_DECL (mx_el_and, M1, M2); \ + SPARSE_BOOL_OP_DECL (mx_el_or, M1, M2); + +#define SPARSE_SMSM_BOOL_OP(F, OP, M1, M2, LHS_ZERO, RHS_ZERO) \ + SparseBoolMatrix \ + F (const M1& m1, const M2& m2) \ + { \ + SparseBoolMatrix r; \ + \ + int m1_nr = m1.rows (); \ + int m1_nc = m1.cols (); \ + \ + int m2_nr = m2.rows (); \ + int m2_nc = m2.cols (); \ + \ + if (m1_nr == m2_nr && m1_nc == m2_nc) \ + { \ + if (m1_nr != 0 || m1_nc != 0) \ + { \ + /* Count num of non-zero elements */ \ + int nel = 0; \ + for (int j = 0; j < m1_nc; j++) \ + for (int i = 0; i < m1_nr; i++) \ + if ((m1.elem(i, j) != LHS_ZERO) \ + OP (m2.elem(i, j) != RHS_ZERO)) \ + nel++; \ + \ + r = SparseBoolMatrix (m1_nr, m1_nc, nel); \ + \ + int ii = 0; \ + r.cidx (0) = 0; \ + for (int j = 0; j < m1_nc; j++) \ + { \ + for (int i = 0; i < m1_nr; i++) \ + { \ + bool el = (m1.elem(i, j) != LHS_ZERO) \ + OP (m2.elem(i, j) != RHS_ZERO); \ + if (el) \ + { \ + r.data(ii) = el; \ + r.ridx(ii++) = i; \ + } \ + } \ + r.cidx(j+1) = ii; \ + } \ + } \ + } \ + else \ + { \ + if ((m1_nr != 0 || m1_nc != 0) && (m2_nr != 0 || m2_nc != 0)) \ + gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \ + } \ + return r; \ + } + +#define SPARSE_SMSM_BOOL_OPS2(M1, M2, LHS_ZERO, RHS_ZERO) \ + SPARSE_SMSM_BOOL_OP (mx_el_and, &&, M1, M2, LHS_ZERO, RHS_ZERO) \ + SPARSE_SMSM_BOOL_OP (mx_el_or, ||, M1, M2, LHS_ZERO, RHS_ZERO) \ + +#define SPARSE_SMSM_BOOL_OPS(M1, M2, ZERO) \ + SPARSE_SMSM_BOOL_OPS2(M1, M2, ZERO, ZERO) + +#define SPARSE_SMSM_OP_DECLS(R1, R2, M1, M2) \ + SPARSE_SMSM_BIN_OP_DECLS (R1, R2, M1, M2) \ + SPARSE_SMSM_CMP_OP_DECLS (M1, M2) \ + SPARSE_SMSM_BOOL_OP_DECLS (M1, M2) + +// matrix by matrix operations. + +#define SPARSE_MSM_BIN_OP_DECLS(R1, R2, M1, M2) \ + SPARSE_BIN_OP_DECL (R1, operator +, M1, M2); \ + SPARSE_BIN_OP_DECL (R1, operator -, M1, M2); \ + SPARSE_BIN_OP_DECL (R2, product, M1, M2); \ + SPARSE_BIN_OP_DECL (R2, quotient, M1, M2); + +#define SPARSE_MSM_BIN_OP_1(R, F, OP, M1, M2) \ + R \ + F (const M1& m1, const M2& m2) \ + { \ + R r; \ + \ + int m1_nr = m1.rows (); \ + int m1_nc = m1.cols (); \ + \ + int m2_nr = m2.rows (); \ + int m2_nc = m2.cols (); \ + \ + if (m1_nr != m2_nr || m1_nc != m2_nc) \ + gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \ + else \ + { \ + r = R (m1_nr, m1_nc); \ + \ + for (int j = 0; j < m1_nc; j++) \ + for (int i = 0; i < m1_nr; i++) \ + r.elem (i, j) = m1.elem (i, j) OP m2.elem (i, j); \ + } \ + return r; \ + } + +#define SPARSE_MSM_BIN_OP_2(R, F, OP, M1, M2, ZERO) \ + R \ + F (const M1& m1, const M2& m2) \ + { \ + R r; \ + \ + int m1_nr = m1.rows (); \ + int m1_nc = m1.cols (); \ + \ + int m2_nr = m2.rows (); \ + int m2_nc = m2.cols (); \ + \ + if (m1_nr != m2_nr || m1_nc != m2_nc) \ + gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \ + else \ + { \ + /* Count num of non-zero elements */ \ + int nel = 0; \ + for (int j = 0; j < m1_nc; j++) \ + for (int i = 0; i < m1_nr; i++) \ + if ((m1.elem(i, j) OP m2.elem(i, j)) != ZERO) \ + nel++; \ + \ + r = R (m1_nr, m1_nc, nel); \ + \ + int ii = 0; \ + r.cidx (0) = 0; \ + for (int j = 0 ; j < m1_nc ; j++) \ + { \ + for (int i = 0 ; i < m1_nr ; i++) \ + { \ + if ((m1.elem(i, j) OP m2.elem(i, j)) != ZERO) \ + { \ + r.data (ii) = m1.elem(i, j) OP m2.elem(i,j); \ + r.ridx (ii++) = i; \ + } \ + } \ + r.cidx(j+1) = ii; \ + } \ + } \ + \ + return r; \ + } + +// XXX FIXME XXX Pass a specific ZERO value +#define SPARSE_MSM_BIN_OPS(R1, R2, M1, M2) \ + SPARSE_MSM_BIN_OP_1 (R1, operator +, +, M1, M2) \ + SPARSE_MSM_BIN_OP_1 (R1, operator -, -, M1, M2) \ + SPARSE_MSM_BIN_OP_2 (R2, product, *, M1, M2, 0.0) \ + SPARSE_MSM_BIN_OP_2 (R2, quotient, /, M1, M2, 0.0) + +#define SPARSE_MSM_CMP_OP_DECLS(M1, M2) \ + SPARSE_CMP_OP_DECL (mx_el_lt, M1, M2); \ + SPARSE_CMP_OP_DECL (mx_el_le, M1, M2); \ + SPARSE_CMP_OP_DECL (mx_el_ge, M1, M2); \ + SPARSE_CMP_OP_DECL (mx_el_gt, M1, M2); \ + SPARSE_CMP_OP_DECL (mx_el_eq, M1, M2); \ + SPARSE_CMP_OP_DECL (mx_el_ne, M1, M2); + +#define SPARSE_MSM_EQNE_OP_DECLS(M1, M2) \ + SPARSE_CMP_OP_DECL (mx_el_eq, M1, M2); \ + SPARSE_CMP_OP_DECL (mx_el_ne, M1, M2); + +#define SPARSE_MSM_CMP_OP(F, OP, M1, C1, M2, C2) \ + SparseBoolMatrix \ + F (const M1& m1, const M2& m2) \ + { \ + SparseBoolMatrix r; \ + \ + int m1_nr = m1.rows (); \ + int m1_nc = m1.cols (); \ + \ + int m2_nr = m2.rows (); \ + int m2_nc = m2.cols (); \ + \ + if (m1_nr == m2_nr && m1_nc == m2_nc) \ + { \ + if (m1_nr != 0 || m1_nc != 0) \ + { \ + /* Count num of non-zero elements */ \ + int nel = 0; \ + for (int j = 0; j < m1_nc; j++) \ + for (int i = 0; i < m1_nr; i++) \ + if (C1 (m1.elem(i, j)) OP C2 (m2.elem(i, j))) \ + nel++; \ + \ + r = SparseBoolMatrix (m1_nr, m1_nc, nel); \ + \ + int ii = 0; \ + r.cidx (0) = 0; \ + for (int j = 0; j < m1_nc; j++) \ + { \ + for (int i = 0; i < m1_nr; i++) \ + { \ + bool el = C1 (m1.elem(i, j)) OP C2 (m2.elem(i, j)); \ + if (el) \ + { \ + r.data(ii) = el; \ + r.ridx(ii++) = i; \ + } \ + } \ + r.cidx(j+1) = ii; \ + } \ + } \ + } \ + else \ + { \ + if ((m1_nr != 0 || m1_nc != 0) && (m2_nr != 0 || m2_nc != 0)) \ + gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \ + } \ + return r; \ + } + +#define SPARSE_MSM_CMP_OPS(M1, Z1, C1, M2, Z2, C2) \ + SPARSE_MSM_CMP_OP (mx_el_lt, <, M1, C1, M2, C2) \ + SPARSE_MSM_CMP_OP (mx_el_le, <=, M1, C1, M2, C2) \ + SPARSE_MSM_CMP_OP (mx_el_ge, >=, M1, C1, M2, C2) \ + SPARSE_MSM_CMP_OP (mx_el_gt, >, M1, C1, M2, C2) \ + SPARSE_MSM_CMP_OP (mx_el_eq, ==, M1, , M2, ) \ + SPARSE_MSM_CMP_OP (mx_el_ne, !=, M1, , M2, ) + +#define SPARSE_MSM_EQNE_OPS(M1, Z1, C1, M2, Z2, C2) \ + SPARSE_MSM_CMP_OP (mx_el_eq, ==, M1, , M2, ) \ + SPARSE_MSM_CMP_OP (mx_el_ne, !=, M1, , M2, ) + +#define SPARSE_MSM_BOOL_OP_DECLS(M1, M2) \ + SPARSE_BOOL_OP_DECL (mx_el_and, M1, M2); \ + SPARSE_BOOL_OP_DECL (mx_el_or, M1, M2); + +#define SPARSE_MSM_BOOL_OP(F, OP, M1, M2, LHS_ZERO, RHS_ZERO) \ + SparseBoolMatrix \ + F (const M1& m1, const M2& m2) \ + { \ + SparseBoolMatrix r; \ + \ + int m1_nr = m1.rows (); \ + int m1_nc = m1.cols (); \ + \ + int m2_nr = m2.rows (); \ + int m2_nc = m2.cols (); \ + \ + if (m1_nr == m2_nr && m1_nc == m2_nc) \ + { \ + if (m1_nr != 0 || m1_nc != 0) \ + { \ + /* Count num of non-zero elements */ \ + int nel = 0; \ + for (int j = 0; j < m1_nc; j++) \ + for (int i = 0; i < m1_nr; i++) \ + if ((m1.elem(i, j) != LHS_ZERO) \ + OP (m2.elem(i, j) != RHS_ZERO)) \ + nel++; \ + \ + r = SparseBoolMatrix (m1_nr, m1_nc, nel); \ + \ + int ii = 0; \ + r.cidx (0) = 0; \ + for (int j = 0; j < m1_nc; j++) \ + { \ + for (int i = 0; i < m1_nr; i++) \ + { \ + bool el = (m1.elem(i, j) != LHS_ZERO) \ + OP (m2.elem(i, j) != RHS_ZERO); \ + if (el) \ + { \ + r.data(ii) = el; \ + r.ridx(ii++) = i; \ + } \ + } \ + r.cidx(j+1) = ii; \ + } \ + } \ + } \ + else \ + { \ + if ((m1_nr != 0 || m1_nc != 0) && (m2_nr != 0 || m2_nc != 0)) \ + gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \ + } \ + return r; \ + } + +#define SPARSE_MSM_BOOL_OPS2(M1, M2, LHS_ZERO, RHS_ZERO) \ + SPARSE_MSM_BOOL_OP (mx_el_and, &&, M1, M2, LHS_ZERO, RHS_ZERO) \ + SPARSE_MSM_BOOL_OP (mx_el_or, ||, M1, M2, LHS_ZERO, RHS_ZERO) \ + +#define SPARSE_MSM_BOOL_OPS(M1, M2, ZERO) \ + SPARSE_MSM_BOOL_OPS2(M1, M2, ZERO, ZERO) + +#define SPARSE_MSM_OP_DECLS(R1, R2, M1, M2) \ + SPARSE_MSM_BIN_OP_DECLS (R1, R2, M1, M2) \ + SPARSE_MSM_CMP_OP_DECLS (M1, M2) \ + SPARSE_MSM_BOOL_OP_DECLS (M1, M2) + +// matrix by matrix operations. + +#define SPARSE_SMM_BIN_OP_DECLS(R1, R2, M1, M2) \ + SPARSE_BIN_OP_DECL (R1, operator +, M1, M2); \ + SPARSE_BIN_OP_DECL (R1, operator -, M1, M2); \ + SPARSE_BIN_OP_DECL (R2, product, M1, M2); \ + SPARSE_BIN_OP_DECL (R2, quotient, M1, M2); + +#define SPARSE_SMM_BIN_OP_1(R, F, OP, M1, M2) \ + R \ + F (const M1& m1, const M2& m2) \ + { \ + R r; \ + \ + int m1_nr = m1.rows (); \ + int m1_nc = m1.cols (); \ + \ + int m2_nr = m2.rows (); \ + int m2_nc = m2.cols (); \ + \ + if (m1_nr != m2_nr || m1_nc != m2_nc) \ + gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \ + else \ + { \ + r = R (m1_nr, m1_nc); \ + \ + for (int j = 0; j < m1_nc; j++) \ + for (int i = 0; i < m1_nr; i++) \ + r.elem (i, j) = m1.elem (i, j) OP m2.elem (i, j); \ + } \ + return r; \ + } + +#define SPARSE_SMM_BIN_OP_2(R, F, OP, M1, M2, ZERO) \ + R \ + F (const M1& m1, const M2& m2) \ + { \ + R r; \ + \ + int m1_nr = m1.rows (); \ + int m1_nc = m1.cols (); \ + \ + int m2_nr = m2.rows (); \ + int m2_nc = m2.cols (); \ + \ + if (m1_nr != m2_nr || m1_nc != m2_nc) \ + gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \ + else \ + { \ + /* Count num of non-zero elements */ \ + int nel = 0; \ + for (int j = 0; j < m1_nc; j++) \ + for (int i = 0; i < m1_nr; i++) \ + if ((m1.elem(i, j) OP m2.elem(i, j)) != ZERO) \ + nel++; \ + \ + r = R (m1_nr, m1_nc, nel); \ + \ + int ii = 0; \ + r.cidx (0) = 0; \ + for (int j = 0 ; j < m1_nc ; j++) \ + { \ + for (int i = 0 ; i < m1_nr ; i++) \ + { \ + if ((m1.elem(i, j) OP m2.elem(i, j)) != ZERO) \ + { \ + r.data (ii) = m1.elem(i, j) OP m2.elem(i,j); \ + r.ridx (ii++) = i; \ + } \ + } \ + r.cidx(j+1) = ii; \ + } \ + } \ + \ + return r; \ + } + +// XXX FIXME XXX Pass a specific ZERO value +#define SPARSE_SMM_BIN_OPS(R1, R2, M1, M2) \ + SPARSE_SMM_BIN_OP_1 (R1, operator +, +, M1, M2) \ + SPARSE_SMM_BIN_OP_1 (R1, operator -, -, M1, M2) \ + SPARSE_SMM_BIN_OP_2 (R2, product, *, M1, M2, 0.0) \ + SPARSE_SMM_BIN_OP_2 (R2, quotient, /, M1, M2, 0.0) + +#define SPARSE_SMM_CMP_OP_DECLS(M1, M2) \ + SPARSE_CMP_OP_DECL (mx_el_lt, M1, M2); \ + SPARSE_CMP_OP_DECL (mx_el_le, M1, M2); \ + SPARSE_CMP_OP_DECL (mx_el_ge, M1, M2); \ + SPARSE_CMP_OP_DECL (mx_el_gt, M1, M2); \ + SPARSE_CMP_OP_DECL (mx_el_eq, M1, M2); \ + SPARSE_CMP_OP_DECL (mx_el_ne, M1, M2); + +#define SPARSE_SMM_EQNE_OP_DECLS(M1, M2) \ + SPARSE_CMP_OP_DECL (mx_el_eq, M1, M2); \ + SPARSE_CMP_OP_DECL (mx_el_ne, M1, M2); + +#define SPARSE_SMM_CMP_OP(F, OP, M1, C1, M2, C2) \ + SparseBoolMatrix \ + F (const M1& m1, const M2& m2) \ + { \ + SparseBoolMatrix r; \ + \ + int m1_nr = m1.rows (); \ + int m1_nc = m1.cols (); \ + \ + int m2_nr = m2.rows (); \ + int m2_nc = m2.cols (); \ + \ + if (m1_nr == m2_nr && m1_nc == m2_nc) \ + { \ + if (m1_nr != 0 || m1_nc != 0) \ + { \ + /* Count num of non-zero elements */ \ + int nel = 0; \ + for (int j = 0; j < m1_nc; j++) \ + for (int i = 0; i < m1_nr; i++) \ + if (C1 (m1.elem(i, j)) OP C2 (m2.elem(i, j))) \ + nel++; \ + \ + r = SparseBoolMatrix (m1_nr, m1_nc, nel); \ + \ + int ii = 0; \ + r.cidx (0) = 0; \ + for (int j = 0; j < m1_nc; j++) \ + { \ + for (int i = 0; i < m1_nr; i++) \ + { \ + bool el = C1 (m1.elem(i, j)) OP C2 (m2.elem(i, j)); \ + if (el) \ + { \ + r.data(ii) = el; \ + r.ridx(ii++) = i; \ + } \ + } \ + r.cidx(j+1) = ii; \ + } \ + } \ + } \ + else \ + { \ + if ((m1_nr != 0 || m1_nc != 0) && (m2_nr != 0 || m2_nc != 0)) \ + gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \ + } \ + return r; \ + } + +#define SPARSE_SMM_CMP_OPS(M1, Z1, C1, M2, Z2, C2) \ + SPARSE_SMM_CMP_OP (mx_el_lt, <, M1, C1, M2, C2) \ + SPARSE_SMM_CMP_OP (mx_el_le, <=, M1, C1, M2, C2) \ + SPARSE_SMM_CMP_OP (mx_el_ge, >=, M1, C1, M2, C2) \ + SPARSE_SMM_CMP_OP (mx_el_gt, >, M1, C1, M2, C2) \ + SPARSE_SMM_CMP_OP (mx_el_eq, ==, M1, , M2, ) \ + SPARSE_SMM_CMP_OP (mx_el_ne, !=, M1, , M2, ) + +#define SPARSE_SMM_EQNE_OPS(M1, Z1, C1, M2, Z2, C2) \ + SPARSE_SMM_CMP_OP (mx_el_eq, ==, M1, , M2, ) \ + SPARSE_SMM_CMP_OP (mx_el_ne, !=, M1, , M2, ) + +#define SPARSE_SMM_BOOL_OP_DECLS(M1, M2) \ + SPARSE_BOOL_OP_DECL (mx_el_and, M1, M2); \ + SPARSE_BOOL_OP_DECL (mx_el_or, M1, M2); + +#define SPARSE_SMM_BOOL_OP(F, OP, M1, M2, LHS_ZERO, RHS_ZERO) \ + SparseBoolMatrix \ + F (const M1& m1, const M2& m2) \ + { \ + SparseBoolMatrix r; \ + \ + int m1_nr = m1.rows (); \ + int m1_nc = m1.cols (); \ + \ + int m2_nr = m2.rows (); \ + int m2_nc = m2.cols (); \ + \ + if (m1_nr == m2_nr && m1_nc == m2_nc) \ + { \ + if (m1_nr != 0 || m1_nc != 0) \ + { \ + /* Count num of non-zero elements */ \ + int nel = 0; \ + for (int j = 0; j < m1_nc; j++) \ + for (int i = 0; i < m1_nr; i++) \ + if ((m1.elem(i, j) != LHS_ZERO) \ + OP (m2.elem(i, j) != RHS_ZERO)) \ + nel++; \ + \ + r = SparseBoolMatrix (m1_nr, m1_nc, nel); \ + \ + int ii = 0; \ + r.cidx (0) = 0; \ + for (int j = 0; j < m1_nc; j++) \ + { \ + for (int i = 0; i < m1_nr; i++) \ + { \ + bool el = (m1.elem(i, j) != LHS_ZERO) \ + OP (m2.elem(i, j) != RHS_ZERO); \ + if (el) \ + { \ + r.data(ii) = el; \ + r.ridx(ii++) = i; \ + } \ + } \ + r.cidx(j+1) = ii; \ + } \ + } \ + } \ + else \ + { \ + if ((m1_nr != 0 || m1_nc != 0) && (m2_nr != 0 || m2_nc != 0)) \ + gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \ + } \ + return r; \ + } + +#define SPARSE_SMM_BOOL_OPS2(M1, M2, LHS_ZERO, RHS_ZERO) \ + SPARSE_SMM_BOOL_OP (mx_el_and, &&, M1, M2, LHS_ZERO, RHS_ZERO) \ + SPARSE_SMM_BOOL_OP (mx_el_or, ||, M1, M2, LHS_ZERO, RHS_ZERO) \ + +#define SPARSE_SMM_BOOL_OPS(M1, M2, ZERO) \ + SPARSE_SMM_BOOL_OPS2(M1, M2, ZERO, ZERO) + +#define SPARSE_SMM_OP_DECLS(R1, R2, M1, M2) \ + SPARSE_SMM_BIN_OP_DECLS (R1, R2, M1, M2) \ + SPARSE_SMM_CMP_OP_DECLS (M1, M2) \ + SPARSE_SMM_BOOL_OP_DECLS (M1, M2) + +// Avoid some code duplication. Maybe we should use templates. + +#define SPARSE_CUMSUM(RET_TYPE, ELT_TYPE, FCN) \ + \ + int nr = rows (); \ + int nc = cols (); \ + \ + RET_TYPE retval; \ + \ + if (nr > 0 && nc > 0) \ + { \ + if ((nr == 1 && dim == -1) || dim == 1) \ + /* Ugly!! Is there a better way? */ \ + retval = transpose (). FCN (0) .transpose (); \ + else \ + { \ + int nel = 0; \ + for (int i = 0; i < nc; i++) \ + { \ + ELT_TYPE t = ELT_TYPE (); \ + for (int j = cidx (i); j < cidx (i+1); j++) \ + { \ + t += data(j); \ + if (t != ELT_TYPE ()) \ + if (j == cidx(i+1) - 1) \ + nel += nr - ridx(j); \ + else \ + nel += ridx(j+1) - ridx(j); \ + } \ + } \ + retval = RET_TYPE (nr, nc, nel); \ + retval.cidx(0) = 0; \ + int ii = 0; \ + for (int i = 0; i < nc; i++) \ + { \ + ELT_TYPE t = ELT_TYPE (); \ + for (int j = cidx (i); j < cidx (i+1); j++) \ + { \ + t += data(j); \ + if (t != ELT_TYPE ()) \ + { \ + if (j == cidx(i+1) - 1) \ + { \ + for (int k = ridx(j); k < nr; k++) \ + { \ + retval.data (ii) = t; \ + retval.ridx (ii++) = k; \ + } \ + } \ + else \ + { \ + for (int k = ridx(j); k < ridx(j+1); k++) \ + { \ + retval.data (ii) = t; \ + retval.ridx (ii++) = k; \ + } \ + } \ + } \ + } \ + retval.cidx(i+1) = ii; \ + } \ + } \ + } \ + else \ + retval = RET_TYPE (nr,nc); \ + \ + return retval + + +#define SPARSE_CUMPROD(RET_TYPE, ELT_TYPE, FCN) \ + \ + int nr = rows (); \ + int nc = cols (); \ + \ + RET_TYPE retval; \ + \ + if (nr > 0 && nc > 0) \ + { \ + if ((nr == 1 && dim == -1) || dim == 1) \ + /* Ugly!! Is there a better way? */ \ + retval = transpose (). FCN (0) .transpose (); \ + else \ + { \ + int nel = 0; \ + for (int i = 0; i < nc; i++) \ + { \ + int jj = 0; \ + for (int j = cidx (i); j < cidx (i+1); j++) \ + { \ + if (jj == ridx(j)) \ + { \ + nel++; \ + jj++; \ + } \ + else \ + break; \ + } \ + } \ + retval = RET_TYPE (nr, nc, nel); \ + retval.cidx(0) = 0; \ + int ii = 0; \ + for (int i = 0; i < nc; i++) \ + { \ + ELT_TYPE t = ELT_TYPE (1.); \ + int jj = 0; \ + for (int j = cidx (i); j < cidx (i+1); j++) \ + { \ + if (jj == ridx(j)) \ + { \ + t *= data(j); \ + retval.data(ii) = t; \ + retval.ridx(ii++) = jj++; \ + } \ + else \ + break; \ + } \ + retval.cidx(i+1) = ii; \ + } \ + } \ + } \ + else \ + retval = RET_TYPE (nr,nc); \ + \ + return retval + +#define SPARSE_BASE_REDUCTION_OP(RET_TYPE, EL_TYPE, ROW_EXPR, COL_EXPR, \ + INIT_VAL, MT_RESULT) \ + \ + int nr = rows (); \ + int nc = cols (); \ + \ + RET_TYPE retval; \ + \ + if (nr > 0 && nc > 0) \ + { \ + if ((nr == 1 && dim == -1) || dim == 1) \ + { \ + OCTAVE_LOCAL_BUFFER (EL_TYPE, tmp, nr); \ + \ + for (int i = 0; i < nr; i++) \ + { \ + tmp[i] = INIT_VAL; \ + for (int j = 0; j < nc; j++) \ + { \ + ROW_EXPR; \ + } \ + } \ + int nel = 0; \ + for (int i = 0; i < nr; i++) \ + if (tmp[i] != EL_TYPE ()) \ + nel++ ; \ + retval = RET_TYPE (nr, 1, nel); \ + retval.cidx(0) = 0; \ + retval.cidx(1) = nel; \ + nel = 0; \ + for (int i = 0; i < nr; i++) \ + if (tmp[i] != EL_TYPE ()) \ + { \ + retval.data(nel) = tmp[i]; \ + retval.ridx(nel++) = i; \ + } \ + } \ + else \ + { \ + OCTAVE_LOCAL_BUFFER (EL_TYPE, tmp, nc); \ + \ + for (int j = 0; j < nc; j++) \ + { \ + tmp[j] = INIT_VAL; \ + for (int i = 0; i < nr; i++) \ + { \ + COL_EXPR; \ + } \ + } \ + int nel = 0; \ + for (int i = 0; i < nc; i++) \ + if (tmp[i] != EL_TYPE ()) \ + nel++ ; \ + retval = RET_TYPE (1, nc, nel); \ + retval.cidx(0) = 0; \ + nel = 0; \ + for (int i = 0; i < nc; i++) \ + if (tmp[i] != EL_TYPE ()) \ + { \ + retval.data(nel) = tmp[i]; \ + retval.ridx(nel++) = 0; \ + retval.cidx(i+1) = retval.cidx(i) + 1; \ + } \ + else \ + retval.cidx(i+1) = retval.cidx(i); \ + } \ + } \ + else if (nc == 0 && (nr == 0 || (nr == 1 && dim == -1))) \ + { \ + retval = RET_TYPE (1, 1, 1); \ + retval.cidx(0) = 0; \ + retval.cidx(1) = 1; \ + retval.ridx(0) = 0; \ + retval.data(0) = MT_RESULT; \ + } \ + else if (nr == 0 && (dim == 0 || dim == -1)) \ + { \ + retval = RET_TYPE (1, nc, nc); \ + retval.cidx (0) = 0; \ + for (int i = 0; i < nc ; i++) \ + { \ + retval.ridx (i) = 0; \ + retval.cidx (i+1) = i; \ + retval.data (i) = MT_RESULT; \ + } \ + } \ + else if (nc == 0 && dim == 1) \ + { \ + retval = RET_TYPE (nr, 1, nr); \ + retval.cidx(0) = 0; \ + retval.cidx(1) = nr; \ + for (int i = 0; i < nr; i++) \ + { \ + retval.ridx(i) = i; \ + retval.data(i) = MT_RESULT; \ + } \ + } \ + else \ + retval.resize (nr > 0, nc > 0); \ + \ + return retval + +#define SPARSE_REDUCTION_OP_ROW_EXPR(OP) \ + tmp[i] OP elem (i, j) + +#define SPARSE_REDUCTION_OP_COL_EXPR(OP) \ + tmp[j] OP elem (i, j) + +#define SPARSE_REDUCTION_OP(RET_TYPE, EL_TYPE, OP, INIT_VAL, MT_RESULT) \ + SPARSE_BASE_REDUCTION_OP (RET_TYPE, EL_TYPE, \ + SPARSE_REDUCTION_OP_ROW_EXPR (OP), \ + SPARSE_REDUCTION_OP_COL_EXPR (OP), \ + INIT_VAL, MT_RESULT) + +#define SPARSE_ANY_ALL_OP_ROW_CODE(TEST_OP, TEST_TRUE_VAL) \ + if (elem (i, j) TEST_OP 0.0) \ + { \ + tmp[i] = TEST_TRUE_VAL; \ + break; \ + } + +#define SPARSE_ANY_ALL_OP_COL_CODE(TEST_OP, TEST_TRUE_VAL) \ + if (elem (i, j) TEST_OP 0.0) \ + { \ + tmp[j] = TEST_TRUE_VAL; \ + break; \ + } + +#define SPARSE_ANY_ALL_OP(DIM, INIT_VAL, TEST_OP, TEST_TRUE_VAL) \ + SPARSE_BASE_REDUCTION_OP (SparseBoolMatrix, char, \ + SPARSE_ANY_ALL_OP_ROW_CODE (TEST_OP, TEST_TRUE_VAL), \ + SPARSE_ANY_ALL_OP_COL_CODE (TEST_OP, TEST_TRUE_VAL), \ + INIT_VAL, INIT_VAL) + +#define SPARSE_ALL_OP(DIM) SPARSE_ANY_ALL_OP (DIM, true, ==, false) + +#define SPARSE_ANY_OP(DIM) SPARSE_ANY_ALL_OP (DIM, false, !=, true) + +#define SPARSE_SPARSE_MUL( RET_TYPE, EL_TYPE ) \ + int nr = m.rows (); \ + int nc = m.cols (); \ + \ + int a_nr = a.rows (); \ + int a_nc = a.cols (); \ + \ + if (nc != a_nr) \ + { \ + gripe_nonconformant ("operator *", nr, nc, a_nr, a_nc); \ + return RET_TYPE (); \ + } \ + else \ + { \ + OCTAVE_LOCAL_BUFFER (EL_TYPE, Xcol, nr); \ + \ + int nel = 0; \ + \ + for (int i = 0; i < a_nc; i++) \ + { \ + OCTAVE_QUIT; \ + for (int k = 0; k < nr; k++) \ + Xcol[k]= 0.; \ + for (int j = a.cidx(i); j < a.cidx(i+1); j++) \ + { \ + int col = a.ridx(j); \ + for (int k = m.cidx(col) ; k < m.cidx(col+1); k++) \ + if (Xcol[m.ridx(k)] == 0.) \ + { \ + Xcol[m.ridx(k)] = 1.; \ + nel++; \ + } \ + } \ + } \ + \ + if (nel == 0) \ + return RET_TYPE (nr, a_nc); \ + else \ + { \ + RET_TYPE retval (nr, a_nc, nel); \ + \ + int ii = 0; \ + \ + retval.cidx(0) = 0; \ + for (int i = 0; i < a_nc ; i++) \ + { \ + OCTAVE_QUIT; \ + for (int k = 0; k < nr; k++) \ + Xcol[k]= 0.; \ + for (int j = a.cidx(i); j < a.cidx(i+1); j++) \ + { \ + int col = a.ridx(j); \ + EL_TYPE tmpval = a.data(j); \ + for (int k = m.cidx(col) ; k < m.cidx(col+1); k++) \ + Xcol[m.ridx(k)] += tmpval * m.data(k); \ + } \ + for (int k = 0; k < nr; k++) \ + { \ + if (Xcol[k] !=0. ) \ + { \ + retval.ridx (ii) = k; \ + retval.data (ii++) = Xcol[k]; \ + } \ + } \ + retval.cidx(i+1) = ii; \ + } \ + return retval; \ + } \ + } + +#endif + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/Sparse.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/Sparse.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,2834 @@ +// Template sparse array class +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include +#include + +#include "Array.h" +#include "Array-flags.h" +#include "Array-util.h" +#include "Range.h" +#include "idx-vector.h" +#include "lo-error.h" +#include "lo-sstream.h" +#include "quit.h" + +#include "Sparse.h" +#include "sparse-sort.h" +#include "oct-spparms.h" + +template +T& +Sparse::SparseRep::elem (int _r, int _c) +{ + int i; + + if (nnz > 0) + { + for (i = c[_c]; i < c[_c + 1]; i++) + if (r[i] == _r) + return d[i]; + else if (r[i] > _r) + break; + + // Ok, If we've gotten here, we're in trouble.. Have to create a + // new element in the sparse array. This' gonna be slow!!! + if (c[ncols+1] == nnz) + { + (*current_liboctave_error_handler) + ("Sparse::SparseRep::elem (int, int): sparse matrix filled"); + return *d; + } + + int to_move = c[ncols] - i; + if (to_move != 0) + { + for (int j = c[ncols]; j > i; j--) + { + d[j] = d[j-1]; + r[j] = r[j-1]; + } + } + + for (int j = _c + 1; j < ncols + 1; j++) + c[j] = c[j] + 1; + + d[i] = 0.; + r[i] = _r; + + return d[i]; + } + else + { + (*current_liboctave_error_handler) + ("Sparse::SparseRep::elem (int, int): sparse matrix filled"); + return *d; + } +} + +template +T +Sparse::SparseRep::celem (int _r, int _c) const +{ + if (nnz > 0) + for (int i = c[_c]; i < c[_c + 1]; i++) + if (r[i] == _r) + return d[i]; + return T (); +} + +template +void +Sparse::SparseRep::maybe_compress (bool remove_zeros) +{ + int ndel = nnz - c[ncols]; + int nzero = 0; + + if (remove_zeros) + for (int i = 0; i < nnz - ndel; i++) + if (d[i] == T ()) + nzero++; + + if (!ndel && !nzero) + return; + + if (!nzero) + { + int new_nnz = nnz - ndel; + + T *new_data = new T [new_nnz]; + for (int i = 0; i < new_nnz; i++) + new_data[i] = d[i]; + delete [] d; + d = new_data; + + int *new_ridx = new int [new_nnz]; + for (int i = 0; i < new_nnz; i++) + new_ridx[i] = r[i]; + delete [] r; + r = new_ridx; + } + else + { + int new_nnz = nnz - ndel - nzero; + + T *new_data = new T [new_nnz]; + int *new_ridx = new int [new_nnz]; + + int ii = 0; + int ic = 0; + for (int j = 0; j < ncols; j++) + { + for (int k = ic; k < c[j+1]; k++) + if (d[k] != T ()) + { + new_data [ii] = d[k]; + new_ridx [ii++] = r[k]; + } + ic = c[j+1]; + c[j+1] = ii; + } + + delete [] d; + d = new_data; + + delete [] r; + r = new_ridx; + } + + nnz -= ndel + nzero; +} + +template +void +Sparse::SparseRep::change_length (int nz) +{ + if (nz != nnz) + { + int min_nnz = (nz < nnz ? nz : nnz); + + int * new_ridx = new int [nz]; + for (int i = 0; i < min_nnz; i++) + new_ridx[i] = r[i]; + + delete [] r; + r = new_ridx; + + T * new_data = new T [nz]; + for (int i = 0; i < min_nnz; i++) + new_data[i] = d[i]; + + delete [] d; + d = new_data; + + if (nz < nnz) + for (int i = 0; i <= ncols; i++) + if (c[i] > nz) + c[i] = nz; + + nnz = nz; + } +} + +template +template +Sparse::Sparse (const Sparse& a) + : dimensions (a.dimensions), idx (0), idx_count (0) +{ + if (a.nnz () == 0) + rep = new typename Sparse::SparseRep (rows (), cols()); + else + { + rep = new typename Sparse::SparseRep (rows (), cols (), a.nnz ()); + + int nz = nnz (); + int nc = cols (); + for (int i = 0; i < nz; i++) + { + xdata (i) = T (a.data (i)); + xridx (i) = a.ridx (i); + } + for (int i = 0; i < nc + 1; i++) + xcidx (i) = a.cidx (i); + } +} + +template +Sparse::Sparse (int nr, int nc, T val) + : rep (new typename Sparse::SparseRep (nr, nc, nr*nc)), + dimensions (dim_vector (nr, nc)), idx (0), idx_count (0) +{ + + int ii = 0; + xcidx (0) = 0; + for (int j = 0; j < nc; j++) + { + for (int i = 0; i < nr; i++) + { + xdata (ii) = val; + xridx (ii++) = i; + } + xcidx (j+1) = ii; + } +} + +template +Sparse::Sparse (const dim_vector& dv) + : dimensions (dv), idx (0), idx_count (0) +{ + if (dv.length() != 2) + (*current_liboctave_error_handler) + ("Sparse::Sparse (const dim_vector&): dimension mismatch"); + else + rep = new typename Sparse::SparseRep (dv(0), dv(1)); +} + +template +Sparse::Sparse (const Sparse& a, const dim_vector& dv) + : dimensions (dv), idx (0), idx_count (0) +{ + + // Work in unsigned long long to avoid overflow issues with numel + unsigned long long a_nel = static_cast(a.rows ()) * + static_cast(a.cols ()); + unsigned long long dv_nel = static_cast(dv (0)) * + static_cast(dv (1)); + + if (a_nel != dv_nel) + (*current_liboctave_error_handler) + ("Sparse::Sparse (const Sparse&, const dim_vector&): dimension mismatch"); + else + { + dim_vector old_dims = a.dims(); + int new_nnz = a.nnz (); + int new_nr = dv (0); + int new_nc = dv (1); + int old_nr = old_dims (0); + int old_nc = old_dims (1); + + rep = new typename Sparse::SparseRep (new_nr, new_nc, new_nnz); + + int kk = 0; + xcidx(0) = 0; + for (int i = 0; i < old_nc; i++) + for (int j = a.cidx(i); j < a.cidx(i+1); j++) + { + int tmp = i * old_nr + a.ridx(j); + int ii = tmp % new_nr; + int jj = (tmp - ii) / new_nr; + for (int k = kk; k < jj; k++) + xcidx(k+1) = j; + kk = jj; + xdata(j) = a.data(j); + xridx(j) = ii; + } + for (int k = kk; k < new_nc; k++) + xcidx(k+1) = new_nnz; + } +} + +template +Sparse::Sparse (const Array& a, const Array& r, + const Array& c, int nr, + int nc, bool sum_terms) + : dimensions (dim_vector (nr, nc)), idx (0), idx_count (0) +{ + int a_len = a.length (); + int r_len = r.length (); + int c_len = c.length (); + bool ri_scalar = (r_len == 1); + bool ci_scalar = (c_len == 1); + bool cf_scalar = (a_len == 1); + + if ((a_len != r_len && !cf_scalar && !ri_scalar) || + (a_len != c_len && !cf_scalar && !ci_scalar) || + (r_len != c_len && !ri_scalar && !ci_scalar) || nr < 0 || nc < 0) + { + (*current_liboctave_error_handler) + ("Sparse::Sparse (const Array&, const Array&, ...): dimension mismatch"); + rep = nil_rep (); + dimensions = dim_vector (0, 0); + } + else + { + int max_nnz = (r_len > c_len ? r_len : c_len); + + OCTAVE_LOCAL_BUFFER (octave_sparse_sort_idxl *, sidx, max_nnz); + OCTAVE_LOCAL_BUFFER (octave_sparse_sort_idxl, sidxX, max_nnz); + + for (int i = 0; i < max_nnz; i++) + sidx[i] = &sidxX[i]; + + int actual_nnz = 0; + OCTAVE_QUIT; + for (int i = 0; i < max_nnz; i++) + { + int rowidx = (ri_scalar ? r(0) : r(i)); + int colidx = (ci_scalar ? c(0) : c(i)); + if (rowidx < nr && rowidx >= 0 && + colidx < nc && colidx >= 0 ) + { + if ( a (cf_scalar ? 0 : i ) != T ()) + { + sidx[actual_nnz]->r = rowidx; + sidx[actual_nnz]->c = colidx; + sidx[actual_nnz]->idx = i; + actual_nnz++; + } + } + else + { + (*current_liboctave_error_handler) + ("Sparse::Sparse : index (%d,%d) out of range", + rowidx + 1, colidx + 1); + rep = nil_rep (); + dimensions = dim_vector (0, 0); + return; + } + } + + if (actual_nnz == 0) + rep = new typename Sparse::SparseRep (nr, nc); + else + { + OCTAVE_QUIT; + octave_sort + sort (octave_sparse_sidxl_comp); + + sort.sort (sidx, actual_nnz); + OCTAVE_QUIT; + + // Now count the unique non-zero values + int real_nnz = 1; + for (int i = 1; i < actual_nnz; i++) + if (sidx[i-1]->r != sidx[i]->r || sidx[i-1]->c != sidx[i]->c) + real_nnz++; + + rep = new typename Sparse::SparseRep (nr, nc, real_nnz); + + int cx = 0; + int prev_rval = -1; + int prev_cval = -1; + int ii = -1; + xcidx (0) = 0; + for (int i = 0; i < actual_nnz; i++) + { + OCTAVE_QUIT; + int iidx = sidx[i]->idx; + int rval = sidx[i]->r; + int cval = sidx[i]->c; + + if (prev_cval < cval || (prev_rval < rval && prev_cval == cval)) + { + int ci = static_cast (c (ci_scalar ? 0 : iidx)); + ii++; + while (cx < ci) + xcidx (++cx) = ii; + xdata(ii) = a (cf_scalar ? 0 : iidx); + xridx(ii) = static_cast (r (ri_scalar ? 0 : iidx)); + } + else + { + if (sum_terms) + xdata(ii) += a (cf_scalar ? 0 : iidx); + else + xdata(ii) = a (cf_scalar ? 0 : iidx); + } + prev_rval = rval; + prev_cval = cval; + } + + while (cx < nc) + xcidx (++cx) = ii + 1; + } + } +} + +template +Sparse::Sparse (const Array& a, const Array& r, + const Array& c, int nr, + int nc, bool sum_terms) + : dimensions (dim_vector (nr, nc)), idx (0), idx_count (0) +{ + int a_len = a.length (); + int r_len = r.length (); + int c_len = c.length (); + bool ri_scalar = (r_len == 1); + bool ci_scalar = (c_len == 1); + bool cf_scalar = (a_len == 1); + + if ((a_len != r_len && !cf_scalar && !ri_scalar) || + (a_len != c_len && !cf_scalar && !ci_scalar) || + (r_len != c_len && !ri_scalar && !ci_scalar) || nr < 0 || nc < 0) + { + (*current_liboctave_error_handler) + ("Sparse::Sparse (const Array&, const Array&, ...): dimension mismatch"); + rep = nil_rep (); + dimensions = dim_vector (0, 0); + } + else + { + int max_nnz = (r_len > c_len ? r_len : c_len); + + OCTAVE_LOCAL_BUFFER (octave_sparse_sort_idxl *, sidx, max_nnz); + OCTAVE_LOCAL_BUFFER (octave_sparse_sort_idxl, sidxX, max_nnz); + + for (int i = 0; i < max_nnz; i++) + sidx[i] = &sidxX[i]; + + int actual_nnz = 0; + OCTAVE_QUIT; + + for (int i = 0; i < max_nnz; i++) + { + int rowidx = static_cast (ri_scalar ? r(0) : r(i)); + int colidx = static_cast (ci_scalar ? c(0) : c(i)); + if (rowidx < nr && rowidx >= 0 && + colidx < nc && colidx >= 0 ) + { + if ( a (cf_scalar ? 0 : i ) != T ()) + { + sidx[actual_nnz]->r = rowidx; + sidx[actual_nnz]->c = colidx; + sidx[actual_nnz]->idx = i; + actual_nnz++; + } + } + else + { + (*current_liboctave_error_handler) + ("Sparse::Sparse : index (%d,%d) out of range", + rowidx + 1, colidx + 1); + rep = nil_rep (); + dimensions = dim_vector (0, 0); + return; + } + } + + if (actual_nnz == 0) + rep = new typename Sparse::SparseRep (nr, nc); + else + { + OCTAVE_QUIT; + octave_sort + sort (octave_sparse_sidxl_comp); + + sort.sort (sidx, actual_nnz); + OCTAVE_QUIT; + + // Now count the unique non-zero values + int real_nnz = 1; + for (int i = 1; i < actual_nnz; i++) + if (sidx[i-1]->r != sidx[i]->r || sidx[i-1]->c != sidx[i]->c) + real_nnz++; + + rep = new typename Sparse::SparseRep (nr, nc, real_nnz); + + int cx = 0; + int prev_rval = -1; + int prev_cval = -1; + int ii = -1; + xcidx (0) = 0; + for (int i = 0; i < actual_nnz; i++) + { + OCTAVE_QUIT; + int iidx = sidx[i]->idx; + int rval = sidx[i]->r; + int cval = sidx[i]->c; + + if (prev_cval < cval || (prev_rval < rval && prev_cval == cval)) + { + int ci = static_cast (c (ci_scalar ? 0 : iidx)); + ii++; + + while (cx < ci) + xcidx (++cx) = ii; + xdata(ii) = a (cf_scalar ? 0 : iidx); + xridx(ii) = static_cast (r (ri_scalar ? 0 : iidx)); + } + else + { + if (sum_terms) + xdata(ii) += a (cf_scalar ? 0 : iidx); + else + xdata(ii) = a (cf_scalar ? 0 : iidx); + } + prev_rval = rval; + prev_cval = cval; + } + + while (cx < nc) + xcidx (++cx) = ii + 1; + } + } +} + +template +Sparse::Sparse (const Array2& a) + : dimensions (a.dims ()), idx (0), idx_count (0) +{ + int nr = rows (); + int nc = cols (); + int len = a.length (); + int new_nnz = 0; + + // First count the number of non-zero terms + for (int i = 0; i < len; i++) + if (a(i) != T ()) + new_nnz++; + + rep = new typename Sparse::SparseRep (nr, nc, new_nnz); + + int ii = 0; + xcidx(0) = 0; + for (int j = 0; j < nc; j++) + { + for (int i = 0; i < nr; i++) + if (a.elem (i,j) != T ()) + { + xdata(ii) = a.elem (i,j); + xridx(ii++) = i; + } + xcidx(j+1) = ii; + } +} + +template +Sparse::Sparse (const Array& a) + : dimensions (a.dims ()), idx (0), idx_count (0) +{ + if (dimensions.length () > 2) + (*current_liboctave_error_handler) + ("Sparse::Sparse (const Array&): dimension mismatch"); + else + { + int nr = rows (); + int nc = cols (); + int len = a.length (); + int new_nnz = 0; + + // First count the number of non-zero terms + for (int i = 0; i < len; i++) + if (a(i) != T ()) + new_nnz++; + + rep = new typename Sparse::SparseRep (nr, nc, new_nnz); + + int ii = 0; + xcidx(0) = 0; + for (int j = 0; j < nc; j++) + { + for (int i = 0; i < nr; i++) + if (a.elem (i,j) != T ()) + { + xdata(ii) = a.elem (i,j); + xridx(ii++) = i; + } + xcidx(j+1) = ii; + } + } +} + +template +Sparse::~Sparse (void) +{ + if (--rep->count <= 0) + delete rep; + + delete [] idx; +} + +template +int +Sparse::compute_index (const Array& ra_idx) const +{ + int retval = -1; + + int n = dimensions.length (); + + if (n > 0 && n == ra_idx.length ()) + { + retval = ra_idx(--n); + + while (--n >= 0) + { + retval *= dimensions(n); + retval += ra_idx(n); + } + } + else + (*current_liboctave_error_handler) + ("Sparse::compute_index: invalid ra_idxing operation"); + + return retval; +} + +template +T +Sparse::range_error (const char *fcn, int n) const +{ + (*current_liboctave_error_handler) ("%s (%d): range error", fcn, n); + return T (); +} + +template +T& +Sparse::range_error (const char *fcn, int n) +{ + (*current_liboctave_error_handler) ("%s (%d): range error", fcn, n); + static T foo; + return foo; +} + +template +T +Sparse::range_error (const char *fcn, int i, int j) const +{ + (*current_liboctave_error_handler) + ("%s (%d, %d): range error", fcn, i, j); + return T (); +} + +template +T& +Sparse::range_error (const char *fcn, int i, int j) +{ + (*current_liboctave_error_handler) + ("%s (%d, %d): range error", fcn, i, j); + static T foo; + return foo; +} + +template +T +Sparse::range_error (const char *fcn, const Array& ra_idx) const +{ + OSSTREAM buf; + + buf << fcn << " ("; + + int n = ra_idx.length (); + + if (n > 0) + buf << ra_idx(0); + + for (int i = 1; i < n; i++) + buf << ", " << ra_idx(i); + + buf << "): range error"; + + buf << OSSTREAM_ENDS; + + (*current_liboctave_error_handler) (OSSTREAM_C_STR (buf)); + + OSSTREAM_FREEZE (buf); + + return T (); +} + +template +T& +Sparse::range_error (const char *fcn, const Array& ra_idx) +{ + OSSTREAM buf; + + buf << fcn << " ("; + + int n = ra_idx.length (); + + if (n > 0) + buf << ra_idx(0); + + for (int i = 1; i < n; i++) + buf << ", " << ra_idx(i); + + buf << "): range error"; + + buf << OSSTREAM_ENDS; + + (*current_liboctave_error_handler) (OSSTREAM_C_STR (buf)); + + OSSTREAM_FREEZE (buf); + + static T foo; + return foo; +} + +template +Sparse +Sparse::reshape (const dim_vector& new_dims) const +{ + Sparse retval; + + if (dimensions != new_dims) + { + if (dimensions.numel () == new_dims.numel ()) + { + int new_nnz = nnz (); + int new_nr = new_dims (0); + int new_nc = new_dims (1); + int old_nr = rows (); + int old_nc = cols (); + retval = Sparse (new_nr, new_nc, new_nnz); + + int kk = 0; + retval.xcidx(0) = 0; + for (int i = 0; i < old_nc; i++) + for (int j = cidx(i); j < cidx(i+1); j++) + { + int tmp = i * old_nr + ridx(j); + int ii = tmp % new_nr; + int jj = (tmp - ii) / new_nr; + for (int k = kk; k < jj; k++) + retval.xcidx(k+1) = j; + kk = jj; + retval.xdata(j) = data(j); + retval.xridx(j) = ii; + } + retval.xcidx(new_nc) = new_nnz; + } + else + (*current_liboctave_error_handler) ("reshape: size mismatch"); + } + else + retval = *this; + + return retval; +} + +template +Sparse +Sparse::permute (const Array& perm_vec, bool) const +{ + dim_vector dv = dims (); + dim_vector dv_new; + + int nd = dv.length (); + + dv_new.resize (nd); + + // Need this array to check for identical elements in permutation array. + Array checked (nd, false); + + // Find dimension vector of permuted array. + for (int i = 0; i < nd; i++) + { + int perm_el = perm_vec.elem (i); + + if (perm_el > dv.length () || perm_el < 1) + { + (*current_liboctave_error_handler) + ("permutation vector contains an invalid element"); + + return Sparse (); + } + + if (checked.elem(perm_el - 1)) + { + (*current_liboctave_error_handler) + ("PERM cannot contain identical elements"); + + return Sparse (); + } + else + checked.elem(perm_el - 1) = true; + + dv_new (i) = dv (perm_el - 1); + } + + if (dv_new == dv) + return *this; + else + return transpose (); +} + +template +void +Sparse::resize_no_fill (const dim_vector& dv) +{ + int n = dv.length (); + + if (n != 2) + { + (*current_liboctave_error_handler) ("sparse array must be 2-D"); + return; + } + + resize_no_fill (dv(0), dv(1)); +} + +template +void +Sparse::resize_no_fill (int r, int c) +{ + if (r < 0 || c < 0) + { + (*current_liboctave_error_handler) + ("can't resize to negative dimension"); + return; + } + + if (ndims () == 0) + dimensions = dim_vector (0, 0); + + if (r == dim1 () && c == dim2 ()) + return; + + typename Sparse::SparseRep *old_rep = Sparse::rep; + int nc = cols (); + int nr = rows (); + + if (nnz () == 0 || r == 0 || c == 0) + // Special case of redimensioning to/from a sparse matrix with + // no elements + rep = new typename Sparse::SparseRep (r, c); + else + { + int n = 0; + Sparse tmpval; + if (r >= nr) + { + if (c > nc) + n = cidx(nc); + else + n = cidx(c); + + tmpval = Sparse (r, c, n); + + if (c > nc) + { + for (int i = 0; i < nc; i++) + tmpval.cidx(i) = cidx(i); + for (int i = nc+2; i < c; i++) + tmpval.cidx(i) = tmpval.cidx(i-1); + } + else if (c <= nc) + for (int i = 0; i < c; i++) + tmpval.cidx(i) = cidx(i); + + for (int i = 0; i < n; i++) + { + tmpval.data(i) = data(i); + tmpval.ridx(i) = ridx(i); + } + } + else + { + // Count how many non zero terms before we do anything + for (int i = 0; i < c; i++) + for (int j = cidx(i); j < cidx(i+1); j++) + if (ridx(j) < r) + n++; + + if (n) + { + // Now that we know the size we can do something + tmpval = Sparse (r, c, n); + + tmpval.cidx(0); + for (int i = 0, ii = 0; i < c; i++) + { + for (int j = cidx(i); j < cidx(i+1); j++) + if (ridx(j) < r) + { + tmpval.data(ii) = data(j); + tmpval.ridx(ii++) = ridx(j); + } + tmpval.cidx(i+1) = ii; + } + } + else + tmpval = Sparse (r, c); + } + + rep = tmpval.rep; + rep->count++; + } + + dimensions = dim_vector (r, c); + + if (--old_rep->count <= 0) + delete old_rep; +} + +template +Sparse& +Sparse::insert (const Sparse& a, int r, int c) +{ + int a_rows = a.rows (); + int a_cols = a.cols (); + int nr = rows (); + int nc = cols (); + + if (r < 0 || r + a_rows > rows () || c < 0 || c + a_cols > cols ()) + { + (*current_liboctave_error_handler) ("range error for insert"); + return *this; + } + + // First count the number of elements in the final array + int nel = cidx(c) + a.nnz (); + + if (c + a_cols < nc) + nel += cidx(nc) - cidx(c + a_cols); + + for (int i = c; i < c + a_cols; i++) + for (int j = cidx(i); j < cidx(i+1); j++) + if (ridx(j) < r || ridx(j) >= r + a_rows) + nel++; + + Sparse tmp (*this); + --rep->count; + rep = new typename Sparse::SparseRep (nr, nc, nel); + + for (int i = 0; i < tmp.cidx(c); i++) + { + data(i) = tmp.data(i); + ridx(i) = tmp.ridx(i); + } + for (int i = 0; i < c + 1; i++) + cidx(i) = tmp.cidx(i); + + int ii = cidx(c); + + for (int i = c; i < c + a_cols; i++) + { + OCTAVE_QUIT; + + for (int j = tmp.cidx(i); j < tmp.cidx(i+1); j++) + if (tmp.ridx(j) < r) + { + data(ii) = tmp.data(j); + ridx(ii++) = tmp.ridx(j); + } + + OCTAVE_QUIT; + + for (int j = a.cidx(i-c); j < a.cidx(i-c+1); j++) + { + data(ii) = a.data(j); + ridx(ii++) = r + a.ridx(j); + } + + OCTAVE_QUIT; + + for (int j = tmp.cidx(i); j < tmp.cidx(i+1); j++) + if (tmp.ridx(j) >= r + a_rows) + { + data(ii) = tmp.data(j); + ridx(ii++) = tmp.ridx(j); + } + + cidx(i+1) = ii; + } + + for (int i = c + a_cols; i < nc; i++) + { + for (int j = tmp.cidx(i); j < tmp.cidx(i+1); j++) + { + data(ii) = tmp.data(j); + ridx(ii++) = tmp.ridx(j); + } + cidx(i+1) = ii; + } + + return *this; +} + +template +Sparse& +Sparse::insert (const Sparse& a, const Array& ra_idx) +{ + + if (ra_idx.length () != 2) + { + (*current_liboctave_error_handler) ("range error for insert"); + return *this; + } + + return insert (a, ra_idx (0), ra_idx (1)); +} + +template +Sparse +Sparse::transpose (void) const +{ + assert (ndims () == 2); + + int nr = rows (); + int nc = cols (); + int nz = nnz (); + Sparse retval (nc, nr, nz); + + retval.cidx(0) = 0; + for (int i = 0, iidx = 0; i < nr; i++) + { + for (int j = 0; j < nc; j++) + for (int k = cidx(j); k < cidx(j+1); k++) + if (ridx(k) == i) + { + retval.data(iidx) = data(k); + retval.ridx(iidx++) = j; + } + retval.cidx(i+1) = iidx; + } + + return retval; +} + +template +void +Sparse::clear_index (void) +{ + delete [] idx; + idx = 0; + idx_count = 0; +} + +template +void +Sparse::set_index (const idx_vector& idx_arg) +{ + int nd = ndims (); + + if (! idx && nd > 0) + idx = new idx_vector [nd]; + + if (idx_count < nd) + { + idx[idx_count++] = idx_arg; + } + else + { + idx_vector *new_idx = new idx_vector [idx_count+1]; + + for (int i = 0; i < idx_count; i++) + new_idx[i] = idx[i]; + + new_idx[idx_count++] = idx_arg; + + delete [] idx; + + idx = new_idx; + } +} + +template +void +Sparse::maybe_delete_elements (idx_vector& idx_arg) +{ + int nr = dim1 (); + int nc = dim2 (); + + if (nr == 0 && nc == 0) + return; + + int n; + if (nr == 1) + n = nc; + else if (nc == 1) + n = nr; + else + { + // Reshape to row vector for Matlab compatibility. + + n = nr * nc; + nr = 1; + nc = n; + } + + if (idx_arg.is_colon_equiv (n, 1)) + { + // Either A(:) = [] or A(idx) = [] with idx enumerating all + // elements, so we delete all elements and return [](0x0). To + // preserve the orientation of the vector, you have to use + // A(idx,:) = [] (delete rows) or A(:,idx) (delete columns). + + resize_no_fill (0, 0); + return; + } + + idx_arg.sort (true); + + int num_to_delete = idx_arg.length (n); + + if (num_to_delete != 0) + { + int new_n = n; + int new_nnz = nnz (); + + int iidx = 0; + + const Sparse tmp (*this); + + for (int i = 0; i < n; i++) + { + OCTAVE_QUIT; + + if (i == idx_arg.elem (iidx)) + { + iidx++; + new_n--; + + if (tmp.elem (i) != T ()) + new_nnz--; + + if (iidx == num_to_delete) + break; + } + } + + if (new_n > 0) + { + rep->count--; + + if (nr == 1) + rep = new typename Sparse::SparseRep (1, new_n, new_nnz); + else + rep = new typename Sparse::SparseRep (new_n, 1, new_nnz); + + int ii = 0; + int jj = 0; + iidx = 0; + for (int i = 0; i < n; i++) + { + OCTAVE_QUIT; + + if (iidx < num_to_delete && i == idx_arg.elem (iidx)) + iidx++; + else + { + T el = tmp.elem (i); + if (el != T ()) + { + data(ii) = el; + ridx(ii++) = jj; + } + jj++; + } + } + + dimensions.resize (2); + + if (nr == 1) + { + ii = 0; + cidx(0) = 0; + for (int i = 0; i < new_n; i++) + { + OCTAVE_QUIT; + if (ridx(ii) == i) + ridx(ii++) = 0; + cidx(i+1) = ii; + } + + dimensions(0) = 1; + dimensions(1) = new_n; + } + else + { + cidx(0) = 0; + cidx(1) = new_nnz; + dimensions(0) = new_n; + dimensions(1) = 1; + } + } + else + (*current_liboctave_error_handler) + ("A(idx) = []: index out of range"); + } +} + +template +void +Sparse::maybe_delete_elements (idx_vector& idx_i, idx_vector& idx_j) +{ + assert (ndims () == 2); + + int nr = dim1 (); + int nc = dim2 (); + + if (nr == 0 && nc == 0) + return; + + if (idx_i.is_colon ()) + { + if (idx_j.is_colon ()) + { + // A(:,:) -- We are deleting columns and rows, so the result + // is [](0x0). + + resize_no_fill (0, 0); + return; + } + + if (idx_j.is_colon_equiv (nc, 1)) + { + // A(:,j) -- We are deleting columns by enumerating them, + // If we enumerate all of them, we should have zero columns + // with the same number of rows that we started with. + + resize_no_fill (nr, 0); + return; + } + } + + if (idx_j.is_colon () && idx_i.is_colon_equiv (nr, 1)) + { + // A(i,:) -- We are deleting rows by enumerating them. If we + // enumerate all of them, we should have zero rows with the + // same number of columns that we started with. + + resize_no_fill (0, nc); + return; + } + + if (idx_i.is_colon_equiv (nr, 1)) + { + if (idx_j.is_colon_equiv (nc, 1)) + resize_no_fill (0, 0); + else + { + idx_j.sort (true); + + int num_to_delete = idx_j.length (nc); + + if (num_to_delete != 0) + { + if (nr == 1 && num_to_delete == nc) + resize_no_fill (0, 0); + else + { + int new_nc = nc; + int new_nnz = nnz (); + + int iidx = 0; + + for (int j = 0; j < nc; j++) + { + OCTAVE_QUIT; + + if (j == idx_j.elem (iidx)) + { + iidx++; + new_nc--; + + new_nnz -= cidx(j+1) - cidx(j); + + if (iidx == num_to_delete) + break; + } + } + + if (new_nc > 0) + { + const Sparse tmp (*this); + --rep->count; + rep = new typename Sparse::SparseRep (nr, new_nc, + new_nnz); + int ii = 0; + int jj = 0; + iidx = 0; + cidx(0) = 0; + for (int j = 0; j < nc; j++) + { + OCTAVE_QUIT; + + if (iidx < num_to_delete && j == idx_j.elem (iidx)) + iidx++; + else + { + for (int i = tmp.cidx(j); + i < tmp.cidx(j+1); i++) + { + data(jj) = tmp.data(i); + ridx(jj++) = tmp.ridx(i); + } + cidx(++ii) = jj; + } + } + + dimensions.resize (2); + dimensions(1) = new_nc; + } + else + (*current_liboctave_error_handler) + ("A(idx) = []: index out of range"); + } + } + } + } + else if (idx_j.is_colon_equiv (nc, 1)) + { + if (idx_i.is_colon_equiv (nr, 1)) + resize_no_fill (0, 0); + else + { + idx_i.sort (true); + + int num_to_delete = idx_i.length (nr); + + if (num_to_delete != 0) + { + if (nc == 1 && num_to_delete == nr) + resize_no_fill (0, 0); + else + { + int new_nr = nr; + int new_nnz = nnz (); + + int iidx = 0; + + for (int i = 0; i < nr; i++) + { + OCTAVE_QUIT; + + if (i == idx_i.elem (iidx)) + { + iidx++; + new_nr--; + + for (int j = 0; j < nnz (); j++) + if (ridx(j) == i) + new_nnz--; + + if (iidx == num_to_delete) + break; + } + } + + if (new_nr > 0) + { + const Sparse tmp (*this); + --rep->count; + rep = new typename Sparse::SparseRep (new_nr, nc, + new_nnz); + + int jj = 0; + cidx(0) = 0; + for (int i = 0; i < nc; i++) + { + iidx = 0; + for (int j = tmp.cidx(i); j < tmp.cidx(i+1); j++) + { + OCTAVE_QUIT; + + int ri = tmp.ridx(j); + + while (iidx < num_to_delete && + ri > idx_i.elem (iidx)) + { + iidx++; + } + + if (iidx == num_to_delete || + ri != idx_i.elem(iidx)) + { + data(jj) = tmp.data(j); + ridx(jj++) = ri - iidx; + } + } + cidx(i+1) = jj; + } + + dimensions.resize (2); + dimensions(0) = new_nr; + } + else + (*current_liboctave_error_handler) + ("A(idx) = []: index out of range"); + } + } + } + } +} + +template +void +Sparse::maybe_delete_elements (Array& ra_idx) +{ + if (ra_idx.length () == 1) + maybe_delete_elements (ra_idx(0)); + else if (ra_idx.length () == 2) + maybe_delete_elements (ra_idx(0), ra_idx(1)); + else + (*current_liboctave_error_handler) + ("range error for maybe_delete_elements"); +} + +template +Sparse +Sparse::value (void) +{ + Sparse retval; + + int n_idx = index_count (); + + if (n_idx == 2) + { + idx_vector *tmp = get_idx (); + + idx_vector idx_i = tmp[0]; + idx_vector idx_j = tmp[1]; + + retval = index (idx_i, idx_j); + } + else if (n_idx == 1) + { + retval = index (idx[0]); + } + else + (*current_liboctave_error_handler) + ("Sparse::value: invalid number of indices specified"); + + clear_index (); + + return retval; +} + +template +Sparse +Sparse::index (idx_vector& idx_arg, int resize_ok) const +{ + Sparse retval; + + assert (ndims () == 2); + + int nr = dim1 (); + int nc = dim2 (); + int nz = nnz (); + + int orig_len = nr * nc; + + dim_vector idx_orig_dims = idx_arg.orig_dimensions (); + + int idx_orig_rows = idx_arg.orig_rows (); + int idx_orig_columns = idx_arg.orig_columns (); + + if (idx_orig_dims.length () > 2) + (*current_liboctave_error_handler) + ("Sparse::index: Can not index Sparse with an N-D Array"); + else if (idx_arg.is_colon ()) + { + // Fast magic colon processing. + retval = Sparse (nr * nc, 1, nz); + + for (int i = 0; i < nc; i++) + for (int j = cidx(i); j < cidx(i+1); j++) + { + OCTAVE_QUIT; + retval.xdata(j) = data(j); + retval.xridx(j) = ridx(j) + i * nr; + } + retval.xcidx(0) = 0; + retval.xcidx(1) = nz; + } + else if (nr == 1 && nc == 1) + { + // You have to be pretty sick to get to this bit of code, + // since you have a scalar stored as a sparse matrix, and + // then want to make a dense matrix with sparse + // representation. Ok, we'll do it, but you deserve what + // you get!! + int n = idx_arg.freeze (length (), "sparse vector", resize_ok); + if (n == 0) + if (idx_arg.one_zero_only ()) + retval = Sparse (dim_vector (0, 0)); + else + retval = Sparse (dim_vector (0, 1)); + else if (nz < 1) + if (n >= idx_orig_dims.numel ()) + retval = Sparse (idx_orig_dims); + else + retval = Sparse (dim_vector (n, 1)); + else if (n >= idx_orig_dims.numel ()) + { + T el = elem (0); + int new_nr = idx_orig_rows; + int new_nc = idx_orig_columns; + for (int i = 2; i < idx_orig_dims.length (); i++) + new_nc *= idx_orig_dims (i); + + retval = Sparse (new_nr, new_nc, idx_arg.ones_count ()); + + int ic = 0; + for (int i = 0; i < n; i++) + { + if (i % new_nr == 0) + retval.xcidx(i % new_nr) = ic; + + int ii = idx_arg.elem (i); + if (ii == 0) + { + OCTAVE_QUIT; + retval.xdata(ic) = el; + retval.xridx(ic++) = i % new_nr; + } + } + retval.xcidx (new_nc) = ic; + } + else + { + T el = elem (0); + retval = Sparse (n, 1, nz); + + for (int i = 0; i < nz; i++) + { + OCTAVE_QUIT; + retval.xdata(i) = el; + retval.xridx(i) = i; + } + retval.xcidx(0) = 0; + retval.xcidx(1) = n; + } + } + else if (nr == 1 || nc == 1) + { + // If indexing a vector with a matrix, return value has same + // shape as the index. Otherwise, it has same orientation as + // indexed object. + int len = length (); + int n = idx_arg.freeze (len, "sparse vector", resize_ok); + + if (n == 0) + if (nr == 1) + retval = Sparse (dim_vector (1, 0)); + else + retval = Sparse (dim_vector (0, 1)); + else if (nz < 1) + if ((n != 0 && idx_arg.one_zero_only ()) + || idx_orig_rows == 1 || idx_orig_columns == 1) + retval = Sparse ((nr == 1 ? 1 : n), (nr == 1 ? n : 1)); + else + retval = Sparse (idx_orig_dims); + else + { + + int new_nnz = 0; + if (nr == 1) + for (int i = 0; i < n; i++) + { + OCTAVE_QUIT; + + int ii = idx_arg.elem (i); + if (ii < len) + if (cidx(ii) != cidx(ii+1)) + new_nnz++; + } + else + for (int i = 0; i < n; i++) + { + int ii = idx_arg.elem (i); + if (ii < len) + for (int j = 0; j < nz; j++) + { + OCTAVE_QUIT; + + if (ridx(j) == ii) + new_nnz++; + if (ridx(j) >= ii) + break; + } + } + + if (idx_arg.one_zero_only () || idx_orig_rows == 1 || + idx_orig_columns == 1) + { + if (nr == 1) + { + retval = Sparse (1, n, new_nnz); + int jj = 0; + retval.xcidx(0) = 0; + for (int i = 0; i < n; i++) + { + OCTAVE_QUIT; + + int ii = idx_arg.elem (i); + if (ii < len) + if (cidx(ii) != cidx(ii+1)) + { + retval.xdata(jj) = data(cidx(ii)); + retval.xridx(jj++) = 0; + } + retval.xcidx(i+1) = jj; + } + } + else + { + retval = Sparse (n, 1, new_nnz); + retval.xcidx(0) = 0; + retval.xcidx(1) = new_nnz; + int jj = 0; + for (int i = 0; i < n; i++) + { + int ii = idx_arg.elem (i); + if (ii < len) + for (int j = 0; j < nz; j++) + { + OCTAVE_QUIT; + + if (ridx(j) == ii) + { + retval.xdata(jj) = data(j); + retval.xridx(jj++) = i; + } + if (ridx(j) >= ii) + break; + } + } + } + } + else + { + int new_nr; + int new_nc; + if (n >= idx_orig_dims.numel ()) + { + new_nr = idx_orig_rows; + new_nc = idx_orig_columns; + } + else + { + new_nr = n; + new_nc = 1; + } + + retval = Sparse (new_nr, new_nc, new_nnz); + + if (nr == 1) + { + int jj = 0; + retval.xcidx(0) = 0; + for (int i = 0; i < n; i++) + { + OCTAVE_QUIT; + + int ii = idx_arg.elem (i); + if (ii < len) + if (cidx(ii) != cidx(ii+1)) + { + retval.xdata(jj) = data(cidx(ii)); + retval.xridx(jj++) = 0; + } + retval.xcidx(i/new_nr+1) = jj; + } + } + else + { + int jj = 0; + retval.xcidx(0) = 0; + for (int i = 0; i < n; i++) + { + int ii = idx_arg.elem (i); + if (ii < len) + for (int j = 0; j < nz; j++) + { + OCTAVE_QUIT; + + if (ridx(j) == ii) + { + retval.xdata(jj) = data(j); + retval.xridx(jj++) = i; + } + if (ridx(j) >= ii) + break; + } + retval.xcidx(i/new_nr+1) = jj; + } + } + } + } + } + else + { + if (liboctave_wfi_flag + && ! (idx_arg.one_zero_only () + && idx_orig_rows == nr + && idx_orig_columns == nc)) + (*current_liboctave_warning_handler) + ("single index used for sparse matrix"); + + // This code is only for indexing matrices. The vector + // cases are handled above. + + idx_arg.freeze (nr * nc, "matrix", resize_ok); + + if (idx_arg) + { + int result_nr = idx_orig_rows; + int result_nc = idx_orig_columns; + + if (idx_arg.one_zero_only ()) + { + result_nr = idx_arg.ones_count (); + result_nc = (result_nr > 0 ? 1 : 0); + } + + if (nz < 1) + retval = Sparse (result_nr, result_nc); + else + { + // Count number of non-zero elements + int new_nnz = 0; + int kk = 0; + for (int j = 0; j < result_nc; j++) + { + for (int i = 0; i < result_nr; i++) + { + OCTAVE_QUIT; + + int ii = idx_arg.elem (kk++); + if (ii < orig_len) + { + int fr = ii % nr; + int fc = (ii - fr) / nr; + for (int k = cidx(fc); k < cidx(fc+1); k++) + { + if (ridx(k) == fr) + new_nnz++; + if (ridx(k) >= fr) + break; + } + } + } + } + + retval = Sparse (result_nr, result_nc, new_nnz); + + kk = 0; + int jj = 0; + retval.xcidx(0) = 0; + for (int j = 0; j < result_nc; j++) + { + for (int i = 0; i < result_nr; i++) + { + OCTAVE_QUIT; + + int ii = idx_arg.elem (kk++); + if (ii < orig_len) + { + int fr = ii % nr; + int fc = (ii - fr) / nr; + for (int k = cidx(fc); k < cidx(fc+1); k++) + { + if (ridx(k) == fr) + { + retval.xdata(jj) = data(k); + retval.xridx(jj++) = i; + } + if (ridx(k) >= fr) + break; + } + } + } + retval.xcidx(j+1) = jj; + } + } + // idx_vector::freeze() printed an error message for us. + } + } + + return retval; +} + +template +Sparse +Sparse::index (idx_vector& idx_i, idx_vector& idx_j, int resize_ok) const +{ + Sparse retval; + + assert (ndims () == 2); + + int nr = dim1 (); + int nc = dim2 (); + + int n = idx_i.freeze (nr, "row", resize_ok); + int m = idx_j.freeze (nc, "column", resize_ok); + + if (idx_i && idx_j) + { + if (idx_i.orig_empty () || idx_j.orig_empty () || n == 0 || m == 0) + { + retval.resize_no_fill (n, m); + } + else if (idx_i.is_colon_equiv (nr) && idx_j.is_colon_equiv (nc)) + { + retval = *this; + } + else + { + // First count the number of non-zero elements + int new_nnz = 0; + for (int j = 0; j < m; j++) + { + int jj = idx_j.elem (j); + for (int i = 0; i < n; i++) + { + OCTAVE_QUIT; + + int ii = idx_i.elem (i); + if (ii < nr && jj < nc) + { + for (int k = cidx(jj); k < cidx(jj+1); k++) + { + if (ridx(k) == ii) + new_nnz++; + if (ridx(k) >= ii) + break; + } + } + } + } + + retval = Sparse (n, m, new_nnz); + + int kk = 0; + retval.xcidx(0) = 0; + for (int j = 0; j < m; j++) + { + int jj = idx_j.elem (j); + for (int i = 0; i < n; i++) + { + OCTAVE_QUIT; + + int ii = idx_i.elem (i); + if (ii < nr && jj < nc) + { + for (int k = cidx(jj); k < cidx(jj+1); k++) + { + if (ridx(k) == ii) + { + retval.xdata(kk) = data(k); + retval.xridx(kk++) = i; + } + if (ridx(k) >= ii) + break; + } + } + } + retval.xcidx(j+1) = kk; + } + } + } + + // idx_vector::freeze() printed an error message for us. + + return retval; +} + +template +Sparse +Sparse::index (Array& ra_idx, int resize_ok) const +{ + + if (ra_idx.length () != 2) + { + (*current_liboctave_error_handler) ("range error for index"); + return *this; + } + + return index (ra_idx (0), ra_idx (1), resize_ok); +} + +// XXX FIXME XXX +// Unfortunately numel can overflow for very large but very sparse matrices. +// For now just flag an error when this happens. +template +int +assign1 (Sparse& lhs, const Sparse& rhs) +{ + int retval = 1; + + idx_vector *idx_tmp = lhs.get_idx (); + + idx_vector lhs_idx = idx_tmp[0]; + + int lhs_len = lhs.numel (); + int rhs_len = rhs.numel (); + + unsigned EIGHT_BYTE_INT long_lhs_len = + static_cast (lhs.rows ()) * + static_cast (lhs.cols ()); + + unsigned EIGHT_BYTE_INT long_rhs_len = + static_cast (rhs.rows ()) * + static_cast (rhs.cols ()); + + if (long_rhs_len != static_cast(rhs_len) || + long_lhs_len != static_cast(lhs_len)) + { + (*current_liboctave_error_handler) + ("A(I) = X: Matrix dimensions too large to ensure correct\n", + "operation. This is an limitation that should be removed\n", + "in the future."); + + lhs.clear_index (); + return 0; + } + + int nr = lhs.rows (); + int nc = lhs.cols (); + int nz = lhs.nnz (); + + int n = lhs_idx.freeze (lhs_len, "vector", true, liboctave_wrore_flag); + + if (n != 0) + { + int max_idx = lhs_idx.max () + 1; + max_idx = max_idx < lhs_len ? lhs_len : max_idx; + + // Take a constant copy of lhs. This means that elem won't + // create missing elements. + const Sparse c_lhs (lhs); + + if (rhs_len == n) + { + int new_nnz = lhs.nnz (); + + // First count the number of non-zero elements + for (int i = 0; i < n; i++) + { + OCTAVE_QUIT; + + int ii = lhs_idx.elem (i); + if (ii < lhs_len && c_lhs.elem(ii) != LT ()) + new_nnz--; + if (rhs.elem(i) != RT ()) + new_nnz++; + } + + if (nr > 1) + { + Sparse tmp (max_idx, 1, new_nnz); + tmp.cidx(0) = 0; + tmp.cidx(1) = tmp.nnz (); + + int i = 0; + int ii = 0; + if (i < nz) + ii = c_lhs.ridx(i); + + int j = 0; + int jj = lhs_idx.elem(j); + + int kk = 0; + + while (j < n || i < nz) + { + if (j == n || (i < nz && ii < jj)) + { + tmp.xdata (kk) = c_lhs.data (i); + tmp.xridx (kk++) = ii; + if (++i < nz) + ii = c_lhs.ridx(i); + } + else + { + RT rtmp = rhs.elem (j); + if (rtmp != RT ()) + { + tmp.xdata (kk) = rtmp; + tmp.xridx (kk++) = jj; + } + + if (ii == jj && i < nz) + if (++i < nz) + ii = c_lhs.ridx(i); + if (++j < n) + jj = lhs_idx.elem(j); + } + } + + lhs = tmp; + } + else + { + Sparse tmp (1, max_idx, new_nnz); + + int i = 0; + int ii = 0; + while (ii < nc && c_lhs.cidx(ii+1) <= i) + ii++; + + int j = 0; + int jj = lhs_idx.elem(j); + + int kk = 0; + int ic = 0; + + while (j < n || i < nz) + { + if (j == n || (i < nz && ii < jj)) + { + while (ic <= ii) + tmp.xcidx (ic++) = kk; + tmp.xdata (kk) = c_lhs.data (i); + i++; + while (ii < nc && c_lhs.cidx(ii+1) <= i) + ii++; + } + else + { + while (ic <= jj) + tmp.xcidx (ic++) = kk; + + RT rtmp = rhs.elem (j); + if (rtmp != RT ()) + tmp.xdata (kk) = rtmp; + if (ii == jj) + { + i++; + while (ii < nc && c_lhs.cidx(ii+1) <= i) + ii++; + } + j++; + if (j < n) + jj = lhs_idx.elem(j); + } + tmp.xridx (kk++) = 0; + } + + for (int iidx = ic; iidx < max_idx+1; iidx++) + tmp.xcidx(iidx) = kk; + + lhs = tmp; + } + } + else if (rhs_len == 1) + { + int new_nnz = lhs.nnz (); + RT scalar = rhs.elem (0); + bool scalar_non_zero = (scalar != RT ()); + + // First count the number of non-zero elements + if (scalar != RT ()) + new_nnz += n; + for (int i = 0; i < n; i++) + { + OCTAVE_QUIT; + + int ii = lhs_idx.elem (i); + if (ii < lhs_len && c_lhs.elem(ii) != LT ()) + new_nnz--; + } + + if (nr > 1) + { + Sparse tmp (max_idx, 1, new_nnz); + tmp.cidx(0) = 0; + tmp.cidx(1) = tmp.nnz (); + + int i = 0; + int ii = 0; + if (i < nz) + ii = c_lhs.ridx(i); + + int j = 0; + int jj = lhs_idx.elem(j); + + int kk = 0; + + while (j < n || i < nz) + { + if (j == n || (i < nz && ii < jj)) + { + tmp.xdata (kk) = c_lhs.data (i); + tmp.xridx (kk++) = ii; + if (++i < nz) + ii = c_lhs.ridx(i); + } + else + { + if (scalar_non_zero) + { + tmp.xdata (kk) = scalar; + tmp.xridx (kk++) = jj; + } + + if (ii == jj && i < nz) + if (++i < nz) + ii = c_lhs.ridx(i); + if (++j < n) + jj = lhs_idx.elem(j); + } + } + + lhs = tmp; + } + else + { + Sparse tmp (1, max_idx, new_nnz); + + int i = 0; + int ii = 0; + while (ii < nc && c_lhs.cidx(ii+1) <= i) + ii++; + + int j = 0; + int jj = lhs_idx.elem(j); + + int kk = 0; + int ic = 0; + + while (j < n || i < nz) + { + if (j == n || (i < nz && ii < jj)) + { + while (ic <= ii) + tmp.xcidx (ic++) = kk; + tmp.xdata (kk) = c_lhs.data (i); + i++; + while (ii < nc && c_lhs.cidx(ii+1) <= i) + ii++; + } + else + { + while (ic <= jj) + tmp.xcidx (ic++) = kk; + if (scalar_non_zero) + tmp.xdata (kk) = scalar; + if (ii == jj) + { + i++; + while (ii < nc && c_lhs.cidx(ii+1) <= i) + ii++; + } + j++; + if (j < n) + jj = lhs_idx.elem(j); + } + tmp.xridx (kk++) = 0; + } + + for (int iidx = ic; iidx < max_idx+1; iidx++) + tmp.xcidx(iidx) = kk; + + lhs = tmp; + } + } + else + { + (*current_liboctave_error_handler) + ("A(I) = X: X must be a scalar or a vector with same length as I"); + + retval = 0; + } + } + else if (lhs_idx.is_colon ()) + { + if (lhs_len == 0) + { + + int new_nnz = rhs.nnz (); + Sparse tmp (1, rhs_len, new_nnz); + + int ii = 0; + int jj = 0; + for (int i = 0; i < rhs.cols(); i++) + for (int j = rhs.cidx(i); j < rhs.cidx(i+1); j++) + { + OCTAVE_QUIT; + for (int k = jj; k <= i * rhs.rows() + rhs.ridx(j); k++) + tmp.cidx(jj++) = ii; + + tmp.data(ii) = rhs.data(j); + tmp.ridx(ii++) = 0; + } + + for (int i = jj; i < rhs_len + 1; i++) + tmp.cidx(i) = ii; + + lhs = tmp; + } + else + (*current_liboctave_error_handler) + ("A(:) = X: A must be the same size as X"); + } + else if (! (rhs_len == 1 || rhs_len == 0)) + { + (*current_liboctave_error_handler) + ("A([]) = X: X must also be an empty matrix or a scalar"); + + retval = 0; + } + + lhs.clear_index (); + + return retval; +} + +template +int +assign (Sparse& lhs, const Sparse& rhs) +{ + int retval = 1; + + int n_idx = lhs.index_count (); + + int lhs_nr = lhs.rows (); + int lhs_nc = lhs.cols (); + int lhs_nz = lhs.nnz (); + + int rhs_nr = rhs.rows (); + int rhs_nc = rhs.cols (); + + idx_vector *tmp = lhs.get_idx (); + + idx_vector idx_i; + idx_vector idx_j; + + if (n_idx > 2) + { + (*current_liboctave_error_handler) + ("A(I, J) = X: can only have 1 or 2 indexes for sparse matrices"); + return 0; + } + + if (n_idx > 1) + idx_j = tmp[1]; + + if (n_idx > 0) + idx_i = tmp[0]; + + if (n_idx == 2) + { + int n = idx_i.freeze (lhs_nr, "row", true, liboctave_wrore_flag); + idx_i.sort (true); + + int m = idx_j.freeze (lhs_nc, "column", true, liboctave_wrore_flag); + idx_j.sort (true); + + + int idx_i_is_colon = idx_i.is_colon (); + int idx_j_is_colon = idx_j.is_colon (); + + if (idx_i_is_colon) + n = lhs_nr > 0 ? lhs_nr : rhs_nr; + + if (idx_j_is_colon) + m = lhs_nc > 0 ? lhs_nc : rhs_nc; + + if (idx_i && idx_j) + { + if (rhs_nr == 0 && rhs_nc == 0) + { + lhs.maybe_delete_elements (idx_i, idx_j); + } + else + { + if (rhs_nr == 1 && rhs_nc == 1 && n >= 0 && m >= 0) + { + // No need to do anything if either of the indices + // are empty. + + if (n > 0 && m > 0) + { + int max_row_idx = idx_i_is_colon ? rhs_nr : + idx_i.max () + 1; + int max_col_idx = idx_j_is_colon ? rhs_nc : + idx_j.max () + 1; + int new_nr = max_row_idx > lhs_nr ? max_row_idx : + lhs_nr; + int new_nc = max_col_idx > lhs_nc ? max_col_idx : + lhs_nc; + RT scalar = rhs.elem (0, 0); + + // Count the number of non-zero terms + int new_nnz = lhs.nnz (); + for (int j = 0; j < m; j++) + { + int jj = idx_j.elem (j); + if (jj < lhs_nc) + { + for (int i = 0; i < n; i++) + { + OCTAVE_QUIT; + + int ii = idx_i.elem (i); + + if (ii < lhs_nr) + { + for (int k = lhs.cidx(jj); + k < lhs.cidx(jj+1); k++) + { + if (lhs.ridx(k) == ii) + new_nnz--; + if (lhs.ridx(k) >= ii) + break; + } + } + } + } + } + + if (scalar != RT()) + new_nnz += m * n; + + Sparse stmp (new_nr, new_nc, new_nnz); + + int jji = 0; + int jj = idx_j.elem (jji); + int kk = 0; + stmp.cidx(0) = 0; + for (int j = 0; j < new_nc; j++) + { + if (jji < m && jj == j) + { + int iii = 0; + int ii = idx_i.elem (iii); + for (int i = 0; i < new_nr; i++) + { + OCTAVE_QUIT; + + if (iii < n && ii == i) + { + if (scalar != RT ()) + { + stmp.data(kk) = scalar; + stmp.ridx(kk++) = i; + } + if (++iii < n) + ii = idx_i.elem(iii); + } + else if (j < lhs.cols()) + { + for (int k = lhs.cidx(j); + k < lhs.cidx(j+1); k++) + { + if (lhs.ridx(k) == i) + { + stmp.data(kk) = lhs.data(k); + stmp.ridx(kk++) = i; + } + if (lhs.ridx(k) >= i) + break; + } + } + } + if (++jji < m) + jj = idx_j.elem(jji); + } + else if (j < lhs.cols()) + { + for (int i = lhs.cidx(j); + i < lhs.cidx(j+1); i++) + { + stmp.data(kk) = lhs.data(i); + stmp.ridx(kk++) = lhs.ridx(i); + } + } + stmp.cidx(j+1) = kk; + } + + lhs = stmp; + } + } + else if (n == rhs_nr && m == rhs_nc) + { + if (n > 0 && m > 0) + { + int max_row_idx = idx_i_is_colon ? rhs_nr : + idx_i.max () + 1; + int max_col_idx = idx_j_is_colon ? rhs_nc : + idx_j.max () + 1; + int new_nr = max_row_idx > lhs_nr ? max_row_idx : + lhs_nr; + int new_nc = max_col_idx > lhs_nc ? max_col_idx : + lhs_nc; + + // Count the number of non-zero terms + int new_nnz = lhs.nnz (); + for (int j = 0; j < m; j++) + { + int jj = idx_j.elem (j); + for (int i = 0; i < n; i++) + { + OCTAVE_QUIT; + + if (jj < lhs_nc) + { + int ii = idx_i.elem (i); + + if (ii < lhs_nr) + { + for (int k = lhs.cidx(jj); + k < lhs.cidx(jj+1); k++) + { + if (lhs.ridx(k) == ii) + new_nnz--; + if (lhs.ridx(k) >= ii) + break; + } + } + } + + if (rhs.elem(i,j) != RT ()) + new_nnz++; + } + } + + Sparse stmp (new_nr, new_nc, new_nnz); + + int jji = 0; + int jj = idx_j.elem (jji); + int kk = 0; + stmp.cidx(0) = 0; + for (int j = 0; j < new_nc; j++) + { + if (jji < m && jj == j) + { + int iii = 0; + int ii = idx_i.elem (iii); + for (int i = 0; i < new_nr; i++) + { + OCTAVE_QUIT; + + if (iii < n && ii == i) + { + RT rtmp = rhs.elem (iii, jji); + if (rtmp != RT ()) + { + stmp.data(kk) = rtmp; + stmp.ridx(kk++) = i; + } + if (++iii < n) + ii = idx_i.elem(iii); + } + else if (j < lhs.cols()) + { + for (int k = lhs.cidx(j); + k < lhs.cidx(j+1); k++) + { + if (lhs.ridx(k) == i) + { + stmp.data(kk) = lhs.data(k); + stmp.ridx(kk++) = i; + } + if (lhs.ridx(k) >= i) + break; + } + } + } + if (++jji < m) + jj = idx_j.elem(jji); + } + else if (j < lhs.cols()) + { + for (int i = lhs.cidx(j); + i < lhs.cidx(j+1); i++) + { + stmp.data(kk) = lhs.data(i); + stmp.ridx(kk++) = lhs.ridx(i); + } + } + stmp.cidx(j+1) = kk; + } + + lhs = stmp; + } + } + else if (n == 0 && m == 0) + { + if (! ((rhs_nr == 1 && rhs_nc == 1) + || (rhs_nr == 0 || rhs_nc == 0))) + { + (*current_liboctave_error_handler) + ("A([], []) = X: X must be an empty matrix or a scalar"); + + retval = 0; + } + } + else + { + (*current_liboctave_error_handler) + ("A(I, J) = X: X must be a scalar or the number of elements in I must"); + (*current_liboctave_error_handler) + ("match the number of rows in X and the number of elements in J must"); + (*current_liboctave_error_handler) + ("match the number of columns in X"); + + retval = 0; + } + } + } + // idx_vector::freeze() printed an error message for us. + } + else if (n_idx == 1) + { + int lhs_is_empty = lhs_nr == 0 || lhs_nc == 0; + + if (lhs_is_empty || (lhs_nr == 1 && lhs_nc == 1)) + { + int lhs_len = lhs.length (); + + int n = idx_i.freeze (lhs_len, 0, true, liboctave_wrore_flag); + idx_i.sort (true); + + if (idx_i) + { + if (rhs_nr == 0 && rhs_nc == 0) + { + if (n != 0 && (lhs_nr != 0 || lhs_nc != 0)) + lhs.maybe_delete_elements (idx_i); + } + else + { + if (liboctave_wfi_flag) + { + if (lhs_is_empty + && idx_i.is_colon () + && ! (rhs_nr == 1 || rhs_nc == 1)) + { + (*current_liboctave_warning_handler) + ("A(:) = X: X is not a vector or scalar"); + } + else + { + int idx_nr = idx_i.orig_rows (); + int idx_nc = idx_i.orig_columns (); + + if (! (rhs_nr == idx_nr && rhs_nc == idx_nc)) + (*current_liboctave_warning_handler) + ("A(I) = X: X does not have same shape as I"); + } + } + + if (! assign1 ((Sparse&) lhs, (Sparse&) rhs)) + retval = 0; + } + } + // idx_vector::freeze() printed an error message for us. + } + else if (lhs_nr == 1) + { + idx_i.freeze (lhs_nc, "vector", true, liboctave_wrore_flag); + idx_i.sort (true); + + if (idx_i) + { + if (rhs_nr == 0 && rhs_nc == 0) + lhs.maybe_delete_elements (idx_i); + else if (! assign1 ((Sparse&) lhs, (Sparse&) rhs)) + retval = 0; + } + // idx_vector::freeze() printed an error message for us. + } + else if (lhs_nc == 1) + { + idx_i.freeze (lhs_nr, "vector", true, liboctave_wrore_flag); + idx_i.sort (true); + + if (idx_i) + { + if (rhs_nr == 0 && rhs_nc == 0) + lhs.maybe_delete_elements (idx_i); + else if (! assign1 ((Sparse&) lhs, (Sparse&) rhs)) + retval = 0; + } + // idx_vector::freeze() printed an error message for us. + } + else + { + if (liboctave_wfi_flag + && ! (idx_i.is_colon () + || (idx_i.one_zero_only () + && idx_i.orig_rows () == lhs_nr + && idx_i.orig_columns () == lhs_nc))) + (*current_liboctave_warning_handler) + ("single index used for matrix"); + + int lhs_len = lhs.length (); + + int len = idx_i.freeze (lhs_nr * lhs_nc, "matrix"); + idx_i.sort (true); + + if (idx_i) + { + // Take a constant copy of lhs. This means that elem won't + // create missing elements. + const Sparse c_lhs (lhs); + + if (rhs_nr == 0 && rhs_nc == 0) + lhs.maybe_delete_elements (idx_i); + else if (len == 0) + { + if (! ((rhs_nr == 1 && rhs_nc == 1) + || (rhs_nr == 0 || rhs_nc == 0))) + (*current_liboctave_error_handler) + ("A([]) = X: X must be an empty matrix or scalar"); + } + else if (len == rhs_nr * rhs_nc) + { + int new_nnz = lhs_nz; + + // First count the number of non-zero elements + for (int i = 0; i < len; i++) + { + OCTAVE_QUIT; + + int ii = idx_i.elem (i); + if (ii < lhs_len && c_lhs.elem(ii) != LT ()) + new_nnz--; + if (rhs.elem(i) != RT ()) + new_nnz++; + } + + Sparse stmp (lhs_nr, lhs_nc, new_nnz); + + int i = 0; + int ii = 0; + int ic = 0; + if (i < lhs_nz) + { + while (ic < lhs_nc && i >= c_lhs.cidx(ic+1)) + ic++; + ii = ic * lhs_nr + c_lhs.ridx(i); + } + + int j = 0; + int jj = idx_i.elem (j); + int jr = jj % lhs_nr; + int jc = (jj - jr) / lhs_nr; + + int kk = 0; + int kc = 0; + + while (j < len || i < lhs_nz) + { + if (j == len || (i < lhs_nz && ii < jj)) + { + while (kc <= ic) + stmp.xcidx (kc++) = kk; + stmp.xdata (kk) = c_lhs.data (i); + stmp.xridx (kk++) = c_lhs.ridx (i); + i++; + while (ic < lhs_nc && i >= c_lhs.cidx(ic+1)) + ic++; + if (i < lhs_nz) + ii = ic * lhs_nr + c_lhs.ridx(i); + } + else + { + while (kc <= jc) + stmp.xcidx (kc++) = kk; + RT rtmp = rhs.elem (j); + if (rtmp != RT ()) + { + stmp.xdata (kk) = rtmp; + stmp.xridx (kk++) = jr; + } + if (ii == jj) + { + i++; + while (ic < lhs_nc && i >= c_lhs.cidx(ic+1)) + ic++; + if (i < lhs_nz) + ii = ic * lhs_nr + c_lhs.ridx(i); + } + j++; + if (j < len) + { + jj = idx_i.elem (j); + jr = jj % lhs_nr; + jc = (jj - jr) / lhs_nr; + } + } + } + + for (int iidx = kc; iidx < lhs_nc+1; iidx++) + stmp.xcidx(iidx) = kk; + + + lhs = stmp; + } + else if (rhs_nr == 1 && rhs_nc == 1) + { + RT scalar = rhs.elem (0, 0); + int new_nnz = lhs_nz; + + // First count the number of non-zero elements + if (scalar != RT ()) + new_nnz += len; + for (int i = 0; i < len; i++) + { + OCTAVE_QUIT; + int ii = idx_i.elem (i); + if (ii < lhs_len && c_lhs.elem(ii) != LT ()) + new_nnz--; + } + + Sparse stmp (lhs_nr, lhs_nc, new_nnz); + + int i = 0; + int ii = 0; + int ic = 0; + if (i < lhs_nz) + { + while (ic < lhs_nc && i >= c_lhs.cidx(ic+1)) + ic++; + ii = ic * lhs_nr + c_lhs.ridx(i); + } + + int j = 0; + int jj = idx_i.elem (j); + int jr = jj % lhs_nr; + int jc = (jj - jr) / lhs_nr; + + int kk = 0; + int kc = 0; + + while (j < len || i < lhs_nz) + { + if (j == len || (i < lhs_nz && ii < jj)) + { + while (kc <= ic) + stmp.xcidx (kc++) = kk; + stmp.xdata (kk) = c_lhs.data (i); + stmp.xridx (kk++) = c_lhs.ridx (i); + i++; + while (ic < lhs_nc && i >= c_lhs.cidx(ic+1)) + ic++; + if (i < lhs_nz) + ii = ic * lhs_nr + c_lhs.ridx(i); + } + else + { + while (kc <= jc) + stmp.xcidx (kc++) = kk; + if (scalar != RT ()) + { + stmp.xdata (kk) = scalar; + stmp.xridx (kk++) = jr; + } + if (ii == jj) + { + i++; + while (ic < lhs_nc && i >= c_lhs.cidx(ic+1)) + ic++; + if (i < lhs_nz) + ii = ic * lhs_nr + c_lhs.ridx(i); + } + j++; + if (j < len) + { + jj = idx_i.elem (j); + jr = jj % lhs_nr; + jc = (jj - jr) / lhs_nr; + } + } + } + + for (int iidx = kc; iidx < lhs_nc+1; iidx++) + stmp.xcidx(iidx) = kk; + + lhs = stmp; + } + else + { + (*current_liboctave_error_handler) + ("A(I) = X: X must be a scalar or a matrix with the same size as I"); + + retval = 0; + } + } + // idx_vector::freeze() printed an error message for us. + } + } + else + { + (*current_liboctave_error_handler) + ("invalid number of indices for matrix expression"); + + retval = 0; + } + + lhs.clear_index (); + + return retval; +} + +template +void +Sparse::print_info (std::ostream& os, const std::string& prefix) const +{ + os << prefix << "rep address: " << rep << "\n" + << prefix << "rep->nnz: " << rep->nnz << "\n" + << prefix << "rep->nrows: " << rep->nrows << "\n" + << prefix << "rep->ncols: " << rep->ncols << "\n" + << prefix << "rep->data: " << static_cast (rep->d) << "\n" + << prefix << "rep->ridx: " << static_cast (rep->r) << "\n" + << prefix << "rep->cidx: " << static_cast (rep->c) << "\n" + << prefix << "rep->count: " << rep->count << "\n"; +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/Sparse.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/Sparse.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,536 @@ +// Template sparse classes +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#if !defined (octave_Sparse_h) +#define octave_Sparse_h 1 + +#include +#include + +#include + +#include "Array.h" +#include "Array2.h" +#include "dim-vector.h" +#include "lo-utils.h" + +class idx_vector; + +// Two dimensional sparse class. Handles the reference counting for +// all the derived classes. + +template +class +Sparse +{ +protected: + //-------------------------------------------------------------------- + // The real representation of all Sparse arrays. + //-------------------------------------------------------------------- + + class SparseRep + { + public: + + T *d; + int *r; + int *c; + int nnz; + int nrows; + int ncols; + int count; + + SparseRep (void) : d (0), r (0), c (new int [1]), nnz (0), nrows (0), + ncols (0), count (1) { c[0] = 0; } + + SparseRep (int n) : d (0), r (0), c (new int [n+1]), nnz (0), nrows (n), + ncols (n), count (1) + { + for (int i = 0; i < n + 1; i++) + c[i] = 0; + } + + SparseRep (int nr, int nc) : d (0), r (0), c (new int [nc+1]), nnz (0), + nrows (nr), ncols (nc), count (1) + { + for (int i = 0; i < nc + 1; i++) + c[i] = 0; + } + + SparseRep (int nr, int nc, int nz) : d (new T [nz]), + r (new int [nz]), c (new int [nc+1]), nnz (nz), nrows (nr), + ncols (nc), count (1) + { + for (int i = 0; i < nc + 1; i++) + c[i] = 0; + } + + SparseRep (const SparseRep& a) + : d (new T [a.nnz]), r (new int [a.nnz]), c (new int [a.ncols + 1]), + nnz (a.nnz), nrows (a.nrows), ncols (a.ncols), count (1) + { + for (int i = 0; i < nnz; i++) + { + d[i] = a.d[i]; + r[i] = a.r[i]; + } + for (int i = 0; i < ncols + 1; i++) + c[i] = a.c[i]; + } + + ~SparseRep (void) { delete [] d; delete [] r; delete [] c; } + + int length (void) const { return nnz; } + + int nonzero (void) const { return c [ncols]; } + + T& elem (int _r, int _c); + + T celem (int _r, int _c) const; + + T& data (int i) { return d[i]; } + + T cdata (int i) const { return d[i]; } + + int& ridx (int i) { return r[i]; } + + int cridx (int i) const { return r[i]; } + + int& cidx (int i) { return c[i]; } + + int ccidx (int i) const { return c[i]; } + + void maybe_compress (bool remove_zeros); + + void change_length (int nz); + + private: + + // No assignment! + + SparseRep& operator = (const SparseRep& a); + }; + + //-------------------------------------------------------------------- + + void make_unique (void) + { + if (rep->count > 1) + { + --rep->count; + rep = new SparseRep (*rep); + } + } + +public: + + // !!! WARNING !!! -- these should be protected, not public. You + // should not access these data members directly! + + typename Sparse::SparseRep *rep; + + dim_vector dimensions; + +protected: + idx_vector *idx; + int idx_count; + +private: + + typename Sparse::SparseRep *nil_rep (void) const + { + static typename Sparse::SparseRep *nr + = new typename Sparse::SparseRep (); + + nr->count++; + + return nr; + } + +public: + + Sparse (void) + : rep (nil_rep ()), dimensions (dim_vector(0,0)), + idx (0), idx_count (0) { } + + explicit Sparse (int n) + : rep (new typename Sparse::SparseRep (n)), + dimensions (dim_vector (n, n)), idx (0), idx_count (0) { } + + explicit Sparse (int nr, int nc) + : rep (new typename Sparse::SparseRep (nr, nc)), + dimensions (dim_vector (nr, nc)), idx (0), idx_count (0) { } + + explicit Sparse (int nr, int nc, T val); + + Sparse (const dim_vector& dv, int nz) + : rep (new typename Sparse::SparseRep (dv(0), dv(1), nz)), + dimensions (dv), idx (0), idx_count (0) { } + + Sparse (int nr, int nc, int nz) + : rep (new typename Sparse::SparseRep (nr, nc, nz)), + dimensions (dim_vector (nr, nc)), idx (0), idx_count (0) { } + + // Type conversion case. + template Sparse (const Sparse& a); + + // No type conversion case. + Sparse (const Sparse& a) + : rep (a.rep), dimensions (a.dimensions), idx (0), idx_count (0) + { + rep->count++; + } + +public: + + Sparse (const dim_vector& dv); + + Sparse (const Sparse& a, const dim_vector& dv); + + Sparse (const Array& a, const Array& r, const Array& c, + int nr, int nc, bool sum_terms); + + Sparse (const Array& a, const Array& r, const Array& c, + int nr, int nc, bool sum_terms); + + // Sparsify a normal matrix + Sparse (const Array2& a); + Sparse (const Array& a); + + virtual ~Sparse (void); + + Sparse& operator = (const Sparse& a) + { + if (this != &a) + { + if (--rep->count <= 0) + delete rep; + + rep = a.rep; + rep->count++; + + dimensions = a.dimensions; + } + + idx_count = 0; + idx = 0; + + return *this; + } + + // Note that capacity and nnz are the amount of storage for non-zero + // elements, while nonzero is the actual number of non-zero terms + int capacity (void) const { return rep->length (); } + int nnz (void) const { return capacity (); } + int nonzero (void) const { return rep->nonzero (); } + + // Paranoid number of elements test for case of dims = (-1,-1) + int numel (void) const + { + if (dim1() < 0 || dim2() < 0) + return 0; + else + return dimensions.numel (); + } + + int nelem (void) const { return capacity (); } + int length (void) const { return numel (); } + + int dim1 (void) const { return dimensions(0); } + int dim2 (void) const { return dimensions(1); } + + int rows (void) const { return dim1 (); } + int cols (void) const { return dim2 (); } + int columns (void) const { return dim2 (); } + + int get_row_index (int k) { return ridx (k); } + int get_col_index (int k) + { + int ret = 0; + while (cidx(ret+1) < k) + ret++; + return ret; + } + size_t byte_size (void) const { return (cols () + 1) * sizeof (int) + + capacity () * (sizeof (T) + sizeof (int)); } + + dim_vector dims (void) const { return dimensions; } + + Sparse squeeze (void) const { return *this; } + + int compute_index (const Array& ra_idx) const; + + T range_error (const char *fcn, int n) const; + T& range_error (const char *fcn, int n); + + T range_error (const char *fcn, int i, int j) const; + T& range_error (const char *fcn, int i, int j); + + T range_error (const char *fcn, const Array& ra_idx) const; + T& range_error (const char *fcn, const Array& ra_idx); + + // No checking, even for multiple references, ever. + + T& xelem (int n) + { + int i = n % rows (), j = n / rows(); + return xelem (i, j); + } + + T xelem (int n) const + { + int i = n % rows (), j = n / rows(); + return xelem (i, j); + } + + T& xelem (int i, int j) { return rep->elem (i, j); } + T xelem (int i, int j) const { return rep->celem (i, j); } + + T& xelem (const Array& ra_idx) + { return xelem (compute_index (ra_idx)); } + + T xelem (const Array& ra_idx) const + { return xelem (compute_index (ra_idx)); } + + // XXX FIXME XXX -- would be nice to fix this so that we don't + // unnecessarily force a copy, but that is not so easy, and I see no + // clean way to do it. + + T& checkelem (int n) + { + if (n < 0 || n >= numel ()) + return range_error ("T& Sparse::checkelem", n); + else + { + make_unique (); + return xelem (n); + } + } + + T& checkelem (int i, int j) + { + if (i < 0 || j < 0 || i >= dim1 () || j >= dim2 ()) + return range_error ("T& Sparse::checkelem", i, j); + else + { + make_unique (); + return xelem (i, j); + } + } + + T& checkelem (const Array& ra_idx) + { + int i = compute_index (ra_idx); + + if (i < 0) + return range_error ("T& Sparse::checkelem", ra_idx); + else + return elem (i); + } + + T& elem (int n) + { + make_unique (); + return xelem (n); + } + + T& elem (int i, int j) + { + make_unique (); + return xelem (i, j); + } + + T& elem (const Array& ra_idx) + { return Sparse::elem (compute_index (ra_idx)); } + +#if defined (BOUNDS_CHECKING) + T& operator () (int n) { return checkelem (n); } + T& operator () (int i, int j) { return checkelem (i, j); } + T& operator () (const Array& ra_idx) { return checkelem (ra_idx); } +#else + T& operator () (int n) { return elem (n); } + T& operator () (int i, int j) { return elem (i, j); } + T& operator () (const Array& ra_idx) { return elem (ra_idx); } +#endif + + T checkelem (int n) const + { + if (n < 0 || n >= numel ()) + return range_error ("T Sparse::checkelem", n); + else + return xelem (n); + } + + T checkelem (int i, int j) const + { + if (i < 0 || j < 0 || i >= dim1 () || j >= dim2 ()) + return range_error ("T Sparse::checkelem", i, j); + else + return xelem (i, j); + } + + T checkelem (const Array& ra_idx) const + { + int i = compute_index (ra_idx); + + if (i < 0) + return range_error ("T Sparse::checkelem", ra_idx); + else + return Sparse::elem (i); + } + + T elem (int n) const { return xelem (n); } + + T elem (int i, int j) const { return xelem (i, j); } + + T elem (const Array& ra_idx) const + { return Sparse::elem (compute_index (ra_idx)); } + +#if defined (BOUNDS_CHECKING) + T operator () (int n) const { return checkelem (n); } + T operator () (int i, int j) const { return checkelem (i, j); } + T operator () (const Array& ra_idx) const { return checkelem (ra_idx); } +#else + T operator () (int n) const { return elem (n); } + T operator () (int i, int j) const { return elem (i, j); } + T operator () (const Array& ra_idx) const { return elem (ra_idx); } +#endif + + Sparse maybe_compress (bool remove_zeros = false) + { rep->maybe_compress (remove_zeros); return (*this); } + + Sparse reshape (const dim_vector& new_dims) const; + + // !!! WARNING !!! -- the following resize_no_fill functions are + // public because template friends don't work properly with versions + // of gcc earlier than 3.3. You should use these functions only in + // classes that are derived from Sparse. + + // protected: + + void resize_no_fill (int r, int c); + + void resize_no_fill (const dim_vector& dv); + +public: + Sparse permute (const Array& vec, bool inv = false) const; + + Sparse ipermute (const Array& vec) const + { return permute (vec, true); } + + void resize (int r, int c) { resize_no_fill (r, c); } + + void resize (const dim_vector& dv) { resize_no_fill (dv); } + + void change_capacity (int nz) { rep->change_length (nz); } + + Sparse& insert (const Sparse& a, int r, int c); + Sparse& insert (const Sparse& a, const Array& idx); + + bool is_square (void) const { return (dim1 () == dim2 ()); } + + bool is_empty (void) const { return (rows () < 1 && cols () < 1); } + + Sparse transpose (void) const; + + T* data (void) { make_unique (); return rep->d; } + T& data (int i) { make_unique (); return rep->data (i); } + T* xdata (void) { return rep->d; } + T& xdata (int i) { return rep->data (i); } + + T data (int i) const { return rep->data (i); } + T* data (void) const { return rep->d; } + + int* ridx (void) { make_unique (); return rep->r; } + int& ridx (int i) { make_unique (); return rep->ridx (i); } + int* xridx (void) { return rep->r; } + int& xridx (int i) { return rep->ridx (i); } + + int ridx (int i) const { return rep->cridx (i); } + int* ridx (void) const { return rep->r; } + + int* cidx (void) { make_unique (); return rep->c; } + int& cidx (int i) { make_unique (); return rep->cidx (i); } + int* xcidx (void) { return rep->c; } + int& xcidx (int i) { return rep->cidx (i); } + + int cidx (int i) const { return rep->ccidx (i); } + int* cidx (void) const { return rep->c; } + + int ndims (void) const { return dimensions.length (); } + + void clear_index (void); + + void set_index (const idx_vector& i); + + int index_count (void) const { return idx_count; } + + idx_vector *get_idx (void) const { return idx; } + + void maybe_delete_elements (idx_vector& i); + + void maybe_delete_elements (idx_vector& i, idx_vector& j); + + void maybe_delete_elements (Array& ra_idx); + + Sparse value (void); + + Sparse index (idx_vector& i, int resize_ok = 0) const; + + Sparse index (idx_vector& i, idx_vector& j, int resize_ok = 0) const; + + Sparse index (Array& ra_idx, int resize_ok = 0) const; + + void print_info (std::ostream& os, const std::string& prefix) const; + +}; + +// NOTE: these functions should be friends of the Sparse class and +// Sparse::dimensions should be protected, not public, but we can't +// do that because of bugs in gcc prior to 3.3. + +template +/* friend */ int +assign (Sparse& lhs, const Sparse& rhs); + +template +/* friend */ int +assign1 (Sparse& lhs, const Sparse& rhs); + +#define INSTANTIATE_SPARSE_ASSIGN(LT, RT) \ + template int assign (Sparse&, const Sparse&); \ + template int assign1 (Sparse&, const Sparse&); + +#define INSTANTIATE_SPARSE(T) \ + template class Sparse; + +#define INSTANTIATE_SPARSE_AND_ASSIGN(T) \ + INSTANTIATE_SPARSE (T); \ + INSTANTIATE_SPARSE_ASSIGN (T, T) + +#endif + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/SparseCmplxLU.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/SparseCmplxLU.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,405 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "lo-error.h" + +#include "SparseCmplxLU.h" +#include "oct-spparms.h" + +// Instantiate the base LU class for the types we need. + +#include "sparse-base-lu.h" +#include "sparse-base-lu.cc" + +template class sparse_base_lu ; + +// Include the UMFPACK functions +extern "C" { +#include "umfpack.h" +} + +SparseComplexLU::SparseComplexLU (const SparseComplexMatrix& a, + double piv_thres) +{ + int nr = a.rows (); + int nc = a.cols (); + + // Setup the control parameters + Matrix Control (UMFPACK_CONTROL, 1); + double *control = Control.fortran_vec (); + umfpack_zi_defaults (control); + + double tmp = Voctave_sparse_controls.get_key ("spumoni"); + if (!xisnan (tmp)) + Control (UMFPACK_PRL) = tmp; + if (piv_thres >= 0.) + { + piv_thres = (piv_thres > 1. ? 1. : piv_thres); + Control (UMFPACK_SYM_PIVOT_TOLERANCE) = piv_thres; + Control (UMFPACK_PIVOT_TOLERANCE) = piv_thres; + } + else + { + tmp = Voctave_sparse_controls.get_key ("piv_tol"); + if (!xisnan (tmp)) + { + Control (UMFPACK_SYM_PIVOT_TOLERANCE) = tmp; + Control (UMFPACK_PIVOT_TOLERANCE) = tmp; + } + } + + // Set whether we are allowed to modify Q or not + tmp = Voctave_sparse_controls.get_key ("autoamd"); + if (!xisnan (tmp)) + Control (UMFPACK_FIXQ) = tmp; + + // Turn-off UMFPACK scaling for LU + Control (UMFPACK_SCALE) = UMFPACK_SCALE_NONE; + + umfpack_zi_report_control (control); + + const int *Ap = a.cidx (); + const int *Ai = a.ridx (); + const Complex *Ax = a.data (); + + umfpack_zi_report_matrix (nr, nc, Ap, Ai, X_CAST (const double *, Ax), + NULL, 1, control); + + void *Symbolic; + Matrix Info (1, UMFPACK_INFO); + double *info = Info.fortran_vec (); + int status = umfpack_zi_qsymbolic (nr, nc, Ap, Ai, + X_CAST (const double *, Ax), NULL, NULL, + &Symbolic, control, info); + + if (status < 0) + { + (*current_liboctave_error_handler) + ("SparseComplexLU::SparseComplexLU symbolic factorization failed"); + + umfpack_zi_report_status (control, status); + umfpack_zi_report_info (control, info); + + umfpack_zi_free_symbolic (&Symbolic) ; + } + else + { + umfpack_zi_report_symbolic (Symbolic, control); + + void *Numeric; + status = umfpack_zi_numeric (Ap, Ai, X_CAST (const double *, Ax), NULL, + Symbolic, &Numeric, control, info) ; + umfpack_zi_free_symbolic (&Symbolic) ; + + cond = Info (UMFPACK_RCOND); + + if (status < 0) + { + (*current_liboctave_error_handler) + ("SparseComplexLU::SparseComplexLU numeric factorization failed"); + + umfpack_zi_report_status (control, status); + umfpack_zi_report_info (control, info); + + umfpack_zi_free_numeric (&Numeric); + } + else + { + umfpack_zi_report_numeric (Numeric, control); + + int lnz, unz, ignore1, ignore2, ignore3; + status = umfpack_zi_get_lunz (&lnz, &unz, &ignore1, &ignore2, + &ignore3, Numeric) ; + + if (status < 0) + { + (*current_liboctave_error_handler) + ("SparseComplexLU::SparseComplexLU extracting LU factors failed"); + + umfpack_zi_report_status (control, status); + umfpack_zi_report_info (control, info); + + umfpack_zi_free_numeric (&Numeric); + } + else + { + int n_inner = (nr < nc ? nr : nc); + + if (lnz < 1) + Lfact = SparseComplexMatrix (n_inner, nr, 1); + else + Lfact = SparseComplexMatrix (n_inner, nr, lnz); + + int *Ltp = Lfact.cidx (); + int *Ltj = Lfact.ridx (); + Complex *Ltx = Lfact.data (); + + if (unz < 1) + Ufact = SparseComplexMatrix (n_inner, nc, 1); + else + Ufact = SparseComplexMatrix (n_inner, nc, unz); + + int *Up = Ufact.cidx (); + int *Uj = Ufact.ridx (); + Complex *Ux = Ufact.data (); + + P.resize (nr); + int *p = P.fortran_vec (); + + Q.resize (nc); + int *q = Q.fortran_vec (); + + int do_recip; + status = umfpack_zi_get_numeric (Ltp, Ltj, X_CAST (double *, Ltx), + NULL, Up, Uj, + X_CAST (double *, Ux), NULL, p, + q, NULL, NULL, &do_recip, + NULL, Numeric) ; + + umfpack_zi_free_numeric (&Numeric) ; + + if (status < 0 || do_recip) + { + (*current_liboctave_error_handler) + ("SparseComplexLU::SparseComplexLU extracting LU factors failed"); + + umfpack_zi_report_status (control, status); + } + else + { + Lfact = Lfact.transpose (); + + umfpack_zi_report_matrix (nr, n_inner, Lfact.cidx (), + Lfact.ridx (), + X_CAST (double *, Lfact.data()), + NULL, 1, control); + + umfpack_zi_report_matrix (n_inner, nc, Ufact.cidx (), + Ufact.ridx (), + X_CAST (double *, Ufact.data()), + NULL, 1, control); + umfpack_zi_report_perm (nr, p, control); + umfpack_zi_report_perm (nc, q, control); + } + + umfpack_zi_report_info (control, info); + } + } + } +} + +SparseComplexLU::SparseComplexLU (const SparseComplexMatrix& a, + const ColumnVector& Qinit, + double piv_thres, bool FixedQ) +{ + int nr = a.rows (); + int nc = a.cols (); + + // Setup the control parameters + Matrix Control (UMFPACK_CONTROL, 1); + double *control = Control.fortran_vec (); + umfpack_zi_defaults (control); + + double tmp = Voctave_sparse_controls.get_key ("spumoni"); + if (!xisnan (tmp)) + Control (UMFPACK_PRL) = tmp; + if (piv_thres >= 0.) + { + piv_thres = (piv_thres > 1. ? 1. : piv_thres); + Control (UMFPACK_SYM_PIVOT_TOLERANCE) = piv_thres; + Control (UMFPACK_PIVOT_TOLERANCE) = piv_thres; + } + else + { + tmp = Voctave_sparse_controls.get_key ("piv_tol"); + if (!xisnan (tmp)) + { + Control (UMFPACK_SYM_PIVOT_TOLERANCE) = tmp; + Control (UMFPACK_PIVOT_TOLERANCE) = tmp; + } + } + + // Set whether we are allowed to modify Q or not + if (FixedQ) + Control (UMFPACK_FIXQ) = 1.0; + else + { + tmp = Voctave_sparse_controls.get_key ("autoamd"); + if (!xisnan (tmp)) + Control (UMFPACK_FIXQ) = tmp; + } + + // Turn-off UMFPACK scaling for LU + Control (UMFPACK_SCALE) = UMFPACK_SCALE_NONE; + + umfpack_zi_report_control (control); + + const int *Ap = a.cidx (); + const int *Ai = a.ridx (); + const Complex *Ax = a.data (); + + umfpack_zi_report_matrix (nr, nc, Ap, Ai, X_CAST (const double *, Ax), NULL, + 1, control); + + void *Symbolic; + Matrix Info (1, UMFPACK_INFO); + double *info = Info.fortran_vec (); + int status; + + // Null loop so that qinit is imediately deallocated when not needed + do { + OCTAVE_LOCAL_BUFFER (int, qinit, nc); + + for (int i = 0; i < nc; i++) + qinit [i] = static_cast (Qinit (i)); + + status = umfpack_zi_qsymbolic (nr, nc, Ap, Ai, X_CAST (const double *, Ax), + NULL, qinit, &Symbolic, control, info); + } while (0); + + if (status < 0) + { + (*current_liboctave_error_handler) + ("SparseComplexLU::SparseComplexLU symbolic factorization failed"); + + umfpack_zi_report_status (control, status); + umfpack_zi_report_info (control, info); + + umfpack_zi_free_symbolic (&Symbolic) ; + } + else + { + umfpack_zi_report_symbolic (Symbolic, control); + + void *Numeric; + status = umfpack_zi_numeric (Ap, Ai, X_CAST (const double *, Ax), NULL, + Symbolic, &Numeric, control, info) ; + umfpack_zi_free_symbolic (&Symbolic) ; + + cond = Info (UMFPACK_RCOND); + + if (status < 0) + { + (*current_liboctave_error_handler) + ("SparseComplexLU::SparseComplexLU numeric factorization failed"); + + umfpack_zi_report_status (control, status); + umfpack_zi_report_info (control, info); + + umfpack_zi_free_numeric (&Numeric); + } + else + { + umfpack_zi_report_numeric (Numeric, control); + + int lnz, unz, ignore1, ignore2, ignore3; + status = umfpack_zi_get_lunz (&lnz, &unz, &ignore1, &ignore2, + &ignore3, Numeric) ; + + if (status < 0) + { + (*current_liboctave_error_handler) + ("SparseComplexLU::SparseComplexLU extracting LU factors failed"); + + umfpack_zi_report_status (control, status); + umfpack_zi_report_info (control, info); + + umfpack_zi_free_numeric (&Numeric); + } + else + { + int n_inner = (nr < nc ? nr : nc); + + if (lnz < 1) + Lfact = SparseComplexMatrix (n_inner, nr, 1); + else + Lfact = SparseComplexMatrix (n_inner, nr, lnz); + + int *Ltp = Lfact.cidx (); + int *Ltj = Lfact.ridx (); + Complex *Ltx = Lfact.data (); + + if (unz < 1) + Ufact = SparseComplexMatrix (n_inner, nc, 1); + else + Ufact = SparseComplexMatrix (n_inner, nc, unz); + + int *Up = Ufact.cidx (); + int *Uj = Ufact.ridx (); + Complex *Ux = Ufact.data (); + + P.resize (nr); + int *p = P.fortran_vec (); + + Q.resize (nc); + int *q = Q.fortran_vec (); + + int do_recip; + status = umfpack_zi_get_numeric (Ltp, Ltj, X_CAST (double *, Ltx), + NULL, Up, Uj, + X_CAST (double *, Ux), NULL, p, + q, NULL, NULL, &do_recip, + NULL, Numeric) ; + + umfpack_zi_free_numeric (&Numeric) ; + + if (status < 0 || do_recip) + { + (*current_liboctave_error_handler) + ("SparseComplexLU::SparseComplexLU extracting LU factors failed"); + + umfpack_zi_report_status (control, status); + } + else + { + Lfact = Lfact.transpose (); + + umfpack_zi_report_matrix (nr, n_inner, Lfact.cidx (), + Lfact.ridx (), + X_CAST (double *, Lfact.data()), + NULL, 1, control); + + umfpack_zi_report_matrix (n_inner, nc, Ufact.cidx (), + Ufact.ridx (), + X_CAST (double *, Ufact.data()), + NULL, 1, control); + umfpack_zi_report_perm (nr, p, control); + umfpack_zi_report_perm (nc, q, control); + } + + umfpack_zi_report_info (control, info); + } + } + } +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ + diff -r 9f3299378193 -r 57077d0ddc8e liboctave/SparseCmplxLU.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/SparseCmplxLU.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,64 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#if !defined (octave_sparse_complex_LU_h) +#define octave_sparse_complex_LU_h 1 + +#include "sparse-base-lu.h" +#include "dSparse.h" +#include "CSparse.h" + +class +SparseComplexLU + : public sparse_base_lu +{ +public: + + SparseComplexLU (void) + : sparse_base_lu () { } + + SparseComplexLU (const SparseComplexMatrix& a, double piv_thres = -1); + + SparseComplexLU (const SparseComplexMatrix& a, const ColumnVector& Qinit, + double piv_thres = -1, bool FixedQ = false); + + SparseComplexLU (const SparseComplexLU& a) + : sparse_base_lu (a) { } + + SparseComplexLU& operator = (const SparseComplexLU& a) + { + if (this != &a) + sparse_base_lu + :: operator = (a); + + return *this; + } + + ~SparseComplexLU (void) { } +}; + +#endif + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/SparseType.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/SparseType.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,696 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "SparseType.h" +#include "dSparse.h" +#include "CSparse.h" +#include "oct-spparms.h" + +// XXX FIXME XXX There is a large code duplication here + +SparseType::SparseType (const SparseType &a) : typ (a.typ), + sp_bandden (a.sp_bandden), bandden (a.bandden), + upper_band (a.upper_band), lower_band (a.lower_band), + dense (a.dense), nperm (a.nperm) +{ + if (nperm != 0) + { + row_perm = new int [nperm]; + col_perm = new int [nperm]; + for (int i = 0; i < nperm; i++) + { + row_perm[i] = a.row_perm[i]; + col_perm[i] = a.col_perm[i]; + } + } +} + +SparseType::SparseType (const SparseMatrix &a) +{ + int nrows = a.rows (); + int ncols = a.cols (); + int nnz = a.nnz (); + + nperm = 0; + + if (nrows != ncols) + typ = SparseType::Rectangular; + else + { + sp_bandden = Voctave_sparse_controls.get_key ("bandden"); + bool maybe_hermitian = false; + typ = SparseType::Full; + + if (nnz == ncols) + { + matrix_type tmp_typ = SparseType::Diagonal; + int i; + // Maybe the matrix is diagonal + for (i = 0; i < ncols; i++) + { + if (a.cidx(i+1) != a.cidx(i) + 1) + { + tmp_typ = Full; + break; + } + if (a.ridx(i) != i) + { + tmp_typ = SparseType::Permuted_Diagonal; + break; + } + } + + if (tmp_typ == SparseType::Permuted_Diagonal) + { + bool found [ncols]; + + for (int j = 0; j < i; j++) + found [j] = true; + for (int j = i; j < ncols; j++) + found [j] = false; + + for (int j = i; j < ncols; j++) + { + if ((a.cidx(j+1) != a.cidx(j) + 1) || found [a.ridx(j)]) + { + tmp_typ = Full; + break; + } + found [a.ridx(j)] = true; + } + } + typ = tmp_typ; + } + + if (typ == Full) + { + // Search for banded, upper and lower triangular matrices + bool singular = false; + upper_band = 0; + lower_band = 0; + for (int j = 0; j < ncols; j++) + { + bool zero_on_diagonal = true; + for (int i = a.cidx(j); i < a.cidx(j+1); i++) + if (a.ridx(i) == j) + { + zero_on_diagonal = false; + break; + } + + if (zero_on_diagonal) + { + singular = true; + break; + } + + if (a.cidx(j+1) - a.cidx(j) > 0) + { + int ru = a.ridx(a.cidx(j)); + int rl = a.ridx(a.cidx(j+1)-1); + + if (j - ru > upper_band) + upper_band = j - ru; + + if (rl - j > lower_band) + lower_band = rl - j; + } + } + + if (!singular) + { + bandden = double (nnz) / + (double (ncols) * (double (lower_band) + + double (upper_band)) - + 0.5 * double (upper_band + 1) * double (upper_band) - + 0.5 * double (lower_band + 1) * double (lower_band)); + + if (sp_bandden != 1. && bandden > sp_bandden) + { + if (upper_band == 1 && lower_band == 1) + typ = SparseType::Tridiagonal; + else + typ = SparseType::Banded; + + int nnz_in_band = (upper_band + lower_band + 1) * nrows - + (1 + upper_band) * upper_band / 2 - + (1 + lower_band) * lower_band / 2; + if (nnz_in_band == nnz) + dense = true; + else + dense = false; + } + else if (upper_band == 0) + typ = SparseType::Lower; + else if (lower_band == 0) + typ = SparseType::Upper; + + if (upper_band == lower_band) + maybe_hermitian = true; + } + + if (typ == Full) + { + // Search for a permuted triangular matrix, and test if + // permutation is singular + + // XXX FIXME XXX Write this test based on dmperm + + } + } + + if (maybe_hermitian && (typ == Full || typ == Tridiagonal || + typ == Banded)) + { + // Check for symmetry, with positive real diagonal, which + // has a very good chance of being symmetric positive + // definite.. + bool is_herm = true; + + for (int j = 0; j < ncols; j++) + { + bool diag_positive = false; + + for (int i = a.cidx(j); i < a.cidx(j+1); i++) + { + int ri = a.ridx(i); + + if (ri == j) + { + if (a.data(i) == std::abs(a.data(i))) + diag_positive = true; + else + break; + } + else + { + bool found = false; + + for (int k = a.cidx(ri); k < a.cidx(ri+1); k++) + { + if (a.ridx(k) == j) + { + if (a.data(i) == conj (a.data(k))) + found = true; + break; + } + } + + if (! found) + { + is_herm = false; + break; + } + } + } + + if (! diag_positive || ! is_herm) + { + is_herm = false; + break; + } + } + + if (is_herm) + { + if (typ == Full) + typ = Hermitian; + else if (typ == Banded) + typ = Banded_Hermitian; + else + typ = Tridiagonal_Hermitian; + } + } + } +} + +SparseType::SparseType (const SparseComplexMatrix &a) +{ + int nrows = a.rows (); + int ncols = a.cols (); + int nnz = a.nnz (); + + nperm = 0; + + if (nrows != ncols) + typ = SparseType::Rectangular; + else + { + sp_bandden = Voctave_sparse_controls.get_key ("bandden"); + bool maybe_hermitian = false; + typ = SparseType::Full; + + if (nnz == ncols) + { + matrix_type tmp_typ = SparseType::Diagonal; + int i; + // Maybe the matrix is diagonal + for (i = 0; i < ncols; i++) + { + if (a.cidx(i+1) != a.cidx(i) + 1) + { + tmp_typ = Full; + break; + } + if (a.ridx(i) != i) + { + tmp_typ = SparseType::Permuted_Diagonal; + break; + } + } + + if (tmp_typ == SparseType::Permuted_Diagonal) + { + bool found [ncols]; + + for (int j = 0; j < i; j++) + found [j] = true; + for (int j = i; j < ncols; j++) + found [j] = false; + + for (int j = i; j < ncols; j++) + { + if ((a.cidx(j+1) != a.cidx(j) + 1) || found [a.ridx(j)]) + { + tmp_typ = Full; + break; + } + found [a.ridx(j)] = true; + } + } + typ = tmp_typ; + } + + if (typ == Full) + { + // Search for banded, upper and lower triangular matrices + bool singular = false; + upper_band = 0; + lower_band = 0; + for (int j = 0; j < ncols; j++) + { + bool zero_on_diagonal = true; + for (int i = a.cidx(j); i < a.cidx(j+1); i++) + if (a.ridx(i) == j) + { + zero_on_diagonal = false; + break; + } + + if (zero_on_diagonal) + { + singular = true; + break; + } + + if (a.cidx(j+1) - a.cidx(j) > 0) + { + int ru = a.ridx(a.cidx(j)); + int rl = a.ridx(a.cidx(j+1)-1); + + if (j - ru > upper_band) + upper_band = j - ru; + + if (rl - j > lower_band) + lower_band = rl - j; + } + } + + if (!singular) + { + bandden = double (nnz) / + (double (ncols) * (double (lower_band) + + double (upper_band)) - + 0.5 * double (upper_band + 1) * double (upper_band) - + 0.5 * double (lower_band + 1) * double (lower_band)); + + if (sp_bandden != 1. && bandden > sp_bandden) + { + if (upper_band == 1 && lower_band == 1) + typ = SparseType::Tridiagonal; + else + typ = SparseType::Banded; + + int nnz_in_band = (upper_band + lower_band + 1) * nrows - + (1 + upper_band) * upper_band / 2 - + (1 + lower_band) * lower_band / 2; + if (nnz_in_band == nnz) + dense = true; + else + dense = false; + } + else if (upper_band == 0) + typ = SparseType::Lower; + else if (lower_band == 0) + typ = SparseType::Upper; + + if (upper_band == lower_band) + maybe_hermitian = true; + } + + if (typ == Full) + { + // Search for a permuted triangular matrix, and test if + // permutation is singular + + // XXX FIXME XXX Write this test based on dmperm + + } + } + + if (maybe_hermitian && (typ == Full || typ == Tridiagonal || + typ == Banded)) + { + // Check for symmetry, with positive real diagonal, which + // has a very good chance of being symmetric positive + // definite.. + bool is_herm = true; + + for (int j = 0; j < ncols; j++) + { + bool diag_positive = false; + + for (int i = a.cidx(j); i < a.cidx(j+1); i++) + { + int ri = a.ridx(i); + + if (ri == j) + { + if (a.data(i) == std::abs(a.data(i))) + diag_positive = true; + else + break; + } + else + { + bool found = false; + + for (int k = a.cidx(ri); k < a.cidx(ri+1); k++) + { + if (a.ridx(k) == j) + { + if (a.data(i) == a.data(k)) + found = true; + break; + } + } + + if (! found) + { + is_herm = false; + break; + } + } + } + + if (! diag_positive || ! is_herm) + { + is_herm = false; + break; + } + } + + if (is_herm) + { + if (typ == Full) + typ = Hermitian; + else if (typ == Banded) + typ = Banded_Hermitian; + else + typ = Tridiagonal_Hermitian; + } + } + } +} + +SparseType::~SparseType (void) +{ + if (nperm != 0) + { + delete [] row_perm; + delete [] col_perm; + } +} + +SparseType& +SparseType::operator = (const SparseType& a) +{ + if (this != &a) + { + typ = a.typ; + sp_bandden = a.sp_bandden; + bandden = a.bandden; + upper_band = a.upper_band; + lower_band = a.lower_band; + dense = a.dense; + nperm = a.nperm; + + if (nperm != 0) + { + row_perm = new int [nperm]; + col_perm = new int [nperm]; + for (int i = 0; i < nperm; i++) + { + row_perm[i] = a.row_perm[i]; + col_perm[i] = a.col_perm[i]; + } + } + + } + return *this; +} + +int +SparseType::type (const SparseMatrix &a) +{ + if (typ != SparseType::Unknown && + sp_bandden == Voctave_sparse_controls.get_key ("bandden")) + { + if (Voctave_sparse_controls.get_key ("spumoni") != 0.) + (*current_liboctave_warning_handler) + ("Using Cached Sparse Matrix Type"); + + return typ; + } + + if (Voctave_sparse_controls.get_key ("spumoni") != 0.) + (*current_liboctave_warning_handler) + ("Calculating Sparse Matrix Type"); + + + SparseType tmp_typ (a); + typ = tmp_typ.typ; + sp_bandden = tmp_typ.sp_bandden; + bandden = tmp_typ.bandden; + upper_band = tmp_typ.upper_band; + lower_band = tmp_typ.lower_band; + dense = tmp_typ.dense; + nperm = tmp_typ.nperm; + + if (nperm != 0) + { + row_perm = new int [nperm]; + col_perm = new int [nperm]; + for (int i = 0; i < nperm; i++) + { + row_perm[i] = tmp_typ.row_perm[i]; + col_perm[i] = tmp_typ.col_perm[i]; + } + } + + return typ; +} + +int +SparseType::type (const SparseComplexMatrix &a) +{ + if (typ != SparseType::Unknown && + sp_bandden == Voctave_sparse_controls.get_key ("bandden")) + { + if (Voctave_sparse_controls.get_key ("spumoni") != 0.) + (*current_liboctave_warning_handler) + ("Using Cached Sparse Matrix Type"); + + return typ; + } + + if (Voctave_sparse_controls.get_key ("spumoni") != 0.) + (*current_liboctave_warning_handler) + ("Calculating Sparse Matrix Type"); + + + SparseType tmp_typ (a); + typ = tmp_typ.typ; + sp_bandden = tmp_typ.sp_bandden; + bandden = tmp_typ.bandden; + upper_band = tmp_typ.upper_band; + lower_band = tmp_typ.lower_band; + dense = tmp_typ.dense; + nperm = tmp_typ.nperm; + + if (nperm != 0) + { + row_perm = new int [nperm]; + col_perm = new int [nperm]; + for (int i = 0; i < nperm; i++) + { + row_perm[i] = tmp_typ.row_perm[i]; + col_perm[i] = tmp_typ.col_perm[i]; + } + } + + return typ; +} + +void +SparseType::info (void) const +{ + if (Voctave_sparse_controls.get_key ("spumoni") != 0.) + { + if (typ == SparseType::Unknown) + (*current_liboctave_warning_handler) + ("Unknown Sparse Matrix Type"); + else if (typ == SparseType::Diagonal) + (*current_liboctave_warning_handler) + ("Diagonal Sparse Matrix"); + else if (typ == SparseType::Permuted_Diagonal) + (*current_liboctave_warning_handler) + ("Permuted Diagonal Sparse Matrix"); + else if (typ == SparseType::Upper) + (*current_liboctave_warning_handler) + ("Upper Triangular Sparse Matrix"); + else if (typ == SparseType::Lower) + (*current_liboctave_warning_handler) + ("Lower Triangular Sparse Matrix"); + else if (typ == SparseType::Permuted_Upper) + (*current_liboctave_warning_handler) + ("Permuted Upper Triangular Sparse Matrix"); + else if (typ == SparseType::Permuted_Lower) + (*current_liboctave_warning_handler) + ("Permuted Lower Triangular Sparse Matrix"); + else if (typ == SparseType::Banded) + (*current_liboctave_warning_handler) + ("Banded Sparse Matrix %g-1-%g (Density %g)", lower_band, + upper_band, bandden); + else if (typ == SparseType::Banded_Hermitian) + (*current_liboctave_warning_handler) + ("Banded Hermitian/Symmetric Sparse Matrix %g-1-%g (Density %g)", + lower_band, upper_band, bandden); + else if (typ == SparseType::Hermitian) + (*current_liboctave_warning_handler) + ("Hermitian/Symmetric Sparse Matrix"); + else if (typ == SparseType::Tridiagonal) + (*current_liboctave_warning_handler) + ("Tridiagonal Sparse Matrix"); + else if (typ == SparseType::Tridiagonal_Hermitian) + (*current_liboctave_warning_handler) + ("Hermitian/Symmetric Tridiagonal Sparse Matrix"); + else if (typ == SparseType::Rectangular) + (*current_liboctave_warning_handler) + ("Rectangular Sparse Matrix"); + else if (typ == SparseType::Full) + (*current_liboctave_warning_handler) + ("Full Sparse Matrix"); + } +} + +void +SparseType::mark_as_symmetric (void) +{ + if (typ == SparseType::Tridiagonal || + typ == SparseType::Tridiagonal_Hermitian) + typ = SparseType::Tridiagonal_Hermitian; + else if (typ == SparseType::Banded || + typ == SparseType::Banded_Hermitian) + typ = SparseType::Banded_Hermitian; + else if (typ == SparseType::Full || typ == SparseType::Hermitian || + typ == SparseType::Unknown) + typ = SparseType::Hermitian; + else + (*current_liboctave_error_handler) + ("Can not mark current matrix type as symmetric"); +} + +void +SparseType::mark_as_unsymmetric (void) +{ + if (typ == SparseType::Tridiagonal || + typ == SparseType::Tridiagonal_Hermitian) + typ = SparseType::Tridiagonal; + else if (typ == SparseType::Banded || + typ == SparseType::Banded_Hermitian) + typ = SparseType::Banded; + else if (typ == SparseType::Full || typ == SparseType::Hermitian || + typ == SparseType::Unknown) + typ = SparseType::Full; +} + +void +SparseType::mark_as_permuted (const int np, const int *pr, const int *pc) +{ + nperm = np; + row_perm = new int [nperm]; + col_perm = new int [nperm]; + for (int i = 0; i < nperm; i++) + { + row_perm[i] = pr[i]; + col_perm[i] = pc[i]; + } + + if (typ == SparseType::Diagonal || typ == SparseType::Permuted_Diagonal) + typ = SparseType::Permuted_Diagonal; + else if (typ == SparseType::Upper || typ == SparseType::Permuted_Upper) + typ = SparseType::Permuted_Upper; + else if (typ == SparseType::Lower || typ == SparseType::Permuted_Lower) + typ = SparseType::Permuted_Lower; + else + (*current_liboctave_error_handler) + ("Can not mark current matrix type as symmetric"); +} + +void +SparseType::mark_as_unpermuted (void) +{ + if (nperm) + { + nperm = 0; + delete [] row_perm; + delete [] col_perm; + } + + if (typ == SparseType::Diagonal || typ == SparseType::Permuted_Diagonal) + typ = SparseType::Diagonal; + else if (typ == SparseType::Upper || typ == SparseType::Permuted_Upper) + typ = SparseType::Upper; + else if (typ == SparseType::Lower || typ == SparseType::Permuted_Lower) + typ = SparseType::Lower; +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ + diff -r 9f3299378193 -r 57077d0ddc8e liboctave/SparseType.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/SparseType.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,155 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#if !defined (octave_SparseType_h) +#define octave_SparseType_h + +class SparseMatrix; +class SparseComplexMatrix; + +class +SparseType +{ +public: + enum matrix_type { + Unknown = 0, + Full, + Diagonal, + Permuted_Diagonal, + Upper, + Lower, + Permuted_Upper, + Permuted_Lower, + Banded, + Hermitian, + Banded_Hermitian, + Tridiagonal, + Tridiagonal_Hermitian, + Rectangular + }; + + SparseType (void) : typ (Unknown), nperm (0) { } + + SparseType (const SparseType &a); + + SparseType (const SparseMatrix &a); + + SparseType (const SparseComplexMatrix &a); + + ~SparseType (void); + + SparseType& operator = (const SparseType& a); + + int type (void) const { return typ; } + + int type (const SparseMatrix &a); + + int type (const SparseComplexMatrix &a); + + double band_density (void) const { return bandden; } + + int nupper (void) const { return upper_band; } + + int nlower (void) const { return lower_band; } + + bool is_dense (void) const { return dense; } + + bool is_diagonal (void) const + { return (typ == Diagonal || typ == Permuted_Diagonal); } + + bool is_upper_triangular (void) const + { return (typ == Upper || typ == Permuted_Upper); } + + bool is_lower_triangular (void) const + { return (typ == Lower || typ == Permuted_Lower); } + + bool is_banded (void) + { return (typ == Banded || typ == Banded_Hermitian); } + + bool is_tridiagonal (void) const + { return (typ == Tridiagonal || typ == Tridiagonal_Hermitian); } + + bool is_hermitian (void) const + { return (typ == Banded_Hermitian || typ == Tridiagonal_Hermitian || + typ == Hermitian); } + + bool is_rectangular (void) const { return (typ == Rectangular); } + + bool is_known (void) const { return (typ != Unknown); } + + bool is_unknown (void) const { return (typ == Unknown); } + + void info (void) const; + + int * triangular_row_perm (void) const { return row_perm; } + + int * triangular_col_perm (void) const { return col_perm; } + + void invaldate_type (void) { typ = Unknown; } + + void mark_as_diagonal (void) { typ = Diagonal; } + + void mark_as_upper_triangular (void) { typ = Upper; } + + void mark_as_lower_triangular (void) { typ = Lower; } + + void mark_as_tridiagonal (void) {typ = Tridiagonal; } + + void mark_as_banded (const int ku, const int kl) + { typ = Banded; upper_band = ku; lower_band = kl; } + + void mark_as_full (void) { typ = Full; } + + void mark_as_rectangular (void) { typ = Rectangular; } + + void mark_as_dense (void) { dense = true; } + + void mark_as_not_dense (void) { dense = false; } + + void mark_as_symmetric (void); + + void mark_as_unsymmetric (void); + + void mark_as_permuted (const int np, const int *pr, const int *pc); + + void mark_as_unpermuted (void); + +private: + void type (int new_typ) { typ = static_cast(new_typ); } + + matrix_type typ; + double sp_bandden; + double bandden; + int upper_band; + int lower_band; + bool dense; + int nperm; + int *row_perm; + int *col_perm; +}; + +#endif + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/SparsedbleLU.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/SparsedbleLU.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,392 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "lo-error.h" + +#include "SparsedbleLU.h" +#include "oct-spparms.h" + +// Instantiate the base LU class for the types we need. + +#include "sparse-base-lu.h" +#include "sparse-base-lu.cc" + +template class sparse_base_lu ; + +// Include the UMFPACK functions +extern "C" { +#include "umfpack.h" +} + +SparseLU::SparseLU (const SparseMatrix& a, double piv_thres) +{ + int nr = a.rows (); + int nc = a.cols (); + + // Setup the control parameters + Matrix Control (UMFPACK_CONTROL, 1); + double *control = Control.fortran_vec (); + umfpack_di_defaults (control); + + double tmp = Voctave_sparse_controls.get_key ("spumoni"); + if (!xisnan (tmp)) + Control (UMFPACK_PRL) = tmp; + + if (piv_thres >= 0.) + { + piv_thres = (piv_thres > 1. ? 1. : piv_thres); + Control (UMFPACK_SYM_PIVOT_TOLERANCE) = piv_thres; + Control (UMFPACK_PIVOT_TOLERANCE) = piv_thres; + } + else + { + tmp = Voctave_sparse_controls.get_key ("piv_tol"); + if (!xisnan (tmp)) + { + Control (UMFPACK_SYM_PIVOT_TOLERANCE) = tmp; + Control (UMFPACK_PIVOT_TOLERANCE) = tmp; + } + } + + // Set whether we are allowed to modify Q or not + tmp = Voctave_sparse_controls.get_key ("autoamd"); + if (!xisnan (tmp)) + Control (UMFPACK_FIXQ) = tmp; + + // Turn-off UMFPACK scaling for LU + Control (UMFPACK_SCALE) = UMFPACK_SCALE_NONE; + + umfpack_di_report_control (control); + + const int *Ap = a.cidx (); + const int *Ai = a.ridx (); + const double *Ax = a.data (); + + umfpack_di_report_matrix (nr, nc, Ap, Ai, Ax, 1, control); + + void *Symbolic; + Matrix Info (1, UMFPACK_INFO); + double *info = Info.fortran_vec (); + int status = umfpack_di_qsymbolic (nr, nc, Ap, Ai, Ax, NULL, + &Symbolic, control, info); + + if (status < 0) + { + (*current_liboctave_error_handler) + ("SparseLU::SparseLU symbolic factorization failed"); + + umfpack_di_report_status (control, status); + umfpack_di_report_info (control, info); + + umfpack_di_free_symbolic (&Symbolic) ; + } + else + { + umfpack_di_report_symbolic (Symbolic, control); + + void *Numeric; + status = umfpack_di_numeric (Ap, Ai, Ax, Symbolic, &Numeric, + control, info) ; + umfpack_di_free_symbolic (&Symbolic) ; + + cond = Info (UMFPACK_RCOND); + + if (status < 0) + { + (*current_liboctave_error_handler) + ("SparseLU::SparseLU numeric factorization failed"); + + umfpack_di_report_status (control, status); + umfpack_di_report_info (control, info); + + umfpack_di_free_numeric (&Numeric); + } + else + { + umfpack_di_report_numeric (Numeric, control); + + int lnz, unz, ignore1, ignore2, ignore3; + status = umfpack_di_get_lunz (&lnz, &unz, &ignore1, &ignore2, + &ignore3, Numeric) ; + + if (status < 0) + { + (*current_liboctave_error_handler) + ("SparseLU::SparseLU extracting LU factors failed"); + + umfpack_di_report_status (control, status); + umfpack_di_report_info (control, info); + + umfpack_di_free_numeric (&Numeric); + } + else + { + int n_inner = (nr < nc ? nr : nc); + + if (lnz < 1) + Lfact = SparseMatrix (n_inner, nr, 1); + else + Lfact = SparseMatrix (n_inner, nr, lnz); + + int *Ltp = Lfact.cidx (); + int *Ltj = Lfact.ridx (); + double *Ltx = Lfact.data (); + + if (unz < 1) + Ufact = SparseMatrix (n_inner, nc, 1); + else + Ufact = SparseMatrix (n_inner, nc, unz); + + int *Up = Ufact.cidx (); + int *Uj = Ufact.ridx (); + double *Ux = Ufact.data (); + + P.resize (nr); + int *p = P.fortran_vec (); + + Q.resize (nc); + int *q = Q.fortran_vec (); + + int do_recip; + status = umfpack_di_get_numeric (Ltp, Ltj, Ltx, Up, Uj, + Ux, p, q, (double *) NULL, + &do_recip, (double *) NULL, + Numeric) ; + + umfpack_di_free_numeric (&Numeric) ; + + if (status < 0 || do_recip) + { + (*current_liboctave_error_handler) + ("SparseLU::SparseLU extracting LU factors failed"); + + umfpack_di_report_status (control, status); + } + else + { + Lfact = Lfact.transpose (); + + umfpack_di_report_matrix (nr, n_inner, Lfact.cidx (), + Lfact.ridx (), Lfact.data (), + 1, control); + umfpack_di_report_matrix (n_inner, nc, Ufact.cidx (), + Ufact.ridx (), Ufact.data (), + 1, control); + umfpack_di_report_perm (nr, p, control); + umfpack_di_report_perm (nc, q, control); + } + + umfpack_di_report_info (control, info); + } + } + } +} + +SparseLU::SparseLU (const SparseMatrix& a, const ColumnVector& Qinit, + double piv_thres, bool FixedQ) +{ + int nr = a.rows (); + int nc = a.cols (); + + // Setup the control parameters + Matrix Control (UMFPACK_CONTROL, 1); + double *control = Control.fortran_vec (); + umfpack_di_defaults (control); + + double tmp = Voctave_sparse_controls.get_key ("spumoni"); + if (!xisnan (tmp)) + Control (UMFPACK_PRL) = tmp; + if (piv_thres >= 0.) + { + piv_thres = (piv_thres > 1. ? 1. : piv_thres); + Control (UMFPACK_SYM_PIVOT_TOLERANCE) = piv_thres; + Control (UMFPACK_PIVOT_TOLERANCE) = piv_thres; + } + else + { + tmp = Voctave_sparse_controls.get_key ("piv_tol"); + if (!xisnan (tmp)) + { + Control (UMFPACK_SYM_PIVOT_TOLERANCE) = tmp; + Control (UMFPACK_PIVOT_TOLERANCE) = tmp; + } + } + + // Set whether we are allowed to modify Q or not + if (FixedQ) + Control (UMFPACK_FIXQ) = 1.0; + else + { + tmp = Voctave_sparse_controls.get_key ("autoamd"); + if (!xisnan (tmp)) + Control (UMFPACK_FIXQ) = tmp; + } + + // Turn-off UMFPACK scaling for LU + Control (UMFPACK_SCALE) = UMFPACK_SCALE_NONE; + + umfpack_di_report_control (control); + + const int *Ap = a.cidx (); + const int *Ai = a.ridx (); + const double *Ax = a.data (); + + umfpack_di_report_matrix (nr, nc, Ap, Ai, Ax, 1, control); + + void *Symbolic; + Matrix Info (1, UMFPACK_INFO); + double *info = Info.fortran_vec (); + int status; + + // Null loop so that qinit is imediately deallocated when not needed + do { + OCTAVE_LOCAL_BUFFER (int, qinit, nc); + + for (int i = 0; i < nc; i++) + qinit [i] = static_cast (Qinit (i)); + + status = umfpack_di_qsymbolic (nr, nc, Ap, Ai, Ax, qinit, + &Symbolic, control, info); + } while (0); + + if (status < 0) + { + (*current_liboctave_error_handler) + ("SparseLU::SparseLU symbolic factorization failed"); + + umfpack_di_report_status (control, status); + umfpack_di_report_info (control, info); + + umfpack_di_free_symbolic (&Symbolic) ; + } + else + { + umfpack_di_report_symbolic (Symbolic, control); + + void *Numeric; + status = umfpack_di_numeric (Ap, Ai, Ax, Symbolic, &Numeric, + control, info) ; + umfpack_di_free_symbolic (&Symbolic) ; + + cond = Info (UMFPACK_RCOND); + + if (status < 0) + { + (*current_liboctave_error_handler) + ("SparseLU::SparseLU numeric factorization failed"); + + umfpack_di_report_status (control, status); + umfpack_di_report_info (control, info); + + umfpack_di_free_numeric (&Numeric); + } + else + { + umfpack_di_report_numeric (Numeric, control); + + int lnz, unz, ignore1, ignore2, ignore3; + status = umfpack_di_get_lunz (&lnz, &unz, &ignore1, &ignore2, + &ignore3, Numeric) ; + + if (status < 0) + { + (*current_liboctave_error_handler) + ("SparseLU::SparseLU extracting LU factors failed"); + + umfpack_di_report_status (control, status); + umfpack_di_report_info (control, info); + + umfpack_di_free_numeric (&Numeric); + } + else + { + int n_inner = (nr < nc ? nr : nc); + + if (lnz < 1) + Lfact = SparseMatrix (n_inner, nr, 1); + else + Lfact = SparseMatrix (n_inner, nr, lnz); + + int *Ltp = Lfact.cidx (); + int *Ltj = Lfact.ridx (); + double *Ltx = Lfact.data (); + + if (unz < 1) + Ufact = SparseMatrix (n_inner, nc, 1); + else + Ufact = SparseMatrix (n_inner, nc, unz); + + int *Up = Ufact.cidx (); + int *Uj = Ufact.ridx (); + double *Ux = Ufact.data (); + + P.resize (nr); + int *p = P.fortran_vec (); + + Q.resize (nc); + int *q = Q.fortran_vec (); + + int do_recip; + status = umfpack_di_get_numeric (Ltp, Ltj, Ltx, Up, Uj, + Ux, p, q, (double *) NULL, + &do_recip, (double *) NULL, + Numeric) ; + + umfpack_di_free_numeric (&Numeric) ; + + if (status < 0 || do_recip) + { + (*current_liboctave_error_handler) + ("SparseLU::SparseLU extracting LU factors failed"); + + umfpack_di_report_status (control, status); + } + else + { + Lfact = Lfact.transpose (); + umfpack_di_report_matrix (nr, n_inner, Lfact.cidx (), + Lfact.ridx (), Lfact.data (), + 1, control); + umfpack_di_report_matrix (n_inner, nc, Ufact.cidx (), + Ufact.ridx (), Ufact.data (), + 1, control); + umfpack_di_report_perm (nr, p, control); + umfpack_di_report_perm (nc, q, control); + } + + umfpack_di_report_info (control, info); + } + } + } +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ + diff -r 9f3299378193 -r 57077d0ddc8e liboctave/SparsedbleLU.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/SparsedbleLU.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,62 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#if !defined (octave_sparse_LU_h) +#define octave_sparse_LU_h 1 + +#include "sparse-base-lu.h" +#include "dSparse.h" + +class +SparseLU : public sparse_base_lu +{ +public: + + SparseLU (void) + : sparse_base_lu () { } + + SparseLU (const SparseMatrix& a, double piv_thres = -1.0); + + SparseLU (const SparseMatrix& a, const ColumnVector& Qinit, + double piv_thres = -1.0, bool FixedQ = false); + + SparseLU (const SparseLU& a) + : sparse_base_lu (a) { } + + SparseLU& operator = (const SparseLU& a) + { + if (this != &a) + sparse_base_lu + :: operator = (a); + + return *this; + } + + ~SparseLU (void) { } +}; + +#endif + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK.README --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK.README Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,47 @@ +This directory contains a modified copy of UMFPACKv4.4 in the +directory UMFPACK. The complete changes from the original version may +be found in the file UMFPACK.patch. + +UMFPACK was written by Timothy A. Davis (davis@cise.ufl.edu), +University of Florida. + +UMFPACK includes a modified version of COLAMD V2.0, by Stefan +I. Larimore and Timothy A. Davis, University of Florida. The COLAMD +algorithm was developed in collaboration with John Gilbert, Xerox Palo +Alto Research Center, and Esmond Ng, Lawrence Berkeley National +Laboratory. + +UMFPACK also includes AMD, by Timothy A. Davis, Patrick R. Amestoy, +and Iain S. Duff. + +UMFPACK Version 2.2.1 (MA38 in the Harwell Subroutine Library) is +co-authored with Iain S. Duff, Rutherford Appleton Laboratory. + +The copyright and license information is: + + UMFPACK Version 4.4 (Jan. 28, 2005), Copyright (c) 2005 by Timothy A. + Davis. All Rights Reserved. + + Your use or distribution of UMFPACK or any modified version of + UMFPACK implies that you agree to this License. + + THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY + EXPRESSED OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + + Permission is hereby granted to use or copy this program, 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 UMFPACK or any modified version of UMFPACK 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. This + software was developed with support from the National Science Foundation, + and is provided to you free of charge. + +John W. Eaton +jwe@bevo.che.wisc.edu +University of Wisconsin-Madison +Department of Chemical & Biological Engineering + +Wed Feb 01 22:15:20 2005 diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK.files --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK.files Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,79 @@ + +# non-user-callable umf_*.[ch] files: +UMFCH := umf_assemble umf_blas3_update \ + umf_build_tuples umf_create_element \ + umf_dump umf_extend_front umf_garbage_collection \ + umf_get_memory umf_init_front umf_kernel \ + umf_kernel_init umf_kernel_wrapup \ + umf_local_search umf_lsolve umf_ltsolve \ + umf_mem_alloc_element umf_mem_alloc_head_block \ + umf_mem_alloc_tail_block umf_mem_free_tail_block \ + umf_mem_init_memoryspace \ + umf_report_vector umf_row_search umf_scale_column \ + umf_set_stats umf_solve umf_symbolic_usage umf_transpose \ + umf_tuple_lengths umf_usolve umf_utsolve umf_valid_numeric \ + umf_valid_symbolic umf_grow_front umf_start_front umf_2by2 \ + umf_store_lu umf_scale + +# non-user-callable umf_*.[ch] files, int/long versions only (no real/complex): +UMFINT := umf_analyze umf_apply_order umf_colamd umf_free umf_fsize \ + umf_is_permutation umf_malloc umf_realloc umf_report_perm \ + umf_singletons + +# non-user-callable and user-callable amd_*.[ch] files (int/long versions only): +AMD := amd_aat amd_1 amd_2 amd_dump amd_postorder amd_post_tree amd_defaults \ + amd_order amd_control amd_info amd_valid + +# non-user-callable, created from umf_ltsolve.c, umf_utsolve.c, +# umf_triplet.c, and umf_assemble.c , with int/long and real/complex versions: +UMF_CREATED := umf_lhsolve umf_uhsolve umf_triplet_map_nox \ + umf_triplet_nomap_x umf_triplet_nomap_nox umf_triplet_map_x \ + umf_assemble_fixq umf_store_lu_drop + +# non-user-callable, int/long and real/complex versions: +UMF := $(UMF_CREATED) $(UMFCH) + +# user-callable umfpack_*.[ch] files (int/long and real/complex): +UMFPACK := umfpack_col_to_triplet umfpack_defaults umfpack_free_numeric \ + umfpack_free_symbolic umfpack_get_numeric umfpack_get_lunz \ + umfpack_get_symbolic umfpack_get_determinant umfpack_numeric \ + umfpack_qsymbolic umfpack_report_control umfpack_report_info \ + umfpack_report_matrix umfpack_report_numeric umfpack_report_perm \ + umfpack_report_status umfpack_report_symbolic umfpack_report_triplet \ + umfpack_report_vector umfpack_solve umfpack_symbolic \ + umfpack_transpose umfpack_triplet_to_col umfpack_scale \ + umfpack_load_numeric umfpack_save_numeric \ + umfpack_load_symbolic umfpack_save_symbolic + +# user-callable, created from umfpack_solve.c (umfpack_wsolve.h exists, though): +# with int/long and real/complex versions: +UMFPACKW := umfpack_wsolve + +USER := $(UMFPACKW) $(UMFPACK) + +# user-callable, only one version for int/long, real/complex, *.[ch] files: +GENERIC := umfpack_timer umfpack_tictoc + +UMFPACK_BASE := \ + $(subst umf_, umf_o_, $(UMFINT)) \ + $(subst umf_, umf_od_, $(UMF)) \ + $(subst umfpack_, umfpack_od_, $(USER)) \ + $(subst umf_, umf_oz_, $(UMF)) \ + $(subst umfpack_, umfpack_oz_, $(USER)) \ + $(subst amd_, amd_o_, $(AMD)) \ + $(subst umfpack_, umfpack_o_, $(GENERIC)) + +UMFPACK_OBJ := $(addsuffix .o, $(UMFPACK_BASE)) + +UMFPACK_PICOBJ := $(addprefix pic/, $(UMFPACK_OBJ)) + +UMFPACK_INCFLAGS := \ + -I$(top_srcdir)/liboctave/UMFPACK/UMFPACK/Include \ + -I$(top_srcdir)/liboctave/UMFPACK/UMFPACK/Source \ + -I$(top_srcdir)/liboctave/UMFPACK/AMD/Include \ + -I$(top_srcdir)/liboctave/UMFPACK/AMD/Source + +$(UMFPACK_OBJ) $(UMFPACK_PICOBJ): INCFLAGS += $(UMFPACK_INCFLAGS) + +UMFPACK_EXTRAS := UMFPACK.files UMFPACK.rules UMFPACK.patch UMFPACK.README + diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK.patch Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,4825 @@ +--- UMFPACKv4.4.orig/AMD/Makefile 2004-01-29 20:40:44.000000000 +0100 ++++ UMFPACK/AMD/Makefile 2005-02-01 22:00:38.917972334 +0100 +@@ -28,11 +28,18 @@ + ( cd Demo ; make cross ) + - cat Doc/License + ++# compile a Octave version ++# (not compiled by "make all") ++octave: ++ ( cd OCTAVE ; make ) ++ - cat Doc/License ++ + # remove object files, but keep the compiled programs and library archives + clean: + ( cd Source ; make clean ) + ( cd Demo ; make clean ) + ( cd MATLAB ; make clean ) ++ ( cd OCTAVE ; make clean ) + ( cd Doc ; make clean ) + + # clean, and then remove compiled programs and library archives +@@ -40,6 +47,7 @@ + ( cd Source ; make purge ) + ( cd Demo ; make purge ) + ( cd MATLAB ; make purge ) ++ ( cd OCTAVE ; make purge ) + ( cd Doc ; make purge ) + + # create PDF documents for the original distribution +--- UMFPACKv4.4.orig/UMFPACK/Makefile 2004-01-29 20:40:48.000000000 +0100 ++++ UMFPACK/UMFPACK/Makefile 2005-02-01 22:00:38.916972398 +0100 +@@ -32,12 +32,19 @@ + hb: + ( cd Demo ; make hb ) + ++# compile a Octave version ++# (not compiled by "make all") ++octave: ++ ( cd OCTAVE ; make ) ++ - cat Doc/License ++ + # remove object files, but keep the compiled programs and library archives + clean: + ( cd ../AMD ; make clean ) + ( cd Source ; make clean ) + ( cd Demo ; make clean ) + ( cd MATLAB ; make clean ) ++ ( cd OCTAVE ; make clean ) + ( cd Doc ; make clean ) + + # clean, and then remove compiled programs and library archives +@@ -46,6 +53,7 @@ + ( cd Source ; make purge ) + ( cd Demo ; make purge ) + ( cd MATLAB ; make purge ) ++ ( cd OCTAVE ; make purge ) + ( cd Doc ; make purge ) + + # create PDF documents for the original distribution +diff -uNr UMFPACKv4.4.orig/UMFPACK/OCTAVE/Contents.m UMFPACK/UMFPACK/OCTAVE/Contents.m +--- UMFPACKv4.4.orig/UMFPACK/OCTAVE/Contents.m 1970-01-01 01:00:00.000000000 +0100 ++++ UMFPACK/UMFPACK/OCTAVE/Contents.m 2004-12-30 01:58:46.000000000 +0100 +@@ -0,1 +1,22 @@ ++%Contents of the UMFPACK sparse matrix toolbox: ++% ++% umfpack computes x=A\b, x=A/b, or lu (A) for a sparse matrix A ++% umfpack_make to compile umfpack for use in MATLAB ++% umfpack_report prints optional control settings and statistics ++% umfpack_demo a long demo ++% umfpack_simple a simple demo ++% umfpack_btf factorize A using a block triangular form ++% umfpack_solve x = A\b or x = b/A ++% lu_normest estimates norm (L*U-A, 1) without forming L*U-A ++% luflop given L and U, computes # of flops required to compute them ++% ++% See also: ++% amd symmetric minimum degree ordering ++% colamd unsymmetric column approx minimum degree ordering ++% symamd symmetric approx minimum degree ordering, based on colamd ++% ++% UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A. ++% Davis. All Rights Reserved. Type umfpack_details for License. ++ ++help Contents +--- UMFPACKv4.4.orig/UMFPACK/OCTAVE/GNUmakefile 1970-01-01 01:00:00.000000000 +0100 ++++ UMFPACK/UMFPACK/OCTAVE/GNUmakefile 2004-12-30 01:58:46.000000000 +0100 +@@ -0,0 +1,248 @@ ++#------------------------------------------------------------------------------- ++# UMFPACK GNUmakefile for the UMFPACK OCTAVE oct-file (GNU "make" only) ++#------------------------------------------------------------------------------- ++ ++.PRECIOUS: %.o ++ ++# UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A. ++# Davis. All Rights Reserved. See ../README for License. ++ ++all: umfpack luflop ++ ++include ../Make/Make.include ++ ++MKOCT = mkoctfile $(CONFIG) -DNRECIPROCAL -I/usr/include/atlas -I../Include -I../Source -I../../AMD/Include -I../../AMD/Source ++ ++OCT_SPARSE_INC = -I../../../ ++ ++ ++#------------------------------------------------------------------------------- ++# source files ++#------------------------------------------------------------------------------- ++ ++# non-user-callable umf_*.[ch] files: ++UMFCH = umf_assemble umf_blas3_update \ ++ umf_build_tuples umf_create_element \ ++ umf_dump umf_extend_front umf_garbage_collection \ ++ umf_get_memory umf_init_front umf_kernel \ ++ umf_kernel_init umf_kernel_wrapup \ ++ umf_local_search umf_lsolve umf_ltsolve \ ++ umf_mem_alloc_element umf_mem_alloc_head_block \ ++ umf_mem_alloc_tail_block umf_mem_free_tail_block \ ++ umf_mem_init_memoryspace \ ++ umf_report_vector umf_row_search umf_scale_column \ ++ umf_set_stats umf_solve umf_symbolic_usage umf_transpose \ ++ umf_tuple_lengths umf_usolve umf_utsolve umf_valid_numeric \ ++ umf_valid_symbolic umf_grow_front umf_start_front umf_2by2 \ ++ umf_store_lu umf_scale ++ ++# non-user-callable umf_*.[ch] files, int/long versions only (no real/complex): ++UMFINT = umf_analyze umf_apply_order umf_colamd umf_free umf_fsize \ ++ umf_is_permutation umf_malloc umf_realloc umf_report_perm \ ++ umf_singletons ++ ++# non-user-callable and user-callable amd_*.[ch] files (int/long versions only): ++AMD = amd_aat amd_1 amd_2 amd_dump amd_postorder amd_post_tree amd_defaults \ ++ amd_order amd_control amd_info amd_valid ++ ++# non-user-callable, created from umf_ltsolve.c, umf_utsolve.c, ++# umf_triplet.c, and umf_assemble.c , with int/long and real/complex versions: ++UMF_CREATED = umf_lhsolve umf_uhsolve umf_triplet_map_nox \ ++ umf_triplet_nomap_x umf_triplet_nomap_nox umf_triplet_map_x \ ++ umf_assemble_fixq umf_store_lu_drop ++ ++# non-user-callable, int/long and real/complex versions: ++UMF = $(UMF_CREATED) $(UMFCH) ++ ++# user-callable umfpack_*.[ch] files (int/long and real/complex): ++UMFPACK = umfpack_col_to_triplet umfpack_defaults umfpack_free_numeric \ ++ umfpack_free_symbolic umfpack_get_numeric umfpack_get_lunz \ ++ umfpack_get_symbolic umfpack_get_determinant umfpack_numeric \ ++ umfpack_qsymbolic umfpack_report_control umfpack_report_info \ ++ umfpack_report_matrix umfpack_report_numeric umfpack_report_perm \ ++ umfpack_report_status umfpack_report_symbolic umfpack_report_triplet \ ++ umfpack_report_vector umfpack_solve umfpack_symbolic \ ++ umfpack_transpose umfpack_triplet_to_col umfpack_scale \ ++ umfpack_load_numeric umfpack_save_numeric \ ++ umfpack_load_symbolic umfpack_save_symbolic ++ ++# user-callable, created from umfpack_solve.c (umfpack_wsolve.h exists, though): ++# with int/long and real/complex versions: ++UMFPACKW = umfpack_wsolve ++ ++USER = $(UMFPACKW) $(UMFPACK) ++ ++# user-callable, only one version for int/long, real/complex, *.[ch] files: ++GENERIC = umfpack_timer umfpack_tictoc ++ ++#------------------------------------------------------------------------------- ++# include files: ++#------------------------------------------------------------------------------- ++ ++AMDH = ../../AMD/Source/amd_internal.h ../../AMD/Include/amd.h ++ ++INC1 = umf_config.h umf_version.h umf_internal.h umf_triplet.h ++ ++INC = ../Include/umfpack.h \ ++ $(addprefix ../Source/, $(INC1)) \ ++ $(addprefix ../Source/, $(addsuffix .h,$(UMFCH))) \ ++ $(addprefix ../Source/, $(addsuffix .h,$(UMFINT))) \ ++ $(addprefix ../Include/, $(addsuffix .h,$(USER))) \ ++ $(addprefix ../Include/, $(addsuffix .h,$(GENERIC))) \ ++ $(AMDH) ++ ++#------------------------------------------------------------------------------- ++# Create the umfpack and amd oct-file for OCTAVE (int versions only) ++#------------------------------------------------------------------------------- ++ ++OCTI = $(addsuffix .o, $(subst umf_,umf_o_,$(UMFINT))) ++OCTDI = $(addsuffix .o, $(subst umf_,umf_od_,$(UMF)) $(subst umfpack_,umfpack_od_,$(USER))) ++OCTZI = $(addsuffix .o, $(subst umf_,umf_oz_,$(UMF)) $(subst umfpack_,umfpack_oz_,$(USER)) ) ++OCTAMD = $(addsuffix .o, $(subst amd_,amd_o_,$(AMD))) ++OCTGN = $(addsuffix .o, $(subst umfpack_,umfpack_o_,$(GENERIC))) ++ ++OCTUMFPACK = $(OCTI) $(OCTDI) $(OCTZI) $(OCTGN) ++ ++OCTUMFPACK_LIB = umfpack_octave.o ++ ++# Note that mkoctfile has an "-o" option, but it doesn't work in conjunction ++# with the "-c" option, thus the need for $(MV) commands. ++# If it did, then the rules would be much simpler: ++# $(MKOCT) -DDINT -c $< -o $@ ++ ++#---------------------------------------- ++# integer-only routines (no real/complex): ++#---------------------------------------- ++ ++amd_o_%.o: ../../AMD/Source/amd_%.c $(AMDH) ++ $(MKOCT) -DDINT -c $< ++ - $(MV) ../../AMD/Source/amd_$*.o $@ ++ ++ ++umf_o_%.o: ../Source/umf_%.c $(INC) ++ $(MKOCT) -DDINT -c $< ++ - $(MV) ../Source/umf_$*.o $@ ++ ++#---------------------------------------- ++# Double precision, int version, for OCTAVE ++#---------------------------------------- ++ ++umf_od_%.o: ../Source/umf_%.c $(INC) ++ $(MKOCT) -DDINT -c $< ++ - $(MV) ../Source/umf_$*.o $@ ++ ++umf_od_%hsolve.o: ../Source/umf_%tsolve.c $(INC) ++ $(MKOCT) -DDINT -DCONJUGATE_SOLVE -c $< ++ - $(MV) ../Source/umf_$*tsolve.o $@ ++ ++umf_od_triplet_map_x.o: ../Source/umf_triplet.c $(INC) ++ $(MKOCT) -DDINT -DDO_MAP -DDO_VALUES -c $< ++ - $(MV) ../Source/umf_triplet.o $@ ++ ++umf_od_triplet_map_nox.o: ../Source/umf_triplet.c $(INC) ++ $(MKOCT) -DDINT -DDO_MAP -c $< ++ - $(MV) ../Source/umf_triplet.o $@ ++ ++umf_od_triplet_nomap_x.o: ../Source/umf_triplet.c $(INC) ++ $(MKOCT) -DDINT -DDO_VALUES -c $< ++ - $(MV) ../Source/umf_triplet.o $@ ++ ++umf_od_triplet_nomap_nox.o: ../Source/umf_triplet.c $(INC) ++ $(MKOCT) -DDINT -c $< ++ - $(MV) ../Source/umf_triplet.o $@ ++ ++umf_od_assemble_fixq.o: ../Source/umf_assemble.c $(INC) ++ $(MKOCT) -DDINT -DFIXQ -c $< ++ - $(MV) ../Source/umf_assemble.o $@ ++ ++umf_od_store_lu_drop.o: ../Source/umf_store_lu.c $(INC) ++ $(MKOCT) -DDINT -DDROP -c $< ++ - $(MV) ../Source/umf_store_lu.o $@ ++ ++umfpack_od_wsolve.o: ../Source/umfpack_solve.c $(INC) ++ $(MKOCT) -DDINT -DWSOLVE -c $< ++ - $(MV) ../Source/umfpack_solve.o $@ ++ ++umfpack_od_%.o: ../Source/umfpack_%.c $(INC) ++ $(MKOCT) -DDINT -c $< ++ - $(MV) ../Source/umfpack_$*.o $@ ++ ++#---------------------------------------- ++# Complex double precision, int version, for OCTAVE ++#---------------------------------------- ++ ++umf_oz_%.o: ../Source/umf_%.c $(INC) ++ $(MKOCT) -DZINT -c $< ++ - $(MV) ../Source/umf_$*.o $@ ++ ++umf_oz_%hsolve.o: ../Source/umf_%tsolve.c $(INC) ++ $(MKOCT) -DZINT -DCONJUGATE_SOLVE -c $< ++ - $(MV) ../Source/umf_$*tsolve.o $@ ++ ++umf_oz_triplet_map_x.o: ../Source/umf_triplet.c $(INC) ++ $(MKOCT) -DZINT -DDO_MAP -DDO_VALUES -c $< ++ - $(MV) ../Source/umf_triplet.o $@ ++ ++umf_oz_triplet_map_nox.o: ../Source/umf_triplet.c $(INC) ++ $(MKOCT) -DZINT -DDO_MAP -c $< ++ - $(MV) ../Source/umf_triplet.o $@ ++ ++umf_oz_triplet_nomap_x.o: ../Source/umf_triplet.c $(INC) ++ $(MKOCT) -DZINT -DDO_VALUES -c $< ++ - $(MV) ../Source/umf_triplet.o $@ ++ ++umf_oz_triplet_nomap_nox.o: ../Source/umf_triplet.c $(INC) ++ $(MKOCT) -DZINT -c $< ++ - $(MV) ../Source/umf_triplet.o $@ ++ ++umf_oz_assemble_fixq.o: ../Source/umf_assemble.c $(INC) ++ $(MKOCT) -DZINT -DFIXQ -c $< ++ - $(MV) ../Source/umf_assemble.o $@ ++ ++umf_oz_store_lu_drop.o: ../Source/umf_store_lu.c $(INC) ++ $(MKOCT) -DZINT -DDROP -c $< ++ - $(MV) ../Source/umf_store_lu.o $@ ++ ++umfpack_oz_wsolve.o: ../Source/umfpack_solve.c $(INC) ++ $(MKOCT) -DZINT -DWSOLVE -c $< ++ - $(MV) ../Source/umfpack_solve.o $@ ++ ++umfpack_oz_%.o: ../Source/umfpack_%.c $(INC) ++ $(MKOCT) -DZINT -c $< ++ - $(MV) ../Source/umfpack_$*.o $@ ++ ++#---------------------------------------- ++# Generic routines for OCTAVE ++#---------------------------------------- ++ ++umfpack_o_timer.o: ../Source/umfpack_timer.c $(INC) ++ $(MKOCT) -c $< ++ - $(MV) ../Source/umfpack_timer.o $@ ++ ++umfpack_o_tictoc.o: ../Source/umfpack_tictoc.c $(INC) ++ $(MKOCT) -c $< ++ - $(MV) ../Source/umfpack_tictoc.o $@ ++ ++#---------------------------------------- ++# umfpack oct-files ++#---------------------------------------- ++ ++umfpack: umfpack.cc $(OCTUMFPACK) $(OCTAMD) ++ $(MKOCT) $(OCT_SPARSE_INC) umfpack.cc $(OCTUMFPACK) $(OCTAMD) -o umfpack.oct ++ ++luflop: luflop.cc ++ $(MKOCT) $(OCT_SPARSE_INC) luflop.cc -o luflop.oct ++ ++#---------------------------------------- ++# umfpack library to link with octave ++#---------------------------------------- ++ ++octave: $(OCTUMFPACK) $(OCTAMD) ++ ld -r $(OCTUMFPACK) $(OCTAMD) -o ../../../$(OCTUMFPACK_LIB) ++ ++#------------------------------------------------------------------------------- ++# Remove all but the files in the original distribution ++#------------------------------------------------------------------------------- ++ ++purge: clean ++ - $(RM) *.oct *.so +diff -uNr UMFPACKv4.4.orig/UMFPACK/OCTAVE/luflop.cc UMFPACK/UMFPACK/OCTAVE/luflop.cc +--- UMFPACKv4.4.orig/UMFPACK/OCTAVE/luflop.cc 1970-01-01 01:00:00.000000000 +0100 ++++ UMFPACK/UMFPACK/OCTAVE/luflop.cc 2004-12-30 01:58:46.000000000 +0100 +@@ -0,0 +1,223 @@ ++/* ++ ++Copyright (C) 2004 David Bateman ++ ++This program is free software; you can redistribute it and/or modify it ++under the terms of the GNU General Public License as published by the ++Free Software Foundation; either version 2, or (at your option) any ++later version. ++ ++This program is distributed in the hope that it will be useful, but WITHOUT ++ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++for more details. ++ ++You should have received a copy of the GNU General Public License ++along with this program; see the file COPYING. If not, write to the Free ++Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++ ++In addition to the terms of the GPL, you are permitted to link ++this program with any Open Source program, as defined by the ++Open Source Initiative (www.opensource.org) ++ ++*/ ++ ++/* ++ ++This is the Octave interface to the UMFPACK code, which bore the following ++copyright ++ ++ UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A. ++ Davis. All Rights Reserved. See ../README for License. ++ email: davis@cise.ufl.edu CISE Department, Univ. of Florida. ++ web: http://www.cise.ufl.edu/research/sparse/umfpack ++ ++*/ ++ ++ ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++ ++#include "ov-re-sparse.h" ++#include "ov-cx-sparse.h" ++ ++DEFUN_DLD (luflop, args, nargout, ++ "-*- texinfo -*-\n\ ++@deftypefn {Loadable Function} {@var{f} =} luflup (@var{l}, @var{u})\n\ ++\n\ ++Given an LU factorization, compute how many flops took to compute it. This\n\ ++is the same as (assuming U has a zero-free diagonal):\n\ ++\n\ ++@example\n\ ++@group\n\ ++ Lnz = full (sum (spones (L))) - 1 ;\n\ ++ Unz = full (sum (spones (U')))' - 1 ;\n\ ++ f = 2*Lnz*Unz + sum (Lnz) ;\n\ ++@end group\n\ ++@end example\n\ ++\n\ ++except that no extra workspace is allocated for spones (L) and spones (U).\n\ ++L and U must be sparse.\n\ ++\n\ ++Note: the above expression has a subtle undercount when exact numerical\n\ ++cancelation occurs. Try [L,U,P] = lu (sparse (ones (10))) and then\n\ ++luflop (L,U).\n\ ++@end deftypefn") ++{ ++ int nargin = args.length (); ++ octave_value retval; ++ ++ // These are here only so that the C++ destructors don't prematurally ++ // remove the underlying data we are interested in ++ SparseMatrix Lmatrix, Umatrix; ++ SparseComplexMatrix CLmatrix, CUmatrix; ++ int *Lp, *Li, *Up, *Ui; ++ int Lm, Ln, Um, Un; ++ ++ if (nargin != 2) ++ { ++ usage ("f = luflop (L, U)"); ++ return retval; ++ } ++ ++ if (args(0).class_name () == "sparse") ++ { ++ if (args(0).is_complex_type ()) ++ { ++ CLmatrix = ++ (((const octave_sparse_complex_matrix&) args(0).get_rep ()) ++ .sparse_complex_matrix_value ()); ++ Lp = CLmatrix.cidx (); ++ Li = CLmatrix.ridx (); ++ Lm = CLmatrix.rows (); ++ Ln = CLmatrix.cols (); ++ } ++ else ++ { ++ Lmatrix = (((const octave_sparse_matrix&) args(0).get_rep ()) ++ .sparse_matrix_value ()); ++ Lp = Lmatrix.cidx (); ++ Li = Lmatrix.ridx (); ++ Lm = Lmatrix.rows (); ++ Ln = Lmatrix.cols (); ++ } ++ } ++ else ++ { ++ if (args(0).is_complex_type ()) ++ { ++ CLmatrix = SparseComplexMatrix (args(0).complex_matrix_value ()); ++ Lp = CLmatrix.cidx (); ++ Li = CLmatrix.ridx (); ++ Lm = CLmatrix.rows (); ++ Ln = CLmatrix.cols (); ++ } ++ else ++ { ++ Lmatrix = SparseMatrix (args(0).matrix_value ()); ++ Lp = Lmatrix.cidx (); ++ Li = Lmatrix.ridx (); ++ Lm = Lmatrix.rows (); ++ Ln = Lmatrix.cols (); ++ } ++ } ++ ++ ++ if (args(0).class_name () == "sparse") ++ { ++ if (args(1).is_complex_type ()) ++ { ++ CUmatrix = ++ (((const octave_sparse_complex_matrix&) args(1).get_rep ()) ++ .sparse_complex_matrix_value ()); ++ Up = CUmatrix.cidx (); ++ Ui = CUmatrix.ridx (); ++ Um = CUmatrix.rows (); ++ Un = CUmatrix.cols (); ++ } ++ else ++ { ++ Umatrix = ++ (((const octave_sparse_matrix&) args(1).get_rep ()) ++ .sparse_matrix_value ()); ++ Up = Umatrix.cidx (); ++ Ui = Umatrix.ridx (); ++ Um = Umatrix.rows (); ++ Un = Umatrix.cols (); ++ } ++ } ++ else ++ { ++ if (args(1).is_complex_type ()) ++ { ++ CUmatrix = SparseComplexMatrix (args(1).complex_matrix_value ()); ++ Up = CUmatrix.cidx (); ++ Ui = CUmatrix.ridx (); ++ Um = CUmatrix.rows (); ++ Un = CUmatrix.cols (); ++ } ++ else ++ { ++ Umatrix = SparseMatrix (args(1).matrix_value ()); ++ Up = Umatrix.cidx (); ++ Ui = Umatrix.ridx (); ++ Um = Umatrix.rows (); ++ Un = Umatrix.cols (); ++ } ++ } ++ ++ ++ if (error_state) ++ return retval; ++ ++ ++ int n = Lm; ++ ++ if (n != Ln || n != Um || n != Un) ++ error ("luflop: L and U must be square"); ++ else ++ { ++ ++ OCTAVE_LOCAL_BUFFER (int, Unz, n); ++ ++ // count the nonzeros in each row of U ++ for (int row = 0 ; row < n ; row++) ++ Unz [row] = 0 ; ++ ++ for (int col = 0 ; col < n ; col++) ++ { ++ for (int p = Up [col] ; p < Up [col+1] ; p++) ++ { ++ int row = Ui [p] ; ++ Unz [row]++ ; ++ } ++ } ++ ++ // count the flops ++ double flop_count = 0.0 ; ++ for (int k = 0 ; k < n ; k++) ++ { ++ /* off-diagonal nonzeros in column k of L: */ ++ int Lnz_k = Lp [k+1] - Lp [k] - 1 ; ++ int Unz_k = Unz [k] - 1 ; ++ flop_count += (2 * Lnz_k * Unz_k) + Lnz_k ; ++ } ++ ++ // return the result ++ retval = flop_count; ++ } ++ ++ return retval; ++} ++ ++/* ++;;; Local Variables: *** ++;;; mode: C++ *** ++;;; End: *** ++*/ +diff -uNr UMFPACKv4.4.orig/UMFPACK/OCTAVE/lu_normest.m UMFPACK/UMFPACK/OCTAVE/lu_normest.m +--- UMFPACKv4.4.orig/UMFPACK/OCTAVE/lu_normest.m 1970-01-01 01:00:00.000000000 +0100 ++++ UMFPACK/UMFPACK/OCTAVE/lu_normest.m 2004-12-30 01:58:46.000000000 +0100 +@@ -0,0 +1,106 @@ ++function rho = lu_normest (A, L, U) ++% LU_NORMEST: estimate the 1-norm of A-L*U without computing L*U ++% ++% Usage: ++% ++% rho = lu_normest (A, L, U) ++% ++% which estimates the computation of the 1-norm: ++% ++% rho = norm (A-L*U, 1) ++% ++% Authors: William W. Hager, Math Dept., Univ. of Florida ++% Timothy A. Davis, CISE Dept., Univ. of Florida ++% Gainesville, FL, 32611, USA. ++% based on normest1, contributed on November, 1997 ++% ++% This code can be quite easily adapted to estimate the 1-norm of any ++% matrix E, where E itself is dense or not explicitly represented, but the ++% computation of E (and E') times a vector is easy. In this case, our matrix ++% of interest is: ++% ++% E = A-L*U ++% ++% That is, L*U is the LU factorization of A, where A, L and U ++% are sparse. This code works for dense matrices A and L too, ++% but it would not be needed in that case, since E is easy to compute ++% explicitly. For sparse A, L, and U, computing E explicitly would be quite ++% expensive, and thus normest (A-L*U) would be prohibitive. ++% ++% For a detailed description, see Davis, T. A. and Hager, W. W., ++% Modifying a sparse Cholesky factorization, SIAM J. Matrix Analysis and ++% Applications, 1999, vol. 20, no. 3, 606-627. ++ ++% The three places that the matrix-vector multiply E*x is used are highlighted. ++% Note that E is never formed explicity. ++ ++[m n] = size (A) ; ++ ++if (m ~= n) ++ % pad A, L, and U with zeros so that they are all square ++ if (m < n) ++ U = [ U ; (sparse (n-m,n)) ] ; ++ L = [ L , (sparse (m,n-m)) ; (sparse (n-m,n)) ] ; ++ A = [ A ; (sparse (n-m,n)) ] ; ++ else ++ U = [ U , (sparse (n,m-n)) ; (sparse (m-n,m)) ] ; ++ L = [ L , (sparse (m,m-n)) ] ; ++ A = [ A , (sparse (m,m-n)) ] ; ++ end ++end ++ ++[m n] = size (A) ; ++ ++notvisited = ones (m, 1) ; % nonvisited(j) is zero if j is visited, 1 otherwise ++rho = 0 ; % the global rho ++ ++At = A' ; ++Lt = L' ; ++ ++for trial = 1:3 % { ++ ++ x = notvisited ./ sum (notvisited) ; ++ rho1 = 0 ; % the current rho for this trial ++ ++ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ++ %%% COMPUTE Ex1 = E*x EFFICIENTLY: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ++ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ++ Ex1 = (A*x) - L*(U*x) ; ++ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ++ ++ rho2 = norm (Ex1, 1) ; ++ ++ while rho2 > rho1 % { ++ ++ rho1 = rho2 ; ++ y = 2*(Ex1 >= 0) - 1 ; ++ ++ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ++ %%% COMPUTE z = E'*y EFFICIENTLY: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ++ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ++ z = (A'*y) - U'*(L'*y) ; ++ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ++ ++ [zj, j] = max (abs (z .* notvisited)) ; ++ j = j (1) ; ++ if (abs (z (j)) > z'*x) % { ++ x = zeros (m, 1) ; ++ x (j) = 1 ; ++ notvisited (j) = 0 ; ++ else % } { ++ break ; ++ end % } ++ ++ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ++ %%% COMPUTE Ex1 = E*x EFFICIENTLY: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ++ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ++ Ex1 = (A*x) - L*(U*x) ; ++ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ++ ++ rho2 = norm (Ex1, 1) ; ++ ++ end % } ++ ++ rho = max (rho, rho1) ; ++ ++end % } +diff -uNr UMFPACKv4.4.orig/UMFPACK/OCTAVE/Makefile UMFPACK/UMFPACK/OCTAVE/Makefile +--- UMFPACKv4.4.orig/UMFPACK/OCTAVE/Makefile 1970-01-01 01:00:00.000000000 +0100 ++++ UMFPACK/UMFPACK/OCTAVE/Makefile 2004-12-30 01:58:46.000000000 +0100 +@@ -0,0 +1,517 @@ ++#------------------------------------------------------------------------------- ++# UMFPACK Makefile for the UMFPACK MATLAB mexFunction (old "make" only) ++#------------------------------------------------------------------------------- ++ ++# UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A. ++# Davis. All Rights Reserved. See ../README for License. ++ ++# This is a very ugly Makefile, and is only provided for those who do not ++# have GNU make. Note that it is not used if you have GNU make. It ignores ++# dependency checking and just compiles everything. It was created ++# automatically, via make -n using the GNUmakefile. That way, I don't have ++# maintain two Makefiles. ++ ++all: umfpack luflop ++ ++include ../Make/Make.include ++ ++MKOCT = mkoctfile $(CONFIG) -DNRECIPROCAL -I/usr/include/atlas -I../Include -I../Source -I../../AMD/Include -I../../AMD/Source ++ ++OCT_SPARSE_INC = -I../../../ ++OCTUMFPACK_LIB = umfpack_octave.o ++ ++umfpack: ++ $(MKOCT) -DDINT -c ../Source/umf_analyze.c ++ $(MV) -f ../Source/umf_analyze.o umf_m_analyze.o ++ $(MKOCT) -DDINT -c ../Source/umf_apply_order.c ++ $(MV) -f ../Source/umf_apply_order.o umf_m_apply_order.o ++ $(MKOCT) -DDINT -c ../Source/umf_colamd.c ++ $(MV) -f ../Source/umf_colamd.o umf_m_colamd.o ++ $(MKOCT) -DDINT -c ../Source/umf_free.c ++ $(MV) -f ../Source/umf_free.o umf_m_free.o ++ $(MKOCT) -DDINT -c ../Source/umf_fsize.c ++ $(MV) -f ../Source/umf_fsize.o umf_m_fsize.o ++ $(MKOCT) -DDINT -c ../Source/umf_is_permutation.c ++ $(MV) -f ../Source/umf_is_permutation.o umf_m_is_permutation.o ++ $(MKOCT) -DDINT -c ../Source/umf_malloc.c ++ $(MV) -f ../Source/umf_malloc.o umf_m_malloc.o ++ $(MKOCT) -DDINT -c ../Source/umf_realloc.c ++ $(MV) -f ../Source/umf_realloc.o umf_m_realloc.o ++ $(MKOCT) -DDINT -c ../Source/umf_report_perm.c ++ $(MV) -f ../Source/umf_report_perm.o umf_m_report_perm.o ++ $(MKOCT) -DDINT -c ../Source/umf_singletons.c ++ $(MV) -f ../Source/umf_singletons.o umf_m_singletons.o ++ $(MKOCT) -DDINT -DCONJUGATE_SOLVE -c ../Source/umf_ltsolve.c ++ $(MV) -f ../Source/umf_ltsolve.o umf_od_lhsolve.o ++ $(MKOCT) -DDINT -DCONJUGATE_SOLVE -c ../Source/umf_utsolve.c ++ $(MV) -f ../Source/umf_utsolve.o umf_od_uhsolve.o ++ $(MKOCT) -DDINT -DDO_MAP -c ../Source/umf_triplet.c ++ $(MV) -f ../Source/umf_triplet.o umf_od_triplet_map_nox.o ++ $(MKOCT) -DDINT -DDO_VALUES -c ../Source/umf_triplet.c ++ $(MV) -f ../Source/umf_triplet.o umf_od_triplet_nomap_x.o ++ $(MKOCT) -DDINT -c ../Source/umf_triplet.c ++ $(MV) -f ../Source/umf_triplet.o umf_od_triplet_nomap_nox.o ++ $(MKOCT) -DDINT -DDO_MAP -DDO_VALUES -c ../Source/umf_triplet.c ++ $(MV) -f ../Source/umf_triplet.o umf_od_triplet_map_x.o ++ $(MKOCT) -DDINT -DFIXQ -c ../Source/umf_assemble.c ++ $(MV) -f ../Source/umf_assemble.o umf_od_assemble_fixq.o ++ $(MKOCT) -DDINT -DDROP -c ../Source/umf_store_lu.c ++ $(MV) -f ../Source/umf_store_lu.o umf_od_store_lu_drop.o ++ $(MKOCT) -DDINT -c ../Source/umf_assemble.c ++ $(MV) -f ../Source/umf_assemble.o umf_od_assemble.o ++ $(MKOCT) -DDINT -c ../Source/umf_blas3_update.c ++ $(MV) -f ../Source/umf_blas3_update.o umf_od_blas3_update.o ++ $(MKOCT) -DDINT -c ../Source/umf_build_tuples.c ++ $(MV) -f ../Source/umf_build_tuples.o umf_od_build_tuples.o ++ $(MKOCT) -DDINT -c ../Source/umf_create_element.c ++ $(MV) -f ../Source/umf_create_element.o umf_od_create_element.o ++ $(MKOCT) -DDINT -c ../Source/umf_dump.c ++ $(MV) -f ../Source/umf_dump.o umf_od_dump.o ++ $(MKOCT) -DDINT -c ../Source/umf_extend_front.c ++ $(MV) -f ../Source/umf_extend_front.o umf_od_extend_front.o ++ $(MKOCT) -DDINT -c ../Source/umf_garbage_collection.c ++ $(MV) -f ../Source/umf_garbage_collection.o umf_od_garbage_collection.o ++ $(MKOCT) -DDINT -c ../Source/umf_get_memory.c ++ $(MV) -f ../Source/umf_get_memory.o umf_od_get_memory.o ++ $(MKOCT) -DDINT -c ../Source/umf_init_front.c ++ $(MV) -f ../Source/umf_init_front.o umf_od_init_front.o ++ $(MKOCT) -DDINT -c ../Source/umf_kernel.c ++ $(MV) -f ../Source/umf_kernel.o umf_od_kernel.o ++ $(MKOCT) -DDINT -c ../Source/umf_kernel_init.c ++ $(MV) -f ../Source/umf_kernel_init.o umf_od_kernel_init.o ++ $(MKOCT) -DDINT -c ../Source/umf_kernel_wrapup.c ++ $(MV) -f ../Source/umf_kernel_wrapup.o umf_od_kernel_wrapup.o ++ $(MKOCT) -DDINT -c ../Source/umf_local_search.c ++ $(MV) -f ../Source/umf_local_search.o umf_od_local_search.o ++ $(MKOCT) -DDINT -c ../Source/umf_lsolve.c ++ $(MV) -f ../Source/umf_lsolve.o umf_od_lsolve.o ++ $(MKOCT) -DDINT -c ../Source/umf_ltsolve.c ++ $(MV) -f ../Source/umf_ltsolve.o umf_od_ltsolve.o ++ $(MKOCT) -DDINT -c ../Source/umf_mem_alloc_element.c ++ $(MV) -f ../Source/umf_mem_alloc_element.o umf_od_mem_alloc_element.o ++ $(MKOCT) -DDINT -c ../Source/umf_mem_alloc_head_block.c ++ $(MV) -f ../Source/umf_mem_alloc_head_block.o umf_od_mem_alloc_head_block.o ++ $(MKOCT) -DDINT -c ../Source/umf_mem_alloc_tail_block.c ++ $(MV) -f ../Source/umf_mem_alloc_tail_block.o umf_od_mem_alloc_tail_block.o ++ $(MKOCT) -DDINT -c ../Source/umf_mem_free_tail_block.c ++ $(MV) -f ../Source/umf_mem_free_tail_block.o umf_od_mem_free_tail_block.o ++ $(MKOCT) -DDINT -c ../Source/umf_mem_init_memoryspace.c ++ $(MV) -f ../Source/umf_mem_init_memoryspace.o umf_od_mem_init_memoryspace.o ++ $(MKOCT) -DDINT -c ../Source/umf_report_vector.c ++ $(MV) -f ../Source/umf_report_vector.o umf_od_report_vector.o ++ $(MKOCT) -DDINT -c ../Source/umf_row_search.c ++ $(MV) -f ../Source/umf_row_search.o umf_od_row_search.o ++ $(MKOCT) -DDINT -c ../Source/umf_scale_column.c ++ $(MV) -f ../Source/umf_scale_column.o umf_od_scale_column.o ++ $(MKOCT) -DDINT -c ../Source/umf_set_stats.c ++ $(MV) -f ../Source/umf_set_stats.o umf_od_set_stats.o ++ $(MKOCT) -DDINT -c ../Source/umf_solve.c ++ $(MV) -f ../Source/umf_solve.o umf_od_solve.o ++ $(MKOCT) -DDINT -c ../Source/umf_symbolic_usage.c ++ $(MV) -f ../Source/umf_symbolic_usage.o umf_od_symbolic_usage.o ++ $(MKOCT) -DDINT -c ../Source/umf_transpose.c ++ $(MV) -f ../Source/umf_transpose.o umf_od_transpose.o ++ $(MKOCT) -DDINT -c ../Source/umf_tuple_lengths.c ++ $(MV) -f ../Source/umf_tuple_lengths.o umf_od_tuple_lengths.o ++ $(MKOCT) -DDINT -c ../Source/umf_usolve.c ++ $(MV) -f ../Source/umf_usolve.o umf_od_usolve.o ++ $(MKOCT) -DDINT -c ../Source/umf_utsolve.c ++ $(MV) -f ../Source/umf_utsolve.o umf_od_utsolve.o ++ $(MKOCT) -DDINT -c ../Source/umf_valid_numeric.c ++ $(MV) -f ../Source/umf_valid_numeric.o umf_od_valid_numeric.o ++ $(MKOCT) -DDINT -c ../Source/umf_valid_symbolic.c ++ $(MV) -f ../Source/umf_valid_symbolic.o umf_od_valid_symbolic.o ++ $(MKOCT) -DDINT -c ../Source/umf_grow_front.c ++ $(MV) -f ../Source/umf_grow_front.o umf_od_grow_front.o ++ $(MKOCT) -DDINT -c ../Source/umf_start_front.c ++ $(MV) -f ../Source/umf_start_front.o umf_od_start_front.o ++ $(MKOCT) -DDINT -c ../Source/umf_2by2.c ++ $(MV) -f ../Source/umf_2by2.o umf_od_2by2.o ++ $(MKOCT) -DDINT -c ../Source/umf_store_lu.c ++ $(MV) -f ../Source/umf_store_lu.o umf_od_store_lu.o ++ $(MKOCT) -DDINT -c ../Source/umf_scale.c ++ $(MV) -f ../Source/umf_scale.o umf_od_scale.o ++ $(MKOCT) -DDINT -DWSOLVE -c ../Source/umfpack_solve.c ++ $(MV) -f ../Source/umfpack_solve.o umfpack_od_wsolve.o ++ $(MKOCT) -DDINT -c ../Source/umfpack_col_to_triplet.c ++ $(MV) -f ../Source/umfpack_col_to_triplet.o umfpack_od_col_to_triplet.o ++ $(MKOCT) -DDINT -c ../Source/umfpack_defaults.c ++ $(MV) -f ../Source/umfpack_defaults.o umfpack_od_defaults.o ++ $(MKOCT) -DDINT -c ../Source/umfpack_free_numeric.c ++ $(MV) -f ../Source/umfpack_free_numeric.o umfpack_od_free_numeric.o ++ $(MKOCT) -DDINT -c ../Source/umfpack_free_symbolic.c ++ $(MV) -f ../Source/umfpack_free_symbolic.o umfpack_od_free_symbolic.o ++ $(MKOCT) -DDINT -c ../Source/umfpack_get_numeric.c ++ $(MV) -f ../Source/umfpack_get_numeric.o umfpack_od_get_numeric.o ++ $(MKOCT) -DDINT -c ../Source/umfpack_get_lunz.c ++ $(MV) -f ../Source/umfpack_get_lunz.o umfpack_od_get_lunz.o ++ $(MKOCT) -DDINT -c ../Source/umfpack_get_symbolic.c ++ $(MV) -f ../Source/umfpack_get_symbolic.o umfpack_od_get_symbolic.o ++ $(MKOCT) -DDINT -c ../Source/umfpack_get_determinant.c ++ $(MV) -f ../Source/umfpack_get_determinant.o umfpack_od_get_determinant.o ++ $(MKOCT) -DDINT -c ../Source/umfpack_numeric.c ++ $(MV) -f ../Source/umfpack_numeric.o umfpack_od_numeric.o ++ $(MKOCT) -DDINT -c ../Source/umfpack_qsymbolic.c ++ $(MV) -f ../Source/umfpack_qsymbolic.o umfpack_od_qsymbolic.o ++ $(MKOCT) -DDINT -c ../Source/umfpack_report_control.c ++ $(MV) -f ../Source/umfpack_report_control.o umfpack_od_report_control.o ++ $(MKOCT) -DDINT -c ../Source/umfpack_report_info.c ++ $(MV) -f ../Source/umfpack_report_info.o umfpack_od_report_info.o ++ $(MKOCT) -DDINT -c ../Source/umfpack_report_matrix.c ++ $(MV) -f ../Source/umfpack_report_matrix.o umfpack_od_report_matrix.o ++ $(MKOCT) -DDINT -c ../Source/umfpack_report_numeric.c ++ $(MV) -f ../Source/umfpack_report_numeric.o umfpack_od_report_numeric.o ++ $(MKOCT) -DDINT -c ../Source/umfpack_report_perm.c ++ $(MV) -f ../Source/umfpack_report_perm.o umfpack_od_report_perm.o ++ $(MKOCT) -DDINT -c ../Source/umfpack_report_status.c ++ $(MV) -f ../Source/umfpack_report_status.o umfpack_od_report_status.o ++ $(MKOCT) -DDINT -c ../Source/umfpack_report_symbolic.c ++ $(MV) -f ../Source/umfpack_report_symbolic.o umfpack_od_report_symbolic.o ++ $(MKOCT) -DDINT -c ../Source/umfpack_report_triplet.c ++ $(MV) -f ../Source/umfpack_report_triplet.o umfpack_od_report_triplet.o ++ $(MKOCT) -DDINT -c ../Source/umfpack_report_vector.c ++ $(MV) -f ../Source/umfpack_report_vector.o umfpack_od_report_vector.o ++ $(MKOCT) -DDINT -c ../Source/umfpack_solve.c ++ $(MV) -f ../Source/umfpack_solve.o umfpack_od_solve.o ++ $(MKOCT) -DDINT -c ../Source/umfpack_symbolic.c ++ $(MV) -f ../Source/umfpack_symbolic.o umfpack_od_symbolic.o ++ $(MKOCT) -DDINT -c ../Source/umfpack_transpose.c ++ $(MV) -f ../Source/umfpack_transpose.o umfpack_od_transpose.o ++ $(MKOCT) -DDINT -c ../Source/umfpack_triplet_to_col.c ++ $(MV) -f ../Source/umfpack_triplet_to_col.o umfpack_od_triplet_to_col.o ++ $(MKOCT) -DDINT -c ../Source/umfpack_scale.c ++ $(MV) -f ../Source/umfpack_scale.o umfpack_od_scale.o ++ $(MKOCT) -DDINT -c ../Source/umfpack_load_numeric.c ++ $(MV) -f ../Source/umfpack_load_numeric.o umfpack_od_load_numeric.o ++ $(MKOCT) -DDINT -c ../Source/umfpack_save_numeric.c ++ $(MV) -f ../Source/umfpack_save_numeric.o umfpack_od_save_numeric.o ++ $(MKOCT) -DDINT -c ../Source/umfpack_load_symbolic.c ++ $(MV) -f ../Source/umfpack_load_symbolic.o umfpack_od_load_symbolic.o ++ $(MKOCT) -DDINT -c ../Source/umfpack_save_symbolic.c ++ $(MV) -f ../Source/umfpack_save_symbolic.o umfpack_od_save_symbolic.o ++ $(MKOCT) -DZINT -DCONJUGATE_SOLVE -c ../Source/umf_ltsolve.c ++ $(MV) -f ../Source/umf_ltsolve.o umf_oz_lhsolve.o ++ $(MKOCT) -DZINT -DCONJUGATE_SOLVE -c ../Source/umf_utsolve.c ++ $(MV) -f ../Source/umf_utsolve.o umf_oz_uhsolve.o ++ $(MKOCT) -DZINT -DDO_MAP -c ../Source/umf_triplet.c ++ $(MV) -f ../Source/umf_triplet.o umf_oz_triplet_map_nox.o ++ $(MKOCT) -DZINT -DDO_VALUES -c ../Source/umf_triplet.c ++ $(MV) -f ../Source/umf_triplet.o umf_oz_triplet_nomap_x.o ++ $(MKOCT) -DZINT -c ../Source/umf_triplet.c ++ $(MV) -f ../Source/umf_triplet.o umf_oz_triplet_nomap_nox.o ++ $(MKOCT) -DZINT -DDO_MAP -DDO_VALUES -c ../Source/umf_triplet.c ++ $(MV) -f ../Source/umf_triplet.o umf_oz_triplet_map_x.o ++ $(MKOCT) -DZINT -DFIXQ -c ../Source/umf_assemble.c ++ $(MV) -f ../Source/umf_assemble.o umf_oz_assemble_fixq.o ++ $(MKOCT) -DZINT -DDROP -c ../Source/umf_store_lu.c ++ $(MV) -f ../Source/umf_store_lu.o umf_oz_store_lu_drop.o ++ $(MKOCT) -DZINT -c ../Source/umf_assemble.c ++ $(MV) -f ../Source/umf_assemble.o umf_oz_assemble.o ++ $(MKOCT) -DZINT -c ../Source/umf_blas3_update.c ++ $(MV) -f ../Source/umf_blas3_update.o umf_oz_blas3_update.o ++ $(MKOCT) -DZINT -c ../Source/umf_build_tuples.c ++ $(MV) -f ../Source/umf_build_tuples.o umf_oz_build_tuples.o ++ $(MKOCT) -DZINT -c ../Source/umf_create_element.c ++ $(MV) -f ../Source/umf_create_element.o umf_oz_create_element.o ++ $(MKOCT) -DZINT -c ../Source/umf_dump.c ++ $(MV) -f ../Source/umf_dump.o umf_oz_dump.o ++ $(MKOCT) -DZINT -c ../Source/umf_extend_front.c ++ $(MV) -f ../Source/umf_extend_front.o umf_oz_extend_front.o ++ $(MKOCT) -DZINT -c ../Source/umf_garbage_collection.c ++ $(MV) -f ../Source/umf_garbage_collection.o umf_oz_garbage_collection.o ++ $(MKOCT) -DZINT -c ../Source/umf_get_memory.c ++ $(MV) -f ../Source/umf_get_memory.o umf_oz_get_memory.o ++ $(MKOCT) -DZINT -c ../Source/umf_init_front.c ++ $(MV) -f ../Source/umf_init_front.o umf_oz_init_front.o ++ $(MKOCT) -DZINT -c ../Source/umf_kernel.c ++ $(MV) -f ../Source/umf_kernel.o umf_oz_kernel.o ++ $(MKOCT) -DZINT -c ../Source/umf_kernel_init.c ++ $(MV) -f ../Source/umf_kernel_init.o umf_oz_kernel_init.o ++ $(MKOCT) -DZINT -c ../Source/umf_kernel_wrapup.c ++ $(MV) -f ../Source/umf_kernel_wrapup.o umf_oz_kernel_wrapup.o ++ $(MKOCT) -DZINT -c ../Source/umf_local_search.c ++ $(MV) -f ../Source/umf_local_search.o umf_oz_local_search.o ++ $(MKOCT) -DZINT -c ../Source/umf_lsolve.c ++ $(MV) -f ../Source/umf_lsolve.o umf_oz_lsolve.o ++ $(MKOCT) -DZINT -c ../Source/umf_ltsolve.c ++ $(MV) -f ../Source/umf_ltsolve.o umf_oz_ltsolve.o ++ $(MKOCT) -DZINT -c ../Source/umf_mem_alloc_element.c ++ $(MV) -f ../Source/umf_mem_alloc_element.o umf_oz_mem_alloc_element.o ++ $(MKOCT) -DZINT -c ../Source/umf_mem_alloc_head_block.c ++ $(MV) -f ../Source/umf_mem_alloc_head_block.o umf_oz_mem_alloc_head_block.o ++ $(MKOCT) -DZINT -c ../Source/umf_mem_alloc_tail_block.c ++ $(MV) -f ../Source/umf_mem_alloc_tail_block.o umf_oz_mem_alloc_tail_block.o ++ $(MKOCT) -DZINT -c ../Source/umf_mem_free_tail_block.c ++ $(MV) -f ../Source/umf_mem_free_tail_block.o umf_oz_mem_free_tail_block.o ++ $(MKOCT) -DZINT -c ../Source/umf_mem_init_memoryspace.c ++ $(MV) -f ../Source/umf_mem_init_memoryspace.o umf_oz_mem_init_memoryspace.o ++ $(MKOCT) -DZINT -c ../Source/umf_report_vector.c ++ $(MV) -f ../Source/umf_report_vector.o umf_oz_report_vector.o ++ $(MKOCT) -DZINT -c ../Source/umf_row_search.c ++ $(MV) -f ../Source/umf_row_search.o umf_oz_row_search.o ++ $(MKOCT) -DZINT -c ../Source/umf_scale_column.c ++ $(MV) -f ../Source/umf_scale_column.o umf_oz_scale_column.o ++ $(MKOCT) -DZINT -c ../Source/umf_set_stats.c ++ $(MV) -f ../Source/umf_set_stats.o umf_oz_set_stats.o ++ $(MKOCT) -DZINT -c ../Source/umf_solve.c ++ $(MV) -f ../Source/umf_solve.o umf_oz_solve.o ++ $(MKOCT) -DZINT -c ../Source/umf_symbolic_usage.c ++ $(MV) -f ../Source/umf_symbolic_usage.o umf_oz_symbolic_usage.o ++ $(MKOCT) -DZINT -c ../Source/umf_transpose.c ++ $(MV) -f ../Source/umf_transpose.o umf_oz_transpose.o ++ $(MKOCT) -DZINT -c ../Source/umf_tuple_lengths.c ++ $(MV) -f ../Source/umf_tuple_lengths.o umf_oz_tuple_lengths.o ++ $(MKOCT) -DZINT -c ../Source/umf_usolve.c ++ $(MV) -f ../Source/umf_usolve.o umf_oz_usolve.o ++ $(MKOCT) -DZINT -c ../Source/umf_utsolve.c ++ $(MV) -f ../Source/umf_utsolve.o umf_oz_utsolve.o ++ $(MKOCT) -DZINT -c ../Source/umf_valid_numeric.c ++ $(MV) -f ../Source/umf_valid_numeric.o umf_oz_valid_numeric.o ++ $(MKOCT) -DZINT -c ../Source/umf_valid_symbolic.c ++ $(MV) -f ../Source/umf_valid_symbolic.o umf_oz_valid_symbolic.o ++ $(MKOCT) -DZINT -c ../Source/umf_grow_front.c ++ $(MV) -f ../Source/umf_grow_front.o umf_oz_grow_front.o ++ $(MKOCT) -DZINT -c ../Source/umf_start_front.c ++ $(MV) -f ../Source/umf_start_front.o umf_oz_start_front.o ++ $(MKOCT) -DZINT -c ../Source/umf_2by2.c ++ $(MV) -f ../Source/umf_2by2.o umf_oz_2by2.o ++ $(MKOCT) -DZINT -c ../Source/umf_store_lu.c ++ $(MV) -f ../Source/umf_store_lu.o umf_oz_store_lu.o ++ $(MKOCT) -DZINT -c ../Source/umf_scale.c ++ $(MV) -f ../Source/umf_scale.o umf_oz_scale.o ++ $(MKOCT) -DZINT -DWSOLVE -c ../Source/umfpack_solve.c ++ $(MV) -f ../Source/umfpack_solve.o umfpack_oz_wsolve.o ++ $(MKOCT) -DZINT -c ../Source/umfpack_col_to_triplet.c ++ $(MV) -f ../Source/umfpack_col_to_triplet.o umfpack_oz_col_to_triplet.o ++ $(MKOCT) -DZINT -c ../Source/umfpack_defaults.c ++ $(MV) -f ../Source/umfpack_defaults.o umfpack_oz_defaults.o ++ $(MKOCT) -DZINT -c ../Source/umfpack_free_numeric.c ++ $(MV) -f ../Source/umfpack_free_numeric.o umfpack_oz_free_numeric.o ++ $(MKOCT) -DZINT -c ../Source/umfpack_free_symbolic.c ++ $(MV) -f ../Source/umfpack_free_symbolic.o umfpack_oz_free_symbolic.o ++ $(MKOCT) -DZINT -c ../Source/umfpack_get_numeric.c ++ $(MV) -f ../Source/umfpack_get_numeric.o umfpack_oz_get_numeric.o ++ $(MKOCT) -DZINT -c ../Source/umfpack_get_lunz.c ++ $(MV) -f ../Source/umfpack_get_lunz.o umfpack_oz_get_lunz.o ++ $(MKOCT) -DZINT -c ../Source/umfpack_get_symbolic.c ++ $(MV) -f ../Source/umfpack_get_symbolic.o umfpack_oz_get_symbolic.o ++ $(MKOCT) -DZINT -c ../Source/umfpack_get_determinant.c ++ $(MV) -f ../Source/umfpack_get_determinant.o umfpack_oz_get_determinant.o ++ $(MKOCT) -DZINT -c ../Source/umfpack_numeric.c ++ $(MV) -f ../Source/umfpack_numeric.o umfpack_oz_numeric.o ++ $(MKOCT) -DZINT -c ../Source/umfpack_qsymbolic.c ++ $(MV) -f ../Source/umfpack_qsymbolic.o umfpack_oz_qsymbolic.o ++ $(MKOCT) -DZINT -c ../Source/umfpack_report_control.c ++ $(MV) -f ../Source/umfpack_report_control.o umfpack_oz_report_control.o ++ $(MKOCT) -DZINT -c ../Source/umfpack_report_info.c ++ $(MV) -f ../Source/umfpack_report_info.o umfpack_oz_report_info.o ++ $(MKOCT) -DZINT -c ../Source/umfpack_report_matrix.c ++ $(MV) -f ../Source/umfpack_report_matrix.o umfpack_oz_report_matrix.o ++ $(MKOCT) -DZINT -c ../Source/umfpack_report_numeric.c ++ $(MV) -f ../Source/umfpack_report_numeric.o umfpack_oz_report_numeric.o ++ $(MKOCT) -DZINT -c ../Source/umfpack_report_perm.c ++ $(MV) -f ../Source/umfpack_report_perm.o umfpack_oz_report_perm.o ++ $(MKOCT) -DZINT -c ../Source/umfpack_report_status.c ++ $(MV) -f ../Source/umfpack_report_status.o umfpack_oz_report_status.o ++ $(MKOCT) -DZINT -c ../Source/umfpack_report_symbolic.c ++ $(MV) -f ../Source/umfpack_report_symbolic.o umfpack_oz_report_symbolic.o ++ $(MKOCT) -DZINT -c ../Source/umfpack_report_triplet.c ++ $(MV) -f ../Source/umfpack_report_triplet.o umfpack_oz_report_triplet.o ++ $(MKOCT) -DZINT -c ../Source/umfpack_report_vector.c ++ $(MV) -f ../Source/umfpack_report_vector.o umfpack_oz_report_vector.o ++ $(MKOCT) -DZINT -c ../Source/umfpack_solve.c ++ $(MV) -f ../Source/umfpack_solve.o umfpack_oz_solve.o ++ $(MKOCT) -DZINT -c ../Source/umfpack_symbolic.c ++ $(MV) -f ../Source/umfpack_symbolic.o umfpack_oz_symbolic.o ++ $(MKOCT) -DZINT -c ../Source/umfpack_transpose.c ++ $(MV) -f ../Source/umfpack_transpose.o umfpack_oz_transpose.o ++ $(MKOCT) -DZINT -c ../Source/umfpack_triplet_to_col.c ++ $(MV) -f ../Source/umfpack_triplet_to_col.o umfpack_oz_triplet_to_col.o ++ $(MKOCT) -DZINT -c ../Source/umfpack_scale.c ++ $(MV) -f ../Source/umfpack_scale.o umfpack_oz_scale.o ++ $(MKOCT) -DZINT -c ../Source/umfpack_load_numeric.c ++ $(MV) -f ../Source/umfpack_load_numeric.o umfpack_oz_load_numeric.o ++ $(MKOCT) -DZINT -c ../Source/umfpack_save_numeric.c ++ $(MV) -f ../Source/umfpack_save_numeric.o umfpack_oz_save_numeric.o ++ $(MKOCT) -DZINT -c ../Source/umfpack_load_symbolic.c ++ $(MV) -f ../Source/umfpack_load_symbolic.o umfpack_oz_load_symbolic.o ++ $(MKOCT) -DZINT -c ../Source/umfpack_save_symbolic.c ++ $(MV) -f ../Source/umfpack_save_symbolic.o umfpack_oz_save_symbolic.o ++ $(MKOCT) -c ../Source/umfpack_timer.c ++ $(MV) -f ../Source/umfpack_timer.o umfpack_m_timer.o ++ $(MKOCT) -c ../Source/umfpack_tictoc.c ++ $(MV) -f ../Source/umfpack_tictoc.o umfpack_m_tictoc.o ++ $(MKOCT) -DDINT -c ../../AMD/Source/amd_aat.c ++ $(MV) -f ../../AMD/Source/amd_aat.o amd_m_aat.o ++ $(MKOCT) -DDINT -c ../../AMD/Source/amd_1.c ++ $(MV) -f ../../AMD/Source/amd_1.o amd_m_1.o ++ $(MKOCT) -DDINT -c ../../AMD/Source/amd_2.c ++ $(MV) -f ../../AMD/Source/amd_2.o amd_m_2.o ++ $(MKOCT) -DDINT -c ../../AMD/Source/amd_dump.c ++ $(MV) -f ../../AMD/Source/amd_dump.o amd_m_dump.o ++ $(MKOCT) -DDINT -c ../../AMD/Source/amd_postorder.c ++ $(MV) -f ../../AMD/Source/amd_postorder.o amd_m_postorder.o ++ $(MKOCT) -DDINT -c ../../AMD/Source/amd_post_tree.c ++ $(MV) -f ../../AMD/Source/amd_post_tree.o amd_m_post_tree.o ++ $(MKOCT) -DDINT -c ../../AMD/Source/amd_defaults.c ++ $(MV) -f ../../AMD/Source/amd_defaults.o amd_m_defaults.o ++ $(MKOCT) -DDINT -c ../../AMD/Source/amd_order.c ++ $(MV) -f ../../AMD/Source/amd_order.o amd_m_order.o ++ $(MKOCT) -DDINT -c ../../AMD/Source/amd_control.c ++ $(MV) -f ../../AMD/Source/amd_control.o amd_m_control.o ++ $(MKOCT) -DDINT -c ../../AMD/Source/amd_info.c ++ $(MV) -f ../../AMD/Source/amd_info.o amd_m_info.o ++ $(MKOCT) -DDINT -c ../../AMD/Source/amd_valid.c ++ $(MV) -f ../../AMD/Source/amd_valid.o amd_m_valid.o ++ $(MKOCT) -o umfpack.oct $(OCT_SPARSE_INC) umfpack.cc \ ++ umf_o_analyze.o umf_o_apply_order.o umf_o_colamd.o umf_o_free.o \ ++ umf_o_fsize.o umf_o_is_permutation.o umf_o_malloc.o \ ++ umf_o_realloc.o umf_o_report_perm.o umf_o_singletons.o \ ++ umf_od_lhsolve.o umf_od_uhsolve.o umf_od_triplet_map_nox.o \ ++ umf_od_triplet_nomap_x.o umf_od_triplet_nomap_nox.o \ ++ umf_od_triplet_map_x.o umf_od_assemble_fixq.o \ ++ umf_od_store_lu_drop.o umf_od_assemble.o umf_od_blas3_update.o \ ++ umf_od_build_tuples.o umf_od_create_element.o umf_od_dump.o \ ++ umf_od_extend_front.o umf_od_garbage_collection.o \ ++ umf_od_get_memory.o umf_od_init_front.o umf_od_kernel.o \ ++ umf_od_kernel_init.o umf_od_kernel_wrapup.o umf_od_local_search.o \ ++ umf_od_lsolve.o umf_od_ltsolve.o umf_od_mem_alloc_element.o \ ++ umf_od_mem_alloc_head_block.o umf_od_mem_alloc_tail_block.o \ ++ umf_od_mem_free_tail_block.o umf_od_mem_init_memoryspace.o \ ++ umf_od_report_vector.o umf_od_row_search.o umf_od_scale_column.o \ ++ umf_od_set_stats.o umf_od_solve.o umf_od_symbolic_usage.o \ ++ umf_od_transpose.o umf_od_tuple_lengths.o umf_od_usolve.o \ ++ umf_od_utsolve.o umf_od_valid_numeric.o umf_od_valid_symbolic.o \ ++ umf_od_grow_front.o umf_od_start_front.o umf_od_2by2.o \ ++ umf_od_store_lu.o umf_od_scale.o umfpack_od_wsolve.o \ ++ umfpack_od_col_to_triplet.o umfpack_od_defaults.o \ ++ umfpack_od_free_numeric.o umfpack_od_free_symbolic.o \ ++ umfpack_od_get_numeric.o umfpack_od_get_lunz.o \ ++ umfpack_od_get_symbolic.o umfpack_od_numeric.o \ ++ umfpack_od_qsymbolic.o umfpack_od_report_control.o \ ++ umfpack_od_report_info.o umfpack_od_report_matrix.o \ ++ umfpack_od_report_numeric.o umfpack_od_report_perm.o \ ++ umfpack_od_report_status.o umfpack_od_report_symbolic.o \ ++ umfpack_od_report_triplet.o umfpack_od_report_vector.o \ ++ umfpack_od_solve.o umfpack_od_symbolic.o umfpack_od_transpose.o \ ++ umfpack_od_triplet_to_col.o umfpack_od_scale.o \ ++ umfpack_od_load_numeric.o umfpack_od_save_numeric.o \ ++ umfpack_od_load_symbolic.o umfpack_od_save_symbolic.o \ ++ umf_oz_lhsolve.o umf_oz_uhsolve.o umf_oz_triplet_map_nox.o \ ++ umf_oz_triplet_nomap_x.o umf_oz_triplet_nomap_nox.o \ ++ umf_oz_triplet_map_x.o umf_oz_assemble_fixq.o \ ++ umf_oz_store_lu_drop.o umf_oz_assemble.o umf_oz_blas3_update.o \ ++ umf_oz_build_tuples.o umf_oz_create_element.o umf_oz_dump.o \ ++ umf_oz_extend_front.o umf_oz_garbage_collection.o \ ++ umf_oz_get_memory.o umf_oz_init_front.o umf_oz_kernel.o \ ++ umf_oz_kernel_init.o umf_oz_kernel_wrapup.o umf_oz_local_search.o \ ++ umf_oz_lsolve.o umf_oz_ltsolve.o umf_oz_mem_alloc_element.o \ ++ umf_oz_mem_alloc_head_block.o umf_oz_mem_alloc_tail_block.o \ ++ umf_oz_mem_free_tail_block.o umf_oz_mem_init_memoryspace.o \ ++ umf_oz_report_vector.o umf_oz_row_search.o umf_oz_scale_column.o \ ++ umf_oz_set_stats.o umf_oz_solve.o umf_oz_symbolic_usage.o \ ++ umf_oz_transpose.o umf_oz_tuple_lengths.o umf_oz_usolve.o \ ++ umf_oz_utsolve.o umf_oz_valid_numeric.o umf_oz_valid_symbolic.o \ ++ umf_oz_grow_front.o umf_oz_start_front.o umf_oz_2by2.o \ ++ umf_oz_store_lu.o umf_oz_scale.o umfpack_oz_wsolve.o \ ++ umfpack_oz_col_to_triplet.o umfpack_oz_defaults.o \ ++ umfpack_oz_free_numeric.o umfpack_oz_free_symbolic.o \ ++ umfpack_oz_get_numeric.o umfpack_oz_get_lunz.o \ ++ umfpack_oz_get_symbolic.o umfpack_oz_numeric.o \ ++ umfpack_oz_qsymbolic.o umfpack_oz_report_control.o \ ++ umfpack_oz_report_info.o umfpack_oz_report_matrix.o \ ++ umfpack_oz_report_numeric.o umfpack_oz_report_perm.o \ ++ umfpack_oz_report_status.o umfpack_oz_report_symbolic.o \ ++ umfpack_oz_report_triplet.o umfpack_oz_report_vector.o \ ++ umfpack_oz_solve.o umfpack_oz_symbolic.o umfpack_oz_transpose.o \ ++ umfpack_oz_triplet_to_col.o umfpack_oz_scale.o \ ++ umfpack_oz_load_numeric.o umfpack_oz_save_numeric.o \ ++ umfpack_oz_load_symbolic.o umfpack_oz_save_symbolic.o \ ++ umfpack_o_timer.o umfpack_o_tictoc.o \ ++ amd_o_aat.o amd_o_1.o amd_o_2.o amd_o_dump.o \ ++ amd_o_postorder.o amd_o_post_tree.o amd_o_defaults.o amd_o_order.o \ ++ amd_o_control.o amd_o_info.o amd_o_valid.o ++ ++luflop: luflop.cc ++ $(MKOCT) luflop.cc -I$(OCT_SPARSE_INC) -o luflop.oct ++ ++#---------------------------------------- ++# umfpack library to link with octave ++#---------------------------------------- ++ ++octave: umfpack ++ ld -r -o ../../../$(OCTUMFPACK_LIB) \ ++ umf_o_analyze.o umf_o_apply_order.o umf_o_colamd.o umf_o_free.o \ ++ umf_o_fsize.o umf_o_is_permutation.o umf_o_malloc.o \ ++ umf_o_realloc.o umf_o_report_perm.o umf_o_singletons.o \ ++ umf_od_lhsolve.o umf_od_uhsolve.o umf_od_triplet_map_nox.o \ ++ umf_od_triplet_nomap_x.o umf_od_triplet_nomap_nox.o \ ++ umf_od_triplet_map_x.o umf_od_assemble_fixq.o \ ++ umf_od_store_lu_drop.o umf_od_assemble.o umf_od_blas3_update.o \ ++ umf_od_build_tuples.o umf_od_create_element.o umf_od_dump.o \ ++ umf_od_extend_front.o umf_od_garbage_collection.o \ ++ umf_od_get_memory.o umf_od_init_front.o umf_od_kernel.o \ ++ umf_od_kernel_init.o umf_od_kernel_wrapup.o umf_od_local_search.o \ ++ umf_od_lsolve.o umf_od_ltsolve.o umf_od_mem_alloc_element.o \ ++ umf_od_mem_alloc_head_block.o umf_od_mem_alloc_tail_block.o \ ++ umf_od_mem_free_tail_block.o umf_od_mem_init_memoryspace.o \ ++ umf_od_report_vector.o umf_od_row_search.o umf_od_scale_column.o \ ++ umf_od_set_stats.o umf_od_solve.o umf_od_symbolic_usage.o \ ++ umf_od_transpose.o umf_od_tuple_lengths.o umf_od_usolve.o \ ++ umf_od_utsolve.o umf_od_valid_numeric.o umf_od_valid_symbolic.o \ ++ umf_od_grow_front.o umf_od_start_front.o umf_od_2by2.o \ ++ umf_od_store_lu.o umf_od_scale.o umfpack_od_wsolve.o \ ++ umfpack_od_col_to_triplet.o umfpack_od_defaults.o \ ++ umfpack_od_free_numeric.o umfpack_od_free_symbolic.o \ ++ umfpack_od_get_numeric.o umfpack_od_get_lunz.o \ ++ umfpack_od_get_symbolic.o umfpack_od_numeric.o \ ++ umfpack_od_qsymbolic.o umfpack_od_report_control.o \ ++ umfpack_od_report_info.o umfpack_od_report_matrix.o \ ++ umfpack_od_report_numeric.o umfpack_od_report_perm.o \ ++ umfpack_od_report_status.o umfpack_od_report_symbolic.o \ ++ umfpack_od_report_triplet.o umfpack_od_report_vector.o \ ++ umfpack_od_solve.o umfpack_od_symbolic.o umfpack_od_transpose.o \ ++ umfpack_od_triplet_to_col.o umfpack_od_scale.o \ ++ umfpack_od_load_numeric.o umfpack_od_save_numeric.o \ ++ umfpack_od_load_symbolic.o umfpack_od_save_symbolic.o \ ++ umf_oz_lhsolve.o umf_oz_uhsolve.o umf_oz_triplet_map_nox.o \ ++ umf_oz_triplet_nomap_x.o umf_oz_triplet_nomap_nox.o \ ++ umf_oz_triplet_map_x.o umf_oz_assemble_fixq.o \ ++ umf_oz_store_lu_drop.o umf_oz_assemble.o umf_oz_blas3_update.o \ ++ umf_oz_build_tuples.o umf_oz_create_element.o umf_oz_dump.o \ ++ umf_oz_extend_front.o umf_oz_garbage_collection.o \ ++ umf_oz_get_memory.o umf_oz_init_front.o umf_oz_kernel.o \ ++ umf_oz_kernel_init.o umf_oz_kernel_wrapup.o umf_oz_local_search.o \ ++ umf_oz_lsolve.o umf_oz_ltsolve.o umf_oz_mem_alloc_element.o \ ++ umf_oz_mem_alloc_head_block.o umf_oz_mem_alloc_tail_block.o \ ++ umf_oz_mem_free_tail_block.o umf_oz_mem_init_memoryspace.o \ ++ umf_oz_report_vector.o umf_oz_row_search.o umf_oz_scale_column.o \ ++ umf_oz_set_stats.o umf_oz_solve.o umf_oz_symbolic_usage.o \ ++ umf_oz_transpose.o umf_oz_tuple_lengths.o umf_oz_usolve.o \ ++ umf_oz_utsolve.o umf_oz_valid_numeric.o umf_oz_valid_symbolic.o \ ++ umf_oz_grow_front.o umf_oz_start_front.o umf_oz_2by2.o \ ++ umf_oz_store_lu.o umf_oz_scale.o umfpack_oz_wsolve.o \ ++ umfpack_oz_col_to_triplet.o umfpack_oz_defaults.o \ ++ umfpack_oz_free_numeric.o umfpack_oz_free_symbolic.o \ ++ umfpack_oz_get_numeric.o umfpack_oz_get_lunz.o \ ++ umfpack_oz_get_symbolic.o umfpack_oz_numeric.o \ ++ umfpack_oz_qsymbolic.o umfpack_oz_report_control.o \ ++ umfpack_oz_report_info.o umfpack_oz_report_matrix.o \ ++ umfpack_oz_report_numeric.o umfpack_oz_report_perm.o \ ++ umfpack_oz_report_status.o umfpack_oz_report_symbolic.o \ ++ umfpack_oz_report_triplet.o umfpack_oz_report_vector.o \ ++ umfpack_oz_solve.o umfpack_oz_symbolic.o umfpack_oz_transpose.o \ ++ umfpack_oz_triplet_to_col.o umfpack_oz_scale.o \ ++ umfpack_oz_load_numeric.o umfpack_oz_save_numeric.o \ ++ umfpack_oz_load_symbolic.o umfpack_oz_save_symbolic.o \ ++ umfpack_o_timer.o umfpack_o_tictoc.o \ ++ amd_o_aat.o amd_o_1.o amd_o_2.o amd_o_dump.o \ ++ amd_o_postorder.o amd_o_post_tree.o amd_o_defaults.o amd_o_order.o \ ++ amd_o_control.o amd_o_info.o amd_o_valid.o ++ ++#------------------------------------------------------------------------------- ++# Remove all but the files in the original distribution ++#------------------------------------------------------------------------------- ++ ++purge: clean ++ - $(RM) *.oct* *.dll +diff -uNr UMFPACKv4.4.orig/UMFPACK/OCTAVE/umfpack_btf.m UMFPACK/UMFPACK/OCTAVE/umfpack_btf.m +--- UMFPACKv4.4.orig/UMFPACK/OCTAVE/umfpack_btf.m 1970-01-01 01:00:00.000000000 +0100 ++++ UMFPACK/UMFPACK/OCTAVE/umfpack_btf.m 2004-12-30 01:58:46.000000000 +0100 +@@ -0,0 +1,129 @@ ++function x = umfpack_btf (A, b, Control) ++% UMFPACK_BTF ++% ++% x = umfpack_btf (A, b, Control) ++% ++% solve Ax=b by first permuting the matrix A to block triangular form via dmperm ++% and then using UMFPACK to factorize each diagonal block. Adjacent 1-by-1 ++% blocks are merged into a single upper triangular block, and solved via ++% MATLAB's \ operator. The Control parameter is optional (Type umfpack_details ++% and umfpack_report for details on its use). A must be square. ++% ++% See also: umfpack, umfpack_factorize, umfpack_details, dmperm ++ ++% UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A. ++% Davis. All Rights Reserved. Type umfpack_details for License. ++ ++if (nargin < 2) ++ help umfpack_btf ++ error ('Usage: x = umfpack_btf (A, b, Control)') ; ++end ++ ++[m n] = size (A) ; ++if (m ~= n) ++ help umfpack_btf ++ error ('umfpack_btf: A must be square') ; ++end ++[m1 n1] = size (b) ; ++if (m1 ~= n) ++ help umfpack_btf ++ error ('umfpack_btf: b has the wrong dimensions') ; ++end ++ ++if (nargin < 3) ++ Control = umfpack ; ++end ++ ++%------------------------------------------------------------------------------- ++% find the block triangular form ++%------------------------------------------------------------------------------- ++ ++[p,q,r] = dmperm (A) ; ++nblocks = length (r) - 1 ; ++ ++%------------------------------------------------------------------------------- ++% solve the system ++%------------------------------------------------------------------------------- ++ ++if (nblocks == 1 | sprank (A) < n) ++ ++ %--------------------------------------------------------------------------- ++ % matrix is irreducible or structurally singular ++ %--------------------------------------------------------------------------- ++ ++ x = umfpack_solve (A, '\\', b, Control) ; ++ ++else ++ ++ %--------------------------------------------------------------------------- ++ % A (p,q) is in block triangular form ++ %--------------------------------------------------------------------------- ++ ++ b = b (p,:) ; ++ A = A (p,q) ; ++ x = zeros (size (b)) ; ++ ++ %--------------------------------------------------------------------------- ++ % merge adjacent singletons into a single upper triangular block ++ %--------------------------------------------------------------------------- ++ ++ [r, nblocks, is_triangular] = merge_singletons (r) ; ++ ++ %--------------------------------------------------------------------------- ++ % solve the system: x (q) = A\b ++ %--------------------------------------------------------------------------- ++ ++ for k = nblocks:-1:1 ++ ++ % get the kth block ++ k1 = r (k) ; ++ k2 = r (k+1) - 1 ; ++ ++ % solve the system ++ x (k1:k2,:) = solver (A (k1:k2, k1:k2), b (k1:k2,:), ... ++ is_triangular (k), Control) ; ++ ++ % off-diagonal block back substitution ++ b (1:k1-1,:) = b (1:k1-1,:) - A (1:k1-1, k1:k2) * x (k1:k2,:) ; ++ ++ end ++ ++ x (q,:) = x ; ++ ++end ++ ++%------------------------------------------------------------------------------- ++% merge_singletons ++%------------------------------------------------------------------------------- ++ ++function [r, nblocks, is_triangular] = merge_singletons (r) ++% ++% Given r from [p,q,r] = dmperm (A), where A is square, return a modified r that ++% reflects the merger of adjacent singletons into a single upper triangular ++% block. is_triangular (k) is 1 if the kth block is upper triangular. nblocks ++% is the number of new blocks. ++ ++nblocks = length (r) - 1 ; ++bsize = r (2:nblocks+1) - r (1:nblocks) ; ++t = [0 (bsize == 1)] ; ++z = (t (1:nblocks) == 0 & t (2:nblocks+1) == 1) | t (2:nblocks+1) == 0 ; ++y = [(find (z)) nblocks+1] ; ++r = r (y) ; ++nblocks = length (y) - 1 ; ++is_triangular = y (2:nblocks+1) - y (1:nblocks) > 1 ; ++ ++%------------------------------------------------------------------------------- ++% solve Ax=b, but check for small and/or triangular systems ++%------------------------------------------------------------------------------- ++ ++function x = solver (A, b, is_triangular, Control) ++if (is_triangular) ++ % back substitution only ++ x = A \ b ; ++elseif (size (A,1) < 4) ++ % a very small matrix, solve it as a dense linear system ++ x = full (A) \ b ; ++else ++ % solve it as a sparse linear system ++ x = umfpack_solve (A, '\\', b, Control) ; ++end +diff -uNr UMFPACKv4.4.orig/UMFPACK/OCTAVE/umfpack.cc UMFPACK/UMFPACK/OCTAVE/umfpack.cc +--- UMFPACKv4.4.orig/UMFPACK/OCTAVE/umfpack.cc 1970-01-01 01:00:00.000000000 +0100 ++++ UMFPACK/UMFPACK/OCTAVE/umfpack.cc 2005-02-01 21:58:15.885225363 +0100 +@@ -0,0 +1,1399 @@ ++/* ++ ++Copyright (C) 2004 David Bateman ++ ++This program is free software; you can redistribute it and/or modify it ++under the terms of the GNU General Public License as published by the ++Free Software Foundation; either version 2, or (at your option) any ++later version. ++ ++This program is distributed in the hope that it will be useful, but WITHOUT ++ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++for more details. ++ ++You should have received a copy of the GNU General Public License ++along with this program; see the file COPYING. If not, write to the Free ++Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++ ++In addition to the terms of the GPL, you are permitted to link ++this program with any Open Source program, as defined by the ++Open Source Initiative (www.opensource.org) ++ ++*/ ++ ++/* ++ ++This is the Octave interface to the UMFPACK code, which bore the following ++copyright ++ ++ UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A. ++ Davis. All Rights Reserved. See ../README for License. ++ email: davis@cise.ufl.edu CISE Department, Univ. of Florida. ++ web: http://www.cise.ufl.edu/research/sparse/umfpack ++ ++*/ ++ ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++ ++#include "ov-re-sparse.h" ++#include "ov-cx-sparse.h" ++ ++// External UMFPACK functions in C ++extern "C" { ++#include "umfpack.h" ++} ++ ++#define MIN(a,b) (((a) < (b)) ? (a) : (b)) ++#define MAX(a,b) (((a) > (b)) ? (a) : (b)) ++ ++// Return an error message ++static ++void umfpack_error (const char *s, int A_is_complex, int nargout, ++ octave_value_list retval, NDArray Control, ++ NDArray Info, int status, int do_info) ++{ ++ if (A_is_complex) ++ { ++ umfpack_zi_report_status (Control.fortran_vec (), status) ; ++ umfpack_zi_report_info (Control.fortran_vec (), Info.fortran_vec ()) ; ++ } ++ else ++ { ++ umfpack_di_report_status (Control.fortran_vec (), status) ; ++ umfpack_di_report_info (Control.fortran_vec (), Info.fortran_vec ()) ; ++ } ++ if (do_info > 0) ++ // return Info ++ retval (do_info) = octave_value (Info); ++ ++ error (s); ++} ++ ++DEFUN_DLD (umfpack, args, nargout, ++ "-*- texinfo -*-\n\ ++@deftypefn {Loadable Function} {[@var{x}, @var{Info}] =} umfpack (@var{a}, '\\', @var{b})\n\ ++@deftypefnx {Loadable Function} {[@var{x}, @var{Info}] =} umfpack (@var{a}, '\\', @var{b}, @var{Control})\n\ ++@deftypefnx {Loadable Function} {[@var{x}, @var{Info}] =} umfpack (@var{a}, @var{Qinit}, '\\', @var{b}, @var{Control})\n\ ++@deftypefnx {Loadable Function} {[@var{x}, @var{Info}] =} umfpack (@var{a}, @var{Qinit}, '\\', b)\n\ ++@deftypefnx {Loadable Function} {[@var{x}, @var{Info}] =} umfpack (@var{b}, '/', A) ;\n\ ++@deftypefnx {Loadable Function} {[@var{x}, @var{Info}] =} umfpack (@var{b}, '/', @var{a}, @var{Control}) ;\n\ ++@deftypefnx {Loadable Function} {[@var{x}, @var{Info}] =} umfpack (@var{b}, '/', @var{a}, @var{Qinit}) ;\n\ ++@deftypefnx {Loadable Function} {[@var{x}, @var{Info}] =} umfpack (@var{b}, '/', @var{a}, @var{Qinit}, @var{Control}) ;\n\ ++@deftypefnx {Loadable Function} {[@var{l}, @var{u}, @var{p}, @var{q}, @var{r}, @var{Info}] =} umfpack (@var{a}) ;\n\ ++@deftypefnx {Loadable Function} {[@var{l}, @var{u}, @var{p}, @var{q}, @var{r}, @var{Info}] =} umfpack (@var{a}, @var{Control}) ;\n\ ++@deftypefnx {Loadable Function} {[@var{l}, @var{u}, @var{p}, @var{q}, @var{r}, @var{Info}] =} umfpack (@var{a}, @var{Qinit}) ;\n\ ++@deftypefnx {Loadable Function} {[@var{l}, @var{u}, @var{p}, @var{q}, @var{r}, @var{Info}] =} umfpack (@var{a}, @var{Qinit}, @var{Control}) ;\n\ ++@deftypefnx {Loadable Function} {[@var{l}, @var{u}, @var{p}, @var{q}] =} umfpack (@var{a}) ;\n\ ++@deftypefnx {Loadable Function} {[@var{l}, @var{u}, @var{p}, @var{q}] =} umfpack (@var{a}, @var{Control}) ;\n\ ++@deftypefnx {Loadable Function} {[@var{l}, @var{u}, @var{p}, @var{q}] =} umfpack (@var{a}, @var{Qinit}) ;\n\ ++@deftypefnx {Loadable Function} {[@var{l}, @var{u}, @var{p}, @var{q}] =} umfpack (@var{a}, @var{Qinit}, @var{Control}) ;\n\ ++@deftypefnx {Loadable Function} {[P1, Q1, Fr, Ch, Info] =} umfpack (@var{a}, 'symbolic') ;\n\ ++@deftypefnx {Loadable Function} {[P1, Q1, Fr, Ch, Info] =} umfpack (@var{a}, 'symbolic', @var{Control}) ;\n\ ++@deftypefnx {Loadable Function} {[P1, Q1, Fr, Ch, Info] =} umfpack (@var{a}, @var{Qinit}, 'symbolic') ;\n\ ++@deftypefnx {Loadable Function} {[P1, Q1, Fr, Ch, Info] =} umfpack (@var{a}, @var{Qinit}, 'symbolic', @var{Control});\n\ ++@deftypefnx {Loadable Function} {@var{Control} =} umfpack ;\n\ ++\n\ ++UMFPACK v4.3 is a Octave oct-file for solving sparse linear systems.\n\ ++\n\ ++@iftex\n\ ++@tex\n\ ++\\vskip 2ex\n\ ++\\hfil\\vbox{\n\ ++\\offinterlineskip\n\ ++\\tabskip=0pt\n\ ++\\halign{\n\ ++\\vrule height1.75ex depth1.25ex width 0.6pt #\\tabskip=1em &\n\ ++\\hfil #\\hfil &\\vrule # & \n\ ++\\hfil #\\hfil &\\vrule # width 0.6pt \\tabskip=0pt\\cr\n\ ++\\noalign{\\hrule height 0.6pt}\n\ ++& UMFPACK v4.3 && OCTAVE approximate equivalent &\\cr\n\ ++\\noalign{\\hrule} \n\ ++& x = umfpack (A, '\\', b) ; && x = A \\ b &\\cr\n\ ++& && &\\cr\n\ ++&x = umfpack (b, '/', A) ; && x = b / A &\\cr\n\ ++& && &\\cr\n\ ++&[L,U,P,Q] = umfpack (A) ; && [m,n] = size (A) ; &\\cr\n\ ++& && I = speye (n) ; &\\cr\n\ ++& && Q = I (:, colamd (A)) ; &\\cr\n\ ++& && [L,U,P] = lu (A*Q) ; &\\cr\n\ ++& && &\\cr\n\ ++&[L,U,P,Q,R] = umfpack (A) ; && [m,n] = size (A) ; &\\cr\n\ ++& && I = speye (n) ; &\\cr\n\ ++& && Q = I (:, colamd (A)) ; &\\cr\n\ ++& && r = full (sum (abs (A), 2)) ; &\\cr\n\ ++& && r (find (r == 0)) = 1 ; &\\cr\n\ ++& && R = spdiags (r, 0, m, m) ; &\\cr\n\ ++& && [L,U,P] = lu ((R\\A)*Q) ; &\\cr\n\ ++& && &\\cr\n\ ++&[P,Q,F,C] = umfpack (A, 'symbolic')&& [m,n] = size (A) ; &\\cr\n\ ++& && I = speye (n) ; &\\cr\n\ ++& && Q = I (:, colamd (A)) ; &\\cr\n\ ++& && [count,h,parent,post] = ... &\\cr\n\ ++& && symbfact (A*Q, 'col') ; &\\cr\n\ ++\\noalign{\\hrule height 0.6pt}\n\ ++}}\\hfil\n\ ++\\vskip 1ex\n\ ++@end tex\n\ ++@end iftex\n\ ++@ifinfo\n\ ++@multitable @columnfractions 0.43 .02 .43\n\ ++@item UMFPACK v4.3: @tab | \n\ ++@tab OCTAVE approx. equivalent\n\ ++@item ------------------------------- @tab | \n\ ++@tab --------------------------------\n\ ++@item x = umfpack (A, '\\', b) ; @tab | \n\ ++@tab x = A \\ b\n\ ++@item @tab | \n\ ++@tab\n\ ++@item x = umfpack (b, '/', A) ; @tab | \n\ ++@tab x = b / A\n\ ++@item @tab | \n\ ++@tab\n\ ++@item [L,U,P,Q] = umfpack (A) ; @tab | \n\ ++@tab [m,n] = size (A) ;\n\ ++@item @tab | \n\ ++@tab I = speye (n) ;\n\ ++@item @tab | \n\ ++@tab Q = I (:, colamd (A)) ;\n\ ++@item @tab | \n\ ++@tab [L,U,P] = lu (A*Q) ;\n\ ++@item @tab | \n\ ++@tab\n\ ++@item [L,U,P,Q,R] = umfpack (A) ; @tab | \n\ ++@tab [m,n] = size (A) ;\n\ ++@item @tab | \n\ ++@tab I = speye (n) ;\n\ ++@item @tab | \n\ ++@tab Q = I (:, colamd (A)) ;\n\ ++@item @tab | \n\ ++@tab r = full (sum (abs (A), 2)) ;\n\ ++@item @tab | \n\ ++@tab r (find (r == 0)) = 1 ;\n\ ++@item @tab | \n\ ++@tab R = spdiags (r, 0, m, m) ;\n\ ++@item @tab | \n\ ++@tab [L,U,P] = lu ((R\\A)*Q) ;\n\ ++@item @tab | \n\ ++@tab\n\ ++@item [P,Q,F,C] = umfpack (A, 'symbolic') @tab | \n\ ++@tab [m,n] = size (A) ; \n\ ++@item @tab | \n\ ++@tab I = speye (n) ;\n\ ++@item @tab | \n\ ++@tab Q = I (:, colamd (A)) ;\n\ ++@item @tab | \n\ ++@tab [count,h,parent,post] = ...\n\ ++@item @tab | \n\ ++@tab symbfact (A*Q, 'col') ;\n\ ++@end multitable\n\ ++@end ifinfo\n\ ++\n\ ++A must be sparse. It can be complex, singular, and/or rectangular.\n\ ++A must be square for '/' or '\\'. b must be a full real or complex\n\ ++vector. For @code{[@var{l}, @var{u}, @var{p}, @var{q}, @var{r}] =\n\ ++umfpack (@var{a})}, the factorization is @code{@var{l} * @var{u} =\n\ ++@var{p} * (@var{r} \\ @var{a}) * @var{q}}. If @var{a} has a mostly\n\ ++symmetric nonzero pattern, then replace @dfn{colamd} with @dfn{amd}\n\ ++in the OCTAVE-equivalent column in the table above.\n\ ++\n\ ++Factor or solve a sparse linear system, returning either the solution\n\ ++@var{x} to @code{@var{A} * @var{x} = @var{b}} or @code{@var{A}' * @var{x}'\n\ ++= @var{b}'}, the factorization LU=PAQ, or LU=P(R\\A)Q. A must be sparse.\n\ ++For the solve, A must be square and b must be a dense n-by-1 vector. For LU\n\ ++factorization, A can be rectangular. In both cases, A and/or b can be real\n\ ++or complex.\n\ ++\n\ ++UMFPACK analyzes the matrix and selects one of three strategies to factorize\n\ ++the matrix. It first finds a set of k initial pivot entries of zero\n\ ++Markowitz cost. This forms the first k rows and columns of L and U. The\n\ ++remaining submatrix S is then analyzed, based on the symmetry of the nonzero\n\ ++pattern of the submatrix and the values on the diagaonal. The strategies\n\ ++include:\n\ ++\n\ ++@table @asis\n\ ++@item unsymmetric\n\ ++Use a COLAMD pre-ordering, a column elimination tree\n\ ++post-ordering, refine the column ordering during factorization,\n\ ++and make no effort at selecting pivots on the diagonal.\n\ ++@item 2-by-2\n\ ++Like the symmetric strategy (see below), except that local\n\ ++row permutations are first made to attempt to place large entries\n\ ++on the diagonal.\n\ ++@item symmetric\n\ ++Use an AMD pre-ordering on the matrix @code{@var{s} + @var{s}'}, an\n\ ++elimination tree post-ordering, do not refine the column ordering during\n\ ++factorization, and attempt to select pivots on the diagonal.\n\ ++@end table\n\ ++\n\ ++Each of the following uses of umfpack (except for 'Control = umfpack') is\n\ ++stand-alone. That is, no call to umfpack is required for any subsequent\n\ ++call. In each usage, the Info output argument is optional.\n\ ++\n\ ++Usage:\n\ ++\n\ ++[x, Info] = umfpack (A, '\\', b) ;\n\ ++[x, Info] = umfpack (A, '\\', b, Control) ;\n\ ++[x, Info] = umfpack (A, Qinit, '\\', b, Control) ;\n\ ++[x, Info] = umfpack (A, Qinit, '\\', b) ;\n\ ++\n\ ++ Solves Ax=b (similar to x = A\\b in OCTAVE).\n\ ++\n\ ++[x, Info] = umfpack (b, '/', A) ;\n\ ++[x, Info] = umfpack (b, '/', A, Control) ;\n\ ++[x, Info] = umfpack (b, '/', A, Qinit) ;\n\ ++[x, Info] = umfpack (b, '/', A, Qinit, Control) ;\n\ ++\n\ ++ Solves A'x'=b' (similar to x = b/A in OCTAVE).\n\ ++\n\ ++[L, U, P, Q, R, Info] = umfpack (A) ;\n\ ++[L, U, P, Q, R, Info] = umfpack (A, Control) ;\n\ ++[L, U, P, Q, R, Info] = umfpack (A, Qinit) ;\n\ ++[L, U, P, Q, R, Info] = umfpack (A, Qinit, Control) ;\n\ ++\n\ ++ Returns the LU factorization of A. P and Q are returned as permutation\n\ ++ matrices. R is a diagonal sparse matrix of scale factors for the rows\n\ ++ of A, L is lower triangular, and U is upper triangular. The\n\ ++ factorization is L*U = P*(R\\A)*Q. You can turn off scaling by setting\n\ ++ Control (17) to zero (in which case R = speye (m)), or by using the\n\ ++ following syntaxes (in which case Control (17) is ignored):\n\ ++\n\ ++[L, U, P, Q] = umfpack (A) ;\n\ ++[L, U, P, Q] = umfpack (A, Control) ;\n\ ++[L, U, P, Q] = umfpack (A, Qinit) ;\n\ ++[L, U, P, Q] = umfpack (A, Qinit, Control) ;\n\ ++\n\ ++ Same as above, except that no row scaling is performed. The Info array\n\ ++ is not returned, either.\n\ ++\n\ ++[P1, Q1, Fr, Ch, Info] = umfpack (A, 'symbolic') ;\n\ ++[P1, Q1, Fr, Ch, Info] = umfpack (A, 'symbolic', Control) ;\n\ ++[P1, Q1, Fr, Ch, Info] = umfpack (A, Qinit, 'symbolic') ;\n\ ++[P1, Q1, Fr, Ch, Info] = umfpack (A, Qinit, 'symbolic', Control);\n\ ++\n\ ++ Performs only the fill-reducing column pre-ordering (including the\n\ ++ elimination tree post-ordering) and symbolic factorization. Q1 is the\n\ ++ initial column permutation (either from colamd, amd, or the input\n\ ++ ordering Qinit), possibly followed by a column elimination tree post-\n\ ++ ordering or a symmetric elimination tree post-ordering, depending on\n\ ++ the strategy used.\n\ ++\n\ ++ For the unsymmetric strategy, P1 is the row ordering induced by Q1\n\ ++ (row-merge order). For the 2-by-2 strategy, P1 is the row ordering that\n\ ++ places large entries on the diagonal of P1*A*Q1. For the symmetric\n\ ++ strategy, P1 = Q1.\n\ ++\n\ ++ Fr is a (nfr+1)-by-4 array containing information about each frontal\n\ ++ matrix, where nfr <= n is the number of frontal matrices. Fr (:,1) is\n\ ++ the number of pivot columns in each front, and Fr (:,2) is the parent\n\ ++ of each front in the supercolumn elimination tree. Fr (k,2) is zero if\n\ ++ k is a root. The first Fr (1,1) columns of P1*A*Q1 are the pivot\n\ ++ columns for the first front, the next Fr (2,1) columns of P1*A*Q1\n\ ++ are the pivot columns for the second front, and so on.\n\ ++\n\ ++ For the unsymmetric strategy, Fr (:,3) is the row index of the first\n\ ++ row in P1*A*Q1 whose leftmost nonzero entry is in a pivot column for\n\ ++ the kth front. Fr (:,4) is the leftmost descendent of the kth front.\n\ ++ Rows in the range Fr (Fr (k,4),3) to Fr (k+1,3)-1 form the entire set\n\ ++ of candidate pivot rows for the kth front (some of these will typically\n\ ++ have been selected as pivot rows of fronts Fr (k,3) to k-1, before the\n\ ++ factorization reaches the kth front. If front k is a leaf node, then\n\ ++ Fr (k,4) is k.\n\ ++\n\ ++ Ch is a (nchains+1)-by-3 array containing information about each\n\ ++ 'chain' (unifrontal sequence) of frontal matrices, and where\n\ ++ nchains <= nfr is the number of chains. The ith chain consists of\n\ ++ frontal matrices. Chain (i,1) to Chain (i+1,1)-1, and the largest\n\ ++ front in chain i is Chain (i,2)-by-Chain (i,3).\n\ ++\n\ ++ This use of umfpack is not required to factor or solve a linear system\n\ ++ in OCTAVE. It analyzes the matrix A and provides information only.\n\ ++ The OCTAVE statement @code{treeplot (Fr (:,2)')} plots the column\n\ ++ elimination tree.\n\ ++\n\ ++Control = umfpack ;\n\ ++\n\ ++ Returns a 20-by-1 vector of default parameter settings for umfpack.\n\ ++\n\ ++umfpack_report (Control, Info) ;\n\ ++\n\ ++ Prints the current Control settings, and Info\n\ ++\n\ ++If present, Qinit is a user-supplied 1-by-n permutation vector. It is an\n\ ++initial fill-reducing column pre-ordering for A; if not present, then colamd\n\ ++or amd are used instead. If present, Control is a user-supplied 20-by-1\n\ ++array. Control and Info are optional; if Control is not present, defaults\n\ ++are used. If a Control entry is NaN, then the default is used for that entry.\n\ ++\n\ ++UMFPACK Version 4.3 (Jan. 16, 2004), Copyright @copyright{} 2004 by\n\ ++Timothy A. Davis. All Rights Reserved.\n\ ++\n\ ++UMFPACK License:\n\ ++\n\ ++@example\n\ ++Your use or distribution of UMFPACK or any modified version of\n\ ++UMFPACK implies that you agree to this License.\n\ ++\n\ ++THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY\n\ ++EXPRESSED OR IMPLIED. ANY USE IS AT YOUR OWN RISK.\n\ ++\n\ ++Permission is hereby granted to use or copy this program, provided\n\ ++that the Copyright, this License, and the Availability of the original\n\ ++version is retained on all copies. User documentation of any code that\n\ ++uses UMFPACK or any modified version of UMFPACK code must cite the\n\ ++Copyright, this License, the Availability note, and 'Used by permission.'\n\ ++Permission to modify the code and to distribute modified code is granted,\n\ ++provided the Copyright, this License, and the Availability note are\n\ ++retained, and a notice that the code was modified is included. This\n\ ++software was developed with support from the National Science Foundation,\n\ ++and is provided to you free of charge.\n\ ++@end example\n\ ++\n\ ++Availability: http://www.cise.ufl.edu/research/sparse/umfpack\n\ ++@end deftypefn\n\ ++@seealso{lu_normtest, colamd, amd, umfpack_solve}") ++{ ++ octave_value_list retval; ++ int nargin = args.length (); ++ int op = 0; ++ std::string operation; ++ bool do_solve = false; ++ int do_info = 0; ++ ++ ColumnVector User_Qinit; ++ SparseComplexMatrix CAmatrix; ++ ComplexMatrix CBmatrix; ++ SparseMatrix Amatrix; ++ Matrix Bmatrix; ++ NDArray User_Control_matrix; ++ ++ bool A_is_complex = false; ++ bool B_is_complex = false; ++ bool X_is_complex = false; ++ bool transpose = false; ++ bool have_User_Qinit = false; ++ bool have_User_Control_matrix = false; ++ bool do_numeric = true; ++ bool no_scale = false; ++ ++ // find the operator ++ for (int i = 0 ; i < nargin ; i++) ++ { ++ if (args(i).is_string ()) ++ { ++ op = i; ++ break; ++ } ++ } ++ ++ if (op > 0) ++ { ++ std::string op_type = args (op).string_value (); ++ ++ if (op_type == "\\") ++ { ++ ++ // matrix left divide, x = A\b ++ ++ // [x, Info] = umfpack (A, '\', b) ; ++ // [x, Info] = umfpack (A, '\', b, Control) ; ++ // [x, Info] = umfpack (A, Qinit, '\', b, Control) ; ++ // [x, Info] = umfpack (A, Qinit, '\', b) ; ++ ++ do_solve = true; ++ operation = "x = A\\b"; ++ ++ if (args(0).class_name () != "sparse") ++ { ++ error ("umfpack: input matrix A must be sparse"); ++ return retval; ++ } ++ ++ if (args(0).is_complex_type ()) ++ { ++ CAmatrix = args(0).sparse_complex_matrix_value (); ++ A_is_complex = true; ++ } ++ else ++ Amatrix = args(0).sparse_matrix_value (); ++ ++ ++ if (args(op+1).is_complex_type ()) ++ { ++ CBmatrix = args(op+1).complex_matrix_value (); ++ B_is_complex = true; ++ } ++ else ++ Bmatrix = args(op+1).matrix_value (); ++ ++ if (nargout == 2) ++ do_info = 1; ++ ++ if (op == 2) ++ { ++ User_Qinit = args(1).column_vector_value (); ++ have_User_Qinit = true; ++ } ++ ++ if ((op == 1 && nargin == 4) || (op == 2 && nargin == 5)) ++ { ++ User_Control_matrix = args(nargin-1).array_value (); ++ have_User_Control_matrix = true; ++ } ++ ++ if (error_state) ++ { ++ error ("umfpack: incorrect argument type"); ++ return retval; ++ } ++ ++ if (nargin < 3 || nargin > 5 || nargout > 2) ++ { ++ error ("umfpack: wrong number of arguments"); ++ return retval; ++ } ++ ++ } ++ else if (op_type == "/") ++ { ++ // matrix right divide, x = b/A ++ ++ // [x, Info] = umfpack (b, '/', A) ; ++ // [x, Info] = umfpack (b, '/', A, Control) ; ++ // [x, Info] = umfpack (b, '/', A, Qinit) ; ++ // [x, Info] = umfpack (b, '/', A, Qinit, Control) ; ++ ++ do_solve = true; ++ operation = "x = b/A" ; ++ ++ transpose = true; ++ ++ if (args(2).class_name () != "sparse") ++ { ++ error ("umfpack: input matrix A must be sparse"); ++ return retval; ++ } ++ ++ if (args(2).is_complex_type ()) ++ { ++ CAmatrix = args(2).sparse_complex_matrix_value (); ++ A_is_complex = true; ++ } ++ else ++ Amatrix = args(2).sparse_matrix_value (); ++ ++ if (args(0).is_complex_type ()) ++ { ++ CBmatrix = args(0).complex_matrix_value (); ++ B_is_complex = true; ++ } ++ else ++ Bmatrix = args(0).matrix_value (); ++ ++ if (nargout == 2) ++ do_info = 1; ++ ++ if (nargin == 5) ++ { ++ User_Qinit = args(3).column_vector_value (); ++ User_Control_matrix = args(4).array_value (); ++ have_User_Qinit = true; ++ have_User_Control_matrix = true; ++ } ++ else if (nargin == 4) ++ { ++ User_Control_matrix = args(3).array_value (); ++ ++ if (User_Control_matrix.rows () == 1) ++ { ++ User_Qinit = args(3).column_vector_value (); ++ have_User_Qinit = true; ++ } ++ else ++ have_User_Control_matrix = true; ++ } ++ else if (nargin < 3 || nargin > 5 || nargout > 2) ++ { ++ error ("umfpack: wrong number of arguments"); ++ return retval; ++ } ++ ++ if (error_state) ++ { ++ error ("umfpack: incorrect argument type"); ++ return retval; ++ } ++ } ++ else if (op_type == "symbolic") ++ { ++ // symbolic factorization only ++ ++ // [P Q Fr Ch Info] = umfpack (A, 'symbolic') ; ++ // [P Q Fr Ch Info] = umfpack (A, 'symbolic', Control) ; ++ // [P Q Fr Ch Info] = umfpack (A, Qinit, 'symbolic') ; ++ // [P Q Fr Ch Info] = umfpack (A, Qinit, 'symbolic', Control) ; ++ ++ operation = "symbolic factorization"; ++ do_numeric = false; ++ ++ if (args(0).class_name () != "sparse") ++ { ++ error ("umfpack: input matrix A must be sparse"); ++ return retval; ++ } ++ ++ if (args(0).is_complex_type ()) ++ { ++ CAmatrix = args(0).sparse_complex_matrix_value (); ++ A_is_complex = true; ++ } ++ else ++ Amatrix = args(0).sparse_matrix_value (); ++ ++ if (nargout == 5) ++ do_info = 4 ; ++ ++ if (op == 2) ++ { ++ User_Qinit = args(1).column_vector_value (); ++ have_User_Qinit = true; ++ } ++ if ((op == 1 && nargin == 3) || (op == 2 && nargin == 4)) ++ { ++ User_Control_matrix = args(nargin-1).array_value (); ++ have_User_Control_matrix = true; ++ } ++ ++ if (error_state) ++ { ++ error ("umfpack: incorrect argument type"); ++ return retval; ++ } ++ ++ if (nargin < 2 || nargin > 4 || nargout > 5 || nargout < 4) ++ { ++ error ("umfpack: wrong number of arguments") ; ++ return retval; ++ } ++ } ++ else ++ { ++ error ("operator must be '/', '\\', or 'symbolic'") ; ++ return retval; ++ } ++ } ++ else if (nargin > 0) ++ { ++ // LU factorization ++ ++ // with scaling: ++ // [L, U, P, Q, R, Info] = umfpack (A) ; ++ // [L, U, P, Q, R, Info] = umfpack (A, Qinit) ; ++ // ++ // scaling determined by Control settings: ++ // [L, U, P, Q, R, Info] = umfpack (A, Control) ; ++ // [L, U, P, Q, R, Info] = umfpack (A, Qinit, Control) ; ++ // ++ // with no scaling: ++ // [L, U, P, Q] = umfpack (A) ; ++ // [L, U, P, Q] = umfpack (A, Control) ; ++ // [L, U, P, Q] = umfpack (A, Qinit) ; ++ // [L, U, P, Q] = umfpack (A, Qinit, Control) ; ++ ++ operation = "numeric factorization" ; ++ ++ if (args(0).is_complex_type ()) ++ { ++ CAmatrix = args(0).sparse_complex_matrix_value (); ++ A_is_complex = true; ++ } ++ else ++ Amatrix = args(0).sparse_matrix_value (); ++ ++ no_scale = nargout <= 4 ; ++ ++ if (nargout == 6) ++ do_info = 5 ; ++ ++ if (nargin == 3) ++ { ++ User_Qinit = args(1).column_vector_value (); ++ User_Control_matrix = args(2).array_value (); ++ have_User_Qinit = true; ++ have_User_Control_matrix = true; ++ } ++ else if (nargin == 2) ++ { ++ User_Control_matrix = args(1).array_value (); ++ ++ if (User_Control_matrix.rows () == 1) ++ { ++ User_Qinit = args(1).column_vector_value (); ++ have_User_Qinit = true; ++ } ++ else ++ have_User_Control_matrix = true; ++ } ++ else if (nargin > 3 || nargout > 6 || nargout < 4) ++ { ++ error ("umfpack: wrong number of arguments") ; ++ return retval; ++ } ++ } ++ else ++ { ++ // return default control settings ++ ++ // Control = umfpack ; ++ // umfpack ; ++ ++ if (nargout > 1) ++ { ++ error ("umfpack: wrong number of arguments") ; ++ return retval; ++ } ++ ++ NDArray user_control (dim_vector (UMFPACK_CONTROL, 1)); ++ double *user_control_ptr = user_control.fortran_vec (); ++ umfpack_di_defaults (user_control_ptr); ++ retval(0) = user_control; ++ return retval; ++ } ++ ++ // check inputs ++ ++ int n_row = Amatrix.rows (); ++ int n_col = Amatrix.cols (); ++ int nn = MAX (n_row, n_col) ; ++ int n_inner = MIN (n_row, n_col) ; ++ if (do_solve && n_row != n_col) ++ { ++ error ("umfpack: input matrix A must square for '\\' or '/'") ; ++ return retval; ++ } ++ if (n_row == 0 || n_col == 0) ++ { ++ error ("umfpack: input matrix A cannot have zero rows or zero columns") ; ++ return retval; ++ } ++ ++ /* The real/complex status of A determines which version to use, */ ++ /* (umfpack_di_* or umfpack_zi_*). */ ++ const int *Ap; ++ const int *Ai; ++ const double *Ax; ++ const double *Bx; ++ ++ if (A_is_complex) ++ { ++ Ap = CAmatrix.cidx (); ++ Ai = CAmatrix.ridx (); ++ Ax = X_CAST (const double *, CAmatrix.data ()); ++ } ++ else ++ { ++ Ap = Amatrix.cidx (); ++ Ai = Amatrix.ridx (); ++ Ax = Amatrix.data (); ++ } ++ ++ if (B_is_complex) ++ Bx = X_CAST (const double *, CBmatrix.fortran_vec ()); ++ else ++ Bx = Bmatrix.fortran_vec (); ++ ++ if (do_solve) ++ { ++ int b_row = Bmatrix.rows (); ++ int b_col = Bmatrix.cols (); ++ ++ if (!((transpose && b_row == 1 && b_col == nn) || ++ (!transpose && b_row == nn && b_col == 1))) ++ { ++ error ("umfpack: b has the wrong dimensions") ; ++ return retval; ++ } ++ ++ X_is_complex = A_is_complex || B_is_complex ; ++ } ++ ++ // set the Control parameters ++ NDArray Control (dim_vector (UMFPACK_CONTROL, 1)); ++ double *Control_ptr = Control.fortran_vec (); ++ if (A_is_complex) ++ umfpack_zi_defaults (Control_ptr) ; ++ else ++ umfpack_di_defaults (Control_ptr) ; ++ ++ if (have_User_Control_matrix) ++ { ++ int size = MIN (UMFPACK_CONTROL, User_Control_matrix.length ()); ++ for (int i = 0 ; i < size ; i++) ++ Control (i) = User_Control_matrix (i) ; ++ } ++ ++ if (no_scale) ++ { ++ // turn off scaling for [L, U, P, Q] = umfpack (A) ; ++ // ignoring the input value of Control (24) for the usage ++ // [L, U, P, Q] = umfpack (A, Control) ; ++ Control (UMFPACK_SCALE) = UMFPACK_SCALE_NONE ; ++ } ++ ++ int print_level; ++ if (xisnan (Control (UMFPACK_PRL))) ++ print_level = UMFPACK_DEFAULT_PRL ; ++ else ++ print_level = int (Control (UMFPACK_PRL)) ; ++ ++ Control (UMFPACK_PRL) = print_level ; ++ ++ // check Qinit, if present ++ int *Qinit = NULL; ++ if (have_User_Qinit) ++ { ++ if(User_Qinit.rows () != 1 || User_Qinit.cols () != n_col) ++ { ++ error ("umfpack: Qinit must be 1-by-n_col") ; ++ return retval; ++ } ++ ++ Qinit = new int [n_col]; ++ for (int i = 0; i < n_col; i++) ++ Qinit[i] = static_cast (User_Qinit (i)); ++ } ++ ++ // report the inputs A and Qinit ++ ++ if (print_level >= 2) ++ // print the operation ++ octave_stdout << "\numfpack: " << operation; ++ ++ if (A_is_complex) ++ { ++ umfpack_zi_report_control (Control_ptr) ; ++ ++ if (print_level >= 3) ++ octave_stdout << "\nA: " ; ++ ++ umfpack_zi_report_matrix (n_row, n_col, Ap, Ai, Ax, NULL, ++ 1, Control_ptr) ; ++ if (have_User_Qinit) ++ { ++ if (print_level >= 3) ++ octave_stdout << "\nQinit: " ; ++ ++ umfpack_zi_report_perm (n_col, Qinit, Control_ptr) ; ++ } ++ } ++ else ++ { ++ umfpack_di_report_control (Control_ptr) ; ++ ++ if (print_level >= 3) ++ octave_stdout << "\nA: " ; ++ ++ umfpack_di_report_matrix (n_row, n_col, Ap, Ai, Ax, ++ 1, Control_ptr) ; ++ if (have_User_Qinit) ++ { ++ if (print_level >= 3) ++ octave_stdout << "\nQinit: " ; ++ ++ umfpack_di_report_perm (n_col, Qinit, Control_ptr) ; ++ } ++ } ++ ++#ifndef NO_TRANSPOSE_FORWARD_SLASH ++ // create the array transpose for x = b/A ++ if (transpose) ++ if (A_is_complex) ++ { ++ CAmatrix = CAmatrix.transpose (); ++ Ap = Amatrix.cidx (); ++ Ai = Amatrix.ridx (); ++ Ax = X_CAST (const double *, CAmatrix.data ()); ++ } ++ else ++ { ++ Amatrix = Amatrix.transpose (); ++ Ap = Amatrix.cidx (); ++ Ai = Amatrix.ridx (); ++ Ax = Amatrix.data (); ++ } ++#endif ++ ++ // perform the symbolic factorization ++ ++ NDArray InfoOut (dim_vector (1, UMFPACK_INFO)); ++ double * Info = InfoOut.fortran_vec (); ++ void *Symbolic; ++ int status, status2; ++ if (A_is_complex) ++ status = umfpack_zi_qsymbolic (n_row, n_col, Ap, Ai, Ax, NULL, ++ Qinit, &Symbolic, Control_ptr, ++ Info); ++ else ++ status = umfpack_di_qsymbolic (n_row, n_col, Ap, Ai, Ax, ++ Qinit, &Symbolic, Control_ptr, ++ Info); ++ ++ if (status < 0) ++ { ++ umfpack_error ("symbolic factorization failed", A_is_complex, ++ nargout, retval, Control, InfoOut, status, do_info) ; ++ return retval; ++ } ++ ++ if (have_User_Qinit) ++ delete [] Qinit; ++ ++ // report the Symbolic object ++ ++ if (A_is_complex) ++ umfpack_zi_report_symbolic (Symbolic, Control_ptr) ; ++ else ++ umfpack_di_report_symbolic (Symbolic, Control_ptr) ; ++ ++ // perform numeric factorization, or just return symbolic factorization ++ ++ if (do_numeric) ++ { ++ // perform the numeric factorization ++ void *Numeric; ++ ++ if (A_is_complex) ++ status = umfpack_zi_numeric (Ap, Ai, Ax, NULL, Symbolic, &Numeric, ++ Control_ptr, Info) ; ++ else ++ status = umfpack_di_numeric (Ap, Ai, Ax, Symbolic, &Numeric, ++ Control_ptr, Info) ; ++ ++ // free the symbolic factorization ++ if (A_is_complex) ++ umfpack_zi_free_symbolic (&Symbolic) ; ++ else ++ umfpack_di_free_symbolic (&Symbolic) ; ++ ++ // report the Numeric object ++ if (status < 0) ++ { ++ umfpack_error ("numeric factorization failed", A_is_complex, ++ nargout, retval, Control, InfoOut, status, do_info); ++ return retval; ++ } ++ ++ if (A_is_complex) ++ (void) umfpack_zi_report_numeric (Numeric, Control_ptr) ; ++ else ++ (void) umfpack_di_report_numeric (Numeric, Control_ptr) ; ++ ++ // return the solution or the factorization ++ ++ if (do_solve) ++ { ++ int sys; ++ ComplexNDArray Xcmplx; ++ NDArray Xreal; ++ ++ // solve Ax=b or A'x'=b', and return just the solution x ++ ++#ifndef NO_TRANSPOSE_FORWARD_SLASH ++ if (transpose) ++ { ++ // A.'x.'=b.' gives the same x=b/A as solving A'x'=b' ++ // since C=A.' was factorized, solve with sys = UMFPACK_A ++ // since x and b are vectors, x.' and b.' are implicit ++ if (X_is_complex) ++ Xcmplx.resize (dim_vector (1, nn)); ++ else ++ Xreal.resize (dim_vector (1, nn)); ++ } ++ else ++ { ++ if (X_is_complex) ++ Xcmplx.resize (dim_vector (nn, 1)); ++ else ++ Xreal.resize (dim_vector (nn, 1)); ++ } ++ ++ sys = UMFPACK_A ; ++#else ++ if (transpose) ++ { ++ // If A is real, A'x=b is the same as A.'x=b. ++ // x and b are vectors, so x and b are the same as x' and b'. ++ // If A is complex, then A.'x.'=b.' gives the same solution x ++ // as the complex conjugate transpose. If we used the A'x=b ++ // option in umfpack_*_solve, we would have to form b' on ++ // input and x' on output (negating the imaginary part). ++ // We can save this work by just using the A.'x=b option in ++ // umfpack_*_solve. Then, forming x.' and b.' is implicit, ++ // since x and b are just vectors anyway. ++ // In both cases, the system to solve is A.'x=b ++ if (X_is_complex) ++ Xcmplx.resize (dim_vector (1, nn)); ++ else ++ Xreal.resize (dim_vector (1, nn)); ++ ++ sys = UMFPACK_Aat ; ++ } ++ else ++ { ++ if (X_is_complex) ++ Xcmplx.resize (dim_vector (nn, 1)); ++ else ++ Xreal.resize (dim_vector (nn, 1)); ++ sys = UMFPACK_A ; ++ } ++#endif ++ ++ // print the right-hand-side, B ++ if (print_level >= 3) ++ octave_stdout << "\nright-hand side, b: "; ++ ++ if (B_is_complex) ++ (void) umfpack_zi_report_vector (nn, Bx, NULL, Control_ptr) ; ++ else ++ (void) umfpack_di_report_vector (nn, Bx, Control_ptr) ; ++ ++ // solve the system ++ double * Xx; ++ if (X_is_complex) ++ Xx = X_CAST (double *, Xcmplx.fortran_vec ()); ++ else ++ Xx = Xreal.fortran_vec (); ++ status2 = UMFPACK_OK ; ++ ++ if (A_is_complex) ++ { ++ if (!B_is_complex) ++ { ++ OCTAVE_LOCAL_BUFFER (double, Bz, nn); ++ for (int i = 0; i < nn; i++) ++ Bz[i] = 0.; ++ ++ status = umfpack_zi_solve (sys, Ap, Ai, Ax, NULL, Xx, NULL, ++ Bx, Bz, Numeric, Control_ptr, ++ Info); ++ } ++ else ++ status = umfpack_zi_solve (sys, Ap, Ai, Ax, NULL, Xx, NULL, ++ Bx, NULL, Numeric, Control_ptr, ++ Info); ++ } ++ else ++ { ++ if (B_is_complex) ++ { ++ // Ax=b when b is complex and A is sparse can be split ++ // into two systems, A*xr=br and A*xi=bi, where r denotes ++ // the real part and i the imaginary part of x and b. ++ OCTAVE_LOCAL_BUFFER (double, Tx, nn); ++ OCTAVE_LOCAL_BUFFER (double, Tz, nn); ++ ++ status = umfpack_di_solve (sys, Ap, Ai, Ax, Tx, Bx, ++ Numeric, Control_ptr, Info); ++ status2 = umfpack_di_solve (sys, Ap, Ai, Ax, Tz, Bx, ++ Numeric, Control_ptr, Info) ; ++ ++ for (int i = 0; i < nn; i++) ++ Xcmplx (i) = Complex (Tx[i], Tz[i]); ++ } ++ else ++ status = umfpack_di_solve (sys, Ap, Ai, Ax, Xx, Bx, ++ Numeric, Control_ptr, Info); ++ } ++ ++ // free the Numeric object ++ if (A_is_complex) ++ umfpack_zi_free_numeric (&Numeric) ; ++ else ++ umfpack_di_free_numeric (&Numeric) ; ++ ++ // check error status ++ if (status < 0 || status2 < 0) ++ { ++ umfpack_error ("solve failed", A_is_complex, nargout, ++ retval, Control, InfoOut, status, do_info) ; ++ return retval; ++ } ++ ++ // print the solution, X ++ if (print_level >= 3) ++ octave_stdout << "\nsolution, x: "; ++ ++ if (X_is_complex) ++ (void) umfpack_zi_report_vector (nn, Xx, NULL, Control_ptr); ++ else ++ (void) umfpack_di_report_vector (nn, Xx, Control_ptr); ++ ++ // warn about singular or near-singular matrices ++ // no warning is given if Control (1) is zero ++ if (Control (UMFPACK_PRL) >= 1) ++ { ++ if (status == UMFPACK_WARNING_singular_matrix) ++ { ++ warning ("matrix is singular"); ++ warning ("Try increasing Control (%d) and Control (%d).", ++ 1+UMFPACK_PIVOT_TOLERANCE, ++ 1+UMFPACK_SYM_PIVOT_TOLERANCE); ++ warning ("(Suppress this warning with Control (%d) = 0.)", ++ 1+UMFPACK_PRL); ++ } ++ else if (InfoOut (UMFPACK_RCOND) < DBL_EPSILON) ++ { ++ warning ("matrix is nearly singular, rcond = %g", ++ InfoOut (UMFPACK_RCOND)); ++ warning ("Try increasing Control (%d) and Control (%d).", ++ 1+UMFPACK_PIVOT_TOLERANCE, ++ 1+UMFPACK_SYM_PIVOT_TOLERANCE); ++ warning ("(Suppress this warning with Control (%d) = 0.)", ++ 1+UMFPACK_PRL); ++ } ++ } ++ ++ // Setup the return value ++ if (X_is_complex) ++ retval (0) = octave_value (Xcmplx); ++ else ++ retval (0) = octave_value (Xreal); ++ } ++ else ++ { ++ // get L, U, P, Q, and r ++ int lnz, unz, ignore1, ignore2, ignore3; ++ ++ if (A_is_complex) ++ status = umfpack_zi_get_lunz (&lnz, &unz, &ignore1, &ignore2, ++ &ignore3, Numeric) ; ++ else ++ status = umfpack_di_get_lunz (&lnz, &unz, &ignore1, &ignore2, ++ &ignore3, Numeric) ; ++ ++ if (status < 0) ++ { ++ if (A_is_complex) ++ umfpack_zi_free_numeric (&Numeric) ; ++ else ++ umfpack_di_free_numeric (&Numeric) ; ++ ++ umfpack_error ("extracting LU factors failed", A_is_complex, ++ nargout, retval, Control, InfoOut, status, ++ do_info); ++ return retval; ++ } ++ ++ // avoid malloc of zero-sized arrays ++ lnz = MAX (lnz, 1) ; ++ unz = MAX (unz, 1) ; ++ ++ // get space for the *** ROW *** form of L ++ SparseMatrix Lreal; ++ SparseComplexMatrix Limag; ++ int *Ltp, *Ltj; ++ double *Ltx; ++ if (A_is_complex) ++ { ++ Limag = SparseComplexMatrix (n_inner, n_row, lnz); ++ Ltp = Limag.cidx (); ++ Ltj = Limag.ridx (); ++ Ltx = X_CAST (double *, Limag.data ()); ++ } ++ else ++ { ++ Lreal = SparseMatrix (n_inner, n_row, lnz); ++ Ltp = Lreal.cidx (); ++ Ltj = Lreal.ridx (); ++ Ltx = Lreal.data (); ++ } ++ ++ // create permanent copy of the output matrix U ++ int *Up, *Ui; ++ double *Ux; ++ SparseMatrix Ureal; ++ SparseComplexMatrix Uimag; ++ ++ if (A_is_complex) ++ { ++ Uimag = SparseComplexMatrix (n_inner, n_col, unz); ++ Up = Uimag.cidx (); ++ Ui = Uimag.ridx (); ++ Ux = X_CAST (double *, Uimag.data ()); ++ } ++ else ++ { ++ Ureal = SparseMatrix (n_inner, n_col, unz); ++ Up = Ureal.cidx (); ++ Ui = Ureal.ridx (); ++ Ux = Ureal.data (); ++ } ++ ++ // temporary space for the integer permutation vectors ++ OCTAVE_LOCAL_BUFFER (int, P, n_row); ++ OCTAVE_LOCAL_BUFFER (int, Q, n_col); ++ ++ // get scale factors, if requested ++ status2 = UMFPACK_OK ; ++ SparseMatrix Rsout; ++ double * Rs; ++ if (!no_scale) ++ { ++ // create a diagonal sparse matrix for the scale factors ++ Rsout = SparseMatrix (n_row, n_row, n_row); ++ for (int i = 0 ; i < n_row ; i++) ++ { ++ Rsout.cidx (i) = i; ++ Rsout.ridx (i) = i; ++ } ++ Rsout.cidx (n_row) = n_row; ++ Rs = Rsout.data (); ++ } ++ else ++ Rs = (double *) NULL ; ++ ++ // get Lt, U, P, Q, and Rs from the numeric object ++ int do_recip; ++ if (A_is_complex) ++ { ++ status = umfpack_zi_get_numeric (Ltp, Ltj, Ltx, NULL, Up, Ui, ++ Ux, NULL, P, Q, ++ (double *) NULL, ++ (double *) NULL, ++ &do_recip, Rs, Numeric) ; ++ umfpack_zi_free_numeric (&Numeric) ; ++ } ++ else ++ { ++ status = umfpack_di_get_numeric (Ltp, Ltj, Ltx, Up, Ui, ++ Ux, P, Q, (double *) NULL, ++ &do_recip, Rs, Numeric) ; ++ umfpack_di_free_numeric (&Numeric) ; ++ } ++ ++ if (!no_scale) ++ retval (4) = octave_vale (Rsout); ++ ++ // for the oct-file, -DNRECIPROCAL must be set, ++ // so do_recip must be FALSE ++ ++ if (status < 0 || status2 < 0 || do_recip) ++ { ++ umfpack_error ("extracting LU factors failed", A_is_complex, ++ nargout, retval, Control, InfoOut, status, ++ do_info); ++ return retval; ++ } ++ ++ if (A_is_complex) ++ retval (1) = octave_value (Uimag); ++ else ++ retval (1) = octave_valye (Ureal); ++ ++ // create sparse permutation matrix for P ++ SparseMatrix Pout (n_row, n_row, n_row); ++ for (int k = 0 ; k < n_row ; k++) ++ { ++ Pout.cidx (k) = k ; ++ Pout.ridx (P [k]) = k; ++ Pout.data (k) = 1; ++ } ++ Pout.cidx (n_row) = n_row; ++ retval (2) = octave_value (Pout); ++ ++ // create sparse permutation matrix for Q ++ SparseMatrix Qout (n_col, n_col, n_col); ++ for (int k = 0 ; k < n_col ; k++) ++ { ++ Qout.cidx (k) = k ; ++ Qout.ridx (k) = Q[k]; ++ Qout.data (k) = 1; ++ } ++ Qout.cidx (n_col) = n_col; ++ retval (3) = octave_value (Qout); ++ ++ // permanent copy of L ++ if (A_is_complex) ++ retval (0) = octave_value (Limag.transpose()); ++ else ++ retval (0) = octave_value (Lreal.transpose()); ++ ++ if (status < 0) ++ { ++ umfpack_error ("constructing L failed", A_is_complex, ++ nargout, retval, Control, InfoOut, status, ++ do_info) ; ++ return octave_value (); ++ } ++ ++ // print L, U, P, and Q ++ if (A_is_complex) ++ { ++ if (print_level >= 3) ++ { ++ octave_stdout << "\nL: "; ++ int *Lp = Limag.cidx (); ++ int *Li = Limag.ridx (); ++ double *Lx = X_CAST (double *, Limag.data ()); ++ ++ (void) umfpack_zi_report_matrix (n_row, n_inner, Lp, Li, ++ Lx, NULL, 1, Control_ptr) ; ++ } ++ ++ if (print_level >= 3) ++ octave_stdout << "\nU: "; ++ (void) umfpack_zi_report_matrix (n_inner, n_col, Up, Ui, ++ Ux, NULL, 1, Control_ptr) ; ++ if (print_level >= 3) ++ octave_stdout << "\nP: "; ++ (void) umfpack_zi_report_perm (n_row, P, Control_ptr); ++ if (print_level >= 3) ++ octave_stdout << "\nQ: "; ++ (void) umfpack_zi_report_perm (n_col, Q, Control_ptr); ++ } ++ else ++ { ++ if (print_level >= 3) ++ { ++ int *Lp = Lreal.cidx (); ++ int *Li = Lreal.ridx (); ++ double *Lx = Lreal.data (); ++ octave_stdout << "\nL: "; ++ (void) umfpack_di_report_matrix (n_row, n_inner, Lp, Li, ++ Lx, 1, Control_ptr); ++ } ++ ++ if (print_level >= 3) ++ octave_stdout << "\nU: "; ++ (void) umfpack_di_report_matrix (n_inner, n_col, Up, Ui, ++ Ux, 1, Control_ptr); ++ if (print_level >= 3) ++ octave_stdout << "\nP: "; ++ (void) umfpack_di_report_perm (n_row, P, Control_ptr); ++ if (print_level >= 3) ++ octave_stdout << "\nQ: "; ++ (void) umfpack_di_report_perm (n_col, Q, Control_ptr); ++ } ++ } ++ } ++ else ++ { ++ // return the symbolic factorization ++ int ignore1, ignore2, ignore3; ++ OCTAVE_LOCAL_BUFFER (int, Q, n_col); ++ OCTAVE_LOCAL_BUFFER (int, P, n_row); ++ OCTAVE_LOCAL_BUFFER (int, Front_npivcol, nn + 1); ++ OCTAVE_LOCAL_BUFFER (int, Front_parent, nn + 1); ++ OCTAVE_LOCAL_BUFFER (int, Front_1strow, nn + 1); ++ OCTAVE_LOCAL_BUFFER (int, Front_leftmostdesc, nn + 1); ++ OCTAVE_LOCAL_BUFFER (int, Chain_start, nn + 1); ++ OCTAVE_LOCAL_BUFFER (int, Chain_maxrows, nn + 1); ++ OCTAVE_LOCAL_BUFFER (int, Chain_maxcols, nn + 1); ++ ++ int nz, nfronts, nchains; ++ ++ if (A_is_complex) ++ { ++ status = umfpack_zi_get_symbolic (&ignore1, &ignore2, &ignore3, ++ &nz, &nfronts, &nchains, P, Q, ++ Front_npivcol, Front_parent, ++ Front_1strow, ++ Front_leftmostdesc, ++ Chain_start, Chain_maxrows, ++ Chain_maxcols, Symbolic) ; ++ umfpack_zi_free_symbolic (&Symbolic) ; ++ } ++ else ++ { ++ status = umfpack_di_get_symbolic (&ignore1, &ignore2, &ignore3, ++ &nz, &nfronts, &nchains, P, Q, ++ Front_npivcol, Front_parent, ++ Front_1strow, ++ Front_leftmostdesc, ++ Chain_start, Chain_maxrows, ++ Chain_maxcols, Symbolic) ; ++ umfpack_di_free_symbolic (&Symbolic) ; ++ } ++ ++ if (status < 0) ++ { ++ umfpack_error ("extracting symbolic factors failed", ++ A_is_complex, nargout, retval, Control, ++ InfoOut, status, do_info) ; ++ return retval; ++ } ++ ++ // create sparse permutation matrix for P ++ SparseMatrix Pout (n_row, n_row, n_row); ++ for (int k = 0 ; k < n_row ; k++) ++ { ++ Pout.cidx (k) = k; ++ Pout.ridx (P [k]) = k; ++ Pout.data (k) = 1; ++ } ++ Pout.cidx (n_row) = n_row; ++ retval (0) = octave_value (Pout); ++ ++ // create sparse permutation matrix for Q ++ SparseMatrix Qout (n_col, n_col, n_col); ++ for (int k = 0 ; k < n_col ; k++) ++ { ++ Qout.cidx (k) = k; ++ Qout.ridx (k) = Q[k]; ++ Qout.data (k) = 1; ++ } ++ Qout.cidx (n_col) = n_col; ++ retval (1) = octave_value (Qout); ++ ++ // create Fr ++ Matrix Frout (nfronts + 1, 4); ++ for (int i = 0 ; i <= nfronts ; i++) ++ { ++ // convert parent, 1strow, and leftmostdesc to 1-based ++ Frout (i, 0) = (double) (Front_npivcol [i]) ; ++ Frout (i, 1) = (double) (Front_parent [i] + 1) ; ++ Frout (i, 2) = (double) (Front_1strow [i] + 1) ; ++ Frout (i, 3) = (double) (Front_leftmostdesc [i] + 1) ; ++ } ++ retval (2) = octave_value (Frout); ++ ++ // create Ch ++ Matrix Chout (nchains + 1, 3); ++ for (int i = 0 ; i <= nchains ; i++) ++ { ++ // convert to 1-based ++ Chout (i, 0) = (double) (Chain_start [i] + 1) ; ++ Chout (i, 1) = (double) (Chain_maxrows [i]) ; ++ Chout (i, 2) = (double) (Chain_maxcols [i]) ; ++ } ++ Chout (0, nchains) = (double) Chain_start [nchains] + 1 ; ++ Chout (1, nchains) = 0.; ++ Chout (2, nchains) = 0.; ++ retval (3) = octave_value (Chout); ++ } ++ ++ // report Info ++ if (A_is_complex) ++ umfpack_zi_report_info (Control_ptr, Info); ++ else ++ umfpack_di_report_info (Control_ptr, Info); ++ ++ if (do_info > 0) ++ retval (do_info) = InfoOut; ++ ++ return retval; ++} ++ ++/* ++;;; Local Variables: *** ++;;; mode: C++ *** ++;;; End: *** ++*/ +diff -uNr UMFPACKv4.4.orig/UMFPACK/OCTAVE/umfpack_demo.m UMFPACK/UMFPACK/OCTAVE/umfpack_demo.m +--- UMFPACKv4.4.orig/UMFPACK/OCTAVE/umfpack_demo.m 1970-01-01 01:00:00.000000000 +0100 ++++ UMFPACK/UMFPACK/OCTAVE/umfpack_demo.m 2004-12-30 01:58:46.000000000 +0100 +@@ -0,0 +1,191 @@ ++function umfpack_demo ++% UMFPACK DEMO ++% ++% A demo of UMFPACK for OCTAVE. ++% ++% See also umfpack, umfpack_make, umfpack_details, umfpack_report, ++% and umfpack_simple. ++ ++% UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A. ++% Davis. All Rights Reserved. Type umfpack_details for License. ++ ++%------------------------------------------------------------------------------- ++% get default control parameters ++%------------------------------------------------------------------------------- ++ ++control = umfpack ; ++fprintf ('\nEnter the printing level for UMFPACK''s output statistics:\n') ; ++fprintf ('0: none, 1: errors only, 2: statistics, 4: print some of outputs\n') ; ++c = input ('5: print all output [default is 1]: ') ; ++if (isempty (c)) ++ c = 1 ; ++end ++control (1) = c ; ++ ++%------------------------------------------------------------------------------- ++% solve a simple system ++%------------------------------------------------------------------------------- ++ ++fprintf ('\n--------------------------------------------------------------\n') ; ++fprintf ('Factor and solve a small system, Ax=b, using default parameters\n') ; ++if (control (1) > 1) ++ fprintf ('(except for verbose printing enabled)\n') ; ++end ++ ++load west0067 ; ++A = Problem.A ; ++n = size (A, 1) ; ++b = rand (n, 1) ; ++ ++fprintf ('Solving Ax=b via UMFPACK:\n') ; ++[xu, info] = umfpack (A, '\\', b, control) ; ++x = xu ; ++ ++fprintf ('Solving Ax=b via OCTAVE:\n') ; ++xm = A\b ; ++x = xm ; ++ ++fprintf ('Difference between UMFPACK and OCTAVE solution: %g\n', ... ++ norm (xu - xm, Inf)) ; ++ ++%------------------------------------------------------------------------------- ++% spy the results ++%------------------------------------------------------------------------------- ++ ++figure (1) ; ++clf ++ ++subplot (2,3,1) ++title ('The matrix A') ; ++spy (A) ++ ++subplot (2,3,2) ++[P1, Q1, Fr, Ch, Info] = umfpack (A, 'symbolic') ; ++title ('Supernodal column elimination tree') ; ++%% Disable for now !! ++%% treeplot (Fr (1:end-1,2)') ; ++ ++subplot (2,3,3) ++title ('A, with initial row and column order') ; ++spy (P1 * A * Q1) ++ ++subplot (2,3,4) ++fprintf ('\n--------------------------------------------------------------\n') ; ++fprintf ('\nFactorizing [L, U, P, Q, R] = umfpack (A)\n') ; ++[L, U, P, Q, R] = umfpack (A) ; ++title ('A, with final row/column order') ; ++spy (P*A*Q) ++ ++fprintf ('\nP * (R\\A) * Q - L*U should be zero:\n') ; ++fprintf ('norm (P*(R\\A)*Q - L*U, 1) = %g (exact) %g (estimated)\n', ... ++ norm (P * (R\A) * Q - L*U, 1), lu_normest (P * (R\A) * Q, L, U)) ; ++ ++fprintf ('\nSolution to Ax=b via UMFPACK factorization:\n') ; ++fprintf ('x = Q * (U \\ (L \\ (P * (R \\ b))))\n') ; ++xu = Q * (U \ (L \ (P * (R \ b)))) ; ++x = xu ; ++ ++fprintf ('\nUMFPACK flop count: %d\n', luflop (L, U)) ; ++ ++subplot (2,3,5) ++title ('UMFPACK LU factors') ; ++spy (spones (L) + spones (U)) ++ ++subplot (2,3,6) ++fprintf ('\nFactorizing [L, U, P] = lu (A (:, q))\n') ; ++try ++ q = colamd (A) ; ++catch ++ fprintf ('\n *** colamd not found, using colmmd instead *** \n') ; ++ q = colmmd (A) ; ++end ++[L, U, P] = lu (A (:,q)) ; ++title ('OCTAVE LU factors') ; ++spy (spones (L) + spones (U)) ++ ++fprintf ('\nSolution to Ax=b via OCTAVE factorization:\n') ; ++fprintf ('x = U \\ (L \\ (P * b)) ; x (q) = x ;\n') ; ++xm = U \ (L \ (P * b)) ; ++xm (q) = xm ; ++ ++fprintf ('Difference between UMFPACK and OCTAVE solution: %g\n', ... ++ norm (xu - xm, Inf)) ; ++ ++fprintf ('\nOCTAVE LU flop count: %d\n', luflop (L, U)) ; ++ ++%------------------------------------------------------------------------------- ++% solve A'x=b ++%------------------------------------------------------------------------------- ++ ++fprintf ('\n--------------------------------------------------------------\n') ; ++fprintf ('Solve A''x=b:\n') ; ++ ++fprintf ('Solving A''x=b via UMFPACK:\n') ; ++[xu, info] = umfpack (b', '/', A, control) ; ++xu = xu' ; ++ ++fprintf ('Solving A''x=b via OCTAVE:\n') ; ++xm = (b'/A)' ; ++x = xm ; ++ ++fprintf ('Difference between UMFPACK and OCTAVE solution: %g\n', ... ++ norm (xu - xm, Inf)) ; ++ ++%------------------------------------------------------------------------------- ++% factor A' and then solve Ax=b using the factors of A' ++%------------------------------------------------------------------------------- ++ ++fprintf ('\n--------------------------------------------------------------\n') ; ++fprintf ('Compute C = A'', and compute the LU factorization of C.\n') ; ++fprintf ('Factorizing A'' can sometimes be better than factorizing A itself\n'); ++fprintf ('(less work and memory usage). Solve C''x=b; the solution is the\n') ; ++fprintf ('same as the solution to Ax=b for the original A.\n'); ++ ++C = A' ; ++ ++% factorize C (P,Q) = L*U ++[L, U, P, Q, R, info] = umfpack (C, control) ; ++ ++fprintf ('\nP * (R\\C) * Q - L*U should be zero:\n') ; ++fprintf ('norm (P*(R\\C)*Q - L*U, 1) = %g (exact) %g (estimated)\n', ... ++ norm (P * (R\C) * Q - L*U, 1), lu_normest (P * (R\C) * Q, L, U)) ; ++ ++fprintf ('\nSolution to Ax=b via UMFPACK, using the factors of C:\n') ; ++fprintf ('x = R \\ (P'' * (L'' \\ (U'' \\ (Q'' * b)))) ;\n') ; ++xu = R \ (P' * (L' \ (U' \ (Q' * b)))) ; ++x = xu ; ++ ++fprintf ('Solution to Ax=b via OCTAVE:\n') ; ++xm = A\b ; ++x = xm ; ++ ++fprintf ('Difference between UMFPACK and OCTAVE solution: %g\n', ... ++ norm (xu - xm, Inf)) ; ++ ++%------------------------------------------------------------------------------- ++% solve Ax=B ++%------------------------------------------------------------------------------- ++ ++fprintf ('\n--------------------------------------------------------------\n') ; ++fprintf ('\nSolve AX=B, where B is n-by-10, and sparse\n') ; ++B = sprandn (n, 10, 0.05) ; ++XU = umfpack_solve (A, '\\', B, control) ; ++XM = A\B ; ++ ++fprintf ('Difference between UMFPACK and OCTAVE solution: %g\n', ... ++ norm (XU - XM, Inf)) ; ++ ++fprintf ('\n--------------------------------------------------------------\n') ; ++fprintf ('\nSolve AX=B, where B is n-by-10, and sparse, using umfpack_btf\n') ; ++XU = umfpack_btf (A, B, control) ; ++ ++fprintf ('Difference between UMFPACK and OCTAVE solution: %g\n', ... ++ norm (XU - XM, Inf)) ; ++ ++fprintf ('\n--------------------------------------------------------------\n') ; ++fprintf ('\nSolve A''X=B, where B is n-by-10, and sparse\n') ; ++XU = umfpack_solve (B', '/', A, control) ; ++XM = B'/A ; ++ ++fprintf ('Difference between UMFPACK and OCTAVE solution: %g\n', ... ++ norm (XU - XM, Inf)) ; +diff -uNr UMFPACKv4.4.orig/UMFPACK/OCTAVE/umfpack_demo.m.out UMFPACK/UMFPACK/OCTAVE/umfpack_demo.m.out +--- UMFPACKv4.4.orig/UMFPACK/OCTAVE/umfpack_demo.m.out 1970-01-01 01:00:00.000000000 +0100 ++++ UMFPACK/UMFPACK/OCTAVE/umfpack_demo.m.out 2004-12-30 01:58:46.000000000 +0100 +@@ -0,0 +1,72 @@ ++>> umfpack_demo ++ ++Enter the printing level for UMFPACK's output statistics: ++0: none, 1: errors only, 2: statistics, 4: print some of outputs ++5: print all output [default is 1]: ++ ++-------------------------------------------------------------- ++Factor and solve a small system, Ax=b, using default parameters ++Solving Ax=b via UMFPACK: ++Solving Ax=b via MATLAB: ++Difference between UMFPACK and MATLAB solution: 1.24345e-14 ++ ++-------------------------------------------------------------- ++ ++Factorizing [L, U, P, Q, R] = umfpack (A) ++ ++P * (R\A) * Q - L*U should be zero: ++norm (P*(R\A)*Q - L*U, 1) = 4.2068e-16 (exact) 3.74627e-16 (estimated) ++ ++Solution to Ax=b via UMFPACK factorization: ++x = Q * (U \ (L \ (P * (R \ b)))) ++ ++UMFPACK flop count: 2362 ++ ++Factorizing [L, U, P] = lu (A (:, q)) ++If you are using a version of MATLAB prior to V6.0, then the ++following statement (q = colamd (A)) may fail. Either download ++colamd from http://www.cise.ufl.edu/research/sparse, upgrade to ++MATLAB V6.0 or later, or replace the statement with ++q = colmmd (A) ; ++ ++Solution to Ax=b via MATLAB factorization: ++x = U \ (L \ (P * b)) ; x (q) = x ; ++Difference between UMFPACK and MATLAB solution: 1.37668e-14 ++ ++MATLAB LU flop count: 3164 ++ ++-------------------------------------------------------------- ++Solve A'x=b: ++Solving A'x=b via UMFPACK: ++Solving A'x=b via MATLAB: ++Difference between UMFPACK and MATLAB solution: 3.10862e-15 ++ ++-------------------------------------------------------------- ++Compute C = A', and compute the LU factorization of C. ++Factorizing A' can sometimes be better than factorizing A itself ++(less work and memory usage). Solve C'x=b; the solution is the ++same as the solution to Ax=b for the original A. ++ ++P * (R\C) * Q - L*U should be zero: ++norm (P*(R\C)*Q - L*U, 1) = 1.31839e-16 (exact) 6.41848e-17 (estimated) ++ ++Solution to Ax=b via UMFPACK, using the factors of C: ++x = R \ (P' * (L' \ (U' \ (Q' * b)))) ; ++Solution to Ax=b via MATLAB: ++Difference between UMFPACK and MATLAB solution: 1.77636e-14 ++ ++-------------------------------------------------------------- ++ ++Solve AX=B, where B is n-by-10, and sparse ++Difference between UMFPACK and MATLAB solution: 2.88198e-14 ++ ++-------------------------------------------------------------- ++ ++Solve AX=B, where B is n-by-10, and sparse, using umfpack_btf ++Difference between UMFPACK and MATLAB solution: 9.79736e-14 ++ ++-------------------------------------------------------------- ++ ++Solve A'X=B, where B is n-by-10, and sparse ++Difference between UMFPACK and MATLAB solution: 1.05244e-13 ++>> diary off +diff -uNr UMFPACKv4.4.orig/UMFPACK/OCTAVE/umfpack_make.m UMFPACK/UMFPACK/OCTAVE/umfpack_make.m +--- UMFPACKv4.4.orig/UMFPACK/OCTAVE/umfpack_make.m 1970-01-01 01:00:00.000000000 +0100 ++++ UMFPACK/UMFPACK/OCTAVE/umfpack_make.m 2004-12-30 01:58:46.000000000 +0100 +@@ -0,0 +1,356 @@ ++function umfpack_make ++% UMFPACK_MAKE ++% ++% Compiles the UMFPACK mexFunction and then runs a simple demo. ++% ++% UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A. ++% Davis. All Rights Reserved. Type umfpack_details for License. ++% ++% See also: umfpack, umfpack_details, umfpack_report, umfpack_demo, and ++% umfpack_simple. ++ ++help umfpack_make ++ ++fprintf ('\n--------------------------------------------------------------\n') ; ++fprintf ('Now compiling the UMFPACK and AMD mexFunctions.\n') ; ++fprintf ('--------------------------------------------------------------\n') ; ++ ++try ++ % ispc does not appear in MATLAB 5.3 ++ pc = ispc ; ++catch ++ % if ispc fails, assume we aren't on a Windows PC. ++ pc = 0 ; ++end ++ ++obj = 'o' ; ++blas_lib = '' ; ++if (pc) ++ obj = 'obj' ; ++end ++ ++%------------------------------------------------------------------------------- ++% BLAS option ++%------------------------------------------------------------------------------- ++ ++msg = [ ... ++ '\nUsing the BLAS is faster, but might not compile correctly.\n', ... ++ 'If you get an error stating that dgemm, dgemv, dger, zgemm,\n', ... ++ 'zgemv, and/or zger are not defined, then recompile without the\n', ... ++ 'BLAS. You can ignore warnings that these routines are implicitly\n', ... ++ 'declared.\n\nPlease select one of the following options: \n', ... ++ ' 1: attempt to compile with the BLAS (default)\n', ... ++ ' 2: do not use the BLAS\n'] ; ++fprintf (msg) ; ++blas = input (': ') ; ++if (isempty (blas)) ++ blas = 1 ; ++end ++if (blas == 1) ++ % try to link to MATLAB's built-in BLAS ++ blas = '' ; ++ if (pc) ++ % the default lcc compiler needs this library to access the BLAS ++ blas_lib = ' libmwlapack.lib' ; ++ msg = [ ... ++ '\nCheck to see if you have a file called libmwlapack.lib in the\n', ... ++ '\\extern\\lib\\win32\\lcc\\ directory, where is ', ... ++ 'the\ndirectory where MATLAB is installed. If a file of that ', ... ++ 'name is already\nthere, then you don''t have to do anything. ', ... ++ 'Otherwise, you must first\ncopy the libmwlapack.lib file from ', ... ++ 'the umfpack\\lcc_lib\\ directory to the\n', ... ++ '\\extern\\lib\\win32\\lcc\\ directory. Next, type\n\n', ... ++ ' mex -setup\n\n', ... ++ 'at the MATLAB prompt, and ask MATLAB to select the lcc compiler. ',... ++ 'You can skip\nall of this if you have already done it, or have ', ... ++ 'configured mex to use\na different compiler. If you are using ', ... ++ 'Norton anti-virus software on Windows\n98SE, then you need to ', ... ++ 'exit MATLAB, turn off virus checking, and restart MATLAB\n', ... ++ 'before you can use the mex command or compile UMFPACK.\n', ... ++ 'You may also need to turn off virus checking in other cases.\n', ... ++ '\nHit enter to continue, or type control-C if you do not wish to '] ; ++ fprintf (msg) ; ++ input ('proceed: ') ; ++ end ++ fprintf ('\nUsing the BLAS (recommended).\n') ; ++else ++ % No BLAS ++ fprintf ('\nNot using the BLAS. UMFPACK will be slow.\n') ; ++ blas = ' -DNBLAS' ; ++end ++ ++%------------------------------------------------------------------------------- ++% -DNUTIL option (using utMalloc or mxMalloc) ++%------------------------------------------------------------------------------- ++ ++utils = '' ; ++ ++if (~pc) ++ msg = [ ... ++ '--------------------------------------------------------------\n', ... ++ '\nUMFPACK uses MATLAB''s memory allocation routines. The internal', ... ++ '\nutMalloc, utFree, and utRealloc allow for better use of memory,', ... ++ '\nbut they are internal utility routines that are not documented.\n', ... ++ 'Thus, they might not always work. Using mxMalloc, mxFree, and\n', ... ++ 'mxRealloc works, but UMFPACK might run out of memory when solving\n', ... ++ 'problems that it could otherwise solve. Try using the default.\n', ... ++ 'If you get an error stating that utMalloc, utFree, and/or\n', ... ++ 'utRealloc are not defined, then recompile with the mx* routines.\n', ... ++ '\nPlease select one of the following options:\n', ... ++ ' 1: attempt to use the ut* routines (default)\n', ... ++ ' 2: use the standard mx* routines\n'] ; ++ fprintf (msg) ; ++ utils = input (': ') ; ++ if (isempty (utils)) ++ utils = 1 ; ++ end ++ if (utils == 2) ++ fprintf ('\nNot using utMalloc, utFree, or utRealloc\n') ; ++ utils = ' -DNUTIL' ; ++ else ++ fprintf ('\nUsing utMalloc, utFree, and utRealloc\n') ; ++ utils = '' ; ++ end ++end ++ ++%------------------------------------------------------------------------------- ++% -DNPOSIX option (for sysconf and times timer routines) ++%------------------------------------------------------------------------------- ++ ++posix = '' ; ++ ++if (~pc) ++ msg = [ ... ++ '--------------------------------------------------------------\n', ... ++ '\nUMFPACK can use the POSIX routines sysconf () and times ()\n', ... ++ 'to provide CPU time and wallclock time statistics. If you do not\n', ... ++ 'have a POSIX-compliant operating system, then UMFPACK won''t\n', ... ++ 'compile. If you don''t know which option to pick, try the\n', ... ++ 'default. If you get an error saying that sysconf and/or times\n', ... ++ 'are not defined, then recompile with the non-POSIX option.\n', ... ++ '\nPlease select one of the following options:\n', ... ++ ' 1: use POSIX sysconf and times routines (default)\n', ... ++ ' 2: do not use POSIX routines\n'] ; ++ fprintf (msg) ; ++ posix = input (': ') ; ++ if (isempty (posix)) ++ posix = 1 ; ++ end ++ if (posix == 2) ++ fprintf ('\nNot using POSIX sysconf and times routines.\n') ; ++ posix = ' -DNPOSIX' ; ++ else ++ fprintf ('\nUsing POSIX sysconf and times routines.\n') ; ++ posix = '' ; ++ end ++end ++ ++%------------------------------------------------------------------------------- ++% mex command ++%------------------------------------------------------------------------------- ++ ++umfdir = sprintf ('..%sSource%s', filesep, filesep) ; ++amddir = sprintf ('..%s..%sAMD%sSource%s', filesep, filesep, filesep, filesep) ; ++incdir = sprintf ( ... ++' -I..%sInclude -I..%sSource -I..%s..%sAMD%sInclude -I..%s..%sAMD%sSource', ... ++filesep,filesep, filesep, filesep, filesep, filesep, filesep, filesep) ; ++ ++mx = sprintf ('mex -inline -O%s%s%s%s', blas, utils, posix, incdir) ; ++msg = [ ... ++ '--------------------------------------------------------------\n', ... ++ '\nCompile options:\n%s\nNow compiling. Please wait.\n'] ; ++fprintf (msg, mx) ; ++ ++% The following is adapted from GNUmakefile ++ ++%------------------------------------------------------------------------------- ++% source files ++%------------------------------------------------------------------------------- ++ ++% non-user-callable umf_*.[ch] files: ++umfch = { 'assemble', 'blas3_update', ... ++ 'build_tuples', 'create_element', ... ++ 'dump', 'extend_front', 'garbage_collection', ... ++ 'get_memory', 'init_front', 'kernel', ... ++ 'kernel_init', 'kernel_wrapup', ... ++ 'local_search', 'lsolve', 'ltsolve', ... ++ 'mem_alloc_element', 'mem_alloc_head_block', ... ++ 'mem_alloc_tail_block', 'mem_free_tail_block', ... ++ 'mem_init_memoryspace', ... ++ 'report_vector', 'row_search', 'scale_column', ... ++ 'set_stats', 'solve', 'symbolic_usage', 'transpose', ... ++ 'tuple_lengths', 'usolve', 'utsolve', 'valid_numeric', ... ++ 'valid_symbolic', 'grow_front', 'start_front', '2by2', ... ++ 'store_lu', 'scale' } ; ++ ++% non-user-callable umf_*.[ch] files, int versions only (no real/complex): ++umfint = { 'analyze', 'apply_order', 'colamd', 'free', 'fsize', ... ++ 'is_permutation', 'malloc', 'realloc', 'report_perm', ... ++ 'singletons' } ; ++ ++% non-user-callable and user-callable amd_*.[ch] files (int versions only): ++amd = { 'aat', '1', '2', 'dump', 'postorder', 'post_tree', 'defaults', ... ++ 'order', 'control', 'info', 'valid' } ; ++ ++% user-callable umfpack_*.[ch] files (real/complex): ++user = { 'col_to_triplet', 'defaults', 'free_numeric', ... ++ 'free_symbolic', 'get_numeric', 'get_lunz', ... ++ 'get_symbolic', 'numeric', 'qsymbolic', ... ++ 'report_control', 'report_info', 'report_matrix', ... ++ 'report_numeric', 'report_perm', 'report_status', ... ++ 'report_symbolic', 'report_triplet', ... ++ 'report_vector', 'solve', 'symbolic', ... ++ 'transpose', 'triplet_to_col', 'scale' ... ++ 'load_numeric', 'save_numeric', 'load_symbolic', 'save_symbolic' } ; ++ ++% user-callable umfpack_*.[ch], only one version ++generic = { 'timer', 'tictoc' } ; ++ ++M = cell (0) ; ++ ++%------------------------------------------------------------------------------- ++% Create the umfpack and amd mexFunctions for MATLAB (int versions only) ++%------------------------------------------------------------------------------- ++ ++for k = 1:length(umfint) ++ M = make (M, '%s -DDINT -c %sumf_%s.c', 'umf_%s.%s', 'umf_%s_%s.%s', ... ++ mx, umfint {k}, umfint {k}, 'm', obj, umfdir) ; ++end ++ ++rules = { [mx ' -DDINT'] , [mx ' -DZINT'] } ; ++kinds = { 'md', 'mz' } ; ++ ++for what = 1:2 ++ ++ rule = rules {what} ; ++ kind = kinds {what} ; ++ ++ M = make (M, '%s -DCONJUGATE_SOLVE -c %sumf_%s.c', 'umf_%s.%s', ... ++ 'umf_%s_%s.%s', rule, 'ltsolve', 'lhsolve', kind, obj, umfdir) ; ++ ++ M = make (M, '%s -DCONJUGATE_SOLVE -c %sumf_%s.c', 'umf_%s.%s', ... ++ 'umf_%s_%s.%s', rule, 'utsolve', 'uhsolve', kind, obj, umfdir) ; ++ ++ M = make (M, '%s -DDO_MAP -c %sumf_%s.c', 'umf_%s.%s', ... ++ 'umf_%s_%s_map_nox.%s', rule, 'triplet', 'triplet', kind, obj, umfdir) ; ++ ++ M = make (M, '%s -DDO_VALUES -c %sumf_%s.c', 'umf_%s.%s', ... ++ 'umf_%s_%s_nomap_x.%s', rule, 'triplet', 'triplet', kind, obj, umfdir) ; ++ ++ M = make (M, '%s -c %sumf_%s.c', 'umf_%s.%s', ... ++ 'umf_%s_%s_nomap_nox.%s', rule, 'triplet', 'triplet', kind, obj, ... ++ umfdir) ; ++ ++ M = make (M, '%s -DDO_MAP -DDO_VALUES -c %sumf_%s.c', 'umf_%s.%s', ... ++ 'umf_%s_%s_map_x.%s', rule, 'triplet', 'triplet', kind, obj, umfdir) ; ++ ++ M = make (M, '%s -DFIXQ -c %sumf_%s.c', 'umf_%s.%s', ... ++ 'umf_%s_%s_fixq.%s', rule, 'assemble', 'assemble', kind, obj, umfdir) ; ++ ++ M = make (M, '%s -DDROP -c %sumf_%s.c', 'umf_%s.%s', ... ++ 'umf_%s_%s_drop.%s', rule, 'store_lu', 'store_lu', kind, obj, umfdir) ; ++ ++ for k = 1:length(umfch) ++ M = make (M, '%s -c %sumf_%s.c', 'umf_%s.%s', 'umf_%s_%s.%s', ... ++ rule, umfch {k}, umfch {k}, kind, obj, umfdir) ; ++ end ++ ++ M = make (M, '%s -DWSOLVE -c %sumfpack_%s.c', 'umfpack_%s.%s', ... ++ 'umfpack_%s_w%s.%s', rule, 'solve', 'solve', kind, obj, umfdir) ; ++ ++ for k = 1:length(user) ++ M = make (M, '%s -c %sumfpack_%s.c', 'umfpack_%s.%s', ... ++ 'umfpack_%s_%s.%s', rule, user {k}, user {k}, kind, obj, umfdir) ; ++ end ++end ++ ++for k = 1:length(generic) ++ M = make (M, '%s -c %sumfpack_%s.c', 'umfpack_%s.%s', ... ++ 'umfpack_%s_%s.%s', mx, generic {k}, generic {k}, 'm', obj, umfdir) ; ++end ++ ++%---------------------------------------- ++% AMD routines (int only) ++%---------------------------------------- ++ ++for k = 1:length(amd) ++ M = make (M, '%s -DDINT -c %samd_%s.c', 'amd_%s.%s', 'amd_%s_%s.%s', ... ++ mx, amd {k}, amd {k}, 'm', obj, amddir) ; ++end ++ ++%---------------------------------------- ++% compile the umfpack mexFunction ++%---------------------------------------- ++ ++C = sprintf ('%s -output umfpack umfpackmex.c', mx) ; ++for i = 1:length (M) ++ C = [C ' ' (M {i})] ; ++end ++C = [C ' ' blas_lib] ; ++cmd (C) ; ++ ++%---------------------------------------- ++% delete the object files ++%---------------------------------------- ++ ++for i = 1:length (M) ++ rmfile (M {i}) ; ++end ++ ++%---------------------------------------- ++% compile the luflop mexFunction ++%---------------------------------------- ++ ++cmd (sprintf ('%s -output luflop luflopmex.c', mx)) ; ++ ++fprintf ('\n\nCompilation has completed. Now trying the umfpack_simple demo.\n'); ++umfpack_simple ++ ++%------------------------------------------------------------------------------- ++% rmfile: delete a file, but only if it exists ++%------------------------------------------------------------------------------- ++ ++function rmfile (file) ++if (length (dir (file)) > 0) ++ delete (file) ; ++end ++ ++%------------------------------------------------------------------------------- ++% cpfile: copy the src file to the filename dst, overwriting dst if it exists ++%------------------------------------------------------------------------------- ++ ++function cpfile (src, dst) ++rmfile (dst) ++if (length (dir (src)) == 0) ++ help umfpack_make ++ error (sprintf ('File does not exist: %s\n', src)) ; ++end ++copyfile (src, dst) ; ++ ++%------------------------------------------------------------------------------- ++% mvfile: move the src file to the filename dst, overwriting dst if it exists ++%------------------------------------------------------------------------------- ++ ++function mvfile (src, dst) ++cpfile (src, dst) ; ++rmfile (src) ; ++ ++%------------------------------------------------------------------------------- ++% cmd: display and execute a command ++%------------------------------------------------------------------------------- ++ ++function cmd (s) ++fprintf ('.') ; ++eval (s) ; ++ ++%------------------------------------------------------------------------------- ++% make: execute a "make" command for a source file ++%------------------------------------------------------------------------------- ++ ++function M = make (M, s, src, dst, rule, file1, file2, kind, obj, srcdir) ++cmd (sprintf (s, rule, srcdir, file1)) ; ++src = sprintf (src, file1, obj) ; ++dst = sprintf (dst, kind, file2, obj) ; ++mvfile (src, dst) ; ++M {end + 1} = dst ; ++ +diff -uNr UMFPACKv4.4.orig/UMFPACK/OCTAVE/umfpack_report.m UMFPACK/UMFPACK/OCTAVE/umfpack_report.m +--- UMFPACKv4.4.orig/UMFPACK/OCTAVE/umfpack_report.m 1970-01-01 01:00:00.000000000 +0100 ++++ UMFPACK/UMFPACK/OCTAVE/umfpack_report.m 2004-12-30 01:58:46.000000000 +0100 +@@ -0,0 +1,346 @@ ++function umfpack_report (Control, Info) ++% UMFPACK_REPORT ++% ++% umfpack_report (Control, Info) ; ++% ++% Prints the current Control settings for umfpack, and the statistical ++% information returned by umfpack in the Info array. If Control is ++% an empty matrix, then the default control settings are printed. ++% ++% Control is 20-by-1, and Info is 90-by-1. Not all entries are used. ++% ++% Alternative usages: ++% ++% umfpack_report ([ ], Info) ; print the default control parameters ++% and the Info array. ++% umfpack_report (Control) ; print the control parameters only. ++% umfpack_report ; print the default control parameters ++% and an empty Info array. ++% ++% See also umfpack, umfpack_make, umfpack_details, ++% umfpack_demo, and umfpack_simple. ++ ++% UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A. ++% Davis. All Rights Reserved. See ../README for License. ++ ++%------------------------------------------------------------------------------- ++% get inputs, use defaults if input arguments not present ++%------------------------------------------------------------------------------- ++ ++% The contents of Control and Info are defined in umfpack.h ++if (nargin < 1) ++ Control = [] ; ++end ++if (nargin < 2) ++ Info = [] ; ++end ++if (isempty (Control)) ++ Control = umfpack ; ++end ++if (isempty (Info)) ++ Info = [ 0 (-ones (1, 89)) ] ; ++end ++ ++%------------------------------------------------------------------------------- ++% control settings ++%------------------------------------------------------------------------------- ++ ++fprintf ('\nUMFPACK Version 4.3: Control settings:\n\n') ; ++fprintf (' Control (1): print level: %d\n', Control (1)) ; ++fprintf (' Control (2): dense row parameter: %g\n', Control (2)) ; ++fprintf (' "dense" rows have > max (16, (%g)*16*sqrt(n_col)) entries\n', Control (2)) ; ++fprintf (' Control (3): dense column parameter: %g\n', Control (3)) ; ++fprintf (' "dense" columns have > max (16, (%g)*16*sqrt(n_row)) entries\n', Control (3)) ; ++fprintf (' Control (4): pivot tolerance: %g\n', Control (4)) ; ++fprintf (' Control (5): max block size for dense matrix kernels: %d\n', Control (5)) ; ++prstrat (' Control (6): strategy: %g ', Control (6)) ; ++fprintf (' Control (7): initial allocation ratio: %g\n', Control (7)) ; ++fprintf (' Control (8): max iterative refinement steps: %d\n', Control (8)) ; ++fprintf (' Control (13): 2-by-2 pivot tolerance: %g\n', Control (13)) ; ++fprintf (' Control (14): Q fixed during numeric factorization: %g ', Control (14)) ; ++if (Control (14) > 0) ++ fprintf ('(yes)\n') ; ++elseif (Control (14) < 0) ++ fprintf ('(no)\n') ; ++else ++ fprintf ('(auto)\n') ; ++end ++fprintf (' Control (15): AMD dense row/column parameter: %g\n', Control (15)) ; ++fprintf (' "dense" rows/columns in A+A'' have > max (16, (%g)*sqrt(n)) entries.\n', Control (15)) ; ++fprintf (' Only used if the AMD ordering is used.\n') ; ++fprintf (' Control (16): diagonal pivot tolerance: %g\n', Control (16)) ; ++fprintf (' Only used if diagonal pivoting is attempted.\n') ; ++ ++fprintf (' Control (17): scaling option: %g ', Control (17)) ; ++if (Control (17) == 0) ++ fprintf ('(none)\n') ; ++elseif (Control (17) == 2) ++ fprintf ('(scale the matrix by\n') ; ++ fprintf (' dividing each row by max. abs. value in each row)\n') ; ++else ++ fprintf ('(scale the matrix by\n') ; ++ fprintf (' dividing each row by sum of abs. values in each row)\n') ; ++end ++ ++fprintf (' Control (18): frontal matrix allocation ratio: %g\n', Control (18)) ; ++fprintf (' Control (19): drop tolerance: %g\n', Control (19)) ; ++fprintf (' Control (20): AMD and COLAMD aggressive absorption: %g ', Control (20)) ; ++yes_no (Control (20)) ; ++ ++% compile-time options: ++ ++fprintf ('\n The following options can only be changed at compile-time:\n') ; ++ ++if (Control (9) == 1) ++ fprintf (' Control (9): compiled to use the BLAS\n') ; ++else ++ fprintf (' Control (9): compiled without the BLAS\n') ; ++ fprintf (' (you will not get the best possible performance)\n') ; ++end ++ ++if (Control (10) == 1) ++ fprintf (' Control (10): compiled for MATLAB\n') ; ++elseif (Control (10) == 2) ++ fprintf (' Control (10): compiled for MATLAB\n') ; ++ fprintf (' Uses internal utMalloc, utFree, utRealloc, utPrintf\n') ; ++ fprintf (' utDivideComplex, and utFdlibm_hypot routines.\n') ; ++else ++ fprintf (' Control (10): not compiled for MATLAB\n') ; ++ fprintf (' Uses ANSI C malloc, free, realloc, and printf\n') ; ++ fprintf (' instead of mxMalloc, mxFree, mxRealloc, and mexPrintf.\n') ; ++ fprintf (' Printing will be in terms of 0-based matrix indexing,\n') ; ++ fprintf (' not 1-based as is expected in MATLAB. Diary output may\n') ; ++ fprintf (' not be properly recorded.\n') ; ++end ++ ++if (Control (11) == 2) ++ fprintf (' Control (11): uses POSIX times ( ) to get CPU time and wallclock time.\n') ; ++elseif (Control (11) == 1) ++ fprintf (' Control (11): uses getrusage to get CPU time.\n') ; ++else ++ fprintf (' Control (11): uses ANSI C clock to get CPU time.\n') ; ++ fprintf (' The CPU time may wrap around, type "help cputime".\n') ; ++end ++ ++if (Control (12) == 1) ++ fprintf (' Control (12): compiled with debugging enabled\n') ; ++ fprintf (' ###########################################\n') ; ++ fprintf (' ### This will be exceedingly slow! ########\n') ; ++ fprintf (' ###########################################\n') ; ++ if (Control (10) == 1) ++ fprintf (' Uses mxAssert.\n') ; ++ elseif (Control (10) == 2) ++ fprintf (' Uses utAssert.\n') ; ++ else ++ fprintf (' Uses ANSI C assert instead of mxAssert.\n') ; ++ end ++else ++ fprintf (' Control (12): compiled for normal operation (no debugging)\n') ; ++end ++ ++%------------------------------------------------------------------------------- ++% Info: ++%------------------------------------------------------------------------------- ++ ++if (nargin == 1) ++ return ++end ++ ++status = Info (1) ; ++fprintf ('\nUMFPACK status: Info (1): %d, ', status) ; ++ ++if (status == 0) ++ fprintf ('OK\n') ; ++elseif (status == 1) ++ fprintf ('WARNING matrix is singular\n') ; ++elseif (status == -1) ++ fprintf ('ERROR out of memory\n') ; ++elseif (status == -3) ++ fprintf ('ERROR numeric LU factorization is invalid\n') ; ++elseif (status == -4) ++ fprintf ('ERROR symbolic LU factorization is invalid\n') ; ++elseif (status == -5) ++ fprintf ('ERROR required argument is missing\n') ; ++elseif (status == -6) ++ fprintf ('ERROR n <= 0\n') ; ++elseif (status <= -7 & status >= -12 | status == -14) ++ fprintf ('ERROR matrix A is corrupted\n') ; ++elseif (status == -13) ++ fprintf ('ERROR invalid system\n') ; ++elseif (status == -15) ++ fprintf ('ERROR invalid permutation\n') ; ++elseif (status == -911) ++ fprintf ('ERROR internal error!\n') ; ++ fprintf ('Please report this error to Tim Davis (davis@cise.ufl.edu)\n') ; ++else ++ fprintf ('ERROR unrecognized error. Info array corrupted\n') ; ++end ++ ++fprintf (' (a -1 means the entry has not been computed):\n') ; ++ ++fprintf ('\n Basic statistics:\n') ; ++fprintf (' Info (2): %d, # of rows of A\n', Info (2)) ; ++fprintf (' Info (17): %d, # of columns of A\n', Info (17)) ; ++fprintf (' Info (3): %d, nnz (A)\n', Info (3)) ; ++fprintf (' Info (4): %d, Unit size, in bytes, for memory usage reported below\n', Info (4)) ; ++fprintf (' Info (5): %d, size of int (in bytes)\n', Info (5)) ; ++fprintf (' Info (6): %d, size of long (in bytes)\n', Info (6)) ; ++fprintf (' Info (7): %d, size of pointer (in bytes)\n', Info (7)) ; ++fprintf (' Info (8): %d, size of numerical entry (in bytes)\n', Info (8)) ; ++ ++fprintf ('\n Pivots with zero Markowitz cost removed to obtain submatrix S:\n') ; ++fprintf (' Info (57): %d, # of pivots with one entry in pivot column\n', Info (57)) ; ++fprintf (' Info (58): %d, # of pivots with one entry in pivot row\n', Info (58)) ; ++fprintf (' Info (59): %d, # of rows/columns in submatrix S (if square)\n', Info (59)) ; ++fprintf (' Info (60): %d ') ; ++if (Info (60) > 0) ++ fprintf ('submatrix S square and diagonal preserved\n') ; ++elseif (Info (60) == 0) ++ fprintf ('submatrix S not square or diagonal not preserved\n') ; ++else ++ fprintf ('\n') ; ++end ++fprintf (' Info (9): %d, # of "dense" rows in S\n', Info (9)) ; ++fprintf (' Info (10): %d, # of empty rows in S\n', Info (10)) ; ++fprintf (' Info (11): %d, # of "dense" columns in S\n', Info (11)) ; ++fprintf (' Info (12): %d, # of empty columns in S\n', Info (12)) ; ++fprintf (' Info (34): %g, symmetry of pattern of S\n', Info (34)) ; ++fprintf (' Info (35): %d, # of off-diagonal nonzeros in S+S''\n', Info (35)) ; ++fprintf (' Info (36): %d, nnz (diag (S))\n', Info (36)) ; ++ ++fprintf ('\n 2-by-2 pivoting to place large entries on diagonal:\n') ; ++fprintf (' Info (52): %d, # of small diagonal entries of S\n', Info (52)) ; ++fprintf (' Info (53): %d, # of unmatched small diagonal entries\n', Info (53)) ; ++fprintf (' Info (54): %g, symmetry of P2*S\n', Info (54)) ; ++fprintf (' Info (55): %d, # of off-diagonal entries in (P2*S)+(P2*S)''\n', Info (55)) ; ++fprintf (' Info (56): %d, nnz (diag (P2*S))\n', Info (56)) ; ++ ++fprintf ('\n AMD results, for strict diagonal pivoting:\n') ; ++fprintf (' Info (37): %d, est. nz in L and U\n', Info (37)) ; ++fprintf (' Info (38): %g, est. flop count\n', Info (38)) ; ++fprintf (' Info (39): %g, # of "dense" rows in S+S''\n', Info (39)) ; ++fprintf (' Info (40): %g, est. max. nz in any column of L\n', Info (40)) ; ++ ++fprintf ('\n Final strategy selection, based on the analysis above:\n') ; ++prstrat (' Info (19): %d, strategy used ', Info (19)) ; ++fprintf (' Info (20): %d, ordering used ', Info (20)) ; ++if (Info (20) == 0) ++ fprintf ('(COLAMD on A)\n') ; ++elseif (Info (20) == 1) ++ fprintf ('(AMD on A+A'')\n') ; ++elseif (Info (20) == 2) ++ fprintf ('(provided by user)\n') ; ++else ++ fprintf ('(undefined ordering option)\n') ; ++end ++fprintf (' Info (32): %d, Q fixed during numeric factorization: ', Info (32)) ; ++yes_no (Info (32)) ; ++fprintf (' Info (33): %d, prefer diagonal pivoting: ', Info (33)) ; ++yes_no (Info (33)) ; ++ ++fprintf ('\n symbolic analysis time and memory usage:\n') ; ++fprintf (' Info (13): %d, defragmentations during symbolic analysis\n', Info (13)) ; ++fprintf (' Info (14): %d, memory used during symbolic analysis (Units)\n', Info (14)) ; ++fprintf (' Info (15): %d, final size of symbolic factors (Units)\n', Info (15)) ; ++fprintf (' Info (16): %.2f, symbolic analysis CPU time (seconds)\n', Info (16)) ; ++fprintf (' Info (18): %.2f, symbolic analysis wall clock time (seconds)\n', Info (18)) ; ++ ++fprintf ('\n Estimates computed in the symbolic analysis:\n') ; ++fprintf (' Info (21): %d, est. size of LU factors (Units)\n', Info (21)) ; ++fprintf (' Info (22): %d, est. total peak memory usage (Units)\n', Info (22)) ; ++fprintf (' Info (23): %d, est. factorization flop count\n', Info (23)) ; ++fprintf (' Info (24): %d, est. nnz (L)\n', Info (24)) ; ++fprintf (' Info (25): %d, est. nnz (U)\n', Info (25)) ; ++fprintf (' Info (26): %d, est. initial size, variable-part of LU (Units)\n', Info (26)) ; ++fprintf (' Info (27): %d, est. peak size, of variable-part of LU (Units)\n', Info (27)) ; ++fprintf (' Info (28): %d, est. final size, of variable-part of LU (Units)\n', Info (28)) ; ++fprintf (' Info (29): %d, est. max frontal matrix size (# of entries)\n', Info (29)) ; ++fprintf (' Info (30): %d, est. max # of rows in frontal matrix\n', Info (30)) ; ++fprintf (' Info (31): %d, est. max # of columns in frontal matrix\n', Info (31)) ; ++ ++fprintf ('\n Computed in the numeric factorization (estimates shown above):\n') ; ++fprintf (' Info (41): %d, size of LU factors (Units)\n', Info (41)) ; ++fprintf (' Info (42): %d, total peak memory usage (Units)\n', Info (42)) ; ++fprintf (' Info (43): %d, factorization flop count\n', Info (43)) ; ++fprintf (' Info (44): %d, nnz (L)\n', Info (44)) ; ++fprintf (' Info (45): %d, nnz (U)\n', Info (45)) ; ++fprintf (' Info (46): %d, initial size of variable-part of LU (Units)\n', Info (46)) ; ++fprintf (' Info (47): %d, peak size of variable-part of LU (Units)\n', Info (47)) ; ++fprintf (' Info (48): %d, final size of variable-part of LU (Units)\n', Info (48)) ; ++fprintf (' Info (49): %d, max frontal matrix size (# of numerical entries)\n', Info (49)) ; ++fprintf (' Info (50): %d, max # of rows in frontal matrix\n', Info (50)) ; ++fprintf (' Info (51): %d, max # of columns in frontal matrix\n', Info (51)) ; ++ ++fprintf ('\n Computed in the numeric factorization (no estimates computed a priori):\n') ; ++fprintf (' Info (61): %d, defragmentations during numeric factorization\n', Info (61)) ; ++fprintf (' Info (62): %d, reallocations during numeric factorization\n', Info (62)) ; ++fprintf (' Info (63): %d, costly reallocations during numeric factorization\n', Info (63)) ; ++fprintf (' Info (64): %d, integer indices in compressed pattern of L and U\n', Info (64)) ; ++fprintf (' Info (65): %d, numerical values stored in L and U\n', Info (65)) ; ++fprintf (' Info (66): %.2f, numeric factorization CPU time (seconds)\n', Info (66)) ; ++fprintf (' Info (76): %.2f, numeric factorization wall clock time (seconds)\n', Info (76)) ; ++if (Info (66) > 0.05 & Info (43) > 0) ++fprintf (' mflops in numeric factorization phase: %.2f\n', 1e-6 * Info (43) / Info (66)) ; ++end ++fprintf (' Info (67): %d, nnz (diag (U))\n', Info (67)) ; ++fprintf (' Info (68): %g, reciprocal condition number estimate\n', Info (68)) ; ++fprintf (' Info (69): %g, matrix was ', Info (69)) ; ++if (Info (69) == 0) ++ fprintf ('not scaled\n') ; ++elseif (Info (69) == 2) ++ fprintf ('scaled (row max)\n') ; ++else ++ fprintf ('scaled (row sum)\n') ; ++end ++fprintf (' Info (70): %g, min. scale factor of rows of A\n', Info (70)) ; ++fprintf (' Info (71): %g, max. scale factor of rows of A\n', Info (71)) ; ++fprintf (' Info (72): %g, min. abs. on diagonal of U\n', Info (72)) ; ++fprintf (' Info (73): %g, max. abs. on diagonal of U\n', Info (73)) ; ++fprintf (' Info (74): %g, initial allocation parameter used\n', Info (74)) ; ++fprintf (' Info (75): %g, # of forced updates due to frontal growth\n', Info (75)) ; ++fprintf (' Info (77): %d, # of off-diaogonal pivots\n', Info (77)) ; ++fprintf (' Info (78): %d, nnz (L), if no small entries dropped\n', Info (78)) ; ++fprintf (' Info (79): %d, nnz (U), if no small entries dropped\n', Info (79)) ; ++fprintf (' Info (80): %d, # of small entries dropped\n', Info (80)) ; ++ ++fprintf ('\n Computed in the solve step:\n') ; ++fprintf (' Info (81): %d, iterative refinement steps taken\n', Info (81)) ; ++fprintf (' Info (82): %d, iterative refinement steps attempted\n', Info (82)) ; ++fprintf (' Info (83): %g, omega(1), sparse-backward error estimate\n', Info (83)) ; ++fprintf (' Info (84): %g, omega(2), sparse-backward error estimate\n', Info (84)) ; ++fprintf (' Info (85): %d, solve flop count\n', Info (85)) ; ++fprintf (' Info (86): %.2f, solve CPU time (seconds)\n', Info (86)) ; ++fprintf (' Info (87): %.2f, solve wall clock time (seconds)\n', Info (87)) ; ++ ++fprintf ('\n Info (88:90): unused\n\n') ; ++ ++%------------------------------------------------------------------------------- ++ ++function prstrat (fmt, strategy) ++fprintf (fmt, strategy) ; ++if (strategy == 1) ++ fprintf ('(unsymmetric)\n') ; ++ fprintf (' Q = COLAMD (A), Q refined during numerical\n') ; ++ fprintf (' factorization, and no attempt at diagonal pivoting.\n') ; ++elseif (strategy == 2) ++ fprintf ('(symmetric, with 2-by-2 pivoting)\n') ; ++ fprintf (' P2 = row permutation to place large values on the diagonal\n') ; ++ fprintf (' Q = AMD (P2*A+(P2*A)''), Q not refined during numeric factorization,\n') ; ++ fprintf (' and diagonal pivoting attempted.\n') ; ++elseif (strategy == 3) ++ fprintf ('(symmetric)\n') ; ++ fprintf (' Q = AMD (A+A''), Q not refined during numeric factorization,\n') ; ++ fprintf (' and diagonal pivoting (P=Q'') attempted.\n') ; ++else ++ strategy = 0 ; ++ fprintf ('(auto)\n') ; ++end ++ ++%------------------------------------------------------------------------------- ++ ++function yes_no (s) ++if (s == 0) ++ fprintf ('(no)\n') ; ++else ++ fprintf ('(yes)\n') ; ++end +diff -uNr UMFPACKv4.4.orig/UMFPACK/OCTAVE/umfpack_simple.m UMFPACK/UMFPACK/OCTAVE/umfpack_simple.m +--- UMFPACKv4.4.orig/UMFPACK/OCTAVE/umfpack_simple.m 1970-01-01 01:00:00.000000000 +0100 ++++ UMFPACK/UMFPACK/OCTAVE/umfpack_simple.m 2004-12-30 01:58:46.000000000 +0100 +@@ -0,0 +1,61 @@ ++% umfpack_simple: a simple demo of UMFPACK ++% ++% UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A. ++% Davis. All Rights Reserved. ++% ++% UMFPACK License: ++% ++% Your use or distribution of UMFPACK or any modified version of ++% UMFPACK implies that you agree to this License. ++% ++% THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY ++% EXPRESSED OR IMPLIED. ANY USE IS AT YOUR OWN RISK. ++% ++% Permission is hereby granted to use or copy this program, 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 UMFPACK or any modified version of UMFPACK 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. This ++% software was developed with support from the National Science Foundation, ++% and is provided to you free of charge. ++% ++% Availability: http://www.cise.ufl.edu/research/sparse/umfpack ++% ++% See also: umfpack, umfpack_details ++ ++help umfpack_simple ++i = input ('Hit enter to agree to the above License: ', 's') ; ++if (~isempty (i)) ++ error ('terminating') ; ++end ++ ++format short ++ ++A = [ ++ 2 3 0 0 0 ++ 3 0 4 0 6 ++ 0 -1 -3 2 0 ++ 0 0 1 0 0 ++ 0 4 2 0 1 ++] ++ ++A = sparse (A) ; ++ ++b = [8 45 -3 3 19]' ++ ++fprintf ('Solution to Ax=b via UMFPACK:\n') ; ++fprintf ('x1 = umfpack (A, ''\\'', b)\n') ; ++ ++x1 = umfpack (A, '\\', b) ++ ++fprintf ('Solution to Ax=b via OCTAVE:\n') ; ++fprintf ('x2 = A\\b\n') ; ++ ++x2 = A\b ++ ++fprintf ('norm (x1-x2) should be small: %g\n', norm (x1-x2)) ; ++ ++fprintf ('Type ''umfpack_demo'' for a full demo of UMFPACK\n') ; +diff -uNr UMFPACKv4.4.orig/UMFPACK/OCTAVE/umfpack_simple.m.out UMFPACK/UMFPACK/OCTAVE/umfpack_simple.m.out +--- UMFPACKv4.4.orig/UMFPACK/OCTAVE/umfpack_simple.m.out 1970-01-01 01:00:00.000000000 +0100 ++++ UMFPACK/UMFPACK/OCTAVE/umfpack_simple.m.out 2004-12-30 01:58:46.000000000 +0100 +@@ -0,0 +1,79 @@ ++octave:4> umfpack_simple ++umfpack_simple is the file: /home/dbateman/octave/devel/octave-sparse/UMFPACKv4.3/UMFPACK/OCTAVE/umfpack_simple.m ++ ++umfpack_simple: a simple demo of UMFPACK ++ ++UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A. ++Davis. All Rights Reserved. ++ ++UMFPACK License: ++ ++ Your use or distribution of UMFPACK or any modified version of ++ UMFPACK implies that you agree to this License. ++ ++ THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY ++ EXPRESSED OR IMPLIED. ANY USE IS AT YOUR OWN RISK. ++ ++ Permission is hereby granted to use or copy this program, 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 UMFPACK or any modified version of UMFPACK 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. This ++ software was developed with support from the National Science Foundation, ++ and is provided to you free of charge. ++ ++Availability: http://www.cise.ufl.edu/research/sparse/umfpack ++ ++See also: umfpack, umfpack_details ++ ++ ++Additional help for built-in functions, operators, and variables ++is available in the on-line version of the manual. Use the command ++`help -i ' to search the manual index. ++ ++Help and information about Octave is also available on the WWW ++at http://www.octave.org and via the help@octave.org ++mailing list. ++Hit enter to agree to the above License: ++A = ++ ++ 2 3 0 0 0 ++ 3 0 4 0 6 ++ 0 -1 -3 2 0 ++ 0 0 1 0 0 ++ 0 4 2 0 1 ++ ++b = ++ ++ 8 ++ 45 ++ -3 ++ 3 ++ 19 ++ ++Solution to Ax=b via UMFPACK: ++x1 = umfpack (A, '\', b) ++x1 = ++ ++ 1.00000 ++ 2.00000 ++ 3.00000 ++ 4.00000 ++ 5.00000 ++ ++Solution to Ax=b via OCTAVE: ++x2 = A\b ++x2 = ++ ++ 1.00000 ++ 2.00000 ++ 3.00000 ++ 4.00000 ++ 5.00000 ++ ++norm (x1-x2) should be small: 0 ++Type 'umfpack_demo' for a full demo of UMFPACK ++octave:5> diary off +diff -uNr UMFPACKv4.4.orig/UMFPACK/OCTAVE/umfpack_solve.m UMFPACK/UMFPACK/OCTAVE/umfpack_solve.m +--- UMFPACKv4.4.orig/UMFPACK/OCTAVE/umfpack_solve.m 1970-01-01 01:00:00.000000000 +0100 ++++ UMFPACK/UMFPACK/OCTAVE/umfpack_solve.m 2004-12-30 01:58:46.000000000 +0100 +@@ -0,0 +1,97 @@ ++function x = umfpack_solve (arg1, op, arg2, Control) ++% UMFPACK_SOLVE ++% ++% x = umfpack_solve (A, '\', b, Control) ++% x = umfpack_solve (b, '/', A, Control) ++% ++% Computes x = A\b, or b/A, where A is square. Uses UMFPACK if A is sparse. ++% The Control argument is optional. ++% ++% See also umfpack, umfpack_make, umfpack_details, umfpack_report, ++% and umfpack_simple. ++ ++% UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A. ++% Davis. All Rights Reserved. Type umfpack_details for License. ++ ++%------------------------------------------------------------------------------- ++% check inputs and get default control parameters ++%------------------------------------------------------------------------------- ++ ++if (op == '\\') ++ A = arg1 ; ++ b = arg2 ; ++elseif (op == '/') ++ A = arg2 ; ++ b = arg1 ; ++else ++ help umfack_solve ++ error ('umfpack_solve: unrecognized operator') ; ++end ++ ++[m n] = size (A) ; ++if (m ~= n) ++ help umfpack_solve ++ error ('umfpack_solve: A must be square') ; ++end ++ ++[m1 n1] = size (b) ; ++if ((op == '\\' & n ~= m1) | (op == '/' & n1 ~= m)) ++ help umfpack_solve ++ error ('umfpack_solve: b has the wrong dimensions') ; ++end ++ ++if (nargin < 4) ++ Control = umfpack ; ++end ++ ++%------------------------------------------------------------------------------- ++% solve the system ++%------------------------------------------------------------------------------- ++ ++if (op == '\\') ++ ++ if (~issparse (A)) ++ ++ % A is not sparse, so just use MATLAB ++ x = A\b ; ++ ++ elseif (n1 == 1 & ~issparse (b)) ++ ++ % the UMFPACK '\' requires b to be a dense column vector ++ x = umfpack (A, '\\', b, Control) ; ++ ++ else ++ ++ % factorize with UMFPACK and do the forward/back solves in MATLAB ++ [L, U, P, Q, R] = umfpack (A, Control) ; ++ keyboard ++ x = Q * (U \ (L \ (P * (R \ b)))) ; ++ ++ end ++ ++else ++ ++ if (~issparse (A)) ++ ++ % A is not sparse, so just use MATLAB ++ x = b/A ; ++ ++ elseif (m1 == 1 & ~issparse (b)) ++ ++ % the UMFPACK '/' requires b to be a dense column vector ++ x = umfpack (b, '/', A, Control) ; ++ ++ else ++ ++ % factorize with UMFPACK and do the forward/back solves in MATLAB ++ % this mimics the behavior of x = b/A, except for the row scaling ++ [L, U, P, Q, R] = umfpack (A.', Control) ; ++ x = (Q * (U \ (L \ (P * (R \ (b.')))))).' ; ++ ++ % an alternative method: ++ % [L, U, P, Q, r] = umfpack (A, Control) ; ++ % x = (R \ (P' * (L.' \ (U.' \ (Q' * b.'))))).' ; ++ ++ end ++ ++end +diff -uNr UMFPACKv4.4.orig/AMD/OCTAVE/amd.cc UMFPACK/AMD/OCTAVE/amd.cc +--- UMFPACKv4.4.orig/AMD/OCTAVE/amd.cc 1970-01-01 01:00:00.000000000 +0100 ++++ UMFPACK/AMD/OCTAVE/amd.cc 2005-02-01 21:51:23.944874478 +0100 +@@ -0,0 +1,299 @@ ++/* ++ ++Copyright (C) 2004 David Bateman ++ ++This program is free software; you can redistribute it and/or modify it ++under the terms of the GNU General Public License as published by the ++Free Software Foundation; either version 2, or (at your option) any ++later version. ++ ++This program is distributed in the hope that it will be useful, but WITHOUT ++ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++for more details. ++ ++You should have received a copy of the GNU General Public License ++along with this program; see the file COPYING. If not, write to the Free ++Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++ ++In addition to the terms of the GPL, you are permitted to link ++this program with any Open Source program, as defined by the ++Open Source Initiative (www.opensource.org) ++ ++*/ ++ ++/* ++ ++This is the Octave interface to the UMFPACK AMD code, which bore the following ++copyright ++ ++ AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis, ++ Patrick R. Amestoy, and Iain S. Duff. See ../README for License. ++ email: davis@cise.ufl.edu CISE Department, Univ. of Florida. ++ web: http://www.cise.ufl.edu/research/sparse/amd ++ -------------------------------------------------------------------------- ++ ++ Acknowledgements: This work was supported by the National Science ++ Foundation, under grants ASC-9111263, DMS-9223088, and CCR-0203270. ++ ++*/ ++ ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++ ++#include "ov-re-sparse.h" ++#include "ov-cx-sparse.h" ++ ++// External AMD functions in C ++extern "C" { ++#include "amd.h" ++} ++ ++DEFUN_DLD (amd, args, nargout, ++ "-*- texinfo -*-\n\ ++@deftypefn {Loadable Function} {@var{p} =} amd (@var{s})\n\ ++@deftypefnx {Loadable Function} {@var{Control} =} amd ()\n\ ++@deftypefnx {Loadable Function} {[@var{p}, @var{info}] =} amd (@var{s})\n\ ++\n\ ++AMD Approximate minimum degree permutation. Returns the approximate\n\ ++minimum degree permutation vector for the sparse matrix\n\ ++@code{@var{c} = @var{S} + @var{S}'}. The Cholesky factorization of\n\ ++@code{@var{c} (@var{p}, @var{p})}, or @code{@var{s} (@var{p}, @var{p})},\n\ ++tends to be sparser than that of @var{c} or @var{s}.\n\ ++@var{s} must be square. If @var{s} is full, @code{amd (@var{S})} is\n\ ++equivalent to @code{amd (sparse (@var{s}))}.\n\ ++\n\ ++@table @asis\n\ ++@item @var{Control} (1)\n\ ++If S is n-by-n, then rows/columns with more than\n\ ++@code{@dfn{max} (16, (@var{Control} (1)) * @dfn{sqrt} (@var{n}))} entries\n\ ++in @code{@var{s} + @var{S}'} are considered @emph{dense}, and ignored during\n\ ++ordering. They are placed last in the output permutation. The default is\n\ ++10.0 if @var{Control} is not present.\n\ ++@item @var{Control} (2)\n\ ++If nonzero, then aggressive absorption is performed. This is the default if\n\ ++@var{Control} is not present.\n\ ++@item @var{Control} (3)\n\ ++If nonzero, print statistics about the ordering.\n\ ++@end table\n\ ++\n\ ++@table @asis\n\ ++@item @var{Info} (1)\n\ ++status (0: ok, -1: out of memory, -2: matrix invalid)\n\ ++@item @var{Info} (2)\n\ ++@code{@var{n} = size (@var{a}, 1)}\n\ ++@item @var{Info} (3)\n\ ++@code{nnz (A)}\n\ ++@item @var{Info} (4)\n\ ++The symmetry of the matrix @var{s} (0.0 means purely unsymmetric, 1.0 means\n\ ++purely symmetric). Computed as: @code{@var{b} = tril (@var{s}, -1) +\n\ ++triu (@var{s}, 1); @var{symmetry} = nnz (@var{b} & @var{b}')\n\ ++/ nnz (@var{b});}\n\ ++@item @var{Info} (5)\n\ ++@code{nnz (diag (@var{s}))}\n\ ++@item @var{Info} (6)\n\ ++@dfn{nnz} in @code{@var{s} + @var{s}'}, excluding the diagonal\n\ ++(= @code{nnz (@var{b} + @var{b}')})\n\ ++@item @var{Info} (7)\n\ ++Number of @emph{dense} rows/columns in @code{@var{s} + @var{s}'}\n\ ++@item @var{Info} (8)\n\ ++The amount of memory used by AMD, in bytes\n\ ++@item @var{Info} (9)\n\ ++The number of memory compactions performed by AMD\n\ ++@end table\n\ ++\n\ ++The following statistics are slight upper bounds because of the\n\ ++approximate degree in AMD. The bounds are looser if @emph{dense}\n\ ++rows/columns are ignored during ordering @code{(@var{Info} (7) > 0)}.\n\ ++The statistics are for a subsequent factorization of the matrix\n\ ++@code{@var{c} (@var{p},@var{p})}. The LU factorization statistics assume\n \ ++no pivoting.\n\ ++\n\ ++@table @asis\n\ ++@item @var{Info} (10)\n\ ++The number of nonzeros in L, excluding the diagonal\n\ ++@item @var{Info} (11)\n\ ++The number of divide operations for LL', LDL', or LU\n\ ++@item @var{Info (12)}\n\ ++The number of multiply-subtract pairs for LL' or LDL'\n\ ++@item @var{Info} (13)\n\ ++The number of multiply-subtract pairs for LU\n\ ++@item @var{Info} (14)\n\ ++The max number of nonzeros in any column of L (incl. diagonal)\n\ ++@item @var{Info} (15:20)\n\ ++unused, reserved for future use\n\ ++@end table\n\ ++\n\ ++An assembly tree post-ordering is performed, which is typically the same\n\ ++as an elimination tree post-ordering. It is not always identical because\n\ ++of the approximate degree update used, and because @emph{dense} rows/columns\n\ ++do not take part in the post-order. It well-suited for a subsequent\n\ ++@dfn{chol}, however. If you require a precise elimination tree\n\ ++post-ordering, then do:\n\ ++\n\ ++@group\n\ ++ @var{p} = @dfn{amd} (@var{s});\n\ ++ % skip this if S already symmetric\n\ ++ @var{c} = spones (@var{s}) + spones (@var{s}');\n\ ++ [@var{ignore}, @var{q}] = sparsfun ('symetree', @var{c} (@var{p}, @var{p}));\n\ ++ @var{p} = @var{p} (@var{q});\n\ ++@end group\n\ ++\n\ ++AMD Version 1.1 (Jan. 21, 2004), Copyright @copyright{} 2004 by\n\ ++Timothy A. Davis, Patrick R. Amestoy, and Iain S. Duff.\n\ ++\n\ ++email: davis@@cise.ufl.edu (CISE Department, Univ. of Florida).\n\ ++\n\ ++web: http://www.cise.ufl.edu/research/sparse/amd\n\ ++\n\ ++Acknowledgements: This work was supported by the National Science\n\ ++Foundation, under grants ASC-9111263, DMS-9223088, and CCR-0203270.\n\ ++@end deftypefn") ++{ ++ int nargin = args.length (); ++ octave_value_list retval; ++ int spumoni = 0; ++ ++ if (nargin > 2 || nargout > 2) ++ usage ("p = amd (A) or [p, Info] = amd (A, Control)"); ++ else if (nargin == 0) ++ { ++ // Get the default control parameter, and return ++ NDArray control (dim_vector (AMD_CONTROL, 1)); ++ double *control_ptr = control.fortran_vec (); ++ amd_defaults (control_ptr); ++ if (nargout == 0) ++ amd_control (control_ptr); ++ else ++ retval(0) = control; ++ } ++ else ++ { ++ NDArray control (dim_vector (AMD_CONTROL, 1)); ++ double *control_ptr = control.fortran_vec (); ++ amd_defaults (control_ptr); ++ ++ if (nargin > 1) ++ { ++ NDArray control_in = args(1).array_value(); ++ ++ if (error_state) ++ { ++ error ("amd: could not read control vector"); ++ return retval; ++ } ++ ++ dim_vector dv = control_in.dims (); ++ if (dv.length() > 2 || (dv(0) != 1 && dv(1) != 1)) ++ { ++ error ("amd: control vector isn't a vector"); ++ return retval; ++ } ++ ++ int nc = dv.numel (); ++ control (AMD_DENSE) = (nc > 0 ? control_in (AMD_DENSE) : ++ AMD_DEFAULT_DENSE); ++ control (AMD_AGGRESSIVE) = (nc > 1 ? control_in (AMD_AGGRESSIVE) : ++ AMD_DEFAULT_AGGRESSIVE); ++ spumoni = (nc > 2 ? (control_in (2) != 0) : 0); ++ } ++ ++ if (spumoni > 0) ++ amd_control (control_ptr); ++ ++ int *Ap, *Ai; ++ int n, m, nz; ++ ++ // These are here only so that the C++ destructors don't prematurally ++ // remove the underlying data we are interested in ++ SparseMatrix sm; ++ SparseComplexMatrix scm; ++ Matrix mm; ++ ComplexMatrix cm; ++ ++ if (args(0).class_name () != "sparse" && spumoni > 0) ++ octave_stdout << " input matrix A is full (sparse copy" ++ << " of A will be created)" << std::endl; ++ ++ if (args(0).is_complex_type ()) ++ { ++ scm = args(0).sparse_complex_matrix_value (); ++ Ai = scm.ridx (); ++ Ap = scm.cidx (); ++ m = scm.rows (); ++ n = scm.cols (); ++ nz = scm.nnz (); ++ } ++ else ++ { ++ sm = args(0).sparse_matrix_value (); ++ Ai = sm.ridx (); ++ Ap = sm.cidx (); ++ m = sm.rows (); ++ n = sm.cols (); ++ nz = sm.nnz (); ++ } ++ ++ if (spumoni > 0) ++ octave_stdout << " input matrix A is " << m << "-by-" << n ++ << std::endl; ++ ++ if (m != n) ++ { ++ error ("amd: A must be square"); ++ return retval; ++ } ++ ++ if (spumoni > 0) ++ octave_stdout << " input matrix A has " << nz << ++ " nonzero entries" << std::endl; ++ ++ // allocate workspace for output permutation ++ Array P(n+1); ++ int *P_ptr = P.fortran_vec (); ++ NDArray info (dim_vector (AMD_INFO, 1)); ++ double *info_ptr = info.fortran_vec (); ++ int result; ++ ++ // order the matrix ++ result = amd_order (n, Ap, Ai, P_ptr, control_ptr, info_ptr); ++ ++ // print results (including return value) ++ if (spumoni > 0) ++ amd_info (info_ptr); ++ ++ // check error conditions ++ if (result == AMD_OUT_OF_MEMORY) ++ error ("amd: out of memory"); ++ else if (result == AMD_INVALID) ++ error ("amd: input matrix A is corrupted"); ++ else ++ { ++ // copy the outputs to Octave ++ ++ // output permutation, P ++ NDArray perm (dim_vector (1, n)); ++ for (int i = 0; i < n; i++) ++ perm (i) = double (P(i) + 1); // 1-based indexing for Octave ++ ++ retval (0) = perm; ++ ++ // Info ++ if (nargout > 1) ++ retval (1) = info; ++ } ++ } ++ return retval; ++} ++ ++/* ++;;; Local Variables: *** ++;;; mode: C++ *** ++;;; End: *** ++*/ +diff -uNr UMFPACKv4.4.orig/AMD/OCTAVE/amd_demo.m UMFPACK/AMD/OCTAVE/amd_demo.m +--- UMFPACKv4.4.orig/AMD/OCTAVE/amd_demo.m 1970-01-01 01:00:00.000000000 +0100 ++++ UMFPACK/AMD/OCTAVE/amd_demo.m 2004-12-30 01:58:45.000000000 +0100 +@@ -0,0 +1,61 @@ ++function amd_demo ++% AMD DEMO ++% ++% A demo of AMD for OCTAVE. ++% ++% -------------------------------------------------------------------------- ++% AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis, ++% Patrick R. Amestoy, and Iain S. Duff. See ../README for License. ++% email: davis@cise.ufl.edu CISE Department, Univ. of Florida. ++% web: http://www.cise.ufl.edu/research/sparse/amd ++% -------------------------------------------------------------------------- ++% ++% See also: amd ++ ++% Get the Harwell/Boeing can_24 matrix. This is an example matrix from the ++% MATLAB-accessible UF sparse matrix collection, and can be loaded into ++% MATLAB with the statment "Problem = UFget ('HB/can_24')", after obtaining ++% the UFget function and its supporting routines at ++% http://www.cise.ufl.edu/sparse/mat . ++ ++load can_24.mat ++A = Problem.A ; ++n = size (A,1) ; ++ ++figure (1) ++clf ++hold off ++subplot (2,1,1) ; ++% remove the "_" from the name before printing it in the plot title ++title (sprintf ('%s', strrep (Problem.name, '_', '-'))) ; ++fprintf ('Matrix name: %s\n', Problem.name) ; ++fprintf ('Matrix title: %s\n', Problem.title) ; ++spy (A) ++ ++% print the details during AMD ordering and SYMBFACT ++control = amd (); ++control (3) = 1; ++ ++% 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] = amd (A, control) ; ++ ++% order again, but this time print some statistics ++[p, Info] = amd (A, [10 1 1]) ; ++ ++fprintf ('Permutation vector:\n') ; ++fprintf (' %2d', p) ; ++fprintf ('\n\n') ; ++ ++subplot (2,1,2) ; ++title ('Permuted matrix') ; ++spy (A (p,p)) ++ ++% 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) ; ++ +diff -uNr UMFPACKv4.4.orig/AMD/OCTAVE/amd_demo.m.out UMFPACK/AMD/OCTAVE/amd_demo.m.out +--- UMFPACKv4.4.orig/AMD/OCTAVE/amd_demo.m.out 1970-01-01 01:00:00.000000000 +0100 ++++ UMFPACK/AMD/OCTAVE/amd_demo.m.out 2004-12-30 01:58:45.000000000 +0100 +@@ -0,1 +1,21 @@ ++octave:3> amd_demo ++ans = 1 ++Matrix name: HB/can_24 ++Matrix title: 1SYMMETRIC PATTERN FROM CANNES,LUCIEN MARRO,JUNE 1981. ++ ++If the next step fails, then you have ++not yet compiled the AMD mexFunction. ++ input matrix A is 24-by-24 ++ input matrix A has 160 nonzero entries ++ input matrix A is 24-by-24 ++ input matrix A has 160 nonzero entries ++Permutation vector: ++ 23 21 11 24 13 6 17 9 15 5 16 8 2 10 14 18 1 3 4 7 12 19 22 20 ++ ++ ++Results from AMD's approximate analysis: ++number of nonzeros in L (including diagonal): 121 ++floating point operation count for chol (A (p,p)): 671 ++ ++octave:4> quit +--- UMFPACKv4.4.orig/AMD/OCTAVE/GNUmakefile 1970-01-01 01:00:00.000000000 +0100 ++++ UMFPACK/AMD/OCTAVE/GNUmakefile 2004-12-30 01:58:45.000000000 +0100 +@@ -0,0 +1,33 @@ ++#------------------------------------------------------------------------------ ++# GNUmakefile for the AMD MATLAB mexFunction ++#------------------------------------------------------------------------------ ++ ++all: amd ++ ++include ../Make/Make.include ++ ++MKOCT = mkoctfile -I../Include ++ ++OCT_SPARSE_INC = -I../../../ ++ ++AMD = amd_aat amd_1 amd_2 amd_dump amd_postorder amd_post_tree amd_defaults \ ++ amd_order amd_control amd_info amd_valid ++ ++INC = ../Include/amd.h ../Source/amd_internal.h ++ ++OCTAMD = $(addsuffix .o, $(subst amd_,amd_o_,$(AMD))) ++ ++amd_o_%.o: ../Source/amd_%.c $(INC) ++ $(MKOCT) -DDINT -c $< -o $@ ++ - $(MV) ../Source/amd_$*.o ++ ++# Note temporary addition of octave sparse path ++amd: amd.cc $(OCTAMD) $(INC) ++ $(MKOCT) amd.cc $(OCTAMD) $(OCT_SPARSE_INC) -o amd.oct ++ ++#------------------------------------------------------------------------------ ++# Remove all but the files in the original distribution ++#------------------------------------------------------------------------------ ++ ++purge: clean ++ - $(RM) amd.oct +diff -uNr UMFPACKv4.4.orig/AMD/OCTAVE/Makefile UMFPACK/AMD/OCTAVE/Makefile +--- UMFPACKv4.4.orig/AMD/OCTAVE/Makefile 1970-01-01 01:00:00.000000000 +0100 ++++ UMFPACK/AMD/OCTAVE/Makefile 2004-12-30 01:58:45.000000000 +0100 +@@ -0,0 +1,41 @@ ++#------------------------------------------------------------------------------ ++# compile the AMD mexFunction for MATLAB (original make only) ++#------------------------------------------------------------------------------ ++ ++# This is a very ugly Makefile, and is only provided for those who do not ++# have GNU make. Note that it is not used if you have GNU make. It ignores ++# dependency checking and just compiles everything. It was created ++# automatically, via make -n using the GNUmakefile. That way, I don't have ++# maintain two Makefiles. ++ ++all: amd ++ ++include ../Make/Make.include ++ ++MKOCT = mkoctfile -I../Include ++ ++OCT_SPARSE_INC = ../../../ ++ ++amd: ++ $(MKOCT) -DDINT -o amd_o_aat.o -c ../Source/amd_aat.c ++ $(MKOCT) -DDINT -o amd_o_1.o -c ../Source/amd_1.c ++ $(MKOCT) -DDINT -o amd_o_2.o -c ../Source/amd_2.c ++ $(MKOCT) -DDINT -o amd_o_dump.o -c ../Source/amd_dump.c ++ $(MKOCT) -DDINT -o amd_o_postorder.o -c ../Source/amd_postorder.c ++ $(MKOCT) -DDINT -o amd_o_post_tree.o -c ../Source/amd_post_tree.c ++ $(MKOCT) -DDINT -o amd_o_defaults.o -c ../Source/amd_defaults.c ++ $(MKOCT) -DDINT -o amd_o_order.o -c ../Source/amd_order.c ++ $(MKOCT) -DDINT -o amd_o_control.o -c ../Source/amd_control.c ++ $(MKOCT) -DDINT -o amd_o_info.o -c ../Source/amd_info.c ++ $(MKOCT) -DDINT -o amd_o_valid.o -c ../Source/amd_valid.c ++ $(MKOCT) -output amd.oct amd_mex.c amd_o_aat.o \ ++ amd_o_1.o amd_o_2.o amd_o_dump.o amd_o_postorder.o \ ++ amd_o_post_tree.o amd_o_defaults.o amd_o_order.o amd_o_control.o \ ++ amd_o_info.o amd_o_valid.o $(OCT_SPARSE_INC) -o amd.oct ++ ++#------------------------------------------------------------------------------ ++# Remove all but the files in the original distribution ++#------------------------------------------------------------------------------ ++ ++purge: clean ++ - $(RM) amd.oct +--- UMFPACKv4.4.orig/UMFPACK/Source/umf_solve.c 2005-01-17 17:21:29.000000000 +0100 ++++ UMFPACK/UMFPACK/Source/umf_solve.c 2005-02-02 00:01:22.904346651 +0100 +@@ -79,7 +79,8 @@ + double *Z2, *Y, *B2, *Rs ; + Int *Rperm, *Cperm, i, n, p, step, j, nz, status, p2, do_scale ; + #ifdef COMPLEX +- Int split ; ++ Int AXsplit ; ++ Int Bsplit ; + #endif + #ifndef NRECIPROCAL + Int do_recip = Numeric->do_recip ; +@@ -141,7 +142,7 @@ + return (UMFPACK_ERROR_argument_missing) ; + } + /* A, B, and X in split format if Az, Bz, and Xz present */ +- split = SPLIT (Az) && SPLIT (Bz) && SPLIT (Xz) ; ++ AXsplit = SPLIT (Az) || SPLIT(Xz); + Z = (Entry *) (SolveWork + 4*n) ; /* Entry Z [0..n-1] */ + S = (Entry *) (SolveWork + 6*n) ; /* Entry S [0..n-1] */ + Y = (double *) (SolveWork + 8*n) ; /* double Y [0..n-1] */ +@@ -150,10 +151,12 @@ + } + else + { +- /* A is ignored, only look at X and B for split/packed cases */ +- split = SPLIT (Bz) && SPLIT (Xz) ; ++ /* A is ignored, only look at X for split/packed cases */ ++ AXsplit = SPLIT(Xz); + } +- if (split) ++ Bsplit = SPLIT (Bz); ++ ++ if (AXsplit) + { + X = (Entry *) (SolveWork + 2*n) ; /* Entry X [0..n-1] */ + } +@@ -209,7 +212,7 @@ + for (p = 0 ; p < p2 ; p++) + { + /* Y [Ai [p]] += ABS (Ax [p]) ; */ +- ASSIGN (aij, Ax, Az, p, split) ; ++ ASSIGN (aij, Ax, Az, p, AXsplit) ; + ABS (d, aij) ; + Y [Ai [p]] += d ; + } +@@ -219,7 +222,7 @@ + for (i = 0 ; i < n ; i++) + { + /* B2 [i] = ABS (B [i]) ; */ +- ASSIGN (bi, Bx, Bz, i, split) ; ++ ASSIGN (bi, Bx, Bz, i, Bsplit) ; + ABS (B2 [i], bi) ; + } + +@@ -276,7 +279,7 @@ + /* multiply by the scale factors */ + for (i = 0 ; i < n ; i++) + { +- ASSIGN (X [i], Bx, Bz, i, split) ; ++ ASSIGN (X [i], Bx, Bz, i, Bsplit) ; + SCALE (X [i], Rs [i]) ; + } + } +@@ -286,7 +289,7 @@ + /* divide by the scale factors */ + for (i = 0 ; i < n ; i++) + { +- ASSIGN (X [i], Bx, Bz, i, split) ; ++ ASSIGN (X [i], Bx, Bz, i, Bsplit) ; + SCALE_DIV (X [i], Rs [i]) ; + } + } +@@ -302,7 +305,7 @@ + for (i = 0 ; i < n ; i++) + { + /* W [i] = B [Rperm [i]] ; */ +- ASSIGN (W [i], Bx, Bz, Rperm [i], split) ; ++ ASSIGN (W [i], Bx, Bz, Rperm [i], Bsplit) ; + } + } + } +@@ -311,7 +314,7 @@ + for (i = 0 ; i < n ; i++) + { + /* Z [i] = B [i] ; */ +- ASSIGN (Z [i], Bx, Bz, i, split) ; ++ ASSIGN (Z [i], Bx, Bz, i, Bsplit) ; + } + flops += MULTSUB_FLOPS * nz ; + for (i = 0 ; i < n ; i++) +@@ -321,7 +324,7 @@ + for (p = Ap [i] ; p < p2 ; p++) + { + /* Z [Ai [p]] -= Ax [p] * xi ; */ +- ASSIGN (aij, Ax, Az, p, split) ; ++ ASSIGN (aij, Ax, Az, p, AXsplit) ; + MULT_SUB (Z [Ai [p]], aij, xi) ; + } + } +@@ -390,7 +393,7 @@ + for (i = 0 ; i < n ; i++) + { + /* W [i] = B [i] ; */ +- ASSIGN (W [i], Bx, Bz, i, split) ; ++ ASSIGN (W [i], Bx, Bz, i, Bsplit) ; + Z2 [i] = 0. ; + } + flops += (MULT_FLOPS + DECREMENT_FLOPS + ABS_FLOPS + 1) * nz ; +@@ -403,7 +406,7 @@ + i = Ai [p] ; + + /* axx = Ax [p] * xj ; */ +- ASSIGN (aij, Ax, Az, p, split) ; ++ ASSIGN (aij, Ax, Az, p, AXsplit) ; + MULT (axx, aij, xj) ; + + /* W [i] -= axx ; */ +@@ -493,7 +496,7 @@ + /* yi += ABS (Ax [p]) * Rs [Ai [p]] ; */ + /* note that abs (aij) is the same as + * abs (conj (aij)) */ +- ASSIGN (aij, Ax, Az, p, split) ; ++ ASSIGN (aij, Ax, Az, p, AXsplit) ; + ABS (d, aij) ; + yi += (d * Rs [Ai [p]]) ; + } +@@ -513,7 +516,7 @@ + /* yi += ABS (Ax [p]) / Rs [Ai [p]] ; */ + /* note that abs (aij) is the same as + * abs (conj (aij)) */ +- ASSIGN (aij, Ax, Az, p, split) ; ++ ASSIGN (aij, Ax, Az, p, AXsplit) ; + ABS (d, aij) ; + yi += (d / Rs [Ai [p]]) ; + } +@@ -534,7 +537,7 @@ + /* yi += ABS (Ax [p]) ; */ + /* note that abs (aij) is the same as + * abs (conj (aij)) */ +- ASSIGN (aij, Ax, Az, p, split) ; ++ ASSIGN (aij, Ax, Az, p, AXsplit) ; + ABS (d, aij) ; + yi += d ; + } +@@ -546,7 +549,7 @@ + for (i = 0 ; i < n ; i++) + { + /* B2 [i] = ABS (B [i]) ; */ +- ASSIGN (bi, Bx, Bz, i, split) ; ++ ASSIGN (bi, Bx, Bz, i, Bsplit) ; + ABS (B2 [i], bi) ; + } + +@@ -568,7 +571,7 @@ + for (i = 0 ; i < n ; i++) + { + /* W [i] = B [Cperm [i]] ; */ +- ASSIGN (W [i], Bx, Bz, Cperm [i], split) ; ++ ASSIGN (W [i], Bx, Bz, Cperm [i], Bsplit) ; + } + } + else +@@ -577,7 +580,7 @@ + for (i = 0 ; i < n ; i++) + { + /* Z [i] = B [i] ; */ +- ASSIGN (Z [i], Bx, Bz, i, split) ; ++ ASSIGN (Z [i], Bx, Bz, i, Bsplit) ; + } + flops += MULTSUB_FLOPS * nz ; + for (i = 0 ; i < n ; i++) +@@ -587,7 +590,7 @@ + for (p = Ap [i] ; p < p2 ; p++) + { + /* zi -= conjugate (Ax [p]) * X [Ai [p]] ; */ +- ASSIGN (aij, Ax, Az, p, split) ; ++ ASSIGN (aij, Ax, Az, p, Bsplit) ; + MULT_SUB_CONJ (zi, X [Ai [p]], aij) ; + } + Z [i] = zi ; +@@ -696,13 +699,13 @@ + for (i = 0 ; i < n ; i++) + { + /* wi = B [i] ; */ +- ASSIGN (wi, Bx, Bz, i, split) ; ++ ASSIGN (wi, Bx, Bz, i, Bsplit) ; + z2i = 0. ; + p2 = Ap [i+1] ; + for (p = Ap [i] ; p < p2 ; p++) + { + /* axx = conjugate (Ax [p]) * X [Ai [p]] ; */ +- ASSIGN (aij, Ax, Az, p, split) ; ++ ASSIGN (aij, Ax, Az, p, AXsplit) ; + MULT_CONJ (axx, X [Ai [p]], aij) ; + + /* wi -= axx ; */ +@@ -766,7 +769,7 @@ + /* yi += ABS (Ax [p]) * Rs [Ai [p]] ; */ + /* note that A.' is the array transpose, + * so no conjugate */ +- ASSIGN (aij, Ax, Az, p, split) ; ++ ASSIGN (aij, Ax, Az, p, AXsplit) ; + ABS (d, aij) ; + yi += (d * Rs [Ai [p]]) ; + } +@@ -786,7 +789,7 @@ + /* yi += ABS (Ax [p]) / Rs [Ai [p]] ; */ + /* note that A.' is the array transpose, + * so no conjugate */ +- ASSIGN (aij, Ax, Az, p, split) ; ++ ASSIGN (aij, Ax, Az, p, AXsplit) ; + ABS (d, aij) ; + yi += (d / Rs [Ai [p]]) ; + } +@@ -807,7 +810,7 @@ + /* yi += ABS (Ax [p]) */ + /* note that A.' is the array transpose, + * so no conjugate */ +- ASSIGN (aij, Ax, Az, p, split) ; ++ ASSIGN (aij, Ax, Az, p, AXsplit) ; + ABS (d, aij) ; + yi += d ; + } +@@ -819,7 +822,7 @@ + for (i = 0 ; i < n ; i++) + { + /* B2 [i] = ABS (B [i]) ; */ +- ASSIGN (bi, Bx, Bz, i, split) ; ++ ASSIGN (bi, Bx, Bz, i, Bsplit) ; + ABS (B2 [i], bi) ; + } + +@@ -841,7 +844,7 @@ + for (i = 0 ; i < n ; i++) + { + /* W [i] = B [Cperm [i]] ; */ +- ASSIGN (W [i], Bx, Bz, Cperm [i], split) ; ++ ASSIGN (W [i], Bx, Bz, Cperm [i], Bsplit) ; + } + } + else +@@ -850,7 +853,7 @@ + for (i = 0 ; i < n ; i++) + { + /* Z [i] = B [i] ; */ +- ASSIGN (Z [i], Bx, Bz, i, split) ; ++ ASSIGN (Z [i], Bx, Bz, i, Bsplit) ; + } + flops += MULTSUB_FLOPS * nz ; + for (i = 0 ; i < n ; i++) +@@ -860,7 +863,7 @@ + for (p = Ap [i] ; p < p2 ; p++) + { + /* zi -= Ax [p] * X [Ai [p]] ; */ +- ASSIGN (aij, Ax, Az, p, split) ; ++ ASSIGN (aij, Ax, Az, p, AXsplit) ; + MULT_SUB (zi, aij, X [Ai [p]]) ; + } + Z [i] = zi ; +@@ -969,13 +972,13 @@ + for (i = 0 ; i < n ; i++) + { + /* wi = B [i] ; */ +- ASSIGN (wi, Bx, Bz, i, split) ; ++ ASSIGN (wi, Bx, Bz, i, Bsplit) ; + z2i = 0. ; + p2 = Ap [i+1] ; + for (p = Ap [i] ; p < p2 ; p++) + { + /* axx = Ax [p] * X [Ai [p]] ; */ +- ASSIGN (aij, Ax, Az, p, split) ; ++ ASSIGN (aij, Ax, Az, p, AXsplit) ; + MULT (axx, aij, X [Ai [p]]) ; + + /* wi -= axx ; */ +@@ -1011,7 +1014,7 @@ + for (i = 0 ; i < n ; i++) + { + /* X [i] = B [Rperm [i]] ; */ +- ASSIGN (X [i], Bx, Bz, Rperm [i], split) ; ++ ASSIGN (X [i], Bx, Bz, Rperm [i], Bsplit) ; + } + flops = UMF_lsolve (Numeric, X, Pattern) ; + status = UMFPACK_OK ; +@@ -1027,7 +1030,7 @@ + for (i = 0 ; i < n ; i++) + { + /* X [i] = B [i] ; */ +- ASSIGN (X [i], Bx, Bz, i, split) ; ++ ASSIGN (X [i], Bx, Bz, i, Bsplit) ; + } + flops = UMF_lsolve (Numeric, X, Pattern) ; + status = UMFPACK_OK ; +@@ -1043,7 +1046,7 @@ + for (i = 0 ; i < n ; i++) + { + /* W [i] = B [i] ; */ +- ASSIGN (W [i], Bx, Bz, i, split) ; ++ ASSIGN (W [i], Bx, Bz, i, Bsplit) ; + } + flops = UMF_lhsolve (Numeric, W, Pattern) ; + for (i = 0 ; i < n ; i++) +@@ -1063,7 +1066,7 @@ + for (i = 0 ; i < n ; i++) + { + /* W [i] = B [i] ; */ +- ASSIGN (W [i], Bx, Bz, i, split) ; ++ ASSIGN (W [i], Bx, Bz, i, Bsplit) ; + } + flops = UMF_ltsolve (Numeric, W, Pattern) ; + for (i = 0 ; i < n ; i++) +@@ -1083,7 +1086,7 @@ + for (i = 0 ; i < n ; i++) + { + /* X [i] = B [i] ; */ +- ASSIGN (X [i], Bx, Bz, i, split) ; ++ ASSIGN (X [i], Bx, Bz, i, Bsplit) ; + } + flops = UMF_lhsolve (Numeric, X, Pattern) ; + status = UMFPACK_OK ; +@@ -1099,7 +1102,7 @@ + for (i = 0 ; i < n ; i++) + { + /* X [i] = B [i] ; */ +- ASSIGN (X [i], Bx, Bz, i, split) ; ++ ASSIGN (X [i], Bx, Bz, i, Bsplit) ; + } + flops = UMF_ltsolve (Numeric, X, Pattern) ; + status = UMFPACK_OK ; +@@ -1115,7 +1118,7 @@ + for (i = 0 ; i < n ; i++) + { + /* W [i] = B [i] ; */ +- ASSIGN (W [i], Bx, Bz, i, split) ; ++ ASSIGN (W [i], Bx, Bz, i, Bsplit) ; + } + flops = UMF_usolve (Numeric, W, Pattern) ; + for (i = 0 ; i < n ; i++) +@@ -1134,7 +1137,7 @@ + for (i = 0 ; i < n ; i++) + { + /* X [i] = B [i] ; */ +- ASSIGN (X [i], Bx, Bz, i, split) ; ++ ASSIGN (X [i], Bx, Bz, i, Bsplit) ; + } + flops = UMF_usolve (Numeric, X, Pattern) ; + +@@ -1149,7 +1152,7 @@ + for (i = 0 ; i < n ; i++) + { + /* X [i] = B [Cperm [i]] ; */ +- ASSIGN (X [i], Bx, Bz, Cperm [i], split) ; ++ ASSIGN (X [i], Bx, Bz, Cperm [i], Bsplit) ; + } + flops = UMF_uhsolve (Numeric, X, Pattern) ; + +@@ -1164,7 +1167,7 @@ + for (i = 0 ; i < n ; i++) + { + /* X [i] = B [Cperm [i]] ; */ +- ASSIGN (X [i], Bx, Bz, Cperm [i], split) ; ++ ASSIGN (X [i], Bx, Bz, Cperm [i], Bsplit) ; + } + flops = UMF_utsolve (Numeric, X, Pattern) ; + +@@ -1179,7 +1182,7 @@ + for (i = 0 ; i < n ; i++) + { + /* X [i] = B [i] ; */ +- ASSIGN (X [i], Bx, Bz, i, split) ; ++ ASSIGN (X [i], Bx, Bz, i, Bsplit) ; + } + flops = UMF_uhsolve (Numeric, X, Pattern) ; + +@@ -1194,7 +1197,7 @@ + for (i = 0 ; i < n ; i++) + { + /* X [i] = B [i] ; */ +- ASSIGN (X [i], Bx, Bz, i, split) ; ++ ASSIGN (X [i], Bx, Bz, i, Bsplit) ; + } + flops = UMF_utsolve (Numeric, X, Pattern) ; + +@@ -1206,7 +1209,7 @@ + + #ifdef COMPLEX + /* copy the solution back, from Entry X [ ] to double Xx [ ] and Xz [ ] */ +- if (split) ++ if (AXsplit) + { + for (i = 0 ; i < n ; i++) + { diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK.rules --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK.rules Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,183 @@ + +#---------------------------------------- +# integer-only routines (no real/complex): +#---------------------------------------- + +amd_o_%.o: $(srcdir)/UMFPACK/AMD/Source/amd_%.c + $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DDINT $< -o $@ + + +umf_o_%.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_%.c + $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DDINT $< -o $@ + +#---------------------------------------- +# Double precision, int version, for OCTAVE +#---------------------------------------- + +umf_od_%.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_%.c + $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DDINT $< -o $@ + +umf_od_%hsolve.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_%tsolve.c + $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DDINT -DCONJUGATE_SOLVE $< -o $@ + +umf_od_triplet_map_x.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_triplet.c + $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DDINT -DDO_MAP -DDO_VALUES $< -o $@ + +umf_od_triplet_map_nox.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_triplet.c + $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DDINT -DDO_MAP $< -o $@ + +umf_od_triplet_nomap_x.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_triplet.c + $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DDINT -DDO_VALUES $< -o $@ + +umf_od_triplet_nomap_nox.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_triplet.c + $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DDINT $< -o $@ + +umf_od_assemble_fixq.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_assemble.c + $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DDINT -DFIXQ $< -o $@ + +umf_od_store_lu_drop.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_store_lu.c + $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DDINT -DDROP $< -o $@ + +umfpack_od_wsolve.o: $(srcdir)/UMFPACK/UMFPACK/Source/umfpack_solve.c + $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DDINT -DWSOLVE $< -o $@ + +umfpack_od_%.o: $(srcdir)/UMFPACK/UMFPACK/Source/umfpack_%.c + $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DDINT $< -o $@ + +#---------------------------------------- +# Complex double precision, int version, for OCTAVE +#---------------------------------------- + +umf_oz_%.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_%.c + $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DZINT $< -o $@ + +umf_oz_%hsolve.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_%tsolve.c + $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DZINT -DCONJUGATE_SOLVE $< -o $@ + +umf_oz_triplet_map_x.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_triplet.c + $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DZINT -DDO_MAP -DDO_VALUES $< -o $@ + +umf_oz_triplet_map_nox.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_triplet.c + $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DZINT -DDO_MAP $< -o $@ + +umf_oz_triplet_nomap_x.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_triplet.c + $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DZINT -DDO_VALUES $< -o $@ + +umf_oz_triplet_nomap_nox.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_triplet.c + $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DZINT $< -o $@ + +umf_oz_assemble_fixq.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_assemble.c + $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DZINT -DFIXQ $< -o $@ + +umf_oz_store_lu_drop.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_store_lu.c + $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DZINT -DDROP $< -o $@ + +umfpack_oz_wsolve.o: $(srcdir)/UMFPACK/UMFPACK/Source/umfpack_solve.c + $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DZINT -DWSOLVE $< -o $@ + +umfpack_oz_%.o: $(srcdir)/UMFPACK/UMFPACK/Source/umfpack_%.c + $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DZINT $< -o $@ + +#---------------------------------------- +# Generic routines for OCTAVE +#---------------------------------------- + +umfpack_o_timer.o: $(srcdir)/UMFPACK/UMFPACK/Source/umfpack_timer.c + $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) $< -o $@ + +umfpack_o_tictoc.o: $(srcdir)/UMFPACK/UMFPACK/Source/umfpack_tictoc.c + $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) $< -o $@ + +######################################################################## +# PIC rules +######################################################################## + +#---------------------------------------- +# integer-only routines (no real/complex): +#---------------------------------------- + +pic/amd_o_%.o: $(srcdir)/UMFPACK/AMD/Source/amd_%.c + $(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) -DDINT $< -o $@ + + +pic/umf_o_%.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_%.c + $(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) -DDINT $< -o $@ + +#---------------------------------------- +# Double precision, int version, for OCTAVE +#---------------------------------------- + +pic/umf_od_%.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_%.c + $(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) -DDINT $< -o $@ + +pic/umf_od_%hsolve.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_%tsolve.c + $(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) -DDINT -DCONJUGATE_SOLVE $< -o $@ + +pic/umf_od_triplet_map_x.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_triplet.c + $(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) -DDINT -DDO_MAP -DDO_VALUES $< -o $@ + +pic/umf_od_triplet_map_nox.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_triplet.c + $(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) -DDINT -DDO_MAP $< -o $@ + +pic/umf_od_triplet_nomap_x.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_triplet.c + $(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) -DDINT -DDO_VALUES $< -o $@ + +pic/umf_od_triplet_nomap_nox.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_triplet.c + $(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) -DDINT $< -o $@ + +pic/umf_od_assemble_fixq.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_assemble.c + $(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) -DDINT -DFIXQ $< -o $@ + +pic/umf_od_store_lu_drop.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_store_lu.c + $(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) -DDINT -DDROP $< -o $@ + +pic/umfpack_od_wsolve.o: $(srcdir)/UMFPACK/UMFPACK/Source/umfpack_solve.c + $(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) -DDINT -DWSOLVE $< -o $@ + +pic/umfpack_od_%.o: $(srcdir)/UMFPACK/UMFPACK/Source/umfpack_%.c + $(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) -DDINT $< -o $@ + +#---------------------------------------- +# Complex double precision, int version, for OCTAVE +#---------------------------------------- + +pic/umf_oz_%.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_%.c + $(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) -DZINT $< -o $@ + +pic/umf_oz_%hsolve.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_%tsolve.c + $(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) -DZINT -DCONJUGATE_SOLVE $< -o $@ + +pic/umf_oz_triplet_map_x.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_triplet.c + $(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) -DZINT -DDO_MAP -DDO_VALUES $< -o $@ + +pic/umf_oz_triplet_map_nox.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_triplet.c + $(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) -DZINT -DDO_MAP $< -o $@ + +pic/umf_oz_triplet_nomap_x.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_triplet.c + $(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) -DZINT -DDO_VALUES $< -o $@ + +pic/umf_oz_triplet_nomap_nox.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_triplet.c + $(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) -DZINT $< -o $@ + +pic/umf_oz_assemble_fixq.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_assemble.c + $(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) -DZINT -DFIXQ $< -o $@ + +pic/umf_oz_store_lu_drop.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_store_lu.c + $(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) -DZINT -DDROP $< -o $@ + +pic/umfpack_oz_wsolve.o: $(srcdir)/UMFPACK/UMFPACK/Source/umfpack_solve.c + $(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) -DZINT -DWSOLVE $< -o $@ + +pic/umfpack_oz_%.o: $(srcdir)/UMFPACK/UMFPACK/Source/umfpack_%.c + $(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) -DZINT $< -o $@ + +#---------------------------------------- +# Generic routines for OCTAVE +#---------------------------------------- + +pic/umfpack_o_timer.o: $(srcdir)/UMFPACK/UMFPACK/Source/umfpack_timer.c + $(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) $< -o $@ + +pic/umfpack_o_tictoc.o: $(srcdir)/UMFPACK/UMFPACK/Source/umfpack_tictoc.c + $(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) $< -o $@ + diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Demo/Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Demo/Makefile Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,79 @@ +#------------------------------------------------------------------------------ +# compile the AMD demo (for both GNU make or original make) +#----------------------------------------------------------------------------- + +all: amd_simple amd_demo amd_demo2 + +include ../Make/Make.include + +C = $(CC) $(CFLAGS) $(CONFIG) -I../Include + +INC = ../Include/amd.h + +../Lib/libamd.a: + ( cd ../Source ; make ) + +../Lib/libamdf77.a: + ( cd ../Source ; make fortran ) + +#------------------------------------------------------------------------------ +# Create the demo program, run it, and compare the output +#------------------------------------------------------------------------------ + +dist: + +amd_demo: amd_demo.c ../Lib/libamd.a $(INC) + $(C) -DDINT -o amd_demo amd_demo.c ../Lib/libamd.a $(LIB) + ./amd_demo > my_amd_demo.out + - diff amd_demo.out my_amd_demo.out + +amd_demo2: amd_demo2.c ../Lib/libamd.a $(INC) + $(C) -DDINT -o amd_demo2 amd_demo2.c ../Lib/libamd.a $(LIB) + ./amd_demo2 > my_amd_demo2.out + - diff amd_demo2.out my_amd_demo2.out + +amd_simple: amd_simple.c ../Lib/libamd.a $(INC) + $(C) -DDINT -o amd_simple amd_simple.c ../Lib/libamd.a $(LIB) + ./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 ../Lib/libamdf77.a + $(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 ../Lib/libamdf77.a + $(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 +#------------------------------------------------------------------------------ + +purge: clean + - $(RM) amd_demo my_amd_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 diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Demo/amd_demo.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Demo/amd_demo.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,169 @@ +/* ========================================================================= */ +/* === AMD demo main program =============================================== */ +/* ========================================================================= */ + +/* ------------------------------------------------------------------------- */ +/* AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis, */ +/* Patrick R. Amestoy, and Iain S. Duff. See ../README for License. */ +/* email: davis@cise.ufl.edu CISE Department, Univ. of Florida. */ +/* web: http://www.cise.ufl.edu/research/sparse/amd */ +/* ------------------------------------------------------------------------- */ + +/* A simple C main program that illustrates the use of the ANSI C interface + * to AMD. + */ + +#include "amd.h" +#include +#include + +int main (int argc, char **argv) +{ + /* 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] ; + + 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 -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Demo/amd_demo.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Demo/amd_demo.out Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,177 @@ +AMD demo, with the 24-by-24 Harwell/Boeing matrix, can_24: + +amd: approximate minimum degree ordering, parameters: + dense row parameter: 10 + (rows with more than max (10 * sqrt (n), 16) entries are + considered "dense", and placed last in output permutation) + aggressive absorption: yes + + +Input matrix: 24-by-24, with 160 entries. + Note that for a symmetric matrix such as this one, only the + strictly lower or upper triangular parts would need to be + passed to AMD, since AMD computes the ordering of A+A'. The + diagonal entries are also not needed, since AMD ignores them. + +Column: 0, number of entries: 9, with row indices in Ai [0 ... 8]: + row indices: 0 5 6 12 13 17 18 19 21 + +Column: 1, number of entries: 6, with row indices in Ai [9 ... 14]: + row indices: 1 8 9 13 14 17 + +Column: 2, number of entries: 6, with row indices in Ai [15 ... 20]: + row indices: 2 6 11 20 21 22 + +Column: 3, number of entries: 6, with row indices in Ai [21 ... 26]: + row indices: 3 7 10 15 18 19 + +Column: 4, number of entries: 6, with row indices in Ai [27 ... 32]: + row indices: 4 7 9 14 15 16 + +Column: 5, number of entries: 6, with row indices in Ai [33 ... 38]: + row indices: 0 5 6 12 13 17 + +Column: 6, number of entries: 9, with row indices in Ai [39 ... 47]: + row indices: 0 2 5 6 11 12 19 21 23 + +Column: 7, number of entries: 9, with row indices in Ai [48 ... 56]: + row indices: 3 4 7 9 14 15 16 17 18 + +Column: 8, number of entries: 4, with row indices in Ai [57 ... 60]: + row indices: 1 8 9 14 + +Column: 9, number of entries: 9, with row indices in Ai [61 ... 69]: + row indices: 1 4 7 8 9 13 14 17 18 + +Column: 10, number of entries: 6, with row indices in Ai [70 ... 75]: + row indices: 3 10 18 19 20 21 + +Column: 11, number of entries: 6, with row indices in Ai [76 ... 81]: + row indices: 2 6 11 12 21 23 + +Column: 12, number of entries: 6, with row indices in Ai [82 ... 87]: + row indices: 0 5 6 11 12 23 + +Column: 13, number of entries: 6, with row indices in Ai [88 ... 93]: + row indices: 0 1 5 9 13 17 + +Column: 14, number of entries: 6, with row indices in Ai [94 ... 99]: + row indices: 1 4 7 8 9 14 + +Column: 15, number of entries: 6, with row indices in Ai [100 ... 105]: + row indices: 3 4 7 15 16 18 + +Column: 16, number of entries: 4, with row indices in Ai [106 ... 109]: + row indices: 4 7 15 16 + +Column: 17, number of entries: 9, with row indices in Ai [110 ... 118]: + row indices: 0 1 5 7 9 13 17 18 19 + +Column: 18, number of entries: 9, with row indices in Ai [119 ... 127]: + row indices: 0 3 7 9 10 15 17 18 19 + +Column: 19, number of entries: 9, with row indices in Ai [128 ... 136]: + row indices: 0 3 6 10 17 18 19 20 21 + +Column: 20, number of entries: 6, with row indices in Ai [137 ... 142]: + row indices: 2 10 19 20 21 22 + +Column: 21, number of entries: 9, with row indices in Ai [143 ... 151]: + row indices: 0 2 6 10 11 19 20 21 22 + +Column: 22, number of entries: 4, with row indices in Ai [152 ... 155]: + row indices: 2 20 21 22 + +Column: 23, number of entries: 4, with row indices in Ai [156 ... 159]: + row indices: 6 11 12 23 + +Plot of input matrix pattern: + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 + 0: X . . . . X X . . . . . X X . . . X X X . X . . + 1: . X . . . . . . X X . . . X X . . X . . . . . . + 2: . . X . . . X . . . . X . . . . . . . . X X X . + 3: . . . X . . . X . . X . . . . X . . X X . . . . + 4: . . . . X . . X . X . . . . X X X . . . . . . . + 5: X . . . . X X . . . . . X X . . . X . . . . . . + 6: X . X . . X X . . . . X X . . . . . . X . X . X + 7: . . . X X . . X . X . . . . X X X X X . . . . . + 8: . X . . . . . . X X . . . . X . . . . . . . . . + 9: . X . . X . . X X X . . . X X . . X X . . . . . +10: . . . X . . . . . . X . . . . . . . X X X X . . +11: . . X . . . X . . . . X X . . . . . . . . X . X +12: X . . . . X X . . . . X X . . . . . . . . . . X +13: X X . . . X . . . X . . . X . . . X . . . . . . +14: . X . . X . . X X X . . . . X . . . . . . . . . +15: . . . X X . . X . . . . . . . X X . X . . . . . +16: . . . . X . . X . . . . . . . X X . . . . . . . +17: X X . . . X . X . X . . . X . . . X X X . . . . +18: X . . X . . . X . X X . . . . X . X X X . . . . +19: X . . X . . X . . . X . . . . . . X X X X X . . +20: . . X . . . . . . . X . . . . . . . . X X X X . +21: X . X . . . X . . . X X . . . . . . . X X X X . +22: . . X . . . . . . . . . . . . . . . . . X X X . +23: . . . . . . X . . . . X X . . . . . . . . . . X +return value from amd_order: 0 (should be 0) + +amd: approximate minimum degree ordering, results: + status: OK + n, dimension of A: 24 + nz, number of nonzeros in A: 160 + symmetry of A: 1.0000 + number of nonzeros on diagonal: 24 + nonzeros in pattern of A+A' (excl. diagonal): 136 + # dense rows/columns of A+A': 0 + memory used, in bytes: 1516 + # of memory compactions: 0 + + The following approximate statistics are for a subsequent + factorization of A(P,P) + A(P,P)'. They are slight upper + bounds if there are no dense rows/columns in A+A', and become + looser if dense rows/columns exist. + + nonzeros in L (excluding diagonal): 97 + nonzeros in L (including diagonal): 121 + # divide operations for LDL' or LU: 97 + # multiply-subtract operations for LDL': 275 + # multiply-subtract operations for LU: 453 + max nz. in any column of L (incl. diagonal): 8 + + chol flop count for real A, sqrt counted as 1 flop: 671 + LDL' flop count for real A: 647 + LDL' flop count for complex A: 3073 + LU flop count for real A (with no pivoting): 1003 + LU flop count for complex A (with no pivoting): 4497 + +Permutation vector: + 22 20 10 23 12 5 16 8 14 4 15 7 1 9 13 17 0 2 3 6 11 18 21 19 + +Inverse permutation vector: + 16 12 17 18 9 5 19 11 7 13 2 20 4 14 8 10 6 15 21 23 1 22 0 3 + + +Plot of permuted matrix pattern: + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 + 0: X X . . . . . . . . . . . . . . . X . . . . X . + 1: X X X . . . . . . . . . . . . . . X . . . . X X + 2: . X X . . . . . . . . . . . . . . . X . . X X X + 3: . . . X X . . . . . . . . . . . . . . X X . . . + 4: . . . X X X . . . . . . . . . . X . . X X . . . + 5: . . . . X X . . . . . . . . X X X . . X . . . . + 6: . . . . . . X . . X X X . . . . . . . . . . . . + 7: . . . . . . . X X . . . X X . . . . . . . . . . + 8: . . . . . . . X X X . X X X . . . . . . . . . . + 9: . . . . . . X . X X X X . X . . . . . . . . . . +10: . . . . . . X . . X X X . . . . . . X . . X . . +11: . . . . . . X . X X X X . X . X . . X . . X . . +12: . . . . . . . X X . . . X X X X . . . . . . . . +13: . . . . . . . X X X . X X X X X . . . . . X . . +14: . . . . . X . . . . . . X X X X X . . . . . . . +15: . . . . . X . . . . . X X X X X X . . . . X . X +16: . . . . X X . . . . . . . . X X X . . X . X X X +17: X X . . . . . . . . . . . . . . . X . X X . X . +18: . . X . . . . . . . X X . . . . . . X . . X . X +19: . . . X X X . . . . . . . . . . X X . X X . X X +20: . . . X X . . . . . . . . . . . . X . X X . X . +21: . . X . . . . . . . X X . X . X X . X . . X . X +22: X X X . . . . . . . . . . . . . X X . X X . X X +23: . X X . . . . . . . . . . . . X X . X X . X X X diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Demo/amd_demo2.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Demo/amd_demo2.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,261 @@ +/* ========================================================================= */ +/* === AMD demo main program (jumbled matrix version) ====================== */ +/* ========================================================================= */ + +/* ------------------------------------------------------------------------- */ +/* AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis, */ +/* Patrick R. Amestoy, and Iain S. Duff. See ../README for License. */ +/* email: davis@cise.ufl.edu CISE Department, Univ. of Florida. */ +/* web: http://www.cise.ufl.edu/research/sparse/amd */ +/* ------------------------------------------------------------------------- */ + +/* 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 (int argc, char **argv) +{ + /* 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 Rp [25], Ri [116] ; + 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, and must be fixed by amd_preprocess prior to\n" + " ordering it with amd_order.\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") ; + } + + /* sort, remove duplicates, and transpose A to get R */ + result = amd_preprocess (n, Ap, Ai, Rp, Ri) ; + printf ("return value from amd_preprocess: %d (should be %d)\n", + result, AMD_OK) ; + + if (result != AMD_OK) + { + printf ("AMD failed\n") ; + exit (1) ; + } + + /* print the sorted/transposed matrix R */ + printf ("\nThe column-oriented form of the sorted/transposed matrix R:\n"); + for (j = 0 ; j < n ; j++) + { + printf ("\nColumn: %d, number of entries: %d, with row indices in" + " Ri [%d ... %d]:\n row indices:", + j, Rp [j+1] - Rp [j], Rp [j], Rp [j+1]-1) ; + for (p = Rp [j] ; p < Rp [j+1] ; p++) + { + i = Ri [p] ; + printf (" %d", i) ; + } + printf ("\n") ; + } + + /* print a character plot of the matrix R. */ + printf ("\nPlot of the sorted/transposed matrix R:\n") ; + for (j = 0 ; j < n ; j++) + { + for (i = 0 ; i < n ; i++) A [i][j] = '.' ; + for (p = Rp [j] ; p < Rp [j+1] ; p++) + { + i = Ri [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 R+R'. */ + 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 = Rp [j] ; p < Rp [j+1] ; p++) + { + i = Ri [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, Rp, Ri, 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 (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 = Rp [j] ; p < Rp [j+1] ; p++) + { + inew = Pinv [Ri [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 -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Demo/amd_demo2.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Demo/amd_demo2.out Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,310 @@ +AMD demo, with a jumbled version of the 24-by-24 +Harwell/Boeing matrix, can_24: + +amd: approximate minimum degree ordering, parameters: + dense row parameter: 10 + (rows with more than max (10 * sqrt (n), 16) entries are + considered "dense", and placed last in output permutation) + aggressive absorption: yes + + +Jumbled input matrix: 24-by-24, with 116 entries. + Note that for a symmetric matrix such as this one, only the + strictly lower or upper triangular parts would need to be + passed to AMD, since AMD computes the ordering of A+A'. The + diagonal entries are also not needed, since AMD ignores them. + This version of the matrix has jumbled columns and duplicate + row indices, and must be fixed by amd_preprocess prior to + ordering it with amd_order. + +Column: 0, number of entries: 9, with row indices in Ai [0 ... 8]: + row indices: 0 17 18 21 5 12 5 0 13 + +Column: 1, number of entries: 5, with row indices in Ai [9 ... 13]: + row indices: 14 1 8 13 17 + +Column: 2, number of entries: 6, with row indices in Ai [14 ... 19]: + row indices: 2 20 11 6 11 22 + +Column: 3, number of entries: 8, with row indices in Ai [20 ... 27]: + row indices: 3 3 10 7 18 18 15 19 + +Column: 4, number of entries: 5, with row indices in Ai [28 ... 32]: + row indices: 7 9 15 14 16 + +Column: 5, number of entries: 4, with row indices in Ai [33 ... 36]: + row indices: 5 13 6 17 + +Column: 6, number of entries: 7, with row indices in Ai [37 ... 43]: + row indices: 5 0 11 6 12 6 23 + +Column: 7, number of entries: 9, with row indices in Ai [44 ... 52]: + row indices: 3 4 9 7 14 16 15 17 18 + +Column: 8, number of entries: 5, with row indices in Ai [53 ... 57]: + row indices: 1 9 14 14 14 + +Column: 9, number of entries: 5, with row indices in Ai [58 ... 62]: + row indices: 7 13 8 1 17 + +Column: 10, number of entries: 0, with row indices in Ai [63 ... 62]: + row indices: + +Column: 11, number of entries: 3, with row indices in Ai [63 ... 65]: + row indices: 2 12 23 + +Column: 12, number of entries: 3, with row indices in Ai [66 ... 68]: + row indices: 5 11 12 + +Column: 13, number of entries: 3, with row indices in Ai [69 ... 71]: + row indices: 0 13 17 + +Column: 14, number of entries: 3, with row indices in Ai [72 ... 74]: + row indices: 1 9 14 + +Column: 15, number of entries: 3, with row indices in Ai [75 ... 77]: + row indices: 3 15 16 + +Column: 16, number of entries: 4, with row indices in Ai [78 ... 81]: + row indices: 16 4 4 15 + +Column: 17, number of entries: 4, with row indices in Ai [82 ... 85]: + row indices: 13 17 19 17 + +Column: 18, number of entries: 5, with row indices in Ai [86 ... 90]: + row indices: 15 17 19 9 10 + +Column: 19, number of entries: 6, with row indices in Ai [91 ... 96]: + row indices: 17 19 20 0 6 10 + +Column: 20, number of entries: 4, with row indices in Ai [97 ... 100]: + row indices: 22 10 20 21 + +Column: 21, number of entries: 11, with row indices in Ai [101 ... 111]: + row indices: 6 2 10 19 20 11 21 22 22 22 22 + +Column: 22, number of entries: 0, with row indices in Ai [112 ... 111]: + row indices: + +Column: 23, number of entries: 4, with row indices in Ai [112 ... 115]: + row indices: 12 11 12 23 + +Plot of (jumbled) input matrix pattern: + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 + 0: X . . . . . X . . . . . . X . . . . . X . . . . + 1: . X . . . . . . X X . . . . X . . . . . . . . . + 2: . . X . . . . . . . . X . . . . . . . . . X . . + 3: . . . X . . . X . . . . . . . X . . . . . . . . + 4: . . . . . . . X . . . . . . . . X . . . . . . . + 5: X . . . . X X . . . . . X . . . . . . . . . . . + 6: . . X . . X X . . . . . . . . . . . . X . X . . + 7: . . . X X . . X . X . . . . . . . . . . . . . . + 8: . X . . . . . . . X . . . . . . . . . . . . . . + 9: . . . . X . . X X . . . . . X . . . X . . . . . +10: . . . X . . . . . . . . . . . . . . X X X X . . +11: . . X . . . X . . . . . X . . . . . . . . X . X +12: X . . . . . X . . . . X X . . . . . . . . . . X +13: X X . . . X . . . X . . . X . . . X . . . . . . +14: . X . . X . . X X . . . . . X . . . . . . . . . +15: . . . X X . . X . . . . . . . X X . X . . . . . +16: . . . . X . . X . . . . . . . X X . . . . . . . +17: X X . . . X . X . X . . . X . . . X X X . . . . +18: X . . X . . . X . . . . . . . . . . . . . . . . +19: . . . X . . . . . . . . . . . . . X X X . X . . +20: . . X . . . . . . . . . . . . . . . . X X X . . +21: X . . . . . . . . . . . . . . . . . . . X X . . +22: . . X . . . . . . . . . . . . . . . . . X X . . +23: . . . . . . X . . . . X . . . . . . . . . . . X +return value from amd_preprocess: 0 (should be 0) + +The column-oriented form of the sorted/transposed matrix R: + +Column: 0, number of entries: 4, with row indices in Ri [0 ... 3]: + row indices: 0 6 13 19 + +Column: 1, number of entries: 4, with row indices in Ri [4 ... 7]: + row indices: 1 8 9 14 + +Column: 2, number of entries: 3, with row indices in Ri [8 ... 10]: + row indices: 2 11 21 + +Column: 3, number of entries: 3, with row indices in Ri [11 ... 13]: + row indices: 3 7 15 + +Column: 4, number of entries: 2, with row indices in Ri [14 ... 15]: + row indices: 7 16 + +Column: 5, number of entries: 4, with row indices in Ri [16 ... 19]: + row indices: 0 5 6 12 + +Column: 6, number of entries: 5, with row indices in Ri [20 ... 24]: + row indices: 2 5 6 19 21 + +Column: 7, number of entries: 4, with row indices in Ri [25 ... 28]: + row indices: 3 4 7 9 + +Column: 8, number of entries: 2, with row indices in Ri [29 ... 30]: + row indices: 1 9 + +Column: 9, number of entries: 5, with row indices in Ri [31 ... 35]: + row indices: 4 7 8 14 18 + +Column: 10, number of entries: 5, with row indices in Ri [36 ... 40]: + row indices: 3 18 19 20 21 + +Column: 11, number of entries: 5, with row indices in Ri [41 ... 45]: + row indices: 2 6 12 21 23 + +Column: 12, number of entries: 5, with row indices in Ri [46 ... 50]: + row indices: 0 6 11 12 23 + +Column: 13, number of entries: 6, with row indices in Ri [51 ... 56]: + row indices: 0 1 5 9 13 17 + +Column: 14, number of entries: 5, with row indices in Ri [57 ... 61]: + row indices: 1 4 7 8 14 + +Column: 15, number of entries: 6, with row indices in Ri [62 ... 67]: + row indices: 3 4 7 15 16 18 + +Column: 16, number of entries: 4, with row indices in Ri [68 ... 71]: + row indices: 4 7 15 16 + +Column: 17, number of entries: 9, with row indices in Ri [72 ... 80]: + row indices: 0 1 5 7 9 13 17 18 19 + +Column: 18, number of entries: 3, with row indices in Ri [81 ... 83]: + row indices: 0 3 7 + +Column: 19, number of entries: 5, with row indices in Ri [84 ... 88]: + row indices: 3 17 18 19 21 + +Column: 20, number of entries: 4, with row indices in Ri [89 ... 92]: + row indices: 2 19 20 21 + +Column: 21, number of entries: 3, with row indices in Ri [93 ... 95]: + row indices: 0 20 21 + +Column: 22, number of entries: 3, with row indices in Ri [96 ... 98]: + row indices: 2 20 21 + +Column: 23, number of entries: 3, with row indices in Ri [99 ... 101]: + row indices: 6 11 23 + +Plot of the sorted/transposed matrix R: + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 + 0: X . . . . X . . . . . . X X . . . X X . . X . . + 1: . X . . . . . . X . . . . X X . . X . . . . . . + 2: . . X . . . X . . . . X . . . . . . . . X . X . + 3: . . . X . . . X . . X . . . . X . . X X . . . . + 4: . . . . . . . X . X . . . . X X X . . . . . . . + 5: . . . . . X X . . . . . . X . . . X . . . . . . + 6: X . . . . X X . . . . X X . . . . . . . . . . X + 7: . . . X X . . X . X . . . . X X X X X . . . . . + 8: . X . . . . . . . X . . . . X . . . . . . . . . + 9: . X . . . . . X X . . . . X . . . X . . . . . . +10: . . . . . . . . . . . . . . . . . . . . . . . . +11: . . X . . . . . . . . . X . . . . . . . . . . X +12: . . . . . X . . . . . X X . . . . . . . . . . . +13: X . . . . . . . . . . . . X . . . X . . . . . . +14: . X . . . . . . . X . . . . X . . . . . . . . . +15: . . . X . . . . . . . . . . . X X . . . . . . . +16: . . . . X . . . . . . . . . . X X . . . . . . . +17: . . . . . . . . . . . . . X . . . X . X . . . . +18: . . . . . . . . . X X . . . . X . X . X . . . . +19: X . . . . . X . . . X . . . . . . X . X X . . . +20: . . . . . . . . . . X . . . . . . . . . X X X . +21: . . X . . . X . . . X X . . . . . . . X X X X . +22: . . . . . . . . . . . . . . . . . . . . . . . . +23: . . . . . . . . . . . X X . . . . . . . . . . X + +Plot of symmetric matrix to be ordered by amd_order: + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 + 0: X . . . . X X . . . . . X X . . . X X X . X . . + 1: . X . . . . . . X X . . . X X . . X . . . . . . + 2: . . X . . . X . . . . X . . . . . . . . X X X . + 3: . . . X . . . X . . X . . . . X . . X X . . . . + 4: . . . . X . . X . X . . . . X X X . . . . . . . + 5: X . . . . X X . . . . . X X . . . X . . . . . . + 6: X . X . . X X . . . . X X . . . . . . X . X . X + 7: . . . X X . . X . X . . . . X X X X X . . . . . + 8: . X . . . . . . X X . . . . X . . . . . . . . . + 9: . X . . X . . X X X . . . X X . . X X . . . . . +10: . . . X . . . . . . X . . . . . . . X X X X . . +11: . . X . . . X . . . . X X . . . . . . . . X . X +12: X . . . . X X . . . . X X . . . . . . . . . . X +13: X X . . . X . . . X . . . X . . . X . . . . . . +14: . X . . X . . X X X . . . . X . . . . . . . . . +15: . . . X X . . X . . . . . . . X X . X . . . . . +16: . . . . X . . X . . . . . . . X X . . . . . . . +17: X X . . . X . X . X . . . X . . . X X X . . . . +18: X . . X . . . X . X X . . . . X . X X X . . . . +19: X . . X . . X . . . X . . . . . . X X X X X . . +20: . . X . . . . . . . X . . . . . . . . X X X X . +21: X . X . . . X . . . X X . . . . . . . X X X X . +22: . . X . . . . . . . . . . . . . . . . . X X X . +23: . . . . . . X . . . . X X . . . . . . . . . . X +return value from amd_order: 0 (should be 0) + +amd: approximate minimum degree ordering, results: + status: OK + n, dimension of A: 24 + nz, number of nonzeros in A: 102 + symmetry of A: 0.4000 + number of nonzeros on diagonal: 17 + nonzeros in pattern of A+A' (excl. diagonal): 136 + # dense rows/columns of A+A': 0 + memory used, in bytes: 1516 + # of memory compactions: 0 + + The following approximate statistics are for a subsequent + factorization of A(P,P) + A(P,P)'. They are slight upper + bounds if there are no dense rows/columns in A+A', and become + looser if dense rows/columns exist. + + nonzeros in L (excluding diagonal): 97 + nonzeros in L (including diagonal): 121 + # divide operations for LDL' or LU: 97 + # multiply-subtract operations for LDL': 275 + # multiply-subtract operations for LU: 453 + max nz. in any column of L (incl. diagonal): 8 + + chol flop count for real A, sqrt counted as 1 flop: 671 + LDL' flop count for real A: 647 + LDL' flop count for complex A: 3073 + LU flop count for real A (with no pivoting): 1003 + LU flop count for complex A (with no pivoting): 4497 + +Permutation vector: + 22 20 10 23 12 5 16 8 14 4 15 7 1 9 13 17 0 2 3 6 11 18 21 19 + +Inverse permutation vector: + 16 12 17 18 9 5 19 11 7 13 2 20 4 14 8 10 6 15 21 23 1 22 0 3 + + +Plot of (symmetrized) permuted matrix pattern: + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 + 0: X X . . . . . . . . . . . . . . . X . . . . X . + 1: X X X . . . . . . . . . . . . . . X . . . . X X + 2: . X X . . . . . . . . . . . . . . . X . . X X X + 3: . . . X X . . . . . . . . . . . . . . X X . . . + 4: . . . X X X . . . . . . . . . . X . . X X . . . + 5: . . . . X X . . . . . . . . X X X . . X . . . . + 6: . . . . . . X . . X X X . . . . . . . . . . . . + 7: . . . . . . . X X . . . X X . . . . . . . . . . + 8: . . . . . . . X X X . X X X . . . . . . . . . . + 9: . . . . . . X . X X X X . X . . . . . . . . . . +10: . . . . . . X . . X X X . . . . . . X . . X . . +11: . . . . . . X . X X X X . X . X . . X . . X . . +12: . . . . . . . X X . . . X X X X . . . . . . . . +13: . . . . . . . X X X . X X X X X . . . . . X . . +14: . . . . . X . . . . . . X X X X X . . . . . . . +15: . . . . . X . . . . . X X X X X X . . . . X . X +16: . . . . X X . . . . . . . . X X X . . X . X X X +17: X X . . . . . . . . . . . . . . . X . X X . X . +18: . . X . . . . . . . X X . . . . . . X . . X . X +19: . . . X X X . . . . . . . . . . X X . X X . X X +20: . . . X X . . . . . . . . . . . . X . X X . X . +21: . . X . . . . . . . X X . X . X X . X . . X . X +22: X X X . . . . . . . . . . . . . X X . X X . X X +23: . X X . . . . . . . . . . . . X X . X X . X X X diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Demo/amd_f77cross.f --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Demo/amd_f77cross.f Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,51 @@ +C ====================================================================== +C === AMD_cross ======================================================== +C ====================================================================== + +C ---------------------------------------------------------------------- +C AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. +C Davis, Patrick R. Amestoy, and Iain S. Duff. See ../README for +C License. email: davis@cise.ufl.edu CISE Department, Univ. of +C Florida. web: http://www.cise.ufl.edu/research/sparse/amd +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 -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Demo/amd_f77cross.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Demo/amd_f77cross.out Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,51 @@ +Input matrix: 5-by- 5 with 14 entries + +Column: 1 number of entries: 2 with row indices in AI ( 1 ... 2) + row indices: 1 2 + +Column: 2 number of entries: 4 with row indices in AI ( 3 ... 6) + row indices: 1 2 3 5 + +Column: 3 number of entries: 4 with row indices in AI ( 7 ... 10) + row indices: 2 3 4 5 + +Column: 4 number of entries: 2 with row indices in AI ( 11 ... 12) + row indices: 3 4 + +Column: 5 number of entries: 2 with row indices in AI ( 13 ... 14) + row indices: 2 5 + +amd: approximate minimum degree ordering, results: + status: OK + n, dimension of A: 5 + nz, number of nonzeros in A: 14 + symmetry of A: 0.8889 + number of nonzeros on diagonal: 5 + nonzeros in pattern of A+A' (excl. diagonal): 10 + # dense rows/columns of A+A': 0 + memory used, in bytes: 228 + # of memory compactions: 0 + + The following approximate statistics are for a subsequent + factorization of A(P,P) + A(P,P)'. They are slight upper + bounds if there are no dense rows/columns in A+A', and become + looser if dense rows/columns exist. + + nonzeros in L (excluding diagonal): 5 + nonzeros in L (including diagonal): 10 + # divide operations for LDL' or LU: 5 + # multiply-subtract operations for LDL': 6 + # multiply-subtract operations for LU: 7 + max nz. in any column of L (incl. diagonal): 3 + + chol flop count for real A, sqrt counted as 1 flop: 22 + LDL' flop count for real A: 17 + LDL' flop count for complex A: 93 + LU flop count for real A (with no pivoting): 19 + LU flop count for complex A (with no pivoting): 101 + +PERM ( 1) = 1 +PERM ( 2) = 4 +PERM ( 3) = 3 +PERM ( 4) = 5 +PERM ( 5) = 2 diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Demo/amd_f77demo.f --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Demo/amd_f77demo.f Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,161 @@ +C ====================================================================== +C === Fortran AMD demo main program ==================================== +C ====================================================================== + +C ---------------------------------------------------------------------- +C AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. +C Davis, Patrick R. Amestoy, and Iain S. Duff. See ../README for +C License. email: davis@cise.ufl.edu CISE Department, Univ. of +C Florida. web: http://www.cise.ufl.edu/research/sparse/amd +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 -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Demo/amd_f77demo.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Demo/amd_f77demo.out Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,318 @@ +AMD Fortran 77 demo, with the 24-by-24 Harwell/Boeing matrix, can_24: +Input matrix: 24-by-24 with 136 entries +Note that the Fortran version of AMD requires that +no diagonal entries be present. + +Column: 1 number of entries: 8 with row indices in AI ( 1 ... 8) + row indices: 6 7 13 14 18 19 20 22 + +Column: 2 number of entries: 5 with row indices in AI ( 9 ... 13) + row indices: 9 10 14 15 18 + +Column: 3 number of entries: 5 with row indices in AI ( 14 ... 18) + row indices: 7 12 21 22 23 + +Column: 4 number of entries: 5 with row indices in AI ( 19 ... 23) + row indices: 8 11 16 19 20 + +Column: 5 number of entries: 5 with row indices in AI ( 24 ... 28) + row indices: 8 10 15 16 17 + +Column: 6 number of entries: 5 with row indices in AI ( 29 ... 33) + row indices: 1 7 13 14 18 + +Column: 7 number of entries: 8 with row indices in AI ( 34 ... 41) + row indices: 1 3 6 12 13 20 22 24 + +Column: 8 number of entries: 8 with row indices in AI ( 42 ... 49) + row indices: 4 5 10 15 16 17 18 19 + +Column: 9 number of entries: 3 with row indices in AI ( 50 ... 52) + row indices: 2 10 15 + +Column: 10 number of entries: 8 with row indices in AI ( 53 ... 60) + row indices: 2 5 8 9 14 15 18 19 + +Column: 11 number of entries: 5 with row indices in AI ( 61 ... 65) + row indices: 4 19 20 21 22 + +Column: 12 number of entries: 5 with row indices in AI ( 66 ... 70) + row indices: 3 7 13 22 24 + +Column: 13 number of entries: 5 with row indices in AI ( 71 ... 75) + row indices: 1 6 7 12 24 + +Column: 14 number of entries: 5 with row indices in AI ( 76 ... 80) + row indices: 1 2 6 10 18 + +Column: 15 number of entries: 5 with row indices in AI ( 81 ... 85) + row indices: 2 5 8 9 10 + +Column: 16 number of entries: 5 with row indices in AI ( 86 ... 90) + row indices: 4 5 8 17 19 + +Column: 17 number of entries: 3 with row indices in AI ( 91 ... 93) + row indices: 5 8 16 + +Column: 18 number of entries: 8 with row indices in AI ( 94 ... 101) + row indices: 1 2 6 8 10 14 19 20 + +Column: 19 number of entries: 8 with row indices in AI (102 ... 109) + row indices: 1 4 8 10 11 16 18 20 + +Column: 20 number of entries: 8 with row indices in AI (110 ... 117) + row indices: 1 4 7 11 18 19 21 22 + +Column: 21 number of entries: 5 with row indices in AI (118 ... 122) + row indices: 3 11 20 22 23 + +Column: 22 number of entries: 8 with row indices in AI (123 ... 130) + row indices: 1 3 7 11 12 20 21 23 + +Column: 23 number of entries: 3 with row indices in AI (131 ... 133) + row indices: 3 21 22 + +Column: 24 number of entries: 3 with row indices in AI (134 ... 136) + row indices: 7 12 13 +Plot of input matrix pattern: + 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 + 1: X . . . . X X . . . . . X X . . . X X X . X . . + 2: . X . . . . . . X X . . . X X . . X . . . . . . + 3: . . X . . . X . . . . X . . . . . . . . X X X . + 4: . . . X . . . X . . X . . . . X . . X X . . . . + 5: . . . . X . . X . X . . . . X X X . . . . . . . + 6: X . . . . X X . . . . . X X . . . X . . . . . . + 7: X . X . . X X . . . . X X . . . . . . X . X . X + 8: . . . X X . . X . X . . . . X X X X X . . . . . + 9: . X . . . . . . X X . . . . X . . . . . . . . . + 10: . X . . X . . X X X . . . X X . . X X . . . . . + 11: . . . X . . . . . . X . . . . . . . X X X X . . + 12: . . X . . . X . . . . X X . . . . . . . . X . X + 13: X . . . . X X . . . . X X . . . . . . . . . . X + 14: X X . . . X . . . X . . . X . . . X . . . . . . + 15: . X . . X . . X X X . . . . X . . . . . . . . . + 16: . . . X X . . X . . . . . . . X X . X . . . . . + 17: . . . . X . . X . . . . . . . X X . . . . . . . + 18: X X . . . X . X . X . . . X . . . X X X . . . . + 19: X . . X . . . X . X X . . . . X . X X X . . . . + 20: X . . X . . X . . . X . . . . . . X X X X X . . + 21: . . X . . . . . . . X . . . . . . . . X X X X . + 22: X . X . . . X . . . X X . . . . . . . X X X X . + 23: . . X . . . . . . . . . . . . . . . . . X X X . + 24: . . . . . . X . . . . X X . . . . . . . . . . X + +------------------------------------------ +ordering the matrix with AMD +------------------------------------------ + +Permutation vector: + 24 23 17 9 15 5 21 13 6 11 16 8 2 10 14 18 1 3 4 19 7 12 22 20 + +Inverse permutation vector: + 17 13 18 19 6 9 21 12 4 14 10 22 8 15 5 11 3 16 20 24 7 23 2 1 +Plot of permuted matrix pattern: + 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 + 1: X . . . . . . X . . . . . . . . . . . . X X . . + 2: . X . . . . X . . . . . . . . . . X . . . . X . + 3: . . X . . X . . . . X X . . . . . . . . . . . . + 4: . . . X X . . . . . . . X X . . . . . . . . . . + 5: . . . X X X . . . . . X X X . . . . . . . . . . + 6: . . X . X X . . . . X X . X . . . . . . . . . . + 7: . X . . . . X . . X . . . . . . . X . . . . X X + 8: X . . . . . . X X . . . . . . . X . . . X X . . + 9: . . . . . . . X X . . . . . X X X . . . X . . . + 10: . . . . . . X . . X . . . . . . . . X X . . X X + 11: . . X . . X . . . . X X . . . . . . X X . . . . + 12: . . X . X X . . . . X X . X . X . . X X . . . . + 13: . . . X X . . . . . . . X X X X . . . . . . . . + 14: . . . X X X . . . . . X X X X X . . . X . . . . + 15: . . . . . . . . X . . . X X X X X . . . . . . . + 16: . . . . . . . . X . . X X X X X X . . X . . . X + 17: . . . . . . . X X . . . . . X X X . . X X . X X + 18: . X . . . . X . . . . . . . . . . X . . X X X . + 19: . . . . . . . . . X X X . . . . . . X X . . . X + 20: . . . . . . . . . X X X . X . X X . X X . . . X + 21: X . . . . . . X X . . . . . . . X X . . X X X X + 22: X . . . . . . X . . . . . . . . . X . . X X X . + 23: . X . . . . X . . X . . . . . . X X . . X X X X + 24: . . . . . . X . . X . . . . . X X . X X X . X X + +New column: 1 old column: 24 number of entries: 3 + new row indices: 21 22 8 + +New column: 2 old column: 23 number of entries: 3 + new row indices: 18 7 23 + +New column: 3 old column: 17 number of entries: 3 + new row indices: 6 12 11 + +New column: 4 old column: 9 number of entries: 3 + new row indices: 13 14 5 + +New column: 5 old column: 15 number of entries: 5 + new row indices: 13 6 12 4 14 + +New column: 6 old column: 5 number of entries: 5 + new row indices: 12 14 5 11 3 + +New column: 7 old column: 21 number of entries: 5 + new row indices: 18 10 24 23 2 + +New column: 8 old column: 13 number of entries: 5 + new row indices: 17 9 21 22 1 + +New column: 9 old column: 6 number of entries: 5 + new row indices: 17 21 8 15 16 + +New column: 10 old column: 11 number of entries: 5 + new row indices: 19 20 24 7 23 + +New column: 11 old column: 16 number of entries: 5 + new row indices: 19 6 12 3 20 + +New column: 12 old column: 8 number of entries: 8 + new row indices: 19 6 14 5 11 3 16 20 + +New column: 13 old column: 2 number of entries: 5 + new row indices: 4 14 15 5 16 + +New column: 14 old column: 10 number of entries: 8 + new row indices: 13 6 12 4 15 5 16 20 + +New column: 15 old column: 14 number of entries: 5 + new row indices: 17 13 9 14 16 + +New column: 16 old column: 18 number of entries: 8 + new row indices: 17 13 9 12 14 15 20 24 + +New column: 17 old column: 1 number of entries: 8 + new row indices: 9 21 8 15 16 20 24 23 + +New column: 18 old column: 3 number of entries: 5 + new row indices: 21 22 7 23 2 + +New column: 19 old column: 4 number of entries: 5 + new row indices: 12 10 11 20 24 + +New column: 20 old column: 19 number of entries: 8 + new row indices: 17 19 12 14 10 11 16 24 + +New column: 21 old column: 7 number of entries: 8 + new row indices: 17 18 9 22 8 24 23 1 + +New column: 22 old column: 12 number of entries: 5 + new row indices: 18 21 8 23 1 + +New column: 23 old column: 22 number of entries: 8 + new row indices: 17 18 21 10 22 24 7 2 + +New column: 24 old column: 20 number of entries: 8 + new row indices: 17 19 21 10 16 20 7 23 + +------------------------------------------ +ordering the matrix with AMDBAR +------------------------------------------ + +Permutation vector: + 24 23 17 9 15 5 21 13 6 11 16 8 2 10 14 18 1 3 4 19 7 12 22 20 + +Inverse permutation vector: + 17 13 18 19 6 9 21 12 4 14 10 22 8 15 5 11 3 16 20 24 7 23 2 1 +Plot of permuted matrix pattern: + 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 + 1: X . . . . . . X . . . . . . . . . . . . X X . . + 2: . X . . . . X . . . . . . . . . . X . . . . X . + 3: . . X . . X . . . . X X . . . . . . . . . . . . + 4: . . . X X . . . . . . . X X . . . . . . . . . . + 5: . . . X X X . . . . . X X X . . . . . . . . . . + 6: . . X . X X . . . . X X . X . . . . . . . . . . + 7: . X . . . . X . . X . . . . . . . X . . . . X X + 8: X . . . . . . X X . . . . . . . X . . . X X . . + 9: . . . . . . . X X . . . . . X X X . . . X . . . + 10: . . . . . . X . . X . . . . . . . . X X . . X X + 11: . . X . . X . . . . X X . . . . . . X X . . . . + 12: . . X . X X . . . . X X . X . X . . X X . . . . + 13: . . . X X . . . . . . . X X X X . . . . . . . . + 14: . . . X X X . . . . . X X X X X . . . X . . . . + 15: . . . . . . . . X . . . X X X X X . . . . . . . + 16: . . . . . . . . X . . X X X X X X . . X . . . X + 17: . . . . . . . X X . . . . . X X X . . X X . X X + 18: . X . . . . X . . . . . . . . . . X . . X X X . + 19: . . . . . . . . . X X X . . . . . . X X . . . X + 20: . . . . . . . . . X X X . X . X X . X X . . . X + 21: X . . . . . . X X . . . . . . . X X . . X X X X + 22: X . . . . . . X . . . . . . . . . X . . X X X . + 23: . X . . . . X . . X . . . . . . X X . . X X X X + 24: . . . . . . X . . X . . . . . X X . X X X . X X + +New column: 1 old column: 24 number of entries: 3 + new row indices: 21 22 8 + +New column: 2 old column: 23 number of entries: 3 + new row indices: 18 7 23 + +New column: 3 old column: 17 number of entries: 3 + new row indices: 6 12 11 + +New column: 4 old column: 9 number of entries: 3 + new row indices: 13 14 5 + +New column: 5 old column: 15 number of entries: 5 + new row indices: 13 6 12 4 14 + +New column: 6 old column: 5 number of entries: 5 + new row indices: 12 14 5 11 3 + +New column: 7 old column: 21 number of entries: 5 + new row indices: 18 10 24 23 2 + +New column: 8 old column: 13 number of entries: 5 + new row indices: 17 9 21 22 1 + +New column: 9 old column: 6 number of entries: 5 + new row indices: 17 21 8 15 16 + +New column: 10 old column: 11 number of entries: 5 + new row indices: 19 20 24 7 23 + +New column: 11 old column: 16 number of entries: 5 + new row indices: 19 6 12 3 20 + +New column: 12 old column: 8 number of entries: 8 + new row indices: 19 6 14 5 11 3 16 20 + +New column: 13 old column: 2 number of entries: 5 + new row indices: 4 14 15 5 16 + +New column: 14 old column: 10 number of entries: 8 + new row indices: 13 6 12 4 15 5 16 20 + +New column: 15 old column: 14 number of entries: 5 + new row indices: 17 13 9 14 16 + +New column: 16 old column: 18 number of entries: 8 + new row indices: 17 13 9 12 14 15 20 24 + +New column: 17 old column: 1 number of entries: 8 + new row indices: 9 21 8 15 16 20 24 23 + +New column: 18 old column: 3 number of entries: 5 + new row indices: 21 22 7 23 2 + +New column: 19 old column: 4 number of entries: 5 + new row indices: 12 10 11 20 24 + +New column: 20 old column: 19 number of entries: 8 + new row indices: 17 19 12 14 10 11 16 24 + +New column: 21 old column: 7 number of entries: 8 + new row indices: 17 18 9 22 8 24 23 1 + +New column: 22 old column: 12 number of entries: 5 + new row indices: 18 21 8 23 1 + +New column: 23 old column: 22 number of entries: 8 + new row indices: 17 18 21 10 22 24 7 2 + +New column: 24 old column: 20 number of entries: 8 + new row indices: 17 19 21 10 16 20 7 23 diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Demo/amd_f77simple.f --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Demo/amd_f77simple.f Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,38 @@ +C ---------------------------------------------------------------------- +C AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. +C Davis, Patrick R. Amestoy, and Iain S. Duff. See ../README for +C License. email: davis@cise.ufl.edu CISE Department, Univ. of +C Florida. web: http://www.cise.ufl.edu/research/sparse/amd +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 -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Demo/amd_f77simple.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Demo/amd_f77simple.out Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,5 @@ +P ( 1) = 4 +P ( 2) = 1 +P ( 3) = 3 +P ( 4) = 5 +P ( 5) = 2 diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Demo/amd_f77wrapper.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Demo/amd_f77wrapper.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,108 @@ +/* ========================================================================= */ +/* === amd_f77wrapper ====================================================== */ +/* ========================================================================= */ + +/* ------------------------------------------------------------------------- */ +/* AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis, */ +/* Patrick R. Amestoy, and Iain S. Duff. See ../README for License. */ +/* email: davis@cise.ufl.edu CISE Department, Univ. of Florida. */ +/* web: http://www.cise.ufl.edu/research/sparse/amd */ +/* ------------------------------------------------------------------------- */ + +/* 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). + * + * Tested with the following compilers: + * Solaris with cc and f77 from Sun WorkShop 6 update 1. + * SGI Irix with MIPSpro cc and f77 compilers version 7.4 + * Linux with GNU gcc or Intel's icc, and GNU g77 Intel's ifc Fortran compiler. + * (any combination). Note that with g77, a call to amd_order in Fortran + * gets translated to a call to amd_order__, with two underscores ("_"). + * Thus, the Fortran names do not include an underscore. + */ + +#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) ; +} + +void amdpreproc_ (int *n, const int *Ap, const int *Ai, int *Rp, int *Ri) +{ + int result = amd_preprocess (*n, Ap, Ai, Rp, Ri) ; + if (result != AMD_OK && Rp) Rp [0] = result ; +} + +/* ------------------------------------------------------------------------- */ +/* 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) ; +} + +void amdpreproc (int *n, const int *Ap, const int *Ai, int *Rp, int *Ri) +{ + int result = amd_preprocess (*n, Ap, Ai, Rp, Ri) ; + if (result != AMD_OK && Rp) Rp [0] = result ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Demo/amd_simple.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Demo/amd_simple.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,23 @@ +/* ------------------------------------------------------------------------- */ +/* AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis, */ +/* Patrick R. Amestoy, and Iain S. Duff. See ../README for License. */ +/* email: davis@cise.ufl.edu CISE Department, Univ. of Florida. */ +/* web: http://www.cise.ufl.edu/research/sparse/amd */ +/* ------------------------------------------------------------------------- */ + +#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 -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Demo/amd_simple.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Demo/amd_simple.out Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,5 @@ +P [0] = 0 +P [1] = 3 +P [2] = 2 +P [3] = 4 +P [4] = 1 diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Doc/AMD_UserGuide.bib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Doc/AMD_UserGuide.bib Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,86 @@ +@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} + } + +@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{DavisGilbertLarimoreNg00pending, + 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={(to appear)} + } + diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Doc/AMD_UserGuide.pdf Binary file liboctave/UMFPACK/AMD/Doc/AMD_UserGuide.pdf has changed diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Doc/AMD_UserGuide.tex --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Doc/AMD_UserGuide.tex Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,1138 @@ +\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 Version 1.1 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{ +Dept.~of Computer and Information Science and Engineering, +Univ.~of Florida, Gainesville, FL, USA. +email: davis@cise.ufl.edu. +http://www.cise.ufl.edu/$\sim$davis. +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{January 29, 2004} +\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} +%------------------------------------------------------------------------------ + +Technical report TR-04-002, CISE Department, University of Florida, +Gainesville, FL, 2004. + +AMD Version 1.1 (Jan. 21, 2004), Copyright\copyright 2004 by Timothy A. +Davis, Patrick R. Amestoy, and Iain S. Duff. All Rights Reserved. + +{\bf AMD License:} + Your use or distribution of AMD or any modified version of + AMD implies that you agree to this License. + + THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY + EXPRESSED OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + + Permission is hereby granted to use or copy this program, 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 AMD or any modified version of AMD 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. This + software was developed with support from the National Science Foundation, + and is provided to you free of charge. + +{\bf Availability:} + http://www.cise.ufl.edu/research/sparse/amd + +{\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} 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, +AMD Version 1.1 is available at http://www.cise.ufl.edu/research/sparse. +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} +%------------------------------------------------------------------------------ + +To use AMD in MATLAB, you must first compile the AMD mexFunction. +Just type {\tt make} in the Unix system shell, while in the {\tt AMD} +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 +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.cise.ufl.edu/research/sparse/umfpack. + +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{DavisGilbertLarimoreNg00pending}. + +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 five 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\_INVALID} if + the matrix is invalid, or {\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\_preprocess} +({\tt long} version: {\tt amd\_l\_info}) + {\footnotesize + \begin{verbatim} + #include "amd.h" + int n, Ap [n+1], Ai [nz], Rp [n+1], Ri [nz] ; + int result = amd_preprocess (n, Ap, Ai, Rp, Ri) ; + \end{verbatim} + } + Removes duplicate entries and sorts each column of its input $\m{A}$, + and returns the nonzero pattern of the transpose, $\m{R}=\m{A}\tr$. + It returns the transpose because this is the simplest way to sort + a matrix and remove duplicate entries. Either $\m{A}$ or $\m{A}\tr$ + can be passed to {\tt amd\_order} with little effect on the + ordering (except for minor tie-breaking changes). + +\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}, +no duplicate row indices may be present, and the row indices in any given +column must be sorted in ascending order. +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), +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. + +The input to {\tt amd\_order} must have sorted columns because it uses +an in-place algorithm to construct $\m{A}+\m{A}\tr$ without first constructing +$\m{A}\tr$. This saves memory, but places an additional restriction on +the input. If the input matrix has columns with unsorted and/or duplicate +row indices, it is not valid as input to {\tt amd\_order}. To handle this +case, the {\tt amd\_preprocess} routine is provided. It sorts, transposes, +and removes duplicate entries from its input matrix, returning its result +as another compressed-column matrix $\m{R}$ which can then be passed to +{\tt amd\_order}. + +%------------------------------------------------------------------------------ +\subsection{Control parameters} +\label{control_param} +%------------------------------------------------------------------------------ + +Control parameters are set 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} +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], Rp [n+1], Ri [nz] ; +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) ; +amd_preprocess (n, Ap, Ai, Rp, Ri) ; +\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], Rp [n+1], Ri [nz] ; +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) ; +amd_l_preprocess (n, Ap, Ai, Rp, Ri) ; +\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 AMD/Make} +directory. You can edit the {\tt Make.include} +file in that directory to customize the compilation. The default +settings will work on most systems. +Sample configuration files are provided +for Linux, Sun Solaris, SGI IRIX, IBM AIX, and the DEC/Compaq Alpha. + +To compile and install the C-callable AMD library, +go to the {\tt AMD} directory and type {\tt make}. +The library will be placed in {\tt AMD/Lib/libamd.a}. +Two 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. The AMD mexFunction for +use in MATLAB will also be compiled. If you do not have MATLAB +type {\tt make lib} instead. + +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} removes all files not in the +original distribution. +If you compile AMD and then later change the {\tt Make.include} +file or your system-specific configuration file such as {\tt Make.linux}, +then you should type {\tt make purge} and then {\tt make} to recompile. + +Here are the various parameters that you can control in your +{\tt Make.include} file: + +\begin{itemize} +\item {\tt CC = } your C compiler, such as {\tt cc}. +\item {\tt RANLIB = } your system's {\tt ranlib} program, if needed. +\item {\tt CFLAGS = } optimization flags, such as {\tt -O}. +\item {\tt LIB = } your libraries, such as {\tt -lm} or {\tt -lblas}. +\item {\tt RM =} the command to delete a file. +\item {\tt MV =} the command to rename a file. +\item {\tt MEX =} the command to compile a MATLAB mexFunction. +\item {\tt F77 =} the command to compile a Fortran program (optional). +\item {\tt F77FLAGS =} the Fortran compiler flags (optional). +\item {\tt F77LIB =} the Fortran libraries (optional). +\end{itemize} + +The {\tt Make.include} includes some definitions regarding the BLAS. +This is so that AMD and UMFPACK (which requires AMD) can share +the same configuration files. If you wish to use AMD only, then +you can ignore any references to the BLAS (the -DNBLAS compile flag). + +When you compile your program that uses the C-callable AMD library, +you need to add the {\tt AMD/Lib/libamd.a} 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. + +If all you want to use is the AMD 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. + +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. The {\tt amd\_preprocess.c} file is optional as well, if you +can ensure that the input matrix to {\tt amd\_order} is always sorted +and has no duplicate entries. +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. Thus, it too can be excluded +if compiled into a larger production program or library. +The bare minimum files required to use just {\tt amd\_order} are +{\tt amd.h} in the {\tt Include} directory, +and +{\tt amd\_1.c}, +{\tt amd\_2.c}, +{\tt amd\_aat.c}, +{\tt and\_order.c}, +{\tt amd\_postorder.c}, +{\tt amd\_post\_tree.c}, +{\tt amd\_valid.c}, +and +{\tt amd\_internal.h}, +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 +\begin{verbatim} +/* ========================================================================= */ +/* === AMD: approximate minimum degree ordering =========================== */ +/* ========================================================================= */ + +/* ------------------------------------------------------------------------- */ +/* AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis, */ +/* Patrick R. Amestoy, and Iain S. Duff. See ../README for License. */ +/* email: davis@cise.ufl.edu CISE Department, Univ. of Florida. */ +/* web: http://www.cise.ufl.edu/research/sparse/amd */ +/* ------------------------------------------------------------------------- */ + +/* 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 "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 + +int amd_order ( /* returns 0 if OK, negative value if error */ + 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 */ +) ; + +long amd_l_order ( /* see above for description of arguments */ + long n, + const long Ap [ ], + const long Ai [ ], + long P [ ], + double Control [ ], + double Info [ ] +) ; + +/* Input arguments (not modified): + * + * n: the matrix A is n-by-n. + * Ap: an int/long array of size n+1, containing the column pointers of A. + * Ai: an int/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/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]. + * The row indices must appear in ascending order in each column, and there + * must not be any duplicate entries. 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.cise.ufl.edu/research/sparse/umfpack, or use the amd_preprocess + * routine discussed below. + * + * 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. For all j in the range 0 to n-1, + * and for all p in the range Ap [j] to Ap [j+1]-2, Ai [p] < Ai [p+1] must + * hold. Ai [0..nz-1] must be in the range 0 to n-1. To avoid integer + * overflow, (2.4*nz + 8*n) < INT_MAX / sizeof (int) for must hold for the + * "int" version. (2.4*nz + 8*n) < LONG_MAX / sizeof (long) must hold + * for the "long" version. 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. + * + * 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_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. + */ + +/* ------------------------------------------------------------------------- */ +/* AMD preprocess */ +/* ------------------------------------------------------------------------- */ + +/* amd_preprocess: sorts, removes duplicate entries, and transposes the + * nonzero pattern of a column-form matrix A, to obtain the matrix R. + * + * Alternatively, you can consider this routine as constructing a row-form + * matrix from a column-form matrix. Duplicate entries are allowed in A (and + * removed in R). The columns of R are sorted. Checks its input A for errors. + * + * On input, A can have unsorted columns, and can have duplicate entries. + * Ap [0] must still be zero, and Ap must be monotonically nondecreasing. + * Row indices must be in the range 0 to n-1. + * + * On output, if this routine returns AMD_OK, then the matrix R is a valid + * input matrix for AMD_order. It has sorted columns, with no duplicate + * entries in each column. Since AMD_order operates on the matrix A+A', it + * can just as easily use A or A', so the transpose has no significant effect + * (except for minor tie-breaking, which can lead to a minor effect in the + * quality of the ordering). As an example, compare the output of amd_demo.c + * and amd_demo2.c. + * + * This routine transposes A to get R because that's the simplest way to + * sort and remove duplicate entries from a matrix. + * + * Allocates 2*n integer work arrays, and free's them when done. + * + * If you wish to call amd_order, but do not know if your matrix has unsorted + * columns or duplicate entries, then you can use the following code, which is + * fairly efficient. amd_order will not allocate any internal matrix until + * it checks that the input matrix is valid, so the method below is memory- + * efficient as well. This code snippet assumes that Rp and Ri are already + * allocated, and are the same size as Ap and Ai respectively. + + result = amd_order (n, p, Ap, Ai, Control, Info) ; + if (result == AMD_INVALID) + { + if (amd_preprocess (n, Ap, Ai, Rp, Ri) == AMD_OK) + { + result = amd_order (n, p, Rp, Ri, Control, Info) ; + } + } + + * amd_preprocess will still return AMD_INVALID if any row index in Ai is out + * of range or if the Ap array is invalid. These errors are not corrected by + * amd_preprocess since they represent a more serious error that should be + * flagged with the AMD_INVALID error code. + */ + +int amd_preprocess +( + int n, + const int Ap [ ], + const int Ai [ ], + int Rp [ ], + int Ri [ ] +) ; + +long amd_l_preprocess +( + long n, + const long Ap [ ], + const long Ai [ ], + long Rp [ ], + long Ri [ ] +) ; + +/* Input arguments (not modified): + * + * n: the matrix A is n-by-n. + * Ap: an int/long array of size n+1, containing the column pointers of A. + * Ai: an int/long array of size nz, containing the row indices of A, + * where nz = Ap [n]. + * The nonzero pattern of column j of A is in Ai [Ap [j] ... Ap [j+1]-1]. + * Ap [0] must be zero, and Ap [j] <= Ap [j+1] must hold for all j in the + * range 0 to n-1. Row indices in Ai must be in the range 0 to n-1. + * The row indices in any one column need not be sorted, and duplicates + * may exist. + * + * Output arguments (not defined on input): + * + * Rp: an int/long array of size n+1, containing the column pointers of R. + * Ri: an int/long array of size rnz, containing the row indices of R, + * where rnz = Rp [n]. Note that Rp [n] will be less than Ap [n] if + * duplicates appear in A. In general, Rp [n] <= Ap [n]. + * The data structure for R is the same as A, except that each column of + * R contains sorted row indices, and no duplicates appear in any column. + * + * amd_preprocess returns: + * + * AMD_OK if the matrix A is valid and sufficient memory can be allocated + * to perform the preprocessing. + * + * AMD_OUT_OF_MEMORY if not enough memory can be allocated. + * + * AMD_INVALID if the input arguments n, Ap, Ai are invalid, or if Rp or + * Ri are NULL. + */ + +/* ------------------------------------------------------------------------- */ +/* 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 */ +#define AMD_INVALID -2 /* input arguments are not valid */ + +#endif +\end{verbatim} +} + +%------------------------------------------------------------------------------ +\newpage +% References +%------------------------------------------------------------------------------ + +\bibliographystyle{plain} +\bibliography{AMD_UserGuide} + +\end{document} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Doc/ChangeLog --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Doc/ChangeLog Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,37 @@ +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 -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Doc/License --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Doc/License Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,25 @@ +AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. +Davis, Patrick R. Amestoy, and Iain S. Duff. All Rights Reserved. + +AMD License: + + Your use or distribution of AMD or any modified version of + AMD implies that you agree to this License. + + THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY + EXPRESSED OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + + Permission is hereby granted to use or copy this program, 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 AMD or any modified version of AMD 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. This + software was developed with support from the National Science Foundation, + and is provided to you free of charge. + +Availability: + + http://www.cise.ufl.edu/research/sparse/amd diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Doc/Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Doc/Makefile Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,28 @@ +#------------------------------------------------------------------------------ +# AMD Makefile for compiling on Unix systems (for GNU or original make) +#------------------------------------------------------------------------------ + +all: dist + +include ../Make/Make.include + +#------------------------------------------------------------------------------ +# Remove all but the files in the original distribution +#------------------------------------------------------------------------------ + +purge: clean + - $(RM) *.aux *.bbl *.blg *.log *.toc + +#------------------------------------------------------------------------------ +# Create the User Guide and Quick Start Guide +#------------------------------------------------------------------------------ + +AMD_UserGuide.pdf: AMD_UserGuide.tex AMD_UserGuide.bib + pdflatex AMD_UserGuide + bibtex AMD_UserGuide + pdflatex AMD_UserGuide + pdflatex AMD_UserGuide + +dist: AMD_UserGuide.pdf + - $(RM) *.aux *.bbl *.blg *.log *.toc + diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Include/amd.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Include/amd.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,359 @@ +/* ========================================================================= */ +/* === AMD: approximate minimum degree ordering =========================== */ +/* ========================================================================= */ + +/* ------------------------------------------------------------------------- */ +/* AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis, */ +/* Patrick R. Amestoy, and Iain S. Duff. See ../README for License. */ +/* email: davis@cise.ufl.edu CISE Department, Univ. of Florida. */ +/* web: http://www.cise.ufl.edu/research/sparse/amd */ +/* ------------------------------------------------------------------------- */ + +/* 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 "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 + +int amd_order ( /* returns 0 if OK, negative value if error */ + 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 */ +) ; + +long amd_l_order ( /* see above for description of arguments */ + long n, + const long Ap [ ], + const long Ai [ ], + long P [ ], + double Control [ ], + double Info [ ] +) ; + +/* Input arguments (not modified): + * + * n: the matrix A is n-by-n. + * Ap: an int/long array of size n+1, containing the column pointers of A. + * Ai: an int/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/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]. + * The row indices must appear in ascending order in each column, and there + * must not be any duplicate entries. 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.cise.ufl.edu/research/sparse/umfpack, or use the amd_preprocess + * routine discussed below. + * + * 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. For all j in the range 0 to n-1, + * and for all p in the range Ap [j] to Ap [j+1]-2, Ai [p] < Ai [p+1] must + * hold. Ai [0..nz-1] must be in the range 0 to n-1. To avoid integer + * overflow, (2.4*nz + 8*n) < INT_MAX / sizeof (int) for must hold for the + * "int" version. (2.4*nz + 8*n) < LONG_MAX / sizeof (long) must hold + * for the "long" version. 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. + * + * 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_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. + */ + +/* ------------------------------------------------------------------------- */ +/* AMD preprocess */ +/* ------------------------------------------------------------------------- */ + +/* amd_preprocess: sorts, removes duplicate entries, and transposes the + * nonzero pattern of a column-form matrix A, to obtain the matrix R. + * + * Alternatively, you can consider this routine as constructing a row-form + * matrix from a column-form matrix. Duplicate entries are allowed in A (and + * removed in R). The columns of R are sorted. Checks its input A for errors. + * + * On input, A can have unsorted columns, and can have duplicate entries. + * Ap [0] must still be zero, and Ap must be monotonically nondecreasing. + * Row indices must be in the range 0 to n-1. + * + * On output, if this routine returns AMD_OK, then the matrix R is a valid + * input matrix for AMD_order. It has sorted columns, with no duplicate + * entries in each column. Since AMD_order operates on the matrix A+A', it + * can just as easily use A or A', so the transpose has no significant effect + * (except for minor tie-breaking, which can lead to a minor effect in the + * quality of the ordering). As an example, compare the output of amd_demo.c + * and amd_demo2.c. + * + * This routine transposes A to get R because that's the simplest way to + * sort and remove duplicate entries from a matrix. + * + * Allocates 2*n integer work arrays, and free's them when done. + * + * If you wish to call amd_order, but do not know if your matrix has unsorted + * columns or duplicate entries, then you can use the following code, which is + * fairly efficient. amd_order will not allocate any internal matrix until + * it checks that the input matrix is valid, so the method below is memory- + * efficient as well. This code snippet assumes that Rp and Ri are already + * allocated, and are the same size as Ap and Ai respectively. + + result = amd_order (n, p, Ap, Ai, Control, Info) ; + if (result == AMD_INVALID) + { + if (amd_preprocess (n, Ap, Ai, Rp, Ri) == AMD_OK) + { + result = amd_order (n, p, Rp, Ri, Control, Info) ; + } + } + + * amd_preprocess will still return AMD_INVALID if any row index in Ai is out + * of range or if the Ap array is invalid. These errors are not corrected by + * amd_preprocess since they represent a more serious error that should be + * flagged with the AMD_INVALID error code. + */ + +int amd_preprocess +( + int n, + const int Ap [ ], + const int Ai [ ], + int Rp [ ], + int Ri [ ] +) ; + +long amd_l_preprocess +( + long n, + const long Ap [ ], + const long Ai [ ], + long Rp [ ], + long Ri [ ] +) ; + +/* Input arguments (not modified): + * + * n: the matrix A is n-by-n. + * Ap: an int/long array of size n+1, containing the column pointers of A. + * Ai: an int/long array of size nz, containing the row indices of A, + * where nz = Ap [n]. + * The nonzero pattern of column j of A is in Ai [Ap [j] ... Ap [j+1]-1]. + * Ap [0] must be zero, and Ap [j] <= Ap [j+1] must hold for all j in the + * range 0 to n-1. Row indices in Ai must be in the range 0 to n-1. + * The row indices in any one column need not be sorted, and duplicates + * may exist. + * + * Output arguments (not defined on input): + * + * Rp: an int/long array of size n+1, containing the column pointers of R. + * Ri: an int/long array of size rnz, containing the row indices of R, + * where rnz = Rp [n]. Note that Rp [n] will be less than Ap [n] if + * duplicates appear in A. In general, Rp [n] <= Ap [n]. + * The data structure for R is the same as A, except that each column of + * R contains sorted row indices, and no duplicates appear in any column. + * + * amd_preprocess returns: + * + * AMD_OK if the matrix A is valid and sufficient memory can be allocated + * to perform the preprocessing. + * + * AMD_OUT_OF_MEMORY if not enough memory can be allocated. + * + * AMD_INVALID if the input arguments n, Ap, Ai are invalid, or if Rp or + * Ri are NULL. + */ + +/* ------------------------------------------------------------------------- */ +/* 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 */ +#define AMD_INVALID -2 /* input arguments are not valid */ + +#endif diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Lib/libamd.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Lib/libamd.def Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,12 @@ +LIBRARY libamd.dll +EXPORTS +amd_order +amd_defaults +amd_control +amd_info +amd_preprocess +amd_l_order +amd_l_defaults +amd_l_control +amd_l_info +amd_l_preprocess diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/MATLAB/Contents.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/MATLAB/Contents.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,13 @@ +%Contents of the AMD sparse matrix ordering package: +% +% amd p = amd (A), the approximate minimum degree ordering of A +% amd_demo a demo of amd, using the can_24 matrix +% amd_make to comple amd for use in MATLAB +% can_24.mat a sample sparse matrix from the Harwell/Boeing collection +% +% See also: amd, colamd, symamd, colmmd, symmmd, umfpack +% +% AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis, +% Patrick R. Amestoy, and Iain S. Duff. All Rights Reserved. + +help Contents diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/MATLAB/GNUmakefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/MATLAB/GNUmakefile Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,30 @@ +#------------------------------------------------------------------------------ +# GNUmakefile for the AMD MATLAB mexFunction +#------------------------------------------------------------------------------ + +all: amd + +include ../Make/Make.include + +MX = $(MEX) -I../Include + +AMD = amd_aat amd_1 amd_2 amd_dump amd_postorder amd_post_tree amd_defaults \ + amd_order amd_control amd_info amd_valid + +INC = ../Include/amd.h ../Source/amd_internal.h + +MEXAMD = $(addsuffix .o, $(subst amd_,amd_m_,$(AMD))) + +amd_m_%.o: ../Source/amd_%.c $(INC) + $(MX) -DDINT -c $< + - $(MV) amd_$*.o $@ + +amd: amd_mex.c $(MEXAMD) $(INC) + $(MX) -output amd amd_mex.c $(MEXAMD) + +#------------------------------------------------------------------------------ +# Remove all but the files in the original distribution +#------------------------------------------------------------------------------ + +purge: clean + - $(RM) amd.mex* amd.dll diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/MATLAB/Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/MATLAB/Makefile Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,50 @@ +#------------------------------------------------------------------------------ +# compile the AMD mexFunction for MATLAB (original make only) +#------------------------------------------------------------------------------ + +# This is a very ugly Makefile, and is only provided for those who do not +# have GNU make. Note that it is not used if you have GNU make. It ignores +# dependency checking and just compiles everything. It was created +# automatically, via make -n using the GNUmakefile. That way, I don't have +# maintain two Makefiles. + +all: amd + +include ../Make/Make.include + +MX = $(MEX) -I../Include + +amd: + $(MX) -DDINT -c ../Source/amd_aat.c + $(MV) amd_aat.o amd_m_aat.o + $(MX) -DDINT -c ../Source/amd_1.c + $(MV) amd_1.o amd_m_1.o + $(MX) -DDINT -c ../Source/amd_2.c + $(MV) amd_2.o amd_m_2.o + $(MX) -DDINT -c ../Source/amd_dump.c + $(MV) amd_dump.o amd_m_dump.o + $(MX) -DDINT -c ../Source/amd_postorder.c + $(MV) amd_postorder.o amd_m_postorder.o + $(MX) -DDINT -c ../Source/amd_post_tree.c + $(MV) amd_post_tree.o amd_m_post_tree.o + $(MX) -DDINT -c ../Source/amd_defaults.c + $(MV) amd_defaults.o amd_m_defaults.o + $(MX) -DDINT -c ../Source/amd_order.c + $(MV) amd_order.o amd_m_order.o + $(MX) -DDINT -c ../Source/amd_control.c + $(MV) amd_control.o amd_m_control.o + $(MX) -DDINT -c ../Source/amd_info.c + $(MV) amd_info.o amd_m_info.o + $(MX) -DDINT -c ../Source/amd_valid.c + $(MV) amd_valid.o amd_m_valid.o + $(MX) -output amd amd_mex.c amd_m_aat.o \ + amd_m_1.o amd_m_2.o amd_m_dump.o amd_m_postorder.o \ + amd_m_post_tree.o amd_m_defaults.o amd_m_order.o amd_m_control.o \ + amd_m_info.o amd_m_valid.o + +#------------------------------------------------------------------------------ +# Remove all but the files in the original distribution +#------------------------------------------------------------------------------ + +purge: clean + - $(RM) amd.mex* amd.dll diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/MATLAB/amd.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/MATLAB/amd.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,74 @@ +function [p, Info] = amd (A, Control) +%AMD Approximate minimum degree permutation. +% P = AMD (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)). +% +% Usage: P = amd (S) ; % finds the ordering +% [P, Info] = amd (S, Control) ; % optional parameters & statistics +% Control = amd ; % returns default parameters +% amd ; % 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 do: +% +% P = amd (S) ; +% C = spones (S) + spones (S') ; % skip this if S already symmetric +% [ignore, Q] = sparsfun ('symetree', C (P,P)) ; +% P = P (Q) ; +% +% -------------------------------------------------------------------------- +% AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis, +% Patrick R. Amestoy, and Iain S. Duff. See ../README for License. +% email: davis@cise.ufl.edu CISE Department, Univ. of Florida. +% web: http://www.cise.ufl.edu/research/sparse/amd +% -------------------------------------------------------------------------- +% +% Acknowledgements: This work was supported by the National Science +% Foundation, under grants ASC-9111263, DMS-9223088, and CCR-0203270. +% +% See also COLMMD, COLAMD, COLPERM, SYMAMD, SYMMMD, SYMRCM. + +more on +help amd +more off +error ('amd mexFunction not found! Type "amd_make" in MATLAB to compile amd'); diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/MATLAB/amd_demo.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/MATLAB/amd_demo.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,96 @@ +function amd_demo +% AMD DEMO +% +% A demo of AMD for MATLAB. +% +% -------------------------------------------------------------------------- +% AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis, +% Patrick R. Amestoy, and Iain S. Duff. See ../README for License. +% email: davis@cise.ufl.edu CISE Department, Univ. of Florida. +% web: http://www.cise.ufl.edu/research/sparse/amd +% -------------------------------------------------------------------------- +% +% See also: amd, amd_make + +% 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 amd + +% Get the Harwell/Boeing can_24 matrix. This is an example matrix from the +% MATLAB-accessible UF sparse matrix collection, and can be loaded into +% MATLAB with the statment "Problem = UFget ('HB/can_24')", after obtaining +% the UFget function and its supporting routines at +% http://www.cise.ufl.edu/sparse/mat . + +load can_24 +A = Problem.A ; +n = size (A,1) ; + +figure (1) +clf +hold off +subplot (2,2,1) ; +spy (A) +% remove the "_" from the name before printing it in the plot title +title (sprintf ('%s', strrep (Problem.name, '_', '-'))) ; +fprintf ('Matrix name: %s\n', Problem.name) ; +fprintf ('Matrix title: %s\n', Problem.title) ; + +% print the details during AMD ordering and SYMBFACT +spparms ('spumoni', 1) ; + +% 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] = amd (A) ; + +% order again, but this time print some statistics +[p, Info] = amd (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) + 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 + +% turn off diagnostic output in MATLAB's sparse matrix routines +spparms ('spumoni', 0) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/MATLAB/amd_demo.m.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/MATLAB/amd_demo.m.out Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,136 @@ +>> amd_demo + + AMD Approximate minimum degree permutation. + P = AMD (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)). + + Usage: P = amd (S) ; % finds the ordering + [P, Info] = amd (S, Control) ; % optional parameters & statistics + Control = amd ; % returns default parameters + amd ; % 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 do: + + P = amd (S) ; + C = spones (S) + spones (S') ; % skip this if S already symmetric + [ignore, Q] = sparsfun ('symetree', C (P,P)) ; + P = P (Q) ; + + -------------------------------------------------------------------------- + AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis, + Patrick R. Amestoy, and Iain S. Duff. See ../README for License. + email: davis@cise.ufl.edu CISE Department, Univ. of Florida. + web: http://www.cise.ufl.edu/research/sparse/amd + -------------------------------------------------------------------------- + + Acknowledgements: This work was supported by the National Science + Foundation, under grants ASC-9111263, DMS-9223088, and CCR-0203270. + + See also COLMMD, COLAMD, COLPERM, SYMAMD, SYMMMD, SYMRCM. + +Matrix name: HB/can_24 +Matrix title: 1SYMMETRIC PATTERN FROM CANNES,LUCIEN MARRO,JUNE 1981. + +If the next step fails, then you have +not yet compiled the AMD mexFunction. + +amd: approximate minimum degree ordering, parameters: + dense row parameter: 10 + (rows with more than max (10 * sqrt (n), 16) entries are + considered "dense", and placed last in output permutation) + aggressive absorption: yes + + input matrix A is 24-by-24 + input matrix A has 160 nonzero entries + +amd: approximate minimum degree ordering, results: + status: OK + n, dimension of A: 24 + nz, number of nonzeros in A: 160 + symmetry of A: 1.0000 + number of nonzeros on diagonal: 24 + nonzeros in pattern of A+A' (excl. diagonal): 136 + # dense rows/columns of A+A': 0 + memory used, in bytes: 1516 + # of memory compactions: 0 + + The following approximate statistics are for a subsequent + factorization of A(P,P) + A(P,P)'. They are slight upper + bounds if there are no dense rows/columns in A+A', and become + looser if dense rows/columns exist. + + nonzeros in L (excluding diagonal): 97 + nonzeros in L (including diagonal): 121 + # divide operations for LDL' or LU: 97 + # multiply-subtract operations for LDL': 275 + # multiply-subtract operations for LU: 453 + max nz. in any column of L (incl. diagonal): 8 + + chol flop count for real A, sqrt counted as 1 flop: 671 + LDL' flop count for real A: 647 + LDL' flop count for complex A: 3073 + LU flop count for real A (with no pivoting): 1003 + LU flop count for complex A (with no pivoting): 4497 + +Permutation vector: + 23 21 11 24 13 6 17 9 15 5 16 8 2 10 14 18 1 3 4 7 12 19 22 20 + +Analyze A(p,p) with MATLAB's symbfact routine: +predicted nonzeros: 120 +predicted flops: 656 +predicted height: 16 +predicted front size: 7 +number of nonzeros in L (including diagonal): 120 +floating point operation count for chol (A (p,p)): 656 + +Results from AMD's approximate analysis: +number of nonzeros in L (including diagonal): 121 +floating point operation count for chol (A (p,p)): 671 + +Note that the nonzero and flop counts from AMD are slight +upper bounds. This is due to the approximate minimum degree +method used, in conjunction with "mass elimination". +See the discussion about mass elimination in amd.h and +amd_2.c for more details. +>> diary off diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/MATLAB/amd_make.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/MATLAB/amd_make.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,32 @@ +function amd_make +% AMD_MAKE: compiles the AMD mexFunction for MATLAB +% +% -------------------------------------------------------------------------- +% AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis, +% Patrick R. Amestoy, and Iain S. Duff. See ../README for License. +% email: davis@cise.ufl.edu CISE Department, Univ. of Florida. +% web: http://www.cise.ufl.edu/research/sparse/amd +% -------------------------------------------------------------------------- +% +% See also: amd, amd_demo + +help amd_make +fprintf ('Compiling the AMD mexFunction:\n') ; +cmd = sprintf ('mex -inline -O -output amd -I..%sInclude amd_mex.c', filesep) ; +files = {'amd_order', 'amd_dump', 'amd_postorder', 'amd_post_tree', ... + 'amd_aat', 'amd_2', 'amd_1', 'amd_defaults', 'amd_control', 'amd_info', ... + 'amd_valid' } ; +for i = 1 : length (files) + cmd = sprintf ('%s ..%sSource%s%s.c', cmd, filesep, filesep, files {i}) ; +end +fprintf ('%s\n', cmd) ; +try + eval (cmd) ; +catch + fprintf ('Compilation not successful.\n') ; +end + +input ('\nHit enter to run the AMD demo\n') ; +more on +amd_demo +more off diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/MATLAB/amd_mex.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/MATLAB/amd_mex.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,189 @@ +/* ========================================================================= */ +/* === AMD mexFunction ===================================================== */ +/* ========================================================================= */ + +/* ------------------------------------------------------------------------- */ +/* AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis, */ +/* Patrick R. Amestoy, and Iain S. Duff. See ../README for License. */ +/* email: davis@cise.ufl.edu CISE Department, Univ. of Florida. */ +/* web: http://www.cise.ufl.edu/research/sparse/amd */ +/* ------------------------------------------------------------------------- */ + +/* + * 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. + */ + +#include "amd.h" +#include "mex.h" +#include "matrix.h" + +void mexFunction +( + int nlhs, + mxArray *plhs[], + int nrhs, + const mxArray *prhs[] +) +{ + int i, m, n, *Ap, *Ai, *P, nc, result, spumoni, full ; + double *Pout, *InfoOut, Control [AMD_CONTROL], Info [AMD_INFO], *ControlIn; + mxArray *A, *string, *parameter ; + + /* --------------------------------------------------------------------- */ + /* get control parameters */ + /* --------------------------------------------------------------------- */ + + spumoni = 0 ; + if (nrhs == 0) + { + /* get the default control parameters, and return */ + plhs [0] = mxCreateDoubleMatrix (AMD_CONTROL, 1, mxREAL) ; + amd_defaults (mxGetPr (plhs [0])) ; + if (nlhs == 0) + { + amd_control (mxGetPr (plhs [0])) ; + } + return ; + } + + amd_defaults (Control) ; + if (nrhs > 1) + { + ControlIn = mxGetPr (prhs [1]) ; + nc = mxGetM (prhs [1]) * mxGetN (prhs [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_control (Control) ; + } + + /* --------------------------------------------------------------------- */ + /* get inputs */ + /* --------------------------------------------------------------------- */ + + if (nlhs > 2 || nrhs > 2) + { + mexErrMsgTxt ("Usage: p = amd (A)\nor [p, Info] = amd (A, Control)") ; + } + + A = (mxArray *) prhs [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 (int)) ; + + /* --------------------------------------------------------------------- */ + /* 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 **) prhs, "sparse") ; + } + Ap = mxGetJc (A) ; + Ai = mxGetIr (A) ; + if (spumoni > 0) + { + mexPrintf (" input matrix A has %d nonzero entries\n", Ap [n]) ; + } + + /* --------------------------------------------------------------------- */ + /* order the matrix */ + /* --------------------------------------------------------------------- */ + + result = amd_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_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 */ + plhs [0] = mxCreateDoubleMatrix (1, n, mxREAL) ; + Pout = mxGetPr (plhs [0]) ; + for (i = 0 ; i < n ; i++) + { + Pout [i] = P [i] + 1 ; /* change to 1-based indexing for MATLAB */ + } + mxFree (P) ; + + /* Info */ + if (nlhs > 1) + { + plhs [1] = mxCreateDoubleMatrix (AMD_INFO, 1, mxREAL) ; + InfoOut = mxGetPr (plhs [1]) ; + for (i = 0 ; i < AMD_INFO ; i++) + { + InfoOut [i] = Info [i] ; + } + } +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/MATLAB/can_24.mat Binary file liboctave/UMFPACK/AMD/MATLAB/can_24.mat has changed diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Make/Make.alpha --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Make/Make.alpha Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,23 @@ +#------------------------------------------------------------------------------ +# Compaq Alpha configuration (for both AMD and UMFPACK) +#------------------------------------------------------------------------------ + +# 64-bit mode only +CFLAGS = -O2 -std1 -DLP64 + +#------------------------------------------------------------------------------ +# BLAS options (UMFPACK only): +#------------------------------------------------------------------------------ + +# 1: with the vendor-supplied BLAS +CONFIG = +LIB = -ldxml -lm + +# 2: with the vendor-supplied BLAS, including BLAS with 64-bit long integers +# CONFIG = -DLONGBLAS +# LIB = -ldxml -lm + +# 2: with no BLAS (this will be slow) +# CONFIG = -DNBLAS +# LIB = -lm + diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Make/Make.include --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Make/Make.include Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,72 @@ +#------------------------------------------------------------------------------ +# Include file for GNU make or original make (for both AMD and UMFPACK) +#------------------------------------------------------------------------------ + +# You can edit these definitions, or select and and edit a specfic +# Make.(architecture) file, below. This same file is used for configuring +# both AMD and UMFPACK. AMD is a stand-alone package. UMFPACK requires AMD, +# and for simplicity of configuring both packages, UMFPACK and AMD share this +# configuration file (and all files in the AMD/Make directory). To configure +# AMD, or both AMD and UMFPACK, you only need to edit this one file (and +# optionaly, one of the ../Make/Make. files below). + +# NOTE: -DNBLAS and other BLAS configurations are ignored by AMD, since AMD +# does not use the BLAS. This flag is here because this file, and the +# ../Make/Make.* files, are shared by UMFPACK (which requires AMD). If you +# use AMD but not UMFPACK, then you can ignore any BLAS-related configuration +# settings. + +CFLAGS = -O +RANLIB = ranlib +LIB = -lm +RM = rm -f +MV = mv -f +F77 = f77 +F77FLAGS = -O +F77LIB = +AR = ar + +#------------------------------------------------------------------------------ +# for the AMD and UMFPACK mexFunctions (-DNBLAS and -DNUTIL for UMFPACK only) +#------------------------------------------------------------------------------ + +# MATLAB 6.0 or later (default) +MEX = mex -inline -O + +# MATLAB 6.0 or later (no divide-by-zero) +# MEX = mex -inline -O -DNO_DIVIDE_BY_ZERO + +# MATLAB 5 (no BLAS, do not try to use utMalloc, utFree, and utRealloc) +# MEX = mex -inline -O -DNBLAS -DNUTIL + +#------------------------------------------------------------------------------ +# for UMFPACK only (BLAS configuration): +#------------------------------------------------------------------------------ + +# The default is to NOT use the BLAS. UMFPACK will be slow, but this is more +# portable. Try this option first, then use your architecture-specific +# configuration, below, to add the BLAS library. AMD ignores the -DNBLAS flag. + +CONFIG = -DNBLAS + +#------------------------------------------------------------------------------ +# Archicture-specific configuration (for both AMD and UMFPACK) +#------------------------------------------------------------------------------ + +# Select your architecture by un-commenting the appropriate line. The include +# file can redefine any of the above definitions, or other definitions. Use +# CC = ... to redefine the name of your C compiler, for example. Without +# any specific changes, this Makefile should work on nearly all systems. + +# include ../Make/Make.linux +# include ../Make/Make.sgi +# include ../Make/Make.solaris +# include ../Make/Make.alpha +# include ../Make/Make.rs6000 + +#------------------------------------------------------------------------------ +# remove object files and profile output +#------------------------------------------------------------------------------ + +clean: + - $(RM) *.o *.obj *.ln *.bb *.bbg *.da *.c.tcov *.c.gcov gmon.out *.bak diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Make/Make.linux --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Make/Make.linux Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,52 @@ +#------------------------------------------------------------------------------ +# Linux configuration (for both AMD and UMFPACK) +#------------------------------------------------------------------------------ + +# You may also need to add -lunwind -lcprts to the LIB= string, +# if you use the Intel compiler and the Fortran BLAS. + +# Using GNU gcc and f77 compilers: + CC = gcc + CFLAGS = -O3 -fPIC + +# Using Intel's icc and ifc compilers: +# F77 = ifc +# CC = icc +# CFLAGS = -ansi -O3 -ip -tpp7 -xW -vec_report0 +# CFLAGS = -pg -g + +# Using gcc compiler with picky tests +# CC = gcc +# CFLAGS = -ansi -pedantic -W -Wall -Wno-parentheses -Wshadow -Wcast-align -Winline -Wstrict-prototypes -Wno-unknown-pragmas -O3 -fPIC + +# for gcc and gcov: +# CC = gcc +# CFLAGS = -pg -ftest-coverage -fprofile-arcs + +# Running splint +# CC = - splint +# CFLAGS = -weak -fixedformalarray -badflag -fileextensions +relaxtypes +posixlib -unrecog + +#------------------------------------------------------------------------------ +# BLAS options (for UMFPACK only) +#------------------------------------------------------------------------------ + +# 1: with no BLAS (this will be slow) +# CONFIG = -DNBLAS +# LIB = -lm + +# 2: with the ATLAS C-BLAS (http://www.netlib.org/atlas). +# CONFIG = -DCBLAS -I../ATLAS/include +# LIB = -lcblas -latlas -lm + +# 3: with Fortran interface to the ATLAS BLAS +# CONFIG = +# LIB = -lf77blas -latlas -lfrtbegin -lg2c -lm + +# 4: with Fortran interface to the BLAS, and Goto's BLAS + CONFIG = + LIB = -lgoto -lxerbla -lfrtbegin -lg2c -lm + +# 5: with Fortran interface to the BLAS, and Goto's BLAS, and no divide-by-zero +# CONFIG = -DNO_DIVIDE_BY_ZERO +# LIB = -lgoto -lxerbla -lfrtbegin -lg2c -lm diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Make/Make.rs6000 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Make/Make.rs6000 Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,24 @@ +#------------------------------------------------------------------------------ +# IBM RS 6000 configuration (for both AMD and UMFPACK) +#------------------------------------------------------------------------------ + +# 32-bit mode: +CFLAGS = -O4 -qipa -qmaxmem=16384 -qproto +F77FLAGS = -O4 -qipa -qmaxmem=16384 + +# 64-bit mode: +# CFLAGS = -O4 -qipa -qmaxmem=16384 -q64 -DLP64 -qproto +# F77FLAGS = -O4 -qipa -qmaxmem=16384 -q64 -DLP64 +# AR = ar -X64 + +#------------------------------------------------------------------------------ +# BLAS options (for UMFPACK only): +#------------------------------------------------------------------------------ + +# 1: with the vendor-supplied BLAS. This is the default. +CONFIG = +LIB = -lessl -lm + +# 2: with no BLAS (this will be slow) +# CONFIG = -DNBLAS +# LIB = -lm diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Make/Make.sgi --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Make/Make.sgi Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,38 @@ +#------------------------------------------------------------------------------ +# SGI IRIX configuration (for both AMD and UMFPACK) +#------------------------------------------------------------------------------ + +# Default: 32-bit mode +# CFLAGS = + +# 64-bit mode (32 bit int's and 64-bit long's): +# CFLAGS = -DLP64 -64 +# F77FLAGS = -64 + +# SGI doesn't have ranlib +RANLIB = echo + +#------------------------------------------------------------------------------ +# BLAS options (for UMFPACK only): +#------------------------------------------------------------------------------ + +# 1: Default: with 32-bit int's and long's, and the 32-bit SCSL BLAS +CONFIG = +LIB = -lscs -lm + +# 2,3: with no BLAS (32 bit or 64 bit mode) +# CONFIG = -DNBLAS +# LIB = -lm + +# 4: 64 bit mode, with 64-bit SCSL BLAS. +# CONFIG = +# LIB = -lscs_i8 -lm + +# 5: 32 bit mode, with the Fortran interface to the vendor-supplied BLAS +# CONFIG = -DNSCSL +# LIB = -lblas -lm + +# 6: 32 bit mode, with the C-BLAS interface to the vendor-supplied BLAS +# CONFIG = -DCBLAS +# LIB = -lblas -lm + diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Make/Make.solaris --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Make/Make.solaris Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,34 @@ +#------------------------------------------------------------------------------ +# Sun Solaris configuration (for both AMD and UMFPACK) +#------------------------------------------------------------------------------ + +# 32-bit mode: +CC = cc +CFLAGS = -Xc -xO5 -KPIC -dalign -native +F77FLAGS = -xO5 -KPIC -dalign -native + +# 64-bit mode: +# CC = cc +# CFLAGS = -Xc -xO5 -KPIC -dalign -native -DLP64 -xtarget=ultra -xarch=v9 +# F77FLAGS = -xO5 -KPIC -dalign -native -DLP64 -xtarget=ultra -xarch=v9 + +#------------------------------------------------------------------------------ +# BLAS options (for UMFPACK only): +#------------------------------------------------------------------------------ + +# 1: Default: with the Sun Performance BLAS in 32-bit mode +CONFIG = +LIB = -lsunperf -lfai -lfsu -lfui -lsunperf -lm -lF77 -lm -lM77 -lsunmath + +# 2,3: with no BLAS (32-bit or 64-bit mode) +# CONFIG = -DNBLAS +# LIB = -lm + +# 4: the Sun Performance BLAS in 64-bit mode +# CONFIG = +# LIB = -lsunperf -lfai -lfsu -lfui -lsunperf -lm + +# 5: with the C-BLAS (http://www.netlib.org/atlas) in the ../ATLAS directory. +# CONFIG = -DCBLAS -I../ATLAS/include +# LIB = -L../ATLAS/lib/SunOS_SunUS1/ -lcblas -latlas -lm + diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Makefile Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,60 @@ +#------------------------------------------------------------------------------ +# AMD Makefile (for GNU Make or original make) +#------------------------------------------------------------------------------ + +# Compile everything, including the C-callable routine and the mexFunctions. +# Do not compile the FORTRAN versions. +all: + ( cd Source ; make ) + ( cd Demo ; make ) + ( cd MATLAB ; make ) + - cat Doc/License + +# compile just the C-callable libraries and demo programs (not mexFunctions) +lib: + ( cd Source ; make ) + ( cd Demo ; make ) + - cat Doc/License + +# compile the FORTRAN libraries and demo programs (not compiled by "make all") +fortran: + ( cd Source ; make fortran ) + ( cd Demo ; make fortran ) + - cat Doc/License + +# compile a FORTRAN demo program that calls the C version of AMD +# (not compiled by "make all") +cross: + ( cd Demo ; make cross ) + - cat Doc/License + +# compile a Octave version +# (not compiled by "make all") +octave: + ( cd OCTAVE ; make ) + - cat Doc/License + +# remove object files, but keep the compiled programs and library archives +clean: + ( cd Source ; make clean ) + ( cd Demo ; make clean ) + ( cd MATLAB ; make clean ) + ( cd OCTAVE ; make clean ) + ( cd Doc ; make clean ) + +# clean, and then remove compiled programs and library archives +purge: + ( cd Source ; make purge ) + ( cd Demo ; make purge ) + ( cd MATLAB ; make purge ) + ( cd OCTAVE ; make purge ) + ( cd Doc ; make purge ) + +# create PDF documents for the original distribution +doc: + ( cd Doc ; make ) + +# get ready for distribution +dist: purge + ( cd Demo ; make dist ) + ( cd Doc ; make ) diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/OCTAVE/GNUmakefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/OCTAVE/GNUmakefile Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,33 @@ +#------------------------------------------------------------------------------ +# GNUmakefile for the AMD MATLAB mexFunction +#------------------------------------------------------------------------------ + +all: amd + +include ../Make/Make.include + +MKOCT = mkoctfile -I../Include + +OCT_SPARSE_INC = -I../../../ + +AMD = amd_aat amd_1 amd_2 amd_dump amd_postorder amd_post_tree amd_defaults \ + amd_order amd_control amd_info amd_valid + +INC = ../Include/amd.h ../Source/amd_internal.h + +OCTAMD = $(addsuffix .o, $(subst amd_,amd_o_,$(AMD))) + +amd_o_%.o: ../Source/amd_%.c $(INC) + $(MKOCT) -DDINT -c $< -o $@ + - $(MV) ../Source/amd_$*.o + +# Note temporary addition of octave sparse path +amd: amd.cc $(OCTAMD) $(INC) + $(MKOCT) amd.cc $(OCTAMD) $(OCT_SPARSE_INC) -o amd.oct + +#------------------------------------------------------------------------------ +# Remove all but the files in the original distribution +#------------------------------------------------------------------------------ + +purge: clean + - $(RM) amd.oct diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/OCTAVE/Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/OCTAVE/Makefile Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,41 @@ +#------------------------------------------------------------------------------ +# compile the AMD mexFunction for MATLAB (original make only) +#------------------------------------------------------------------------------ + +# This is a very ugly Makefile, and is only provided for those who do not +# have GNU make. Note that it is not used if you have GNU make. It ignores +# dependency checking and just compiles everything. It was created +# automatically, via make -n using the GNUmakefile. That way, I don't have +# maintain two Makefiles. + +all: amd + +include ../Make/Make.include + +MKOCT = mkoctfile -I../Include + +OCT_SPARSE_INC = ../../../ + +amd: + $(MKOCT) -DDINT -o amd_o_aat.o -c ../Source/amd_aat.c + $(MKOCT) -DDINT -o amd_o_1.o -c ../Source/amd_1.c + $(MKOCT) -DDINT -o amd_o_2.o -c ../Source/amd_2.c + $(MKOCT) -DDINT -o amd_o_dump.o -c ../Source/amd_dump.c + $(MKOCT) -DDINT -o amd_o_postorder.o -c ../Source/amd_postorder.c + $(MKOCT) -DDINT -o amd_o_post_tree.o -c ../Source/amd_post_tree.c + $(MKOCT) -DDINT -o amd_o_defaults.o -c ../Source/amd_defaults.c + $(MKOCT) -DDINT -o amd_o_order.o -c ../Source/amd_order.c + $(MKOCT) -DDINT -o amd_o_control.o -c ../Source/amd_control.c + $(MKOCT) -DDINT -o amd_o_info.o -c ../Source/amd_info.c + $(MKOCT) -DDINT -o amd_o_valid.o -c ../Source/amd_valid.c + $(MKOCT) -output amd.oct amd_mex.c amd_o_aat.o \ + amd_o_1.o amd_o_2.o amd_o_dump.o amd_o_postorder.o \ + amd_o_post_tree.o amd_o_defaults.o amd_o_order.o amd_o_control.o \ + amd_o_info.o amd_o_valid.o $(OCT_SPARSE_INC) -o amd.oct + +#------------------------------------------------------------------------------ +# Remove all but the files in the original distribution +#------------------------------------------------------------------------------ + +purge: clean + - $(RM) amd.oct diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/OCTAVE/amd.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/OCTAVE/amd.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,299 @@ +/* + +Copyright (C) 2004 David Bateman + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +In addition to the terms of the GPL, you are permitted to link +this program with any Open Source program, as defined by the +Open Source Initiative (www.opensource.org) + +*/ + +/* + +This is the Octave interface to the UMFPACK AMD code, which bore the following +copyright + + AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis, + Patrick R. Amestoy, and Iain S. Duff. See ../README for License. + email: davis@cise.ufl.edu CISE Department, Univ. of Florida. + web: http://www.cise.ufl.edu/research/sparse/amd + -------------------------------------------------------------------------- + + Acknowledgements: This work was supported by the National Science + Foundation, under grants ASC-9111263, DMS-9223088, and CCR-0203270. + +*/ + +#include +#include + +#include +#include +#include +#include +#include + +#include "ov-re-sparse.h" +#include "ov-cx-sparse.h" + +// External AMD functions in C +extern "C" { +#include "amd.h" +} + +DEFUN_DLD (amd, args, nargout, + "-*- texinfo -*-\n\ +@deftypefn {Loadable Function} {@var{p} =} amd (@var{s})\n\ +@deftypefnx {Loadable Function} {@var{Control} =} amd ()\n\ +@deftypefnx {Loadable Function} {[@var{p}, @var{info}] =} amd (@var{s})\n\ +\n\ +AMD Approximate minimum degree permutation. Returns the approximate\n\ +minimum degree permutation vector for the sparse matrix\n\ +@code{@var{c} = @var{S} + @var{S}'}. The Cholesky factorization of\n\ +@code{@var{c} (@var{p}, @var{p})}, or @code{@var{s} (@var{p}, @var{p})},\n\ +tends to be sparser than that of @var{c} or @var{s}.\n\ +@var{s} must be square. If @var{s} is full, @code{amd (@var{S})} is\n\ +equivalent to @code{amd (sparse (@var{s}))}.\n\ +\n\ +@table @asis\n\ +@item @var{Control} (1)\n\ +If S is n-by-n, then rows/columns with more than\n\ +@code{@dfn{max} (16, (@var{Control} (1)) * @dfn{sqrt} (@var{n}))} entries\n\ +in @code{@var{s} + @var{S}'} are considered @emph{dense}, and ignored during\n\ +ordering. They are placed last in the output permutation. The default is\n\ +10.0 if @var{Control} is not present.\n\ +@item @var{Control} (2)\n\ +If nonzero, then aggressive absorption is performed. This is the default if\n\ +@var{Control} is not present.\n\ +@item @var{Control} (3)\n\ +If nonzero, print statistics about the ordering.\n\ +@end table\n\ +\n\ +@table @asis\n\ +@item @var{Info} (1)\n\ +status (0: ok, -1: out of memory, -2: matrix invalid)\n\ +@item @var{Info} (2)\n\ +@code{@var{n} = size (@var{a}, 1)}\n\ +@item @var{Info} (3)\n\ +@code{nnz (A)}\n\ +@item @var{Info} (4)\n\ +The symmetry of the matrix @var{s} (0.0 means purely unsymmetric, 1.0 means\n\ +purely symmetric). Computed as: @code{@var{b} = tril (@var{s}, -1) +\n\ +triu (@var{s}, 1); @var{symmetry} = nnz (@var{b} & @var{b}')\n\ +/ nnz (@var{b});}\n\ +@item @var{Info} (5)\n\ +@code{nnz (diag (@var{s}))}\n\ +@item @var{Info} (6)\n\ +@dfn{nnz} in @code{@var{s} + @var{s}'}, excluding the diagonal\n\ +(= @code{nnz (@var{b} + @var{b}')})\n\ +@item @var{Info} (7)\n\ +Number of @emph{dense} rows/columns in @code{@var{s} + @var{s}'}\n\ +@item @var{Info} (8)\n\ +The amount of memory used by AMD, in bytes\n\ +@item @var{Info} (9)\n\ +The number of memory compactions performed by AMD\n\ +@end table\n\ +\n\ +The following statistics are slight upper bounds because of the\n\ +approximate degree in AMD. The bounds are looser if @emph{dense}\n\ +rows/columns are ignored during ordering @code{(@var{Info} (7) > 0)}.\n\ +The statistics are for a subsequent factorization of the matrix\n\ +@code{@var{c} (@var{p},@var{p})}. The LU factorization statistics assume\n \ +no pivoting.\n\ +\n\ +@table @asis\n\ +@item @var{Info} (10)\n\ +The number of nonzeros in L, excluding the diagonal\n\ +@item @var{Info} (11)\n\ +The number of divide operations for LL', LDL', or LU\n\ +@item @var{Info (12)}\n\ +The number of multiply-subtract pairs for LL' or LDL'\n\ +@item @var{Info} (13)\n\ +The number of multiply-subtract pairs for LU\n\ +@item @var{Info} (14)\n\ +The max number of nonzeros in any column of L (incl. diagonal)\n\ +@item @var{Info} (15:20)\n\ +unused, reserved for future use\n\ +@end table\n\ +\n\ +An assembly tree post-ordering is performed, which is typically the same\n\ +as an elimination tree post-ordering. It is not always identical because\n\ +of the approximate degree update used, and because @emph{dense} rows/columns\n\ +do not take part in the post-order. It well-suited for a subsequent\n\ +@dfn{chol}, however. If you require a precise elimination tree\n\ +post-ordering, then do:\n\ +\n\ +@group\n\ + @var{p} = @dfn{amd} (@var{s});\n\ + % skip this if S already symmetric\n\ + @var{c} = spones (@var{s}) + spones (@var{s}');\n\ + [@var{ignore}, @var{q}] = sparsfun ('symetree', @var{c} (@var{p}, @var{p}));\n\ + @var{p} = @var{p} (@var{q});\n\ +@end group\n\ +\n\ +AMD Version 1.1 (Jan. 21, 2004), Copyright @copyright{} 2004 by\n\ +Timothy A. Davis, Patrick R. Amestoy, and Iain S. Duff.\n\ +\n\ +email: davis@@cise.ufl.edu (CISE Department, Univ. of Florida).\n\ +\n\ +web: http://www.cise.ufl.edu/research/sparse/amd\n\ +\n\ +Acknowledgements: This work was supported by the National Science\n\ +Foundation, under grants ASC-9111263, DMS-9223088, and CCR-0203270.\n\ +@end deftypefn") +{ + int nargin = args.length (); + octave_value_list retval; + int spumoni = 0; + + if (nargin > 2 || nargout > 2) + usage ("p = amd (A) or [p, Info] = amd (A, Control)"); + else if (nargin == 0) + { + // Get the default control parameter, and return + NDArray control (dim_vector (AMD_CONTROL, 1)); + double *control_ptr = control.fortran_vec (); + amd_defaults (control_ptr); + if (nargout == 0) + amd_control (control_ptr); + else + retval(0) = control; + } + else + { + NDArray control (dim_vector (AMD_CONTROL, 1)); + double *control_ptr = control.fortran_vec (); + amd_defaults (control_ptr); + + if (nargin > 1) + { + NDArray control_in = args(1).array_value(); + + if (error_state) + { + error ("amd: could not read control vector"); + return retval; + } + + dim_vector dv = control_in.dims (); + if (dv.length() > 2 || (dv(0) != 1 && dv(1) != 1)) + { + error ("amd: control vector isn't a vector"); + return retval; + } + + int nc = dv.numel (); + control (AMD_DENSE) = (nc > 0 ? control_in (AMD_DENSE) : + AMD_DEFAULT_DENSE); + control (AMD_AGGRESSIVE) = (nc > 1 ? control_in (AMD_AGGRESSIVE) : + AMD_DEFAULT_AGGRESSIVE); + spumoni = (nc > 2 ? (control_in (2) != 0) : 0); + } + + if (spumoni > 0) + amd_control (control_ptr); + + int *Ap, *Ai; + int n, m, nz; + + // These are here only so that the C++ destructors don't prematurally + // remove the underlying data we are interested in + SparseMatrix sm; + SparseComplexMatrix scm; + Matrix mm; + ComplexMatrix cm; + + if (args(0).class_name () != "sparse" && spumoni > 0) + octave_stdout << " input matrix A is full (sparse copy" + << " of A will be created)" << std::endl; + + if (args(0).is_complex_type ()) + { + scm = args(0).sparse_complex_matrix_value (); + Ai = scm.ridx (); + Ap = scm.cidx (); + m = scm.rows (); + n = scm.cols (); + nz = scm.nnz (); + } + else + { + sm = args(0).sparse_matrix_value (); + Ai = sm.ridx (); + Ap = sm.cidx (); + m = sm.rows (); + n = sm.cols (); + nz = sm.nnz (); + } + + if (spumoni > 0) + octave_stdout << " input matrix A is " << m << "-by-" << n + << std::endl; + + if (m != n) + { + error ("amd: A must be square"); + return retval; + } + + if (spumoni > 0) + octave_stdout << " input matrix A has " << nz << + " nonzero entries" << std::endl; + + // allocate workspace for output permutation + Array P(n+1); + int *P_ptr = P.fortran_vec (); + NDArray info (dim_vector (AMD_INFO, 1)); + double *info_ptr = info.fortran_vec (); + int result; + + // order the matrix + result = amd_order (n, Ap, Ai, P_ptr, control_ptr, info_ptr); + + // print results (including return value) + if (spumoni > 0) + amd_info (info_ptr); + + // check error conditions + if (result == AMD_OUT_OF_MEMORY) + error ("amd: out of memory"); + else if (result == AMD_INVALID) + error ("amd: input matrix A is corrupted"); + else + { + // copy the outputs to Octave + + // output permutation, P + NDArray perm (dim_vector (1, n)); + for (int i = 0; i < n; i++) + perm (i) = double (P(i) + 1); // 1-based indexing for Octave + + retval (0) = perm; + + // Info + if (nargout > 1) + retval (1) = info; + } + } + return retval; +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/OCTAVE/amd_demo.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/OCTAVE/amd_demo.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,61 @@ +function amd_demo +% AMD DEMO +% +% A demo of AMD for OCTAVE. +% +% -------------------------------------------------------------------------- +% AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis, +% Patrick R. Amestoy, and Iain S. Duff. See ../README for License. +% email: davis@cise.ufl.edu CISE Department, Univ. of Florida. +% web: http://www.cise.ufl.edu/research/sparse/amd +% -------------------------------------------------------------------------- +% +% See also: amd + +% Get the Harwell/Boeing can_24 matrix. This is an example matrix from the +% MATLAB-accessible UF sparse matrix collection, and can be loaded into +% MATLAB with the statment "Problem = UFget ('HB/can_24')", after obtaining +% the UFget function and its supporting routines at +% http://www.cise.ufl.edu/sparse/mat . + +load can_24.mat +A = Problem.A ; +n = size (A,1) ; + +figure (1) +clf +hold off +subplot (2,1,1) ; +% remove the "_" from the name before printing it in the plot title +title (sprintf ('%s', strrep (Problem.name, '_', '-'))) ; +fprintf ('Matrix name: %s\n', Problem.name) ; +fprintf ('Matrix title: %s\n', Problem.title) ; +spy (A) + +% print the details during AMD ordering and SYMBFACT +control = amd (); +control (3) = 1; + +% 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] = amd (A, control) ; + +% order again, but this time print some statistics +[p, Info] = amd (A, [10 1 1]) ; + +fprintf ('Permutation vector:\n') ; +fprintf (' %2d', p) ; +fprintf ('\n\n') ; + +subplot (2,1,2) ; +title ('Permuted matrix') ; +spy (A (p,p)) + +% 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) ; + diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/OCTAVE/amd_demo.m.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/OCTAVE/amd_demo.m.out Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,20 @@ +octave:3> amd_demo +ans = 1 +Matrix name: HB/can_24 +Matrix title: 1SYMMETRIC PATTERN FROM CANNES,LUCIEN MARRO,JUNE 1981. + +If the next step fails, then you have +not yet compiled the AMD mexFunction. + input matrix A is 24-by-24 + input matrix A has 160 nonzero entries + input matrix A is 24-by-24 + input matrix A has 160 nonzero entries +Permutation vector: + 23 21 11 24 13 6 17 9 15 5 16 8 2 10 14 18 1 3 4 7 12 19 22 20 + + +Results from AMD's approximate analysis: +number of nonzeros in L (including diagonal): 121 +floating point operation count for chol (A (p,p)): 671 + +octave:4> quit diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/OCTAVE/can_24.mat Binary file liboctave/UMFPACK/AMD/OCTAVE/can_24.mat has changed diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/README.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/README.txt Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,202 @@ +AMD version 1.1: a set of routines for permuting sparse matrices prior to + factorization. Includes a version in C, a version in Fortran, and a MATLAB + mexFunction. + +Quick start (Unix, or Windows with Cygwin): + + To compile, test, and install AMD, you may wish to first configure the + installation by editting the AMD/Make/Make.include file. Next, cd to this + directory (AMD) and type "make" (or "make lib" if you do not have MATLAB). + To compile and run a demo program for the Fortran version, type + "make fortran". When done, type "make clean" to remove unused *.o files + (keeps the compiled libraries and demo programs). See the User Guide + (Doc/AMD_UserGuide.pdf), or AMD/Make/Make.include, for more details. + +Quick start (for MATLAB users); + + To compile, test, and install the AMD mexFunction, cd to the + AMD/MATLAB directory and type amd_make at the MATLAB prompt. + This works on any system supported by MATLAB. + +------------------------------------------------------------------------------- + +AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. +Davis, Patrick R. Amestoy, and Iain S. Duff. All Rights Reserved. + +AMD License: + + Your use or distribution of AMD or any modified version of + AMD implies that you agree to this License. + + THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY + EXPRESSED OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + + Permission is hereby granted to use or copy this program, 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 AMD or any modified version of AMD 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. This + software was developed with support from the National Science Foundation, + and is provided to you free of charge. + +Availability: + + http://www.cise.ufl.edu/research/sparse/amd + +------------------------------------------------------------------------------- + +This is the AMD Version 1.1 README file. It is a terse overview of AMD. +Refer to the User Guide (Doc/AMD_UserGuide.pdf) for how to install and use AMD. + +Description: + + AMD is a set of routines for pre-ordering sparse matrices prior to Cholesky + or LU factorization, using the approximate minimum degree ordering + algorithm. Written in ANSI/ISO C with a MATLAB interface, and in + Fortran 77. + +Authors: + + Timothy A. Davis (davis@cise.ufl.edu), University of Florida. + Patrick R. Amestory, ENSEEIHT, Toulouse, France. + Iain S. Duff, Rutherford Appleton Laboratory, UK. + +Acknowledgements: + + This work was supported by the National Science Foundation, under + grants DMS-9504974, DMS-9803599, and 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. + +------------------------------------------------------------------------------- +Files and directories in the AMD v1.0 distribution: +------------------------------------------------------------------------------- + + --------------------------------------------------------------------------- + Subdirectories of the AMD directory: + --------------------------------------------------------------------------- + + Doc documentation + Make for compiling AMD + Source primary source code + Include include file for use in your code that calls AMD + Demo demo programs. also serves as test of the AMD installation. + MATLAB AMD mexFunction for MATLAB, and supporting m-files + Lib where the compiled C-callable and Fortran-callable + AMD libraries placed. + + --------------------------------------------------------------------------- + Files in the AMD directory: + --------------------------------------------------------------------------- + + Makefile top-level Makefile for GNU make or original make. + Windows users would require Cygwin to use "make" + + README this file + + --------------------------------------------------------------------------- + Doc directory: documentation + --------------------------------------------------------------------------- + + ChangeLog change log + License the AMD License + Makefile for creating the documentation + AMD_UserGuide.bib AMD User Guide (references) + AMD_UserGuide.tex AMD User Guide (LaTeX) + AMD_UserGuide.pdf AmD User Guide (PDF) + + --------------------------------------------------------------------------- + Make directory: for compiling AMD (Lib/libamd.a and Lib/libamdf77.a) + --------------------------------------------------------------------------- + + Make.include overall configurations. Can use one of: + Make.alpha Makefile additions for Compaq Alpha + Make.linux Makefile additions for Linux + Make.rs6000 Makefile additions for RS 6000 + Make.sgi Makefile additions for SGI + Make.solaris Makefile additions for Solaris + + --------------------------------------------------------------------------- + Source directory: + --------------------------------------------------------------------------- + + GNUmakefile a nice Makefile, for GNU make + Makefile an ugly Unix Makefile (for older make's) + + amd_order.c user-callable, primary AMD ordering routine + amd_control.c user-callable, prints the control parameters + amd_defaults.c user-callable, sets default control parameters + amd_info.c user-callable, prints the statistics from AMD + + amd_1.c non-user-callable, construct A+A' + amd_2.c non-user-callable, primary ordering kernel + (a C version of amd.f and amdbar.f, with + post-ordering added) + amd_aat.c non-user-callable, computes nnz (A+A') + amd_dump.c non-user-callable, debugging routines + amd_internal.h non-user-callable, include file for AMD + amd_mex.c non-user-callable, MATLAB mexFunction + amd_postorder.c non-user-callable, postorder + amd_post_tree.c non-user-callable, postorder just one tree + amd_valid.c non-user-callable, verifies a matrix + + amd.f user-callable Fortran 77 version + amdbar.f user-callable Fortran 77 version + + --------------------------------------------------------------------------- + Include directory: + --------------------------------------------------------------------------- + + amd.h include file for C programs that use AMD + + --------------------------------------------------------------------------- + Demo directory: + --------------------------------------------------------------------------- + + Makefile for GNU make or original make + + amd_demo.c C demo program for AMD + amd_demo.out output of amd_demo.c + + amd_simple.c simple C demo program for AMD + amd_simple.out output of amd_simple.c + + amd_f77demo.f Fortran 77 demo program for AMD + amd_f77demo.out output of amd_f77demo.f + + amd_f77simple.c simple Fortran 77 demo program for AMD + amd_f77simple.out output of amd_f77simple.f + + amd_f77cross.f Fortran 77 demo, calls the C version of AMD + amd_f77cross.out output of amd_f77cross.f + amd_f77wrapper.c Fortran-callable wrapper for C version of AMD + + --------------------------------------------------------------------------- + MATLAB directory: + --------------------------------------------------------------------------- + + GNUmakefile a nice Makefile, for GNU make + Makefile an ugly Unix Makefile (for older make's) + + Contents.m for "help amd" listing of toolbox contents + + amd.m MATLAB help file for AMD + amd_make.m MATLAB m-file for compiling AMD mexFunction + + amd_mex.c AMD mexFunction for MATLAB + + amd_demo.m MATLAB demo for AMD + amd_demo.m.out diary output of amd_demo.m + can_24.mat input file for AMD demo + + --------------------------------------------------------------------------- + Lib directory: libamd.a and libamdf77.a libraries placed here + --------------------------------------------------------------------------- + + libamd.def AMD definitions for Windows diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Source/GNUmakefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Source/GNUmakefile Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,68 @@ +#------------------------------------------------------------------------------- +# AMD Makefile for compiling on Unix systems (for GNU make only) +#------------------------------------------------------------------------------- + +all: ../Lib/libamd.a + +include ../Make/Make.include + +C = $(CC) $(CFLAGS) $(CONFIG) -I../Include + +#------------------------------------------------------------------------------- +# source files +#------------------------------------------------------------------------------- + +AMD = amd_aat amd_1 amd_2 amd_dump amd_postorder amd_post_tree amd_defaults \ + amd_order amd_control amd_info amd_valid amd_preprocess + +INC = ../Include/amd.h amd_internal.h + +#------------------------------------------------------------------------------- +# object files for each version +#------------------------------------------------------------------------------- + +AMDI = $(addsuffix .o, $(subst amd_,amd_i_,$(AMD))) +AMDL = $(addsuffix .o, $(subst amd_,amd_l_,$(AMD))) + +#------------------------------------------------------------------------------- +# compile each int and long routine (with no real/complex version) +#------------------------------------------------------------------------------- + +amd_i_%.o: amd_%.c $(INC) + $(C) -DDINT -c $< -o $@ + +amd_l_%.o: amd_%.c $(INC) + $(C) -DDLONG -c $< -o $@ + +#------------------------------------------------------------------------------- +# Create the libamd.a library (C versions only) +#------------------------------------------------------------------------------- + +../Lib/libamd.a: $(AMDI) $(AMDL) + $(AR) cr ../Lib/libamd.a $^ + - $(RANLIB) ../Lib/libamd.a + +#------------------------------------------------------------------------------- +# compile the Fortran versions and the libamdf77.a library +#------------------------------------------------------------------------------- + +fortran: ../Lib/libamdf77.a + +AMDF77 = amd.o amdbar.o + +amd.o: amd.f + $(F77) $(F77FLAGS) -c amd.f -o amd.o + +amdbar.o: amdbar.f + $(F77) $(F77FLAGS) -c amdbar.f -o amdbar.o + +../Lib/libamdf77.a: $(AMDF77) + $(AR) cr ../Lib/libamdf77.a $^ + - $(RANLIB) ../Lib/libamdf77.a + +#------------------------------------------------------------------------------- +# Remove all but the files in the original distribution +#------------------------------------------------------------------------------- + +purge: clean + - $(RM) ../Lib/libamd.a ../Lib/libamdf77.a diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Source/Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Source/Makefile Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,65 @@ +#------------------------------------------------------------------------------- +# AMD Makefile for compiling on Unix systems (for original Make ONLY) +#------------------------------------------------------------------------------- + +# This is a very ugly Makefile, and is only provided for those who do not +# have GNU make. Note that it is not used if you have GNU make. It ignores +# dependency checking and just compiles everything. It was created +# automatically, via make -n using the GNUmakefile. That way, I don't have +# maintain two Makefiles. + +all: everything + +include ../Make/Make.include + +C = $(CC) $(CFLAGS) $(CONFIG) -I../Include + +everything: + $(C) -DDINT -c amd_aat.c -o amd_i_aat.o + $(C) -DDINT -c amd_1.c -o amd_i_1.o + $(C) -DDINT -c amd_2.c -o amd_i_2.o + $(C) -DDINT -c amd_dump.c -o amd_i_dump.o + $(C) -DDINT -c amd_postorder.c -o amd_i_postorder.o + $(C) -DDINT -c amd_post_tree.c -o amd_i_post_tree.o + $(C) -DDINT -c amd_defaults.c -o amd_i_defaults.o + $(C) -DDINT -c amd_order.c -o amd_i_order.o + $(C) -DDINT -c amd_control.c -o amd_i_control.o + $(C) -DDINT -c amd_info.c -o amd_i_info.o + $(C) -DDINT -c amd_valid.c -o amd_i_valid.o + $(C) -DDINT -c amd_preprocess.c -o amd_i_preprocess.o + $(C) -DDLONG -c amd_aat.c -o amd_l_aat.o + $(C) -DDLONG -c amd_1.c -o amd_l_1.o + $(C) -DDLONG -c amd_2.c -o amd_l_2.o + $(C) -DDLONG -c amd_dump.c -o amd_l_dump.o + $(C) -DDLONG -c amd_postorder.c -o amd_l_postorder.o + $(C) -DDLONG -c amd_post_tree.c -o amd_l_post_tree.o + $(C) -DDLONG -c amd_defaults.c -o amd_l_defaults.o + $(C) -DDLONG -c amd_order.c -o amd_l_order.o + $(C) -DDLONG -c amd_control.c -o amd_l_control.o + $(C) -DDLONG -c amd_info.c -o amd_l_info.o + $(C) -DDLONG -c amd_valid.c -o amd_l_valid.o + $(C) -DDLONG -c amd_preprocess.c -o amd_l_preprocess.o + $(AR) cr ../Lib/libamd.a amd_i_aat.o amd_i_1.o amd_i_2.o amd_i_dump.o \ + amd_i_postorder.o amd_i_post_tree.o amd_i_defaults.o amd_i_order.o \ + amd_i_control.o amd_i_info.o amd_i_valid.o amd_l_aat.o amd_l_1.o \ + amd_l_2.o amd_l_dump.o amd_l_postorder.o amd_l_post_tree.o \ + amd_l_defaults.o amd_l_order.o amd_l_control.o amd_l_info.o \ + amd_l_valid.o amd_i_preprocess.o amd_l_preprocess.o + - $(RANLIB) ../Lib/libamd.a + +#------------------------------------------------------------------------------- +# compile the Fortran versions and the libamdf77.a library +#------------------------------------------------------------------------------- + +fortran: + $(F77) $(F77FLAGS) -c amd.f -o amd.o + $(F77) $(F77FLAGS) -c amdbar.f -o amdbar.o + $(AR) cr ../Lib/libamdf77.a amd.o amdbar.o + - $(RANLIB) ../Lib/libamdf77.a + +#------------------------------------------------------------------------------- +# Remove all but the files in the original distribution +#------------------------------------------------------------------------------- + +purge: clean + - $(RM) ../Lib/libamd.a ../Lib/libamdf77.a diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Source/amd.f --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Source/amd.f Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,1214 @@ +C----------------------------------------------------------------------- +C AMD: approximate minimum degree, with aggressive absorption +C----------------------------------------------------------------------- + + SUBROUTINE AMD + $ (N, PE, IW, LEN, IWLEN, PFREE, NV, NEXT, + $ LAST, HEAD, ELEN, DEGREE, NCMPA, W) + + 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) + +C Given a representation of the nonzero pattern of a symmetric matrix, +C A, (excluding the diagonal) perform an approximate minimum +C (UMFPACK/MA38-style) degree ordering to compute a pivot order +C such that the introduction of nonzeros (fill-in) in the Cholesky +C factors A = LL^T are kept low. At each step, the pivot +C selected is the one with the minimum UMFPACK/MA38-style +C upper-bound on the external degree. +C +C Aggresive absorption is used to tighten the bound on the degree. + +C ********************************************************************** +C ***** CAUTION: ARGUMENTS ARE NOT CHECKED FOR ERRORS ON INPUT. ****** +C ********************************************************************** + +C References: +C +C [1] Timothy A. Davis and Iain Duff, "An unsymmetric-pattern +C multifrontal method for sparse LU factorization", SIAM J. +C Matrix Analysis and Applications, vol. 18, no. 1, pp. +C 140-158. Discusses UMFPACK / MA38, which first introduced +C the approximate minimum degree used by this routine. +C +C [2] Patrick Amestoy, Timothy A. Davis, and Iain S. Duff, "An +C approximate degree ordering algorithm," SIAM J. Matrix +C Analysis and Applications, vol. 17, no. 4, pp. 886-905, +C 1996. Discusses AMD, AMDBAR, and MC47B. +C +C [3] Alan George and Joseph Liu, "The evolution of the minimum +C degree ordering algorithm," SIAM Review, vol. 31, no. 1, +C pp. 1-19, 1989. We list below the features mentioned in +C that paper that this code includes: +C +C mass elimination: +C Yes. MA27 relied on supervariable detection for mass +C elimination. +C indistinguishable nodes: +C Yes (we call these "supervariables"). This was also in +C the MA27 code - although we modified the method of +C detecting them (the previous hash was the true degree, +C which we no longer keep track of). A supervariable is +C a set of rows with identical nonzero pattern. All +C variables in a supervariable are eliminated together. +C Each supervariable has as its numerical name that of +C one of its variables (its principal variable). +C quotient graph representation: +C Yes. We use the term "element" for the cliques formed +C during elimination. This was also in the MA27 code. +C The algorithm can operate in place, but it will work +C more efficiently if given some "elbow room." +C element absorption: +C Yes. This was also in the MA27 code. +C external degree: +C Yes. The MA27 code was based on the true degree. +C incomplete degree update and multiple elimination: +C No. This was not in MA27, either. Our method of +C degree update within MC47B/BD is element-based, not +C variable-based. It is thus not well-suited for use +C with incomplete degree update or multiple elimination. + +C----------------------------------------------------------------------- +C Authors, and Copyright (C) 1995 by: +C Timothy A. Davis, Patrick Amestoy, Iain S. Duff, & John K. Reid. +C +C Acknowledgements: +C This work (and the UMFPACK package) was supported by the +C National Science Foundation (ASC-9111263 and DMS-9223088). +C The UMFPACK/MA38 approximate degree update algorithm, the +C unsymmetric analog which forms the basis of MC47B/BD, was +C developed while Tim Davis was supported by CERFACS (Toulouse, +C France) in a post-doctoral position. +C +C Date: September, 1995 +C----------------------------------------------------------------------- + +C----------------------------------------------------------------------- +C INPUT ARGUMENTS (unaltered): +C----------------------------------------------------------------------- + +C n: The matrix order. +C +C Restriction: 1 .le. n .lt. (iovflo/2)-2, where iovflo is +C the largest positive integer that your computer can represent. + +C iwlen: The length of iw (1..iwlen). On input, the matrix is +C stored in iw (1..pfree-1). However, iw (1..iwlen) should be +C slightly larger than what is required to hold the matrix, at +C least iwlen .ge. pfree + n is recommended. Otherwise, +C excessive compressions will take place. +C *** We do not recommend running this algorithm with *** +C *** iwlen .lt. pfree + n. *** +C *** Better performance will be obtained if *** +C *** iwlen .ge. pfree + n *** +C *** or better yet *** +C *** iwlen .gt. 1.2 * pfree *** +C *** (where pfree is its value on input). *** +C The algorithm will not run at all if iwlen .lt. pfree-1. +C +C Restriction: iwlen .ge. pfree-1 + +C----------------------------------------------------------------------- +C INPUT/OUPUT ARGUMENTS: +C----------------------------------------------------------------------- + +C pe: On input, pe (i) is the index in iw of the start of row i, or +C zero if row i has no off-diagonal non-zeros. +C +C During execution, it is used for both supervariables and +C elements: +C +C * Principal supervariable i: index into iw of the +C description of supervariable i. A supervariable +C represents one or more rows of the matrix +C with identical nonzero pattern. +C * Non-principal supervariable i: if i has been absorbed +C into another supervariable j, then pe (i) = -j. +C That is, j has the same pattern as i. +C Note that j might later be absorbed into another +C supervariable j2, in which case pe (i) is still -j, +C and pe (j) = -j2. +C * Unabsorbed element e: the index into iw of the description +C of element e, if e has not yet been absorbed by a +C subsequent element. Element e is created when +C the supervariable of the same name is selected as +C the pivot. +C * Absorbed element e: if element e is absorbed into element +C e2, then pe (e) = -e2. This occurs when the pattern of +C e (that is, Le) is found to be a subset of the pattern +C of e2 (that is, Le2). If element e is "null" (it has +C no nonzeros outside its pivot block), then pe (e) = 0. +C +C On output, pe holds the assembly tree/forest, which implicitly +C represents a pivot order with identical fill-in as the actual +C order (via a depth-first search of the tree). +C +C On output: +C If nv (i) .gt. 0, then i represents a node in the assembly tree, +C and the parent of i is -pe (i), or zero if i is a root. +C If nv (i) = 0, then (i,-pe (i)) represents an edge in a +C subtree, the root of which is a node in the assembly tree. + +C pfree: On input the tail end of the array, iw (pfree..iwlen), +C is empty, and the matrix is stored in iw (1..pfree-1). +C During execution, additional data is placed in iw, and pfree +C is modified so that iw (pfree..iwlen) is always the unused part +C of iw. On output, pfree is set equal to the size of iw that +C would have been needed for no compressions to occur. If +C ncmpa is zero, then pfree (on output) is less than or equal to +C iwlen, and the space iw (pfree+1 ... iwlen) was not used. +C Otherwise, pfree (on output) is greater than iwlen, and all the +C memory in iw was used. + +C----------------------------------------------------------------------- +C INPUT/MODIFIED (undefined on output): +C----------------------------------------------------------------------- + +C len: On input, len (i) holds the number of entries in row i of the +C matrix, excluding the diagonal. The contents of len (1..n) +C are undefined on output. + +C iw: On input, iw (1..pfree-1) holds the description of each row i +C in the matrix. The matrix must be symmetric, and both upper +C and lower triangular parts must be present. The diagonal must +C not be present. Row i is held as follows: +C +C len (i): the length of the row i data structure +C iw (pe (i) ... pe (i) + len (i) - 1): +C the list of column indices for nonzeros +C in row i (simple supervariables), excluding +C the diagonal. All supervariables start with +C one row/column each (supervariable i is just +C row i). +C if len (i) is zero on input, then pe (i) is ignored +C on input. +C +C Note that the rows need not be in any particular order, +C and there may be empty space between the rows. +C +C During execution, the supervariable i experiences fill-in. +C This is represented by placing in i a list of the elements +C that cause fill-in in supervariable i: +C +C len (i): the length of supervariable i +C iw (pe (i) ... pe (i) + elen (i) - 1): +C the list of elements that contain i. This list +C is kept short by removing absorbed elements. +C iw (pe (i) + elen (i) ... pe (i) + len (i) - 1): +C the list of supervariables in i. This list +C is kept short by removing nonprincipal +C variables, and any entry j that is also +C contained in at least one of the elements +C (j in Le) in the list for i (e in row i). +C +C When supervariable i is selected as pivot, we create an +C element e of the same name (e=i): +C +C len (e): the length of element e +C iw (pe (e) ... pe (e) + len (e) - 1): +C the list of supervariables in element e. +C +C An element represents the fill-in that occurs when supervariable +C i is selected as pivot (which represents the selection of row i +C and all non-principal variables whose principal variable is i). +C We use the term Le to denote the set of all supervariables +C in element e. Absorbed supervariables and elements are pruned +C from these lists when computationally convenient. +C +C CAUTION: THE INPUT MATRIX IS OVERWRITTEN DURING COMPUTATION. +C The contents of iw are undefined on output. + +C----------------------------------------------------------------------- +C OUTPUT (need not be set on input): +C----------------------------------------------------------------------- + +C nv: During execution, abs (nv (i)) is equal to the number of rows +C that are represented by the principal supervariable i. If i is +C a nonprincipal variable, then nv (i) = 0. Initially, +C nv (i) = 1 for all i. nv (i) .lt. 0 signifies that i is a +C principal variable in the pattern Lme of the current pivot +C element me. On output, nv (e) holds the true degree of element +C e at the time it was created (including the diagonal part). + +C ncmpa: The number of times iw was compressed. If this is +C excessive, then the execution took longer than what could have +C been. To reduce ncmpa, try increasing iwlen to be 10% or 20% +C larger than the value of pfree on input (or at least +C iwlen .ge. pfree + n). The fastest performance will be +C obtained when ncmpa is returned as zero. If iwlen is set to +C the value returned by pfree on *output*, then no compressions +C will occur. + +C elen: See the description of iw above. At the start of execution, +C elen (i) is set to zero. During execution, elen (i) is the +C number of elements in the list for supervariable i. When e +C becomes an element, elen (e) = -nel is set, where nel is the +C current step of factorization. elen (i) = 0 is done when i +C becomes nonprincipal. +C +C For variables, elen (i) .ge. 0 holds until just before the +C permutation vectors are computed. For elements, +C elen (e) .lt. 0 holds. +C +C On output elen (1..n) holds the inverse permutation (the same +C as the 'INVP' argument in Sparspak). That is, if k = elen (i), +C then row i is the kth pivot row. Row i of A appears as the +C (elen(i))-th row in the permuted matrix, PAP^T. + +C last: In a degree list, last (i) is the supervariable preceding i, +C or zero if i is the head of the list. In a hash bucket, +C last (i) is the hash key for i. last (head (hash)) is also +C used as the head of a hash bucket if head (hash) contains a +C degree list (see head, below). +C +C On output, last (1..n) holds the permutation (the same as the +C 'PERM' argument in Sparspak). That is, if i = last (k), then +C row i is the kth pivot row. Row last (k) of A is the k-th row +C in the permuted matrix, PAP^T. + +C----------------------------------------------------------------------- +C LOCAL (not input or output - used only during execution): +C----------------------------------------------------------------------- + +C degree: If i is a supervariable, then degree (i) holds the +C current approximation of the external degree of row i (an upper +C bound). The external degree is the number of nonzeros in row i, +C minus abs (nv (i)) (the diagonal part). The bound is equal to +C the external degree if elen (i) is less than or equal to two. +C +C We also use the term "external degree" for elements e to refer +C to |Le \ Lme|. If e is an element, then degree (e) holds |Le|, +C which is the degree of the off-diagonal part of the element e +C (not including the diagonal part). + +C head: head is used for degree lists. head (deg) is the first +C supervariable in a degree list (all supervariables i in a +C degree list deg have the same approximate degree, namely, +C deg = degree (i)). If the list deg is empty then +C head (deg) = 0. +C +C During supervariable detection head (hash) also serves as a +C pointer to a hash bucket. +C If head (hash) .gt. 0, there is a degree list of degree hash. +C The hash bucket head pointer is last (head (hash)). +C If head (hash) = 0, then the degree list and hash bucket are +C both empty. +C If head (hash) .lt. 0, then the degree list is empty, and +C -head (hash) is the head of the hash bucket. +C After supervariable detection is complete, all hash buckets +C are empty, and the (last (head (hash)) = 0) condition is +C restored for the non-empty degree lists. + +C next: next (i) is the supervariable following i in a link list, or +C zero if i is the last in the list. Used for two kinds of +C lists: degree lists and hash buckets (a supervariable can be +C in only one kind of list at a time). + +C w: The flag array w determines the status of elements and +C variables, and the external degree of elements. +C +C for elements: +C if w (e) = 0, then the element e is absorbed +C if w (e) .ge. wflg, then w (e) - wflg is the size of +C the set |Le \ Lme|, in terms of nonzeros (the +C sum of abs (nv (i)) for each principal variable i that +C is both in the pattern of element e and NOT in the +C pattern of the current pivot element, me). +C if wflg .gt. w (e) .gt. 0, then e is not absorbed and has +C not yet been seen in the scan of the element lists in +C the computation of |Le\Lme| in loop 150 below. +C +C for variables: +C during supervariable detection, if w (j) .ne. wflg then j is +C not in the pattern of variable i +C +C The w array is initialized by setting w (i) = 1 for all i, +C and by setting wflg = 2. It is reinitialized if wflg becomes +C too large (to ensure that wflg+n does not cause integer +C overflow). + +C----------------------------------------------------------------------- +C LOCAL INTEGERS: +C----------------------------------------------------------------------- + + INTEGER DEG, DEGME, DEXT, DMAX, E, ELENME, ELN, HASH, HMOD, I, + $ ILAST, INEXT, J, JLAST, JNEXT, K, KNT1, KNT2, KNT3, + $ LENJ, LN, MAXMEM, ME, MEM, MINDEG, NEL, NEWMEM, + $ NLEFT, NVI, NVJ, NVPIV, SLENME, WE, WFLG, WNVI, X + +C deg: the degree of a variable or element +C degme: size, |Lme|, of the current element, me (= degree (me)) +C dext: external degree, |Le \ Lme|, of some element e +C dmax: largest |Le| seen so far +C e: an element +C elenme: the length, elen (me), of element list of pivotal var. +C eln: the length, elen (...), of an element list +C hash: the computed value of the hash function +C hmod: the hash function is computed modulo hmod = max (1,n-1) +C i: a supervariable +C ilast: the entry in a link list preceding i +C inext: the entry in a link list following i +C j: a supervariable +C jlast: the entry in a link list preceding j +C jnext: the entry in a link list, or path, following j +C k: the pivot order of an element or variable +C knt1: loop counter used during element construction +C knt2: loop counter used during element construction +C knt3: loop counter used during compression +C lenj: len (j) +C ln: length of a supervariable list +C maxmem: amount of memory needed for no compressions +C me: current supervariable being eliminated, and the +C current element created by eliminating that +C supervariable +C mem: memory in use assuming no compressions have occurred +C mindeg: current minimum degree +C nel: number of pivots selected so far +C newmem: amount of new memory needed for current pivot element +C nleft: n - nel, the number of nonpivotal rows/columns remaining +C nvi: the number of variables in a supervariable i (= nv (i)) +C nvj: the number of variables in a supervariable j (= nv (j)) +C nvpiv: number of pivots in current element +C slenme: number of variables in variable list of pivotal variable +C we: w (e) +C wflg: used for flagging the w array. See description of iw. +C wnvi: wflg - nv (i) +C x: either a supervariable or an element + +C----------------------------------------------------------------------- +C LOCAL POINTERS: +C----------------------------------------------------------------------- + + INTEGER P, P1, P2, P3, PDST, PEND, PJ, PME, PME1, PME2, PN, PSRC + +C Any parameter (pe (...) or pfree) or local variable +C starting with "p" (for Pointer) is an index into iw, +C and all indices into iw use variables starting with +C "p." The only exception to this rule is the iwlen +C input argument. + +C p: pointer into lots of things +C p1: pe (i) for some variable i (start of element list) +C p2: pe (i) + elen (i) - 1 for some var. i (end of el. list) +C p3: index of first supervariable in clean list +C pdst: destination pointer, for compression +C pend: end of memory to compress +C pj: pointer into an element or variable +C pme: pointer into the current element (pme1...pme2) +C pme1: the current element, me, is stored in iw (pme1...pme2) +C pme2: the end of the current element +C pn: pointer into a "clean" variable, also used to compress +C psrc: source pointer, for compression + +C----------------------------------------------------------------------- +C FUNCTIONS CALLED: +C----------------------------------------------------------------------- + + INTRINSIC MAX, MIN, MOD + +C======================================================================= +C INITIALIZATIONS +C======================================================================= + + WFLG = 2 + MINDEG = 1 + NCMPA = 0 + NEL = 0 + HMOD = MAX (1, N-1) + DMAX = 0 + MEM = PFREE - 1 + MAXMEM = MEM + ME = 0 + + DO 10 I = 1, N + LAST (I) = 0 + HEAD (I) = 0 + NV (I) = 1 + W (I) = 1 + ELEN (I) = 0 + DEGREE (I) = LEN (I) +10 CONTINUE + +C ---------------------------------------------------------------- +C initialize degree lists and eliminate rows with no off-diag. nz. +C ---------------------------------------------------------------- + + DO 20 I = 1, N + + DEG = DEGREE (I) + + IF (DEG .GT. 0) THEN + +C ---------------------------------------------------------- +C place i in the degree list corresponding to its degree +C ---------------------------------------------------------- + + INEXT = HEAD (DEG) + IF (INEXT .NE. 0) LAST (INEXT) = I + NEXT (I) = INEXT + HEAD (DEG) = I + + ELSE + +C ---------------------------------------------------------- +C we have a variable that can be eliminated at once because +C there is no off-diagonal non-zero in its row. +C ---------------------------------------------------------- + + NEL = NEL + 1 + ELEN (I) = -NEL + PE (I) = 0 + W (I) = 0 + + ENDIF + +20 CONTINUE + +C======================================================================= +C WHILE (selecting pivots) DO +C======================================================================= + +30 CONTINUE + IF (NEL .LT. N) THEN + +C======================================================================= +C GET PIVOT OF MINIMUM DEGREE +C======================================================================= + +C ------------------------------------------------------------- +C find next supervariable for elimination +C ------------------------------------------------------------- + + DO 40 DEG = MINDEG, N + ME = HEAD (DEG) + IF (ME .GT. 0) GOTO 50 +40 CONTINUE +50 CONTINUE + MINDEG = DEG + +C ------------------------------------------------------------- +C remove chosen variable from link list +C ------------------------------------------------------------- + + INEXT = NEXT (ME) + IF (INEXT .NE. 0) LAST (INEXT) = 0 + HEAD (DEG) = INEXT + +C ------------------------------------------------------------- +C me represents the elimination of pivots nel+1 to nel+nv(me). +C place me itself as the first in this set. It will be moved +C to the nel+nv(me) position when the permutation vectors are +C computed. +C ------------------------------------------------------------- + + ELENME = ELEN (ME) + ELEN (ME) = - (NEL + 1) + NVPIV = NV (ME) + NEL = NEL + NVPIV + +C======================================================================= +C CONSTRUCT NEW ELEMENT +C======================================================================= + +C ------------------------------------------------------------- +C At this point, me is the pivotal supervariable. It will be +C converted into the current element. Scan list of the +C pivotal supervariable, me, setting tree pointers and +C constructing new list of supervariables for the new element, +C me. p is a pointer to the current position in the old list. +C ------------------------------------------------------------- + +C flag the variable "me" as being in Lme by negating nv (me) + NV (ME) = -NVPIV + DEGME = 0 + + IF (ELENME .EQ. 0) THEN + +C ---------------------------------------------------------- +C construct the new element in place +C ---------------------------------------------------------- + + PME1 = PE (ME) + PME2 = PME1 - 1 + + DO 60 P = PME1, PME1 + LEN (ME) - 1 + I = IW (P) + NVI = NV (I) + IF (NVI .GT. 0) THEN + +C ---------------------------------------------------- +C i is a principal variable not yet placed in Lme. +C store i in new list +C ---------------------------------------------------- + + DEGME = DEGME + NVI +C flag i as being in Lme by negating nv (i) + NV (I) = -NVI + PME2 = PME2 + 1 + IW (PME2) = I + +C ---------------------------------------------------- +C remove variable i from degree list. +C ---------------------------------------------------- + + ILAST = LAST (I) + INEXT = NEXT (I) + IF (INEXT .NE. 0) LAST (INEXT) = ILAST + IF (ILAST .NE. 0) THEN + NEXT (ILAST) = INEXT + ELSE +C i is at the head of the degree list + HEAD (DEGREE (I)) = INEXT + ENDIF + + ENDIF +60 CONTINUE +C this element takes no new memory in iw: + NEWMEM = 0 + + ELSE + +C ---------------------------------------------------------- +C construct the new element in empty space, iw (pfree ...) +C ---------------------------------------------------------- + + P = PE (ME) + PME1 = PFREE + SLENME = LEN (ME) - ELENME + + DO 120 KNT1 = 1, ELENME + 1 + + IF (KNT1 .GT. ELENME) THEN +C search the supervariables in me. + E = ME + PJ = P + LN = SLENME + ELSE +C search the elements in me. + E = IW (P) + P = P + 1 + PJ = PE (E) + LN = LEN (E) + ENDIF + +C ------------------------------------------------------- +C search for different supervariables and add them to the +C new list, compressing when necessary. this loop is +C executed once for each element in the list and once for +C all the supervariables in the list. +C ------------------------------------------------------- + + DO 110 KNT2 = 1, LN + I = IW (PJ) + PJ = PJ + 1 + NVI = NV (I) + IF (NVI .GT. 0) THEN + +C ------------------------------------------------- +C compress iw, if necessary +C ------------------------------------------------- + + IF (PFREE .GT. IWLEN) THEN +C prepare for compressing iw by adjusting +C pointers and lengths so that the lists being +C searched in the inner and outer loops contain +C only the remaining entries. + + PE (ME) = P + LEN (ME) = LEN (ME) - KNT1 + IF (LEN (ME) .EQ. 0) THEN +C nothing left of supervariable me + PE (ME) = 0 + ENDIF + PE (E) = PJ + LEN (E) = LN - KNT2 + IF (LEN (E) .EQ. 0) THEN +C nothing left of element e + PE (E) = 0 + ENDIF + + NCMPA = NCMPA + 1 +C store first item in pe +C set first entry to -item + DO 70 J = 1, N + PN = PE (J) + IF (PN .GT. 0) THEN + PE (J) = IW (PN) + IW (PN) = -J + ENDIF +70 CONTINUE + +C psrc/pdst point to source/destination + PDST = 1 + PSRC = 1 + PEND = PME1 - 1 + +C while loop: +80 CONTINUE + IF (PSRC .LE. PEND) THEN +C search for next negative entry + J = -IW (PSRC) + PSRC = PSRC + 1 + IF (J .GT. 0) THEN + IW (PDST) = PE (J) + PE (J) = PDST + PDST = PDST + 1 +C copy from source to destination + LENJ = LEN (J) + DO 90 KNT3 = 0, LENJ - 2 + IW (PDST + KNT3) = IW (PSRC + KNT3) +90 CONTINUE + PDST = PDST + LENJ - 1 + PSRC = PSRC + LENJ - 1 + ENDIF + GOTO 80 + ENDIF + +C move the new partially-constructed element + P1 = PDST + DO 100 PSRC = PME1, PFREE - 1 + IW (PDST) = IW (PSRC) + PDST = PDST + 1 +100 CONTINUE + PME1 = P1 + PFREE = PDST + PJ = PE (E) + P = PE (ME) + ENDIF + +C ------------------------------------------------- +C i is a principal variable not yet placed in Lme +C store i in new list +C ------------------------------------------------- + + DEGME = DEGME + NVI +C flag i as being in Lme by negating nv (i) + NV (I) = -NVI + IW (PFREE) = I + PFREE = PFREE + 1 + +C ------------------------------------------------- +C remove variable i from degree link list +C ------------------------------------------------- + + ILAST = LAST (I) + INEXT = NEXT (I) + IF (INEXT .NE. 0) LAST (INEXT) = ILAST + IF (ILAST .NE. 0) THEN + NEXT (ILAST) = INEXT + ELSE +C i is at the head of the degree list + HEAD (DEGREE (I)) = INEXT + ENDIF + + ENDIF +110 CONTINUE + + IF (E .NE. ME) THEN +C set tree pointer and flag to indicate element e is +C absorbed into new element me (the parent of e is me) + PE (E) = -ME + W (E) = 0 + ENDIF +120 CONTINUE + + PME2 = PFREE - 1 +C this element takes newmem new memory in iw (possibly zero) + NEWMEM = PFREE - PME1 + MEM = MEM + NEWMEM + MAXMEM = MAX (MAXMEM, MEM) + ENDIF + +C ------------------------------------------------------------- +C me has now been converted into an element in iw (pme1..pme2) +C ------------------------------------------------------------- + +C degme holds the external degree of new element + DEGREE (ME) = DEGME + PE (ME) = PME1 + LEN (ME) = PME2 - PME1 + 1 + +C ------------------------------------------------------------- +C make sure that wflg is not too large. With the current +C value of wflg, wflg+n must not cause integer overflow +C ------------------------------------------------------------- + + IF (WFLG + N .LE. WFLG) THEN + DO 130 X = 1, N + IF (W (X) .NE. 0) W (X) = 1 +130 CONTINUE + WFLG = 2 + ENDIF + +C======================================================================= +C COMPUTE (w (e) - wflg) = |Le\Lme| FOR ALL ELEMENTS +C======================================================================= + +C ------------------------------------------------------------- +C Scan 1: compute the external degrees of previous elements +C with respect to the current element. That is: +C (w (e) - wflg) = |Le \ Lme| +C for each element e that appears in any supervariable in Lme. +C The notation Le refers to the pattern (list of +C supervariables) of a previous element e, where e is not yet +C absorbed, stored in iw (pe (e) + 1 ... pe (e) + iw (pe (e))). +C The notation Lme refers to the pattern of the current element +C (stored in iw (pme1..pme2)). If (w (e) - wflg) becomes +C zero, then the element e will be absorbed in scan 2. +C ------------------------------------------------------------- + + DO 150 PME = PME1, PME2 + I = IW (PME) + ELN = ELEN (I) + IF (ELN .GT. 0) THEN +C note that nv (i) has been negated to denote i in Lme: + NVI = -NV (I) + WNVI = WFLG - NVI + DO 140 P = PE (I), PE (I) + ELN - 1 + E = IW (P) + WE = W (E) + IF (WE .GE. WFLG) THEN +C unabsorbed element e has been seen in this loop + WE = WE - NVI + ELSE IF (WE .NE. 0) THEN +C e is an unabsorbed element +C this is the first we have seen e in all of Scan 1 + WE = DEGREE (E) + WNVI + ENDIF + W (E) = WE +140 CONTINUE + ENDIF +150 CONTINUE + +C======================================================================= +C DEGREE UPDATE AND ELEMENT ABSORPTION +C======================================================================= + +C ------------------------------------------------------------- +C Scan 2: for each i in Lme, sum up the degree of Lme (which +C is degme), plus the sum of the external degrees of each Le +C for the elements e appearing within i, plus the +C supervariables in i. Place i in hash list. +C ------------------------------------------------------------- + + DO 180 PME = PME1, PME2 + I = IW (PME) + P1 = PE (I) + P2 = P1 + ELEN (I) - 1 + PN = P1 + HASH = 0 + DEG = 0 + +C ---------------------------------------------------------- +C scan the element list associated with supervariable i +C ---------------------------------------------------------- + + DO 160 P = P1, P2 + E = IW (P) +C dext = | Le \ Lme | + DEXT = W (E) - WFLG + IF (DEXT .GT. 0) THEN + DEG = DEG + DEXT + IW (PN) = E + PN = PN + 1 + HASH = HASH + E + ELSE IF (DEXT .EQ. 0) THEN +C aggressive absorption: e is not adjacent to me, but +C the |Le \ Lme| is 0, so absorb it into me + PE (E) = -ME + W (E) = 0 + ELSE +C element e has already been absorbed, due to +C regular absorption, in do loop 120 above. Ignore it. + CONTINUE + ENDIF +160 CONTINUE + +C count the number of elements in i (including me): + ELEN (I) = PN - P1 + 1 + +C ---------------------------------------------------------- +C scan the supervariables in the list associated with i +C ---------------------------------------------------------- + + P3 = PN + DO 170 P = P2 + 1, P1 + LEN (I) - 1 + J = IW (P) + NVJ = NV (J) + IF (NVJ .GT. 0) THEN +C j is unabsorbed, and not in Lme. +C add to degree and add to new list + DEG = DEG + NVJ + IW (PN) = J + PN = PN + 1 + HASH = HASH + J + ENDIF +170 CONTINUE + +C ---------------------------------------------------------- +C update the degree and check for mass elimination +C ---------------------------------------------------------- + + IF (DEG .EQ. 0) THEN + +C ------------------------------------------------------- +C mass elimination +C ------------------------------------------------------- + +C There is nothing left of this node except for an +C edge to the current pivot element. elen (i) is 1, +C and there are no variables adjacent to node i. +C Absorb i into the current pivot element, me. + + PE (I) = -ME + NVI = -NV (I) + DEGME = DEGME - NVI + NVPIV = NVPIV + NVI + NEL = NEL + NVI + NV (I) = 0 + ELEN (I) = 0 + + ELSE + +C ------------------------------------------------------- +C update the upper-bound degree of i +C ------------------------------------------------------- + +C the following degree does not yet include the size +C of the current element, which is added later: + DEGREE (I) = MIN (DEGREE (I), DEG) + +C ------------------------------------------------------- +C add me to the list for i +C ------------------------------------------------------- + +C move first supervariable to end of list + IW (PN) = IW (P3) +C move first element to end of element part of list + IW (P3) = IW (P1) +C add new element to front of list. + IW (P1) = ME +C store the new length of the list in len (i) + LEN (I) = PN - P1 + 1 + +C ------------------------------------------------------- +C place in hash bucket. Save hash key of i in last (i). +C ------------------------------------------------------- + + HASH = MOD (HASH, HMOD) + 1 + J = HEAD (HASH) + IF (J .LE. 0) THEN +C the degree list is empty, hash head is -j + NEXT (I) = -J + HEAD (HASH) = -I + ELSE +C degree list is not empty +C use last (head (hash)) as hash head + NEXT (I) = LAST (J) + LAST (J) = I + ENDIF + LAST (I) = HASH + ENDIF +180 CONTINUE + + DEGREE (ME) = DEGME + +C ------------------------------------------------------------- +C Clear the counter array, w (...), by incrementing wflg. +C ------------------------------------------------------------- + + DMAX = MAX (DMAX, DEGME) + WFLG = WFLG + DMAX + +C make sure that wflg+n does not cause integer overflow + IF (WFLG + N .LE. WFLG) THEN + DO 190 X = 1, N + IF (W (X) .NE. 0) W (X) = 1 +190 CONTINUE + WFLG = 2 + ENDIF +C at this point, w (1..n) .lt. wflg holds + +C======================================================================= +C SUPERVARIABLE DETECTION +C======================================================================= + + DO 250 PME = PME1, PME2 + I = IW (PME) + IF (NV (I) .LT. 0) THEN +C i is a principal variable in Lme + +C ------------------------------------------------------- +C examine all hash buckets with 2 or more variables. We +C do this by examing all unique hash keys for super- +C variables in the pattern Lme of the current element, me +C ------------------------------------------------------- + + HASH = LAST (I) +C let i = head of hash bucket, and empty the hash bucket + J = HEAD (HASH) + IF (J .EQ. 0) GOTO 250 + IF (J .LT. 0) THEN +C degree list is empty + I = -J + HEAD (HASH) = 0 + ELSE +C degree list is not empty, restore last () of head + I = LAST (J) + LAST (J) = 0 + ENDIF + IF (I .EQ. 0) GOTO 250 + +C while loop: +200 CONTINUE + IF (NEXT (I) .NE. 0) THEN + +C ---------------------------------------------------- +C this bucket has one or more variables following i. +C scan all of them to see if i can absorb any entries +C that follow i in hash bucket. Scatter i into w. +C ---------------------------------------------------- + + LN = LEN (I) + ELN = ELEN (I) +C do not flag the first element in the list (me) + DO 210 P = PE (I) + 1, PE (I) + LN - 1 + W (IW (P)) = WFLG +210 CONTINUE + +C ---------------------------------------------------- +C scan every other entry j following i in bucket +C ---------------------------------------------------- + + JLAST = I + J = NEXT (I) + +C while loop: +220 CONTINUE + IF (J .NE. 0) THEN + +C ------------------------------------------------- +C check if j and i have identical nonzero pattern +C ------------------------------------------------- + + IF (LEN (J) .NE. LN) THEN +C i and j do not have same size data structure + GOTO 240 + ENDIF + IF (ELEN (J) .NE. ELN) THEN +C i and j do not have same number of adjacent el + GOTO 240 + ENDIF +C do not flag the first element in the list (me) + DO 230 P = PE (J) + 1, PE (J) + LN - 1 + IF (W (IW (P)) .NE. WFLG) THEN +C an entry (iw(p)) is in j but not in i + GOTO 240 + ENDIF +230 CONTINUE + +C ------------------------------------------------- +C found it! j can be absorbed into i +C ------------------------------------------------- + + PE (J) = -I +C both nv (i) and nv (j) are negated since they +C are in Lme, and the absolute values of each +C are the number of variables in i and j: + NV (I) = NV (I) + NV (J) + NV (J) = 0 + ELEN (J) = 0 +C delete j from hash bucket + J = NEXT (J) + NEXT (JLAST) = J + GOTO 220 + +C ------------------------------------------------- +240 CONTINUE +C j cannot be absorbed into i +C ------------------------------------------------- + + JLAST = J + J = NEXT (J) + GOTO 220 + ENDIF + +C ---------------------------------------------------- +C no more variables can be absorbed into i +C go to next i in bucket and clear flag array +C ---------------------------------------------------- + + WFLG = WFLG + 1 + I = NEXT (I) + IF (I .NE. 0) GOTO 200 + ENDIF + ENDIF +250 CONTINUE + +C======================================================================= +C RESTORE DEGREE LISTS AND REMOVE NONPRINCIPAL SUPERVAR. FROM ELEMENT +C======================================================================= + + P = PME1 + NLEFT = N - NEL + DO 260 PME = PME1, PME2 + I = IW (PME) + NVI = -NV (I) + IF (NVI .GT. 0) THEN +C i is a principal variable in Lme +C restore nv (i) to signify that i is principal + NV (I) = NVI + +C ------------------------------------------------------- +C compute the external degree (add size of current elem) +C ------------------------------------------------------- + + DEG = MIN (DEGREE (I) + DEGME - NVI, NLEFT - NVI) + +C ------------------------------------------------------- +C place the supervariable at the head of the degree list +C ------------------------------------------------------- + + INEXT = HEAD (DEG) + IF (INEXT .NE. 0) LAST (INEXT) = I + NEXT (I) = INEXT + LAST (I) = 0 + HEAD (DEG) = I + +C ------------------------------------------------------- +C save the new degree, and find the minimum degree +C ------------------------------------------------------- + + MINDEG = MIN (MINDEG, DEG) + DEGREE (I) = DEG + +C ------------------------------------------------------- +C place the supervariable in the element pattern +C ------------------------------------------------------- + + IW (P) = I + P = P + 1 + ENDIF +260 CONTINUE + +C======================================================================= +C FINALIZE THE NEW ELEMENT +C======================================================================= + + NV (ME) = NVPIV + DEGME +C nv (me) is now the degree of pivot (including diagonal part) +C save the length of the list for the new element me + LEN (ME) = P - PME1 + IF (LEN (ME) .EQ. 0) THEN +C there is nothing left of the current pivot element + PE (ME) = 0 + W (ME) = 0 + ENDIF + IF (NEWMEM .NE. 0) THEN +C element was not constructed in place: deallocate part +C of it (final size is less than or equal to newmem, +C since newly nonprincipal variables have been removed). + PFREE = P + MEM = MEM - NEWMEM + LEN (ME) + ENDIF + +C======================================================================= +C END WHILE (selecting pivots) + GOTO 30 + ENDIF +C======================================================================= + +C======================================================================= +C COMPUTE THE PERMUTATION VECTORS +C======================================================================= + +C ---------------------------------------------------------------- +C The time taken by the following code is O(n). At this +C point, elen (e) = -k has been done for all elements e, +C and elen (i) = 0 has been done for all nonprincipal +C variables i. At this point, there are no principal +C supervariables left, and all elements are absorbed. +C ---------------------------------------------------------------- + +C ---------------------------------------------------------------- +C compute the ordering of unordered nonprincipal variables +C ---------------------------------------------------------------- + + DO 290 I = 1, N + IF (ELEN (I) .EQ. 0) THEN + +C ---------------------------------------------------------- +C i is an un-ordered row. Traverse the tree from i until +C reaching an element, e. The element, e, was the +C principal supervariable of i and all nodes in the path +C from i to when e was selected as pivot. +C ---------------------------------------------------------- + + J = -PE (I) +C while (j is a variable) do: +270 CONTINUE + IF (ELEN (J) .GE. 0) THEN + J = -PE (J) + GOTO 270 + ENDIF + E = J + +C ---------------------------------------------------------- +C get the current pivot ordering of e +C ---------------------------------------------------------- + + K = -ELEN (E) + +C ---------------------------------------------------------- +C traverse the path again from i to e, and compress the +C path (all nodes point to e). Path compression allows +C this code to compute in O(n) time. Order the unordered +C nodes in the path, and place the element e at the end. +C ---------------------------------------------------------- + + J = I +C while (j is a variable) do: +280 CONTINUE + IF (ELEN (J) .GE. 0) THEN + JNEXT = -PE (J) + PE (J) = -E + IF (ELEN (J) .EQ. 0) THEN +C j is an unordered row + ELEN (J) = K + K = K + 1 + ENDIF + J = JNEXT + GOTO 280 + ENDIF +C leave elen (e) negative, so we know it is an element + ELEN (E) = -K + ENDIF +290 CONTINUE + +C ---------------------------------------------------------------- +C reset the inverse permutation (elen (1..n)) to be positive, +C and compute the permutation (last (1..n)). +C ---------------------------------------------------------------- + + DO 300 I = 1, N + K = ABS (ELEN (I)) + LAST (K) = I + ELEN (I) = K +300 CONTINUE + +C======================================================================= +C RETURN THE MEMORY USAGE IN IW +C======================================================================= + +C If maxmem is less than or equal to iwlen, then no compressions +C occurred, and iw (maxmem+1 ... iwlen) was unused. Otherwise +C compressions did occur, and iwlen would have had to have been +C greater than or equal to maxmem for no compressions to occur. +C Return the value of maxmem in the pfree argument. + + PFREE = MAXMEM + + RETURN + END + diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Source/amd_1.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Source/amd_1.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,181 @@ +/* ========================================================================= */ +/* === AMD_1 =============================================================== */ +/* ========================================================================= */ + +/* ------------------------------------------------------------------------- */ +/* AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis, */ +/* Patrick R. Amestoy, and Iain S. Duff. See ../README for License. */ +/* email: davis@cise.ufl.edu CISE Department, Univ. of Florida. */ +/* web: http://www.cise.ufl.edu/research/sparse/amd */ +/* ------------------------------------------------------------------------- */ + +/* AMD_1: Construct A+A' for a sparse matrix A and perform the AMD ordering. + * + * The n-by-n sparse matrix A can be unsymmetric. It is stored in MATLAB-style + * compressed-column form, with sorted row indices in each column, and no + * duplicate entries. Diagonal entries may be present, but they are ignored. + * Row indices of column j of A are stored in Ai [Ap [j] ... Ap [j+1]-1]. + * Ap [0] must be zero, and nz = Ap [n] is the number of entries in A. The + * size of the matrix, n, must be greater than or equal to zero. + * + * This routine must be preceded by a call to AMD_aat, which computes the + * number of entries in each row/column in A+A', excluding the diagonal. + * Len [j], on input, is the number of entries in row/column j of A+A'. This + * routine constructs the matrix A+A' and then calls AMD_2. No error checking + * is performed (this was done in AMD_aat). + */ + +#include "amd_internal.h" + +GLOBAL void AMD_1 +( + Int n, /* n > 0 */ + const Int Ap [ ], /* input of size n+1, not modified */ + const Int Ai [ ], /* input of size nz = Ap [n], not modified */ + Int P [ ], /* size n output permutation */ + Int Pinv [ ], /* size n output inverse permutation */ + Int Len [ ], /* size n input, undefined on output */ + Int slen, /* slen >= sum (Len [0..n-1]) + 7n, + * ideally slen = 1.2 * sum (Len) + 8n */ + Int S [ ], /* size slen workspace */ + double Control [ ], /* input array of size AMD_CONTROL */ + double Info [ ] /* output array of size AMD_INFO */ +) +{ + Int i, j, k, p, pfree, iwlen, pj, p1, p2, pj2, *Iw, *Pe, *Nv, *Head, + *Elen, *Degree, *s, *W, *Sp, *Tp ; + + /* --------------------------------------------------------------------- */ + /* construct the matrix for AMD_2 */ + /* --------------------------------------------------------------------- */ + + ASSERT (n > 0) ; + + iwlen = slen - 6*n ; + s = S ; + Pe = s ; s += n ; + Nv = s ; s += n ; + Head = s ; s += n ; + Elen = s ; s += n ; + Degree = s ; s += n ; + W = s ; s += n ; + Iw = s ; s += iwlen ; + + ASSERT (AMD_valid (n, n, Ap, Ai)) ; + + /* construct the pointers for A+A' */ + Sp = Nv ; /* use Nv and W as workspace for Sp and Tp [ */ + Tp = W ; + pfree = 0 ; + for (j = 0 ; j < n ; j++) + { + Pe [j] = pfree ; + Sp [j] = pfree ; + pfree += Len [j] ; + } + + /* Note that this restriction on iwlen is slightly more restrictive than + * what is strictly required in AMD_2. AMD_2 can operate with no elbow + * room at all, but it will be very slow. For better performance, at + * least size-n elbow room is enforced. */ + ASSERT (iwlen >= pfree + n) ; + +#ifndef NDEBUG + for (p = 0 ; p < iwlen ; p++) Iw [p] = EMPTY ; +#endif + + for (k = 0 ; k < n ; k++) + { + AMD_DEBUG1 (("Construct row/column k= "ID" of A+A'\n", k)) ; + p1 = Ap [k] ; + p2 = Ap [k+1] ; + + /* construct A+A' */ + for (p = p1 ; p < p2 ; ) + { + /* scan the upper triangular part of A */ + j = Ai [p] ; + ASSERT (j >= 0 && j < n) ; + if (j < k) + { + /* entry A (j,k) in the strictly upper triangular part */ + ASSERT (Sp [j] < (j == n-1 ? pfree : Pe [j+1])) ; + ASSERT (Sp [k] < (k == n-1 ? pfree : Pe [k+1])) ; + Iw [Sp [j]++] = k ; + Iw [Sp [k]++] = j ; + p++ ; + } + else if (j == k) + { + /* skip the diagonal */ + p++ ; + break ; + } + else /* j > k */ + { + /* first entry below the diagonal */ + break ; + } + /* scan lower triangular part of A, in column j until reaching + * row k. Start where last scan left off. */ + ASSERT (Ap [j] <= Tp [j] && Tp [j] <= Ap [j+1]) ; + pj2 = Ap [j+1] ; + for (pj = Tp [j] ; pj < pj2 ; ) + { + i = Ai [pj] ; + ASSERT (i >= 0 && i < n) ; + if (i < k) + { + /* A (i,j) is only in the lower part, not in upper */ + ASSERT (Sp [i] < (i == n-1 ? pfree : Pe [i+1])) ; + ASSERT (Sp [j] < (j == n-1 ? pfree : Pe [j+1])) ; + Iw [Sp [i]++] = j ; + Iw [Sp [j]++] = i ; + pj++ ; + } + else if (i == k) + { + /* entry A (k,j) in lower part and A (j,k) in upper */ + pj++ ; + break ; + } + else /* i > k */ + { + /* consider this entry later, when k advances to i */ + break ; + } + } + Tp [j] = pj ; + } + Tp [k] = p ; + } + + /* clean up, for remaining mismatched entries */ + for (j = 0 ; j < n ; j++) + { + for (pj = Tp [j] ; pj < Ap [j+1] ; pj++) + { + i = Ai [pj] ; + ASSERT (i >= 0 && i < n) ; + /* A (i,j) is only in the lower part, not in upper */ + ASSERT (Sp [i] < (i == n-1 ? pfree : Pe [i+1])) ; + ASSERT (Sp [j] < (j == n-1 ? pfree : Pe [j+1])) ; + Iw [Sp [i]++] = j ; + Iw [Sp [j]++] = i ; + } + } + +#ifndef NDEBUG + for (j = 0 ; j < n-1 ; j++) ASSERT (Sp [j] == Pe [j+1]) ; + ASSERT (Sp [n-1] == pfree) ; +#endif + + /* Tp and Sp no longer needed ] */ + + /* --------------------------------------------------------------------- */ + /* order the matrix */ + /* --------------------------------------------------------------------- */ + + AMD_2 (n, Pe, Iw, Len, iwlen, pfree, + Nv, Pinv, P, Head, Elen, Degree, W, Control, Info) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Source/amd_2.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Source/amd_2.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,1823 @@ +/* ========================================================================= */ +/* === AMD_2 =============================================================== */ +/* ========================================================================= */ + +/* ------------------------------------------------------------------------- */ +/* AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis, */ +/* Patrick R. Amestoy, and Iain S. Duff. See ../README for License. */ +/* email: davis@cise.ufl.edu CISE Department, Univ. of Florida. */ +/* web: http://www.cise.ufl.edu/research/sparse/amd */ +/* ------------------------------------------------------------------------- */ + +/* AMD_2: performs the AMD ordering on a symmetric sparse matrix A, followed + * by a postordering (via depth-first search) of the assembly tree using the + * AMD_postorder routine. + */ + +#include "amd_internal.h" + +GLOBAL void AMD_2 +( + Int n, /* A is n-by-n, where n > 0 */ + Int Pe [ ], /* Pe [0..n-1]: index in Iw of row i on input */ + Int Iw [ ], /* workspace of size iwlen. Iw [0..pfree-1] + * holds the matrix on input */ + Int Len [ ], /* Len [0..n-1]: length for row/column i on input */ + Int iwlen, /* length of Iw. iwlen >= pfree + n */ + Int pfree, /* Iw [pfree ... iwlen-1] is empty on input */ + + /* 7 size-n workspaces, not defined on input: */ + Int Nv [ ], /* the size of each supernode on output */ + Int Next [ ], /* the output inverse permutation */ + Int Last [ ], /* the output permutation */ + Int Head [ ], + Int Elen [ ], /* the size columns of L for each supernode */ + Int Degree [ ], + Int W [ ], + + /* control parameters and output statistics */ + double Control [ ], /* array of size AMD_CONTROL */ + double Info [ ] /* array of size AMD_INFO */ +) +{ + +/* + * Given a representation of the nonzero pattern of a symmetric matrix, A, + * (excluding the diagonal) perform an approximate minimum (UMFPACK/MA38-style) + * degree ordering to compute a pivot order such that the introduction of + * nonzeros (fill-in) in the Cholesky factors A = LL' is kept low. At each + * step, the pivot selected is the one with the minimum UMFAPACK/MA38-style + * upper-bound on the external degree. This routine can optionally perform + * aggresive absorption (as done by MC47B in the Harwell Subroutine + * Library). + * + * The approximate degree algorithm implemented here is the symmetric analog of + * the degree update algorithm in MA38 and UMFPACK (the Unsymmetric-pattern + * MultiFrontal PACKage, both by Davis and Duff). The routine is based on the + * MA27 minimum degree ordering algorithm by Iain Duff and John Reid. + * + * This routine is a translation of the original AMDBAR and MC47B routines, + * in Fortran, with the following modifications: + * + * (1) dense rows/columns are removed prior to ordering the matrix, and placed + * last in the output order. The presence of a dense row/column can + * increase the ordering time by up to O(n^2), unless they are removed + * prior to ordering. + * + * (2) the minimum degree ordering is followed by a postordering (depth-first + * search) of the assembly tree. Note that mass elimination (discussed + * below) combined with the approximate degree update can lead to the mass + * elimination of nodes with lower exact degree than the current pivot + * element. No additional fill-in is caused in the representation of the + * Schur complement. The mass-eliminated nodes merge with the current + * pivot element. They are ordered prior to the current pivot element. + * Because they can have lower exact degree than the current element, the + * merger of two or more of these nodes in the current pivot element can + * lead to a single element that is not a "fundamental supernode". The + * diagonal block can have zeros in it. Thus, the assembly tree used here + * is not guaranteed to be the precise supernodal elemination tree (with + * "funadmental" supernodes), and the postordering performed by this + * routine is not guaranteed to be a precise postordering of the + * elimination tree. + * + * (3) input parameters are added, to control aggressive absorption and the + * detection of "dense" rows/columns of A. + * + * (4) additional statistical information is returned, such as the number of + * nonzeros in L, and the flop counts for subsequent LDL' and LU + * factorizations. These are slight upper bounds, because of the mass + * elimination issue discussed above. + * + * (5) additional routines are added to interface this routine to MATLAB + * to provide a simple C-callable user-interface, to check inputs for + * errors, compute the symmetry of the pattern of A and the number of + * nonzeros in each row/column of A+A', to compute the pattern of A+A', + * to perform the assembly tree postordering, and to provide debugging + * ouput. Many of these functions are also provided by the Fortran + * Harwell Subroutine Library routine MC47A. + * + * (6) both "int" and "long" versions are provided. In the descriptions below + * and integer is and "int" or "long", depending on which version is + * being used. + + ********************************************************************** + ***** CAUTION: ARGUMENTS ARE NOT CHECKED FOR ERRORS ON INPUT. ****** + ********************************************************************** + ** If you want error checking, a more versatile input format, and a ** + ** simpler user interface, use amd_order or amd_l_order instead. ** + ** This routine is not meant to be user-callable. ** + ********************************************************************** + + * ---------------------------------------------------------------------------- + * References: + * ---------------------------------------------------------------------------- + * + * [1] Timothy A. Davis and Iain Duff, "An unsymmetric-pattern multifrontal + * method for sparse LU factorization", SIAM J. Matrix Analysis and + * Applications, vol. 18, no. 1, pp. 140-158. Discusses UMFPACK / MA38, + * which first introduced the approximate minimum degree used by this + * routine. + * + * [2] Patrick Amestoy, Timothy A. Davis, and Iain S. Duff, "An approximate + * minimum degree ordering algorithm," SIAM J. Matrix Analysis and + * Applications, vol. 17, no. 4, pp. 886-905, 1996. Discusses AMDBAR and + * MC47B, which are the Fortran versions of this routine. + * + * [3] Alan George and Joseph Liu, "The evolution of the minimum degree + * ordering algorithm," SIAM Review, vol. 31, no. 1, pp. 1-19, 1989. + * We list below the features mentioned in that paper that this code + * includes: + * + * mass elimination: + * Yes. MA27 relied on supervariable detection for mass elimination. + * + * indistinguishable nodes: + * Yes (we call these "supervariables"). This was also in the MA27 + * code - although we modified the method of detecting them (the + * previous hash was the true degree, which we no longer keep track + * of). A supervariable is a set of rows with identical nonzero + * pattern. All variables in a supervariable are eliminated together. + * Each supervariable has as its numerical name that of one of its + * variables (its principal variable). + * + * quotient graph representation: + * Yes. We use the term "element" for the cliques formed during + * elimination. This was also in the MA27 code. The algorithm can + * operate in place, but it will work more efficiently if given some + * "elbow room." + * + * element absorption: + * Yes. This was also in the MA27 code. + * + * external degree: + * Yes. The MA27 code was based on the true degree. + * + * incomplete degree update and multiple elimination: + * No. This was not in MA27, either. Our method of degree update + * within MC47B is element-based, not variable-based. It is thus + * not well-suited for use with incomplete degree update or multiple + * elimination. + * + * Authors, and Copyright (C) 2004 by: + * Timothy A. Davis, Patrick Amestoy, Iain S. Duff, John K. Reid. + * + * Acknowledgements: This work (and the UMFPACK package) was supported by the + * National Science Foundation (ASC-9111263, DMS-9223088, and CCR-0203270). + * The UMFPACK/MA38 approximate degree update algorithm, the unsymmetric analog + * which forms the basis of AMD, was developed while Tim Davis was supported by + * CERFACS (Toulouse, France) in a post-doctoral position. This C version, and + * the etree postorder, were written while Tim Davis was on sabbatical at + * Stanford University and Lawrence Berkeley National Laboratory. + + * ---------------------------------------------------------------------------- + * INPUT ARGUMENTS (unaltered): + * ---------------------------------------------------------------------------- + + * n: The matrix order. Restriction: n >= 1. + * + * iwlen: The size of the Iw array. On input, the matrix is stored in + * Iw [0..pfree-1]. However, Iw [0..iwlen-1] should be slightly larger + * than what is required to hold the matrix, at least iwlen >= pfree + n. + * Otherwise, excessive compressions will take place. The recommended + * value of iwlen is 1.2 * pfree + n, which is the value used in the + * user-callable interface to this routine (amd_order.c). The algorithm + * will not run at all if iwlen < pfree. Restriction: iwlen >= pfree + n. + * Note that this is slightly more restrictive than the actual minimum + * (iwlen >= pfree), but AMD_2 will be very slow with no elbow room. + * Thus, this routine enforces a bare minimum elbow room of size n. + * + * pfree: On input the tail end of the array, Iw [pfree..iwlen-1], is empty, + * and the matrix is stored in Iw [0..pfree-1]. During execution, + * additional data is placed in Iw, and pfree is modified so that + * Iw [pfree..iwlen-1] is always the unused part of Iw. + * + * Control: A double array of size AMD_CONTROL containing input parameters + * that affect how the ordering is computed. If NULL, then default + * settings are used. + * + * Control [AMD_DENSE] is used to determine whether or not a given input + * row is "dense". A row is "dense" if the number of entries in the row + * exceeds Control [AMD_DENSE] times sqrt (n), except that rows with 16 or + * fewer entries are never considered "dense". To turn off the detection + * of dense rows, set Control [AMD_DENSE] to a negative number, or to a + * number larger than sqrt (n). The default value of Control [AMD_DENSE] + * is AMD_DEFAULT_DENSE, which is defined in amd.h as 10. + * + * Control [AMD_AGGRESSIVE] is used to determine whether or not aggressive + * absorption is to be performed. If nonzero, then aggressive absorption + * is performed (this is the default). + + * ---------------------------------------------------------------------------- + * INPUT/OUPUT ARGUMENTS: + * ---------------------------------------------------------------------------- + * + * Pe: An integer array of size n. On input, Pe [i] is the index in Iw of + * the start of row i. Pe [i] is ignored if row i has no off-diagonal + * entries. Thus Pe [i] must be in the range 0 to pfree-1 for non-empty + * rows. + * + * During execution, it is used for both supervariables and elements: + * + * Principal supervariable i: index into Iw of the description of + * supervariable i. A supervariable represents one or more rows of + * the matrix with identical nonzero pattern. In this case, + * Pe [i] >= 0. + * + * Non-principal supervariable i: if i has been absorbed into another + * supervariable j, then Pe [i] = FLIP (j), where FLIP (j) is defined + * as (-(j)-2). Row j has the same pattern as row i. Note that j + * might later be absorbed into another supervariable j2, in which + * case Pe [i] is still FLIP (j), and Pe [j] = FLIP (j2) which is + * < EMPTY, where EMPTY is defined as (-1) in amd_internal.h. + * + * Unabsorbed element e: the index into Iw of the description of element + * e, if e has not yet been absorbed by a subsequent element. Element + * e is created when the supervariable of the same name is selected as + * the pivot. In this case, Pe [i] >= 0. + * + * Absorbed element e: if element e is absorbed into element e2, then + * Pe [e] = FLIP (e2). This occurs when the pattern of e (which we + * refer to as Le) is found to be a subset of the pattern of e2 (that + * is, Le2). In this case, Pe [i] < EMPTY. If element e is "null" + * (it has no nonzeros outside its pivot block), then Pe [e] = EMPTY, + * and e is the root of an assembly subtree (or the whole tree if + * there is just one such root). + * + * Dense variable i: if i is "dense", then Pe [i] = EMPTY. + * + * On output, Pe holds the assembly tree/forest, which implicitly + * represents a pivot order with identical fill-in as the actual order + * (via a depth-first search of the tree), as follows. If Nv [i] > 0, + * then i represents a node in the assembly tree, and the parent of i is + * Pe [i], or EMPTY if i is a root. If Nv [i] = 0, then (i, Pe [i]) + * represents an edge in a subtree, the root of which is a node in the + * assembly tree. Note that i refers to a row/column in the original + * matrix, not the permuted matrix. + * + * Info: A double array of size AMD_INFO. If present, (that is, not NULL), + * then statistics about the ordering are returned in the Info array. + * See amd.h for a description. + + * ---------------------------------------------------------------------------- + * INPUT/MODIFIED (undefined on output): + * ---------------------------------------------------------------------------- + * + * Len: An integer array of size n. On input, Len [i] holds the number of + * entries in row i of the matrix, excluding the diagonal. The contents + * of Len are undefined on output. + * + * Iw: An integer array of size iwlen. On input, Iw [0..pfree-1] holds the + * description of each row i in the matrix. The matrix must be symmetric, + * and both upper and lower triangular parts must be present. The + * diagonal must not be present. Row i is held as follows: + * + * Len [i]: the length of the row i data structure in the Iw array. + * Iw [Pe [i] ... Pe [i] + Len [i] - 1]: + * the list of column indices for nonzeros in row i (simple + * supervariables), excluding the diagonal. All supervariables + * start with one row/column each (supervariable i is just row i). + * If Len [i] is zero on input, then Pe [i] is ignored on input. + * + * Note that the rows need not be in any particular order, and there + * may be empty space between the rows. + * + * During execution, the supervariable i experiences fill-in. This is + * represented by placing in i a list of the elements that cause fill-in + * in supervariable i: + * + * Len [i]: the length of supervariable i in the Iw array. + * Iw [Pe [i] ... Pe [i] + Elen [i] - 1]: + * the list of elements that contain i. This list is kept short + * by removing absorbed elements. + * Iw [Pe [i] + Elen [i] ... Pe [i] + Len [i] - 1]: + * the list of supervariables in i. This list is kept short by + * removing nonprincipal variables, and any entry j that is also + * contained in at least one of the elements (j in Le) in the list + * for i (e in row i). + * + * When supervariable i is selected as pivot, we create an element e of + * the same name (e=i): + * + * Len [e]: the length of element e in the Iw array. + * Iw [Pe [e] ... Pe [e] + Len [e] - 1]: + * the list of supervariables in element e. + * + * An element represents the fill-in that occurs when supervariable i is + * selected as pivot (which represents the selection of row i and all + * non-principal variables whose principal variable is i). We use the + * term Le to denote the set of all supervariables in element e. Absorbed + * supervariables and elements are pruned from these lists when + * computationally convenient. + * + * CAUTION: THE INPUT MATRIX IS OVERWRITTEN DURING COMPUTATION. + * The contents of Iw are undefined on output. + + * ---------------------------------------------------------------------------- + * OUTPUT (need not be set on input): + * ---------------------------------------------------------------------------- + * + * Nv: An integer array of size n. During execution, ABS (Nv [i]) is equal to + * the number of rows that are represented by the principal supervariable + * i. If i is a nonprincipal or dense variable, then Nv [i] = 0. + * Initially, Nv [i] = 1 for all i. Nv [i] < 0 signifies that i is a + * principal variable in the pattern Lme of the current pivot element me. + * After element me is constructed, Nv [i] is set back to a positive + * value. + * + * On output, Nv [i] holds the number of pivots represented by super + * row/column i of the original matrix, or Nv [i] = 0 for non-principal + * rows/columns. Note that i refers to a row/column in the original + * matrix, not the permuted matrix. + * + * Elen: An integer array of size n. See the description of Iw above. At the + * start of execution, Elen [i] is set to zero for all rows i. During + * execution, Elen [i] is the number of elements in the list for + * supervariable i. When e becomes an element, Elen [e] = FLIP (esize) is + * set, where esize is the size of the element (the number of pivots, plus + * the number of nonpivotal entries). Thus Elen [e] < EMPTY. + * Elen (i) = EMPTY set when variable i becomes nonprincipal. + * + * For variables, Elen (i) >= EMPTY holds until just before the + * postordering and permutation vectors are computed. For elements, + * Elen [e] < EMPTY holds. + * + * On output, Elen [i] is the degree of the row/column in the Cholesky + * factorization of the permuted matrix, corresponding to the original row + * i, if i is a super row/column. It is equal to EMPTY if i is + * non-principal. Note that i refers to a row/column in the original + * matrix, not the permuted matrix. + * + * Note that the contents of Elen on output differ from the Fortran + * version (Elen holds the inverse permutation in the Fortran version, + * which is instead returned in the Next array in this C version, + * described below). + * + * Last: In a degree list, Last [i] is the supervariable preceding i, or EMPTY + * if i is the head of the list. In a hash bucket, Last [i] is the hash + * key for i. + * + * Last [Head [hash]] is also used as the head of a hash bucket if + * Head [hash] contains a degree list (see the description of Head, + * below). + * + * On output, Last [0..n-1] holds the permutation. That is, if + * i = Last [k], then row i is the kth pivot row (where k ranges from 0 to + * n-1). Row Last [k] of A is the kth row in the permuted matrix, PAP'. + * + * Next: Next [i] is the supervariable following i in a link list, or EMPTY if + * i is the last in the list. Used for two kinds of lists: degree lists + * and hash buckets (a supervariable can be in only one kind of list at a + * time). + * + * On output Next [0..n-1] holds the inverse permutation. That is, if + * k = Next [i], then row i is the kth pivot row. Row i of A appears as + * the (Next[i])-th row in the permuted matrix, PAP'. + * + * Note that the contents of Next on output differ from the Fortran + * version (Next is undefined on output in the Fortran version). + + * ---------------------------------------------------------------------------- + * LOCAL WORKSPACE (not input or output - used only during execution): + * ---------------------------------------------------------------------------- + * + * Degree: An integer array of size n. If i is a supervariable, then + * Degree [i] holds the current approximation of the external degree of + * row i (an upper bound). The external degree is the number of nonzeros + * in row i, minus ABS (Nv [i]), the diagonal part. The bound is equal to + * the exact external degree if Elen [i] is less than or equal to two. + * + * We also use the term "external degree" for elements e to refer to + * |Le \ Lme|. If e is an element, then Degree [e] is |Le|, which is the + * degree of the off-diagonal part of the element e (not including the + * diagonal part). + * + * Head: An integer array of size n. Head is used for degree lists. + * Head [deg] is the first supervariable in a degree list. All + * supervariables i in a degree list Head [deg] have the same approximate + * degree, namely, deg = Degree [i]. If the list Head [deg] is empty then + * Head [deg] = EMPTY. + * + * During supervariable detection Head [hash] also serves as a pointer to + * a hash bucket. If Head [hash] >= 0, there is a degree list of degree + * hash. The hash bucket head pointer is Last [Head [hash]]. If + * Head [hash] = EMPTY, then the degree list and hash bucket are both + * empty. If Head [hash] < EMPTY, then the degree list is empty, and + * FLIP (Head [hash]) is the head of the hash bucket. After supervariable + * detection is complete, all hash buckets are empty, and the + * (Last [Head [hash]] = EMPTY) condition is restored for the non-empty + * degree lists. + * + * W: An integer array of size n. The flag array W determines the status of + * elements and variables, and the external degree of elements. + * + * for elements: + * if W [e] = 0, then the element e is absorbed. + * if W [e] >= wflg, then W [e] - wflg is the size of the set + * |Le \ Lme|, in terms of nonzeros (the sum of ABS (Nv [i]) for + * each principal variable i that is both in the pattern of + * element e and NOT in the pattern of the current pivot element, + * me). + * if wflg > W [e] > 0, then e is not absorbed and has not yet been + * seen in the scan of the element lists in the computation of + * |Le\Lme| in Scan 1 below. + * + * for variables: + * during supervariable detection, if W [j] != wflg then j is + * not in the pattern of variable i. + * + * The W array is initialized by setting W [i] = 1 for all i, and by + * setting wflg = 2. It is reinitialized if wflg becomes too large (to + * ensure that wflg+n does not cause integer overflow). + + * ---------------------------------------------------------------------------- + * LOCAL INTEGERS: + * ---------------------------------------------------------------------------- + */ + + Int deg, degme, dext, lemax, e, elenme, eln, i, ilast, inext, j, + jlast, jnext, k, knt1, knt2, knt3, lenj, ln, me, mindeg, nel, nleft, + nvi, nvj, nvpiv, slenme, wbig, we, wflg, wnvi, x, ok, ndense, ncmpa, + dense, aggressive ; + + unsigned Int hash ; /* unsigned, so that hash % n is well defined.*/ + +/* + * deg: the degree of a variable or element + * degme: size, |Lme|, of the current element, me (= Degree [me]) + * dext: external degree, |Le \ Lme|, of some element e + * lemax: largest |Le| seen so far (called dmax in Fortran version) + * e: an element + * elenme: the length, Elen [me], of element list of pivotal variable + * eln: the length, Elen [...], of an element list + * hash: the computed value of the hash function + * i: a supervariable + * ilast: the entry in a link list preceding i + * inext: the entry in a link list following i + * j: a supervariable + * jlast: the entry in a link list preceding j + * jnext: the entry in a link list, or path, following j + * k: the pivot order of an element or variable + * knt1: loop counter used during element construction + * knt2: loop counter used during element construction + * knt3: loop counter used during compression + * lenj: Len [j] + * ln: length of a supervariable list + * me: current supervariable being eliminated, and the current + * element created by eliminating that supervariable + * mindeg: current minimum degree + * nel: number of pivots selected so far + * nleft: n - nel, the number of nonpivotal rows/columns remaining + * nvi: the number of variables in a supervariable i (= Nv [i]) + * nvj: the number of variables in a supervariable j (= Nv [j]) + * nvpiv: number of pivots in current element + * slenme: number of variables in variable list of pivotal variable + * wbig: = INT_MAX - n for the "int" version, LONG_MAX - n for the + * "long" version. wflg is not allowed to be >= wbig. + * we: W [e] + * wflg: used for flagging the W array. See description of Iw. + * wnvi: wflg - Nv [i] + * x: either a supervariable or an element + * + * ok: true if supervariable j can be absorbed into i + * ndense: number of "dense" rows/columns + * dense: rows/columns with initial degree > dense are considered "dense" + * aggressive: true if aggressive absorption is being performed + * ncmpa: number of garbage collections + + * ---------------------------------------------------------------------------- + * LOCAL DOUBLES, used for statistical output only (except for alpha): + * ---------------------------------------------------------------------------- + */ + + double f, r, ndiv, s, nms_lu, nms_ldl, dmax, alpha, lnz, lnzme ; + +/* + * f: nvpiv + * r: degme + nvpiv + * ndiv: number of divisions for LU or LDL' factorizations + * s: number of multiply-subtract pairs for LU factorization, for the + * current element me + * nms_lu number of multiply-subtract pairs for LU factorization + * nms_ldl number of multiply-subtract pairs for LDL' factorization + * dmax: the largest number of entries in any column of L, including the + * diagonal + * alpha: "dense" degree ratio + * lnz: the number of nonzeros in L (excluding the diagonal) + * lnzme: the number of nonzeros in L (excl. the diagonal) for the + * current element me + + * ---------------------------------------------------------------------------- + * LOCAL "POINTERS" (indices into the Iw array) + * ---------------------------------------------------------------------------- +*/ + + Int p, p1, p2, p3, p4, pdst, pend, pj, pme, pme1, pme2, pn, psrc ; + +/* + * Any parameter (Pe [...] or pfree) or local variable starting with "p" (for + * Pointer) is an index into Iw, and all indices into Iw use variables starting + * with "p." The only exception to this rule is the iwlen input argument. + * + * p: pointer into lots of things + * p1: Pe [i] for some variable i (start of element list) + * p2: Pe [i] + Elen [i] - 1 for some variable i + * p3: index of first supervariable in clean list + * p4: + * pdst: destination pointer, for compression + * pend: end of memory to compress + * pj: pointer into an element or variable + * pme: pointer into the current element (pme1...pme2) + * pme1: the current element, me, is stored in Iw [pme1...pme2] + * pme2: the end of the current element + * pn: pointer into a "clean" variable, also used to compress + * psrc: source pointer, for compression +*/ + +/* ========================================================================= */ +/* INITIALIZATIONS */ +/* ========================================================================= */ + + /* Note that this restriction on iwlen is slightly more restrictive than + * what is actually required in AMD_2. AMD_2 can operate with no elbow + * room at all, but it will be slow. For better performance, at least + * size-n elbow room is enforced. */ + ASSERT (iwlen >= pfree + n) ; + ASSERT (n > 0) ; + + /* initialize output statistics */ + lnz = 0 ; + ndiv = 0 ; + nms_lu = 0 ; + nms_ldl = 0 ; + dmax = 1 ; + me = EMPTY ; + + wflg = 2 ; + mindeg = 0 ; + ncmpa = 0 ; + nel = 0 ; + lemax = 0 ; /* this is called dmax in the Fortran version */ + +#ifdef TEST_FOR_INTEGER_OVERFLOW + /* for testing only */ + wbig = 3*n ; +#else + /* normal operation */ + wbig = Int_MAX - n ; +#endif + + /* get control parameters */ + if (Control != (double *) NULL) + { + alpha = Control [AMD_DENSE] ; + aggressive = (Control [AMD_AGGRESSIVE] != 0) ; + } + else + { + alpha = AMD_DEFAULT_DENSE ; + aggressive = AMD_DEFAULT_AGGRESSIVE ; + } + if (alpha < 0) + { + /* no dense rows/columns */ + dense = n ; + } + else + { + dense = alpha * sqrt ((double) n) ; + } + dense = MAX (16, dense) ; + dense = MIN (n, dense) ; + AMD_DEBUG1 (("AMD (debug), alpha %g, aggr. "ID"\n", alpha, aggressive)) ; + + for (i = 0 ; i < n ; i++) + { + Last [i] = EMPTY ; + Head [i] = EMPTY ; + Next [i] = EMPTY ; + /* if seperate Hhead array is used for hash buckets: * + Hhead [i] = EMPTY ; + */ + Nv [i] = 1 ; + W [i] = 1 ; + Elen [i] = 0 ; + Degree [i] = Len [i] ; + } + +#ifndef NDEBUG + AMD_DEBUG1 (("\n======Nel "ID"\n", nel)) ; + AMD_dump (n, Pe, Iw, Len, iwlen, pfree, Nv, Next, Last, + Head, Elen, Degree, W, -1) ; +#endif + + /* --------------------------------------------------------------------- */ + /* initialize degree lists and eliminate dense and empty rows */ + /* --------------------------------------------------------------------- */ + + ndense = 0 ; + + /* for (i = n-1 ; i >= 0 ; i--) */ + for (i = 0 ; i < n ; i++) + { + deg = Degree [i] ; + ASSERT (deg >= 0 && deg < n) ; + if (deg == 0) + { + + /* ------------------------------------------------------------- + * we have a variable that can be eliminated at once because + * there is no off-diagonal non-zero in its row. Note that + * Nv [i] = 1 for an empty variable i. It is treated just + * the same as an eliminated element i. + * ------------------------------------------------------------- */ + + Elen [i] = FLIP (1) ; + nel++ ; + Pe [i] = EMPTY ; + W [i] = 0 ; + + } + else if (deg > dense) + { + + /* ------------------------------------------------------------- + * Dense variables are not treated as elements, but as unordered, + * non-principal variables that have no parent. They do not take + * part in the postorder, since Nv [i] = 0. Note that the Fortran + * version does not have this option. + * ------------------------------------------------------------- */ + + AMD_DEBUG1 (("Dense node "ID" degree "ID"\n", i, deg)) ; + ndense++ ; + Nv [i] = 0 ; /* do not postorder this node */ + Elen [i] = EMPTY ; + nel++ ; + Pe [i] = EMPTY ; + + } + else + { + + /* ------------------------------------------------------------- + * place i in the degree list corresponding to its degree + * ------------------------------------------------------------- */ + + inext = Head [deg] ; + ASSERT (inext >= EMPTY && inext < n) ; + if (inext != EMPTY) Last [inext] = i ; + Next [i] = inext ; + Head [deg] = i ; + + } + } + +/* ========================================================================= */ +/* WHILE (selecting pivots) DO */ +/* ========================================================================= */ + + while (nel < n) + { + +#ifndef NDEBUG + AMD_DEBUG1 (("\n======Nel "ID"\n", nel)) ; + if (AMD_debug >= 2) AMD_dump (n, Pe, Iw, Len, iwlen, pfree, Nv, Next, + Last, Head, Elen, Degree, W, nel) ; +#endif + +/* ========================================================================= */ +/* GET PIVOT OF MINIMUM DEGREE */ +/* ========================================================================= */ + + /* ----------------------------------------------------------------- */ + /* find next supervariable for elimination */ + /* ----------------------------------------------------------------- */ + + ASSERT (mindeg >= 0 && mindeg < n) ; + for (deg = mindeg ; deg < n ; deg++) + { + me = Head [deg] ; + if (me != EMPTY) break ; + } + mindeg = deg ; + ASSERT (me >= 0 && me < n) ; + AMD_DEBUG1 (("=================me: "ID"\n", me)) ; + + /* ----------------------------------------------------------------- */ + /* remove chosen variable from link list */ + /* ----------------------------------------------------------------- */ + + inext = Next [me] ; + ASSERT (inext >= EMPTY && inext < n) ; + if (inext != EMPTY) Last [inext] = EMPTY ; + Head [deg] = inext ; + + /* ----------------------------------------------------------------- */ + /* me represents the elimination of pivots nel to nel+Nv[me]-1. */ + /* place me itself as the first in this set. */ + /* ----------------------------------------------------------------- */ + + elenme = Elen [me] ; + nvpiv = Nv [me] ; + ASSERT (nvpiv > 0) ; + nel += nvpiv ; + +/* ========================================================================= */ +/* CONSTRUCT NEW ELEMENT */ +/* ========================================================================= */ + + /* ----------------------------------------------------------------- + * At this point, me is the pivotal supervariable. It will be + * converted into the current element. Scan list of the pivotal + * supervariable, me, setting tree pointers and constructing new list + * of supervariables for the new element, me. p is a pointer to the + * current position in the old list. + * ----------------------------------------------------------------- */ + + /* flag the variable "me" as being in Lme by negating Nv [me] */ + Nv [me] = -nvpiv ; + degme = 0 ; + ASSERT (Pe [me] >= 0 && Pe [me] < iwlen) ; + + if (elenme == 0) + { + + /* ------------------------------------------------------------- */ + /* construct the new element in place */ + /* ------------------------------------------------------------- */ + + pme1 = Pe [me] ; + pme2 = pme1 - 1 ; + + for (p = pme1 ; p <= pme1 + Len [me] - 1 ; p++) + { + i = Iw [p] ; + ASSERT (i >= 0 && i < n && Nv [i] >= 0) ; + nvi = Nv [i] ; + if (nvi > 0) + { + + /* ----------------------------------------------------- */ + /* i is a principal variable not yet placed in Lme. */ + /* store i in new list */ + /* ----------------------------------------------------- */ + + /* flag i as being in Lme by negating Nv [i] */ + degme += nvi ; + Nv [i] = -nvi ; + Iw [++pme2] = i ; + + /* ----------------------------------------------------- */ + /* remove variable i from degree list. */ + /* ----------------------------------------------------- */ + + ilast = Last [i] ; + inext = Next [i] ; + ASSERT (ilast >= EMPTY && ilast < n) ; + ASSERT (inext >= EMPTY && inext < n) ; + if (inext != EMPTY) Last [inext] = ilast ; + if (ilast != EMPTY) + { + Next [ilast] = inext ; + } + else + { + /* i is at the head of the degree list */ + ASSERT (Degree [i] >= 0 && Degree [i] < n) ; + Head [Degree [i]] = inext ; + } + } + } + } + else + { + + /* ------------------------------------------------------------- */ + /* construct the new element in empty space, Iw [pfree ...] */ + /* ------------------------------------------------------------- */ + + p = Pe [me] ; + pme1 = pfree ; + slenme = Len [me] - elenme ; + + for (knt1 = 1 ; knt1 <= elenme + 1 ; knt1++) + { + + if (knt1 > elenme) + { + /* search the supervariables in me. */ + e = me ; + pj = p ; + ln = slenme ; + AMD_DEBUG2 (("Search sv: "ID" "ID" "ID"\n", me,pj,ln)) ; + } + else + { + /* search the elements in me. */ + e = Iw [p++] ; + ASSERT (e >= 0 && e < n) ; + pj = Pe [e] ; + ln = Len [e] ; + AMD_DEBUG2 (("Search element e "ID" in me "ID"\n", e,me)) ; + ASSERT (Elen [e] < EMPTY && W [e] > 0 && pj >= 0) ; + } + ASSERT (ln >= 0 && (ln == 0 || (pj >= 0 && pj < iwlen))) ; + + /* --------------------------------------------------------- + * search for different supervariables and add them to the + * new list, compressing when necessary. this loop is + * executed once for each element in the list and once for + * all the supervariables in the list. + * --------------------------------------------------------- */ + + for (knt2 = 1 ; knt2 <= ln ; knt2++) + { + i = Iw [pj++] ; + ASSERT (i >= 0 && i < n && (i == me || Elen [i] >= EMPTY)); + nvi = Nv [i] ; + AMD_DEBUG2 ((": "ID" "ID" "ID" "ID"\n", + i, Elen [i], Nv [i], wflg)) ; + + if (nvi > 0) + { + + /* ------------------------------------------------- */ + /* compress Iw, if necessary */ + /* ------------------------------------------------- */ + + if (pfree >= iwlen) + { + + AMD_DEBUG1 (("GARBAGE COLLECTION\n")) ; + + /* prepare for compressing Iw by adjusting pointers + * and lengths so that the lists being searched in + * the inner and outer loops contain only the + * remaining entries. */ + + Pe [me] = p ; + Len [me] -= knt1 ; + /* check if nothing left of supervariable me */ + if (Len [me] == 0) Pe [me] = EMPTY ; + Pe [e] = pj ; + Len [e] = ln - knt2 ; + /* nothing left of element e */ + if (Len [e] == 0) Pe [e] = EMPTY ; + + ncmpa++ ; /* one more garbage collection */ + + /* store first entry of each object in Pe */ + /* FLIP the first entry in each object */ + for (j = 0 ; j < n ; j++) + { + pn = Pe [j] ; + if (pn >= 0) + { + ASSERT (pn >= 0 && pn < iwlen) ; + Pe [j] = Iw [pn] ; + Iw [pn] = FLIP (j) ; + } + } + + /* psrc/pdst point to source/destination */ + psrc = 0 ; + pdst = 0 ; + pend = pme1 - 1 ; + + while (psrc <= pend) + { + /* search for next FLIP'd entry */ + j = FLIP (Iw [psrc++]) ; + if (j >= 0) + { + AMD_DEBUG2 (("Got object j: "ID"\n", j)) ; + Iw [pdst] = Pe [j] ; + Pe [j] = pdst++ ; + lenj = Len [j] ; + /* copy from source to destination */ + for (knt3 = 0 ; knt3 <= lenj - 2 ; knt3++) + { + Iw [pdst++] = Iw [psrc++] ; + } + } + } + + /* move the new partially-constructed element */ + p1 = pdst ; + for (psrc = pme1 ; psrc <= pfree-1 ; psrc++) + { + Iw [pdst++] = Iw [psrc] ; + } + pme1 = p1 ; + pfree = pdst ; + pj = Pe [e] ; + p = Pe [me] ; + + } + + /* ------------------------------------------------- */ + /* i is a principal variable not yet placed in Lme */ + /* store i in new list */ + /* ------------------------------------------------- */ + + /* flag i as being in Lme by negating Nv [i] */ + degme += nvi ; + Nv [i] = -nvi ; + Iw [pfree++] = i ; + AMD_DEBUG2 ((" s: "ID" nv "ID"\n", i, Nv [i])); + + /* ------------------------------------------------- */ + /* remove variable i from degree link list */ + /* ------------------------------------------------- */ + + ilast = Last [i] ; + inext = Next [i] ; + ASSERT (ilast >= EMPTY && ilast < n) ; + ASSERT (inext >= EMPTY && inext < n) ; + if (inext != EMPTY) Last [inext] = ilast ; + if (ilast != EMPTY) + { + Next [ilast] = inext ; + } + else + { + /* i is at the head of the degree list */ + ASSERT (Degree [i] >= 0 && Degree [i] < n) ; + Head [Degree [i]] = inext ; + } + } + } + + if (e != me) + { + /* set tree pointer and flag to indicate element e is + * absorbed into new element me (the parent of e is me) */ + AMD_DEBUG1 ((" Element "ID" => "ID"\n", e, me)) ; + Pe [e] = FLIP (me) ; + W [e] = 0 ; + } + } + + pme2 = pfree - 1 ; + } + + /* ----------------------------------------------------------------- */ + /* me has now been converted into an element in Iw [pme1..pme2] */ + /* ----------------------------------------------------------------- */ + + /* degme holds the external degree of new element */ + Degree [me] = degme ; + Pe [me] = pme1 ; + Len [me] = pme2 - pme1 + 1 ; + ASSERT (Pe [me] >= 0 && Pe [me] < iwlen) ; + + Elen [me] = FLIP (nvpiv + degme) ; + /* FLIP (Elen (me)) is now the degree of pivot (including + * diagonal part). */ + +#ifndef NDEBUG + AMD_DEBUG2 (("New element structure: length= "ID"\n", pme2-pme1+1)) ; + for (pme = pme1 ; pme <= pme2 ; pme++) AMD_DEBUG3 ((" "ID"", Iw[pme])); + AMD_DEBUG3 (("\n")) ; +#endif + + /* ----------------------------------------------------------------- */ + /* make sure that wflg is not too large. */ + /* ----------------------------------------------------------------- */ + + /* With the current value of wflg, wflg+n must not cause integer + * overflow */ + + if (wflg >= wbig) + { + for (x = 0 ; x < n ; x++) + { + if (W [x] != 0) W [x] = 1 ; + } + wflg = 2 ; + } + +/* ========================================================================= */ +/* COMPUTE (W [e] - wflg) = |Le\Lme| FOR ALL ELEMENTS */ +/* ========================================================================= */ + + /* ----------------------------------------------------------------- + * Scan 1: compute the external degrees of previous elements with + * respect to the current element. That is: + * (W [e] - wflg) = |Le \ Lme| + * for each element e that appears in any supervariable in Lme. The + * notation Le refers to the pattern (list of supervariables) of a + * previous element e, where e is not yet absorbed, stored in + * Iw [Pe [e] + 1 ... Pe [e] + Iw [Pe [e]]]. The notation Lme + * refers to the pattern of the current element (stored in + * Iw [pme1..pme2]). If aggressive absorption is enabled, and + * (W [e] - wflg) becomes zero, then the element e will be absorbed + * in Scan 2. + * ----------------------------------------------------------------- */ + + AMD_DEBUG2 (("me: ")) ; + for (pme = pme1 ; pme <= pme2 ; pme++) + { + i = Iw [pme] ; + ASSERT (i >= 0 && i < n) ; + eln = Elen [i] ; + AMD_DEBUG3 ((""ID" Elen "ID": \n", i, eln)) ; + if (eln > 0) + { + /* note that Nv [i] has been negated to denote i in Lme: */ + nvi = -Nv [i] ; + ASSERT (nvi > 0 && Pe [i] >= 0 && Pe [i] < iwlen) ; + wnvi = wflg - nvi ; + for (p = Pe [i] ; p <= Pe [i] + eln - 1 ; p++) + { + e = Iw [p] ; + ASSERT (e >= 0 && e < n) ; + we = W [e] ; + AMD_DEBUG4 ((" e "ID" we "ID" ", e, we)) ; + if (we >= wflg) + { + /* unabsorbed element e has been seen in this loop */ + AMD_DEBUG4 ((" unabsorbed, first time seen")) ; + we -= nvi ; + } + else if (we != 0) + { + /* e is an unabsorbed element */ + /* this is the first we have seen e in all of Scan 1 */ + AMD_DEBUG4 ((" unabsorbed")) ; + we = Degree [e] + wnvi ; + } + AMD_DEBUG4 (("\n")) ; + W [e] = we ; + } + } + } + AMD_DEBUG2 (("\n")) ; + +/* ========================================================================= */ +/* DEGREE UPDATE AND ELEMENT ABSORPTION */ +/* ========================================================================= */ + + /* ----------------------------------------------------------------- + * Scan 2: for each i in Lme, sum up the degree of Lme (which is + * degme), plus the sum of the external degrees of each Le for the + * elements e appearing within i, plus the supervariables in i. + * Place i in hash list. + * ----------------------------------------------------------------- */ + + for (pme = pme1 ; pme <= pme2 ; pme++) + { + i = Iw [pme] ; + ASSERT (i >= 0 && i < n && Nv [i] < 0 && Elen [i] >= 0) ; + AMD_DEBUG2 (("Updating: i "ID" "ID" "ID"\n", i, Elen[i], Len [i])); + p1 = Pe [i] ; + p2 = p1 + Elen [i] - 1 ; + pn = p1 ; + hash = 0 ; + deg = 0 ; + ASSERT (p1 >= 0 && p1 < iwlen && p2 >= -1 && p2 < iwlen) ; + + /* ------------------------------------------------------------- */ + /* scan the element list associated with supervariable i */ + /* ------------------------------------------------------------- */ + + /* UMFPACK/MA38-style approximate degree: */ + if (aggressive) + { + for (p = p1 ; p <= p2 ; p++) + { + e = Iw [p] ; + ASSERT (e >= 0 && e < n) ; + we = W [e] ; + if (we != 0) + { + /* e is an unabsorbed element */ + /* dext = | Le \ Lme | */ + dext = we - wflg ; + if (dext > 0) + { + deg += dext ; + Iw [pn++] = e ; + hash += e ; + AMD_DEBUG4 ((" e: "ID" hash = "ID"\n",e,hash)) ; + } + else + { + /* external degree of e is zero, absorb e into me*/ + AMD_DEBUG1 ((" Element "ID" =>"ID" (aggressive)\n", + e, me)) ; + ASSERT (dext == 0) ; + Pe [e] = FLIP (me) ; + W [e] = 0 ; + } + } + } + } + else + { + for (p = p1 ; p <= p2 ; p++) + { + e = Iw [p] ; + ASSERT (e >= 0 && e < n) ; + we = W [e] ; + if (we != 0) + { + /* e is an unabsorbed element */ + dext = we - wflg ; + ASSERT (dext >= 0) ; + deg += dext ; + Iw [pn++] = e ; + hash += e ; + AMD_DEBUG4 ((" e: "ID" hash = "ID"\n",e,hash)) ; + } + } + } + + /* count the number of elements in i (including me): */ + Elen [i] = pn - p1 + 1 ; + + /* ------------------------------------------------------------- */ + /* scan the supervariables in the list associated with i */ + /* ------------------------------------------------------------- */ + + /* The bulk of the AMD run time is typically spent in this loop, + * particularly if the matrix has many dense rows that are not + * removed prior to ordering. */ + p3 = pn ; + p4 = p1 + Len [i] ; + for (p = p2 + 1 ; p < p4 ; p++) + { + j = Iw [p] ; + ASSERT (j >= 0 && j < n) ; + nvj = Nv [j] ; + if (nvj > 0) + { + /* j is unabsorbed, and not in Lme. */ + /* add to degree and add to new list */ + deg += nvj ; + Iw [pn++] = j ; + hash += j ; + AMD_DEBUG4 ((" s: "ID" hash "ID" Nv[j]= "ID"\n", + j, hash, nvj)) ; + } + } + + /* ------------------------------------------------------------- */ + /* update the degree and check for mass elimination */ + /* ------------------------------------------------------------- */ + + /* with aggressive absorption, deg==0 is identical to the + * Elen [i] == 1 && p3 == pn test, below. */ + ASSERT (IMPLIES (aggressive, (deg==0) == (Elen[i]==1 && p3==pn))) ; + + if (Elen [i] == 1 && p3 == pn) + { + + /* --------------------------------------------------------- */ + /* mass elimination */ + /* --------------------------------------------------------- */ + + /* There is nothing left of this node except for an edge to + * the current pivot element. Elen [i] is 1, and there are + * no variables adjacent to node i. Absorb i into the + * current pivot element, me. Note that if there are two or + * more mass eliminations, fillin due to mass elimination is + * possible within the nvpiv-by-nvpiv pivot block. It is this + * step that causes AMD's analysis to be an upper bound. + * + * The reason is that the selected pivot has a lower + * approximate degree than the true degree of the two mass + * eliminated nodes. There is no edge between the two mass + * eliminated nodes. They are merged with the current pivot + * anyway. + * + * No fillin occurs in the Schur complement, in any case, + * and this effect does not decrease the quality of the + * ordering itself, just the quality of the nonzero and + * flop count analysis. It also means that the post-ordering + * is not an exact elimination tree post-ordering. */ + + AMD_DEBUG1 ((" MASS i "ID" => parent e "ID"\n", i, me)) ; + Pe [i] = FLIP (me) ; + nvi = -Nv [i] ; + degme -= nvi ; + nvpiv += nvi ; + nel += nvi ; + Nv [i] = 0 ; + Elen [i] = EMPTY ; + + } + else + { + + /* --------------------------------------------------------- */ + /* update the upper-bound degree of i */ + /* --------------------------------------------------------- */ + + /* the following degree does not yet include the size + * of the current element, which is added later: */ + + Degree [i] = MIN (Degree [i], deg) ; + + /* --------------------------------------------------------- */ + /* add me to the list for i */ + /* --------------------------------------------------------- */ + + /* move first supervariable to end of list */ + Iw [pn] = Iw [p3] ; + /* move first element to end of element part of list */ + Iw [p3] = Iw [p1] ; + /* add new element, me, to front of list. */ + Iw [p1] = me ; + /* store the new length of the list in Len [i] */ + Len [i] = pn - p1 + 1 ; + + /* --------------------------------------------------------- */ + /* place in hash bucket. Save hash key of i in Last [i]. */ + /* --------------------------------------------------------- */ + + /* NOTE: this can fail if hash is negative, because the ANSI C + * standard does not define a % b when a and/or b are negative. + * That's why hash is defined as an unsigned Int, to avoid this + * problem. */ + hash = hash % n ; + ASSERT (((Int) hash) >= 0 && ((Int) hash) < n) ; + + /* if the Hhead array is not used: */ + j = Head [hash] ; + if (j <= EMPTY) + { + /* degree list is empty, hash head is FLIP (j) */ + Next [i] = FLIP (j) ; + Head [hash] = FLIP (i) ; + } + else + { + /* degree list is not empty, use Last [Head [hash]] as + * hash head. */ + Next [i] = Last [j] ; + Last [j] = i ; + } + + /* if a seperate Hhead array is used: * + Next [i] = Hhead [hash] ; + Hhead [hash] = i ; + */ + + Last [i] = hash ; + } + } + + Degree [me] = degme ; + + /* ----------------------------------------------------------------- */ + /* Clear the counter array, W [...], by incrementing wflg. */ + /* ----------------------------------------------------------------- */ + + /* make sure that wflg+n does not cause integer overflow */ + lemax = MAX (lemax, degme) ; + wflg += lemax ; + if (wflg >= wbig) + { + for (x = 0 ; x < n ; x++) + { + if (W [x] != 0) W [x] = 1 ; + } + wflg = 2 ; + } + /* at this point, W [0..n-1] < wflg holds */ + +/* ========================================================================= */ +/* SUPERVARIABLE DETECTION */ +/* ========================================================================= */ + + AMD_DEBUG1 (("Detecting supervariables:\n")) ; + for (pme = pme1 ; pme <= pme2 ; pme++) + { + i = Iw [pme] ; + ASSERT (i >= 0 && i < n) ; + AMD_DEBUG2 (("Consider i "ID" nv "ID"\n", i, Nv [i])) ; + if (Nv [i] < 0) + { + /* i is a principal variable in Lme */ + + /* --------------------------------------------------------- + * examine all hash buckets with 2 or more variables. We do + * this by examing all unique hash keys for supervariables in + * the pattern Lme of the current element, me + * --------------------------------------------------------- */ + + /* let i = head of hash bucket, and empty the hash bucket */ + ASSERT (Last [i] >= 0 && Last [i] < n) ; + hash = Last [i] ; + + /* if Hhead array is not used: */ + j = Head [hash] ; + if (j == EMPTY) + { + /* hash bucket and degree list are both empty */ + i = EMPTY ; + } + else if (j < EMPTY) + { + /* degree list is empty */ + i = FLIP (j) ; + Head [hash] = EMPTY ; + } + else + { + /* degree list is not empty, restore Last [j] of head j */ + i = Last [j] ; + Last [j] = EMPTY ; + } + + /* if seperate Hhead array is used: * + i = Hhead [hash] ; + Hhead [hash] = EMPTY ; + */ + + ASSERT (i >= EMPTY && i < n) ; + AMD_DEBUG2 (("----i "ID" hash "ID"\n", i, hash)) ; + + while (i != EMPTY && Next [i] != EMPTY) + { + + /* ----------------------------------------------------- + * this bucket has one or more variables following i. + * scan all of them to see if i can absorb any entries + * that follow i in hash bucket. Scatter i into w. + * ----------------------------------------------------- */ + + ln = Len [i] ; + eln = Elen [i] ; + ASSERT (ln >= 0 && eln >= 0) ; + ASSERT (Pe [i] >= 0 && Pe [i] < iwlen) ; + /* do not flag the first element in the list (me) */ + for (p = Pe [i] + 1 ; p <= Pe [i] + ln - 1 ; p++) + { + ASSERT (Iw [p] >= 0 && Iw [p] < n) ; + W [Iw [p]] = wflg ; + } + + /* ----------------------------------------------------- */ + /* scan every other entry j following i in bucket */ + /* ----------------------------------------------------- */ + + jlast = i ; + j = Next [i] ; + ASSERT (j >= EMPTY && j < n) ; + + while (j != EMPTY) + { + /* ------------------------------------------------- */ + /* check if j and i have identical nonzero pattern */ + /* ------------------------------------------------- */ + + AMD_DEBUG3 (("compare i "ID" and j "ID"\n", i,j)) ; + + /* check if i and j have the same Len and Elen */ + ASSERT (Len [j] >= 0 && Elen [j] >= 0) ; + ASSERT (Pe [j] >= 0 && Pe [j] < iwlen) ; + ok = (Len [j] == ln) && (Elen [j] == eln) ; + /* skop the first element in the list (me) */ + for (p = Pe [j] + 1 ; ok && p <= Pe [j] + ln - 1 ; p++) + { + ASSERT (Iw [p] >= 0 && Iw [p] < n) ; + if (W [Iw [p]] != wflg) ok = 0 ; + } + if (ok) + { + /* --------------------------------------------- */ + /* found it! j can be absorbed into i */ + /* --------------------------------------------- */ + + AMD_DEBUG1 (("found it! j "ID" => i "ID"\n", j,i)); + Pe [j] = FLIP (i) ; + /* both Nv [i] and Nv [j] are negated since they */ + /* are in Lme, and the absolute values of each */ + /* are the number of variables in i and j: */ + Nv [i] += Nv [j] ; + Nv [j] = 0 ; + Elen [j] = EMPTY ; + /* delete j from hash bucket */ + ASSERT (j != Next [j]) ; + j = Next [j] ; + Next [jlast] = j ; + + } + else + { + /* j cannot be absorbed into i */ + jlast = j ; + ASSERT (j != Next [j]) ; + j = Next [j] ; + } + ASSERT (j >= EMPTY && j < n) ; + } + + /* ----------------------------------------------------- + * no more variables can be absorbed into i + * go to next i in bucket and clear flag array + * ----------------------------------------------------- */ + + wflg++ ; + i = Next [i] ; + ASSERT (i >= EMPTY && i < n) ; + + } + } + } + AMD_DEBUG2 (("detect done\n")) ; + +/* ========================================================================= */ +/* RESTORE DEGREE LISTS AND REMOVE NONPRINCIPAL SUPERVARIABLES FROM ELEMENT */ +/* ========================================================================= */ + + p = pme1 ; + nleft = n - nel ; + for (pme = pme1 ; pme <= pme2 ; pme++) + { + i = Iw [pme] ; + ASSERT (i >= 0 && i < n) ; + nvi = -Nv [i] ; + AMD_DEBUG3 (("Restore i "ID" "ID"\n", i, nvi)) ; + if (nvi > 0) + { + /* i is a principal variable in Lme */ + /* restore Nv [i] to signify that i is principal */ + Nv [i] = nvi ; + + /* --------------------------------------------------------- */ + /* compute the external degree (add size of current element) */ + /* --------------------------------------------------------- */ + + deg = Degree [i] + degme - nvi ; + deg = MIN (deg, nleft - nvi) ; + ASSERT (IMPLIES (aggressive, deg > 0) && deg >= 0 && deg < n) ; + + /* --------------------------------------------------------- */ + /* place the supervariable at the head of the degree list */ + /* --------------------------------------------------------- */ + + inext = Head [deg] ; + ASSERT (inext >= EMPTY && inext < n) ; + if (inext != EMPTY) Last [inext] = i ; + Next [i] = inext ; + Last [i] = EMPTY ; + Head [deg] = i ; + + /* --------------------------------------------------------- */ + /* save the new degree, and find the minimum degree */ + /* --------------------------------------------------------- */ + + mindeg = MIN (mindeg, deg) ; + Degree [i] = deg ; + + /* --------------------------------------------------------- */ + /* place the supervariable in the element pattern */ + /* --------------------------------------------------------- */ + + Iw [p++] = i ; + + } + } + AMD_DEBUG2 (("restore done\n")) ; + +/* ========================================================================= */ +/* FINALIZE THE NEW ELEMENT */ +/* ========================================================================= */ + + AMD_DEBUG2 (("ME = "ID" DONE\n", me)) ; + Nv [me] = nvpiv ; + /* save the length of the list for the new element me */ + Len [me] = p - pme1 ; + if (Len [me] == 0) + { + /* there is nothing left of the current pivot element */ + /* it is a root of the assembly tree */ + Pe [me] = EMPTY ; + W [me] = 0 ; + } + if (elenme != 0) + { + /* element was not constructed in place: deallocate part of */ + /* it since newly nonprincipal variables may have been removed */ + pfree = p ; + } + + /* The new element has nvpiv pivots and the size of the contribution + * block for a multifrontal method is degme-by-degme, not including + * the "dense" rows/columns. If the "dense" rows/columns are included, + * the frontal matrix is no larger than + * (degme+ndense)-by-(degme+ndense). + */ + + if (Info != (double *) NULL) + { + f = nvpiv ; + r = degme + ndense ; + dmax = MAX (dmax, f + r) ; + + /* number of nonzeros in L (excluding the diagonal) */ + lnzme = f*r + (f-1)*f/2 ; + lnz += lnzme ; + + /* number of divide operations for LDL' and for LU */ + ndiv += lnzme ; + + /* number of multiply-subtract pairs for LU */ + s = f*r*r + r*(f-1)*f + (f-1)*f*(2*f-1)/6 ; + nms_lu += s ; + + /* number of multiply-subtract pairs for LDL' */ + nms_ldl += (s + lnzme)/2 ; + } + +#ifndef NDEBUG + AMD_DEBUG2 (("finalize done nel "ID" n "ID"\n ::::\n", nel, n)) ; + for (pme = Pe [me] ; pme <= Pe [me] + Len [me] - 1 ; pme++) + { + AMD_DEBUG3 ((" "ID"", Iw [pme])) ; + } + AMD_DEBUG3 (("\n")) ; +#endif + + } + +/* ========================================================================= */ +/* DONE SELECTING PIVOTS */ +/* ========================================================================= */ + + if (Info != (double *) NULL) + { + + /* count the work to factorize the ndense-by-ndense submatrix */ + f = ndense ; + dmax = MAX (dmax, (double) ndense) ; + + /* number of nonzeros in L (excluding the diagonal) */ + lnzme = (f-1)*f/2 ; + lnz += lnzme ; + + /* number of divide operations for LDL' and for LU */ + ndiv += lnzme ; + + /* number of multiply-subtract pairs for LU */ + s = (f-1)*f*(2*f-1)/6 ; + nms_lu += s ; + + /* number of multiply-subtract pairs for LDL' */ + nms_ldl += (s + lnzme)/2 ; + + /* number of nz's in L (excl. diagonal) */ + Info [AMD_LNZ] = lnz ; + + /* number of divide ops for LU and LDL' */ + Info [AMD_NDIV] = ndiv ; + + /* number of multiply-subtract pairs for LDL' */ + Info [AMD_NMULTSUBS_LDL] = nms_ldl ; + + /* number of multiply-subtract pairs for LU */ + Info [AMD_NMULTSUBS_LU] = nms_lu ; + + /* number of "dense" rows/columns */ + Info [AMD_NDENSE] = ndense ; + + /* largest front is dmax-by-dmax */ + Info [AMD_DMAX] = dmax ; + + /* number of garbage collections in AMD */ + Info [AMD_NCMPA] = ncmpa ; + + /* successful ordering */ + Info [AMD_STATUS] = AMD_OK ; + } + +/* ------------------------------------------------------------------------- + * Variables at this point: + * + * Pe: holds the elimination tree. The parent of j is FLIP (Pe [j]), + * or EMPTY if j is a root. The tree holds both elements and + * non-principal (unordered) variables absorbed into them. + * Dense variables are non-principal and unordered. + * + * Elen: holds the size of each element, including the diagonal part. + * FLIP (Elen [e]) > 0 if e is an element. For unordered + * variables i, Elen [i] is EMPTY. + * + * Nv: Nv [e] > 0 is the number of pivots represented by the element e. + * For unordered variables i, Nv [i] is zero. + * + * Contents no longer needed: + * W, Iw, Len, Degree, Head, Next, Last. + * + * The matrix itself has been destroyed. + * + * n: the size of the matrix. + * No other scalars needed (pfree, iwlen, etc.) + * ------------------------------------------------------------------------- */ + + for (i = 0 ; i < n ; i++) + { + Pe [i] = FLIP (Pe [i]) ; + Elen [i] = FLIP (Elen [i]) ; + } + +/* Now the parent of j is Pe [j], or EMPTY if j is a root. Elen [e] > 0 + * is the size of element e. Elen [i] is EMPTY for unordered variable i. */ + +#ifndef NDEBUG + AMD_DEBUG2 (("\nTree:\n")) ; + for (i = 0 ; i < n ; i++) + { + AMD_DEBUG2 ((" "ID" parent: "ID" ", i, Pe [i])) ; + ASSERT (Pe [i] >= EMPTY && Pe [i] < n) ; + if (Nv [i] > 0) + { + /* this is an element */ + e = i ; + AMD_DEBUG2 ((" element, size is "ID"\n", Elen [i])) ; + ASSERT (Elen [e] > 0) ; + } + AMD_DEBUG2 (("\n")) ; + } + AMD_DEBUG2 (("\nelements:\n")) ; + for (e = 0 ; e < n ; e++) + { + if (Nv [e] > 0) + { + AMD_DEBUG3 (("Element e= "ID" size "ID" nv "ID" \n", e, + Elen [e], Nv [e])) ; + } + } + AMD_DEBUG2 (("\nvariables:\n")) ; + for (i = 0 ; i < n ; i++) + { + Int cnt ; + if (Nv [i] == 0) + { + AMD_DEBUG3 (("i unordered: "ID"\n", i)) ; + j = Pe [i] ; + cnt = 0 ; + AMD_DEBUG3 ((" j: "ID"\n", j)) ; + if (j == EMPTY) + { + AMD_DEBUG3 ((" i is a dense variable\n")) ; + } + else + { + ASSERT (j >= 0 && j < n) ; + while (Nv [j] == 0) + { + AMD_DEBUG3 ((" j : "ID"\n", j)) ; + j = Pe [j] ; + AMD_DEBUG3 ((" j:: "ID"\n", j)) ; + cnt++ ; + if (cnt > n) break ; + } + e = j ; + AMD_DEBUG3 ((" got to e: "ID"\n", e)) ; + } + } + } +#endif + +/* ========================================================================= */ +/* compress the paths of the variables */ +/* ========================================================================= */ + + for (i = 0 ; i < n ; i++) + { + if (Nv [i] == 0) + { + + /* ------------------------------------------------------------- + * i is an un-ordered row. Traverse the tree from i until + * reaching an element, e. The element, e, was the principal + * supervariable of i and all nodes in the path from i to when e + * was selected as pivot. + * ------------------------------------------------------------- */ + + AMD_DEBUG1 (("Path compression, i unordered: "ID"\n", i)) ; + j = Pe [i] ; + ASSERT (j >= EMPTY && j < n) ; + AMD_DEBUG3 ((" j: "ID"\n", j)) ; + if (j == EMPTY) + { + /* Skip a dense variable. It has no parent. */ + AMD_DEBUG3 ((" i is a dense variable\n")) ; + continue ; + } + + /* while (j is a variable) */ + while (Nv [j] == 0) + { + AMD_DEBUG3 ((" j : "ID"\n", j)) ; + j = Pe [j] ; + AMD_DEBUG3 ((" j:: "ID"\n", j)) ; + ASSERT (j >= 0 && j < n) ; + } + /* got to an element e */ + e = j ; + AMD_DEBUG3 (("got to e: "ID"\n", e)) ; + + /* ------------------------------------------------------------- + * traverse the path again from i to e, and compress the path + * (all nodes point to e). Path compression allows this code to + * compute in O(n) time. + * ------------------------------------------------------------- */ + + j = i ; + /* while (j is a variable) */ + while (Nv [j] == 0) + { + jnext = Pe [j] ; + AMD_DEBUG3 (("j "ID" jnext "ID"\n", j, jnext)) ; + Pe [j] = e ; + j = jnext ; + ASSERT (j >= 0 && j < n) ; + } + } + } + +/* ========================================================================= */ +/* postorder the assembly tree */ +/* ========================================================================= */ + + AMD_postorder (n, Pe, Nv, Elen, + W, /* output order */ + Head, Next, Last) ; /* workspace */ + +/* ========================================================================= */ +/* compute output permutation and inverse permutation */ +/* ========================================================================= */ + + /* W [e] = k means that element e is the kth element in the new + * order. e is in the range 0 to n-1, and k is in the range 0 to + * the number of elements. Use Head for inverse order. */ + + for (k = 0 ; k < n ; k++) + { + Head [k] = EMPTY ; + Next [k] = EMPTY ; + } + for (e = 0 ; e < n ; e++) + { + k = W [e] ; + ASSERT ((k == EMPTY) == (Nv [e] == 0)) ; + if (k != EMPTY) + { + ASSERT (k >= 0 && k < n) ; + Head [k] = e ; + } + } + + /* construct output inverse permutation in Next, + * and permutation in Last */ + nel = 0 ; + for (k = 0 ; k < n ; k++) + { + e = Head [k] ; + if (e == EMPTY) break ; + ASSERT (e >= 0 && e < n && Nv [e] > 0) ; + Next [e] = nel ; + nel += Nv [e] ; + } + ASSERT (nel == n - ndense) ; + + /* order non-principal variables (dense, & those merged into supervar's) */ + for (i = 0 ; i < n ; i++) + { + if (Nv [i] == 0) + { + e = Pe [i] ; + ASSERT (e >= EMPTY && e < n) ; + if (e != EMPTY) + { + /* This is an unordered variable that was merged + * into element e via supernode detection or mass + * elimination of i when e became the pivot element. + * Place i in order just before e. */ + ASSERT (Next [i] == EMPTY && Nv [e] > 0) ; + Next [i] = Next [e] ; + Next [e]++ ; + } + else + { + /* This is a dense unordered variable, with no parent. + * Place it last in the output order. */ + Next [i] = nel++ ; + } + } + } + ASSERT (nel == n) ; + + AMD_DEBUG2 (("\n\nPerm:\n")) ; + for (i = 0 ; i < n ; i++) + { + k = Next [i] ; + ASSERT (k >= 0 && k < n) ; + Last [k] = i ; + AMD_DEBUG2 ((" perm ["ID"] = "ID"\n", k, i)) ; + } +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Source/amd_aat.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Source/amd_aat.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,180 @@ +/* ========================================================================= */ +/* === AMD_aat ============================================================= */ +/* ========================================================================= */ + +/* ------------------------------------------------------------------------- */ +/* AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis, */ +/* Patrick R. Amestoy, and Iain S. Duff. See ../README for License. */ +/* email: davis@cise.ufl.edu CISE Department, Univ. of Florida. */ +/* web: http://www.cise.ufl.edu/research/sparse/amd */ +/* ------------------------------------------------------------------------- */ + +/* AMD_aat: compute the symmetry of the pattern of A, and count the number of + * nonzeros each column of A+A' (excluding the diagonal). Assume the input + * matrix has no errors. + */ + +#include "amd_internal.h" + +GLOBAL Int AMD_aat /* returns nz in A+A' */ +( + Int n, + const Int Ap [ ], + const Int Ai [ ], + Int Len [ ], /* Len [j]: length of column j of A+A', excl diagonal*/ + Int Tp [ ], /* workspace of size n */ + double Info [ ] +) +{ + Int p1, p2, p, i, j, pj, pj2, k, nzdiag, nzboth, nz, nzaat ; + double sym ; + +#ifndef NDEBUG + AMD_debug_init ("AMD AAT") ; + for (k = 0 ; k < n ; k++) Tp [k] = EMPTY ; + ASSERT (AMD_valid (n, n, Ap, Ai)) ; +#endif + + if (Info != (double *) NULL) + { + /* clear the Info array, if it exists */ + for (i = 0 ; i < AMD_INFO ; i++) + { + Info [i] = EMPTY ; + } + Info [AMD_STATUS] = AMD_OK ; + } + + for (k = 0 ; k < n ; k++) + { + Len [k] = 0 ; + } + + nzdiag = 0 ; + nzboth = 0 ; + nz = Ap [n] ; + + for (k = 0 ; k < n ; k++) + { + p1 = Ap [k] ; + p2 = Ap [k+1] ; + AMD_DEBUG2 (("\nAAT Column: "ID" p1: "ID" p2: "ID"\n", k, p1, p2)) ; + + /* construct A+A' */ + for (p = p1 ; p < p2 ; ) + { + /* scan the upper triangular part of A */ + j = Ai [p] ; + if (j < k) + { + /* entry A (j,k) is in the strictly upper triangular part, + * add both A (j,k) and A (k,j) to the matrix A+A' */ + Len [j]++ ; + Len [k]++ ; + AMD_DEBUG3 ((" upper ("ID","ID") ("ID","ID")\n", j,k, k,j)); + p++ ; + } + else if (j == k) + { + /* skip the diagonal */ + p++ ; + nzdiag++ ; + break ; + } + else /* j > k */ + { + /* first entry below the diagonal */ + break ; + } + /* scan lower triangular part of A, in column j until reaching + * row k. Start where last scan left off. */ + ASSERT (Tp [j] != EMPTY) ; + ASSERT (Ap [j] <= Tp [j] && Tp [j] <= Ap [j+1]) ; + pj2 = Ap [j+1] ; + for (pj = Tp [j] ; pj < pj2 ; ) + { + i = Ai [pj] ; + if (i < k) + { + /* A (i,j) is only in the lower part, not in upper. + * add both A (i,j) and A (j,i) to the matrix A+A' */ + Len [i]++ ; + Len [j]++ ; + AMD_DEBUG3 ((" lower ("ID","ID") ("ID","ID")\n", + i,j, j,i)) ; + pj++ ; + } + else if (i == k) + { + /* entry A (k,j) in lower part and A (j,k) in upper */ + pj++ ; + nzboth++ ; + break ; + } + else /* i > k */ + { + /* consider this entry later, when k advances to i */ + break ; + } + } + Tp [j] = pj ; + } + /* Tp [k] points to the entry just below the diagonal in column k */ + Tp [k] = p ; + } + + /* clean up, for remaining mismatched entries */ + for (j = 0 ; j < n ; j++) + { + for (pj = Tp [j] ; pj < Ap [j+1] ; pj++) + { + i = Ai [pj] ; + /* A (i,j) is only in the lower part, not in upper. + * add both A (i,j) and A (j,i) to the matrix A+A' */ + Len [i]++ ; + Len [j]++ ; + AMD_DEBUG3 ((" lower cleanup ("ID","ID") ("ID","ID")\n", + i,j, j,i)) ; + } + } + + /* --------------------------------------------------------------------- */ + /* compute the symmetry of the nonzero pattern of A */ + /* --------------------------------------------------------------------- */ + + /* Given a matrix A, the symmetry of A is: + * B = tril (spones (A), -1) + triu (spones (A), 1) ; + * sym = nnz (B & B') / nnz (B) ; + * or 1 if nnz (B) is zero. + */ + + if (nz == nzdiag) + { + sym = 1 ; + } + else + { + sym = ((double) (2 * nzboth)) / ((double) (nz - nzdiag)) ; + } + + nzaat = 0 ; + for (k = 0 ; k < n ; k++) + { + nzaat += Len [k] ; + } + AMD_DEBUG1 (("AMD nz in A+A', excluding diagonal (nzaat) = "ID"\n",nzaat)); + AMD_DEBUG1 ((" nzboth: "ID" nz: "ID" nzdiag: "ID" symmetry: %g\n", + nzboth, nz, nzdiag, sym)) ; + + if (Info != (double *) NULL) + { + Info [AMD_STATUS] = AMD_OK ; + Info [AMD_N] = n ; + Info [AMD_NZ] = nz ; + Info [AMD_SYMMETRY] = sym ; /* symmetry of pattern of A */ + Info [AMD_NZDIAG] = nzdiag ; /* nonzeros on diagonal of A */ + Info [AMD_NZ_A_PLUS_AT] = nzaat ; /* nonzeros in A+A' */ + } + + return (nzaat) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Source/amd_control.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Source/amd_control.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,61 @@ +/* ========================================================================= */ +/* === AMD_control ========================================================= */ +/* ========================================================================= */ + +/* ------------------------------------------------------------------------- */ +/* AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis, */ +/* Patrick R. Amestoy, and Iain S. Duff. See ../README for License. */ +/* email: davis@cise.ufl.edu CISE Department, Univ. of Florida. */ +/* web: http://www.cise.ufl.edu/research/sparse/amd */ +/* ------------------------------------------------------------------------- */ + +/* User-callable. Prints the control parameters for AMD. See amd.h + * for details. If the Control array is not present, the defaults are + * printed instead. + */ + +#include "amd_internal.h" + +GLOBAL void AMD_control +( + double Control [ ] +) +{ + double alpha ; + Int aggressive ; + + if (Control != (double *) NULL) + { + alpha = Control [AMD_DENSE] ; + aggressive = Control [AMD_AGGRESSIVE] != 0 ; + } + else + { + alpha = AMD_DEFAULT_DENSE ; + aggressive = AMD_DEFAULT_AGGRESSIVE ; + } + + PRINTF (("\namd: approximate minimum degree ordering, parameters:\n" + " dense row parameter: %g\n", alpha)) ; + + if (alpha < 0) + { + PRINTF ((" no rows treated as dense\n")) ; + } + else + { + PRINTF (( + " (rows with more than max (%g * sqrt (n), 16) entries are\n" + " considered \"dense\", and placed last in output permutation)\n", + alpha)) ; + } + + if (aggressive) + { + PRINTF ((" aggressive absorption: yes\n\n")) ; + } + else + { + PRINTF ((" aggressive absorption: no\n\n")) ; + } +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Source/amd_defaults.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Source/amd_defaults.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,33 @@ +/* ========================================================================= */ +/* === AMD_defaults ======================================================== */ +/* ========================================================================= */ + +/* ------------------------------------------------------------------------- */ +/* AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis, */ +/* Patrick R. Amestoy, and Iain S. Duff. See ../README for License. */ +/* email: davis@cise.ufl.edu CISE Department, Univ. of Florida. */ +/* web: http://www.cise.ufl.edu/research/sparse/amd */ +/* ------------------------------------------------------------------------- */ + +/* User-callable. Sets default control parameters for AMD. See amd.h + * for details. + */ + +#include "amd_internal.h" + +GLOBAL void AMD_defaults +( + double Control [ ] +) +{ + Int i ; + if (Control != (double *) NULL) + { + for (i = 0 ; i < AMD_CONTROL ; i++) + { + Control [i] = 0 ; + } + Control [AMD_DENSE] = AMD_DEFAULT_DENSE ; + Control [AMD_AGGRESSIVE] = AMD_DEFAULT_AGGRESSIVE ; + } +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Source/amd_dump.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Source/amd_dump.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,176 @@ +/* ========================================================================= */ +/* === AMD_dump ============================================================ */ +/* ========================================================================= */ + +/* ------------------------------------------------------------------------- */ +/* AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis, */ +/* Patrick R. Amestoy, and Iain S. Duff. See ../README for License. */ +/* email: davis@cise.ufl.edu CISE Department, Univ. of Florida. */ +/* web: http://www.cise.ufl.edu/research/sparse/amd */ +/* ------------------------------------------------------------------------- */ + +/* Debugging routines for AMD. Not used if NDEBUG is not defined at compile- + * time (the default). See comments in amd_internal.h on how to enable + * debugging. Not user-callable. + */ + +#include "amd_internal.h" + +#ifndef NDEBUG + +/* This global variable is present only when debugging */ +GLOBAL Int AMD_debug = -999 ; /* default is no debug printing */ + +/* ========================================================================= */ +/* === AMD_debug_init ====================================================== */ +/* ========================================================================= */ + +/* Sets the debug print level, by reading the file debug.amd (if it exists) */ + +GLOBAL void AMD_debug_init ( char *s ) +{ + FILE *f ; + f = fopen ("debug.amd", "r") ; + if (f == (FILE *) NULL) + { + AMD_debug = -999 ; + } + else + { + fscanf (f, ID, &AMD_debug) ; + fclose (f) ; + } + if (AMD_debug >= 0) printf ("%s: AMD_debug_init, D= "ID"\n", s, AMD_debug); +} + +/* ========================================================================= */ +/* === AMD_dump ============================================================ */ +/* ========================================================================= */ + +/* Dump AMD's data structure, except for the hash buckets. This routine + * cannot be called when the hash buckets are non-empty. + */ + +GLOBAL void AMD_dump ( + Int n, /* A is n-by-n */ + Int Pe [ ], /* pe [0..n-1]: index in iw of start of row i */ + Int Iw [ ], /* workspace of size iwlen, iwlen [0..pfree-1] + * holds the matrix on input */ + Int Len [ ], /* len [0..n-1]: length for row i */ + Int iwlen, /* length of iw */ + Int pfree, /* iw [pfree ... iwlen-1] is empty on input */ + Int Nv [ ], /* nv [0..n-1] */ + Int Next [ ], /* next [0..n-1] */ + Int Last [ ], /* last [0..n-1] */ + Int Head [ ], /* head [0..n-1] */ + Int Elen [ ], /* size n */ + Int Degree [ ], /* size n */ + Int W [ ], /* size n */ + Int nel +) +{ + Int i, pe, elen, nv, len, e, p, k, j, deg, w, cnt, ilast ; + + if (AMD_debug < 0) return ; + ASSERT (pfree <= iwlen) ; + for (i = 0 ; i < n ; i++) + { + pe = Pe [i] ; + elen = Elen [i] ; + nv = Nv [i] ; + len = Len [i] ; + w = W [i] ; + + if (elen >= EMPTY) + { + if (nv == 0) + { + AMD_DEBUG3 (("\nI "ID": nonprincipal: ", i)) ; + ASSERT (elen == EMPTY) ; + if (pe == EMPTY) + { + AMD_DEBUG3 ((" dense node\n")) ; + ASSERT (w == 1) ; + } + else + { + ASSERT (pe < EMPTY) ; + AMD_DEBUG3 ((" i "ID" -> parent "ID"\n", i, FLIP (Pe[i]))); + } + } + else + { + AMD_DEBUG3 (("\nI "ID": active principal supervariable:\n",i)); + AMD_DEBUG3 ((" nv(i): "ID" Flag: %d\n", nv, (nv < 0))) ; + ASSERT (elen >= 0) ; + ASSERT (nv > 0 && pe >= 0) ; + p = pe ; + AMD_DEBUG3 ((" e/s: ")) ; + if (elen == 0) AMD_DEBUG3 ((" : ")) ; + ASSERT (pe < pfree) ; + for (k = 0 ; k < len ; k++) + { + j = Iw [p] ; + AMD_DEBUG3 ((" "ID"", j)) ; + ASSERT (j >= 0 && j < n) ; + if (k == elen-1) AMD_DEBUG3 ((" : ")) ; + p++ ; + } + AMD_DEBUG3 (("\n")) ; + } + } + else + { + e = i ; + if (w == 0) + { + AMD_DEBUG3 (("\nE "ID": absorbed element: w "ID"\n", e, w)) ; + ASSERT (nv > 0 && pe < 0) ; + AMD_DEBUG3 ((" e "ID" -> parent "ID"\n", e, FLIP (Pe [e]))) ; + } + else + { + AMD_DEBUG3 (("\nE "ID": unabsorbed element: w "ID"\n", e, w)) ; + ASSERT (nv > 0 && pe >= 0) ; + p = pe ; + AMD_DEBUG3 ((" : ")) ; + ASSERT (pe < pfree) ; + for (k = 0 ; k < len ; k++) + { + j = Iw [p] ; + AMD_DEBUG3 ((" "ID"", j)) ; + ASSERT (j >= 0 && j < n) ; + p++ ; + } + AMD_DEBUG3 (("\n")) ; + } + } + } + + /* this routine cannot be called when the hash buckets are non-empty */ + AMD_DEBUG3 (("\nDegree lists:\n")) ; + if (nel >= 0) + { + cnt = 0 ; + for (deg = 0 ; deg < n ; deg++) + { + if (Head [deg] == EMPTY) continue ; + ilast = EMPTY ; + AMD_DEBUG3 ((ID": ", deg)) ; + for (i = Head [deg] ; i != EMPTY ; i = Next [i]) + { + AMD_DEBUG3 ((" "ID" : next "ID" last "ID" deg "ID"\n", + i, Next [i], Last [i], Degree [i])) ; + ASSERT (i >= 0 && i < n && ilast == Last [i] && + deg == Degree [i]) ; + cnt += Nv [i] ; + ilast = i ; + } + AMD_DEBUG3 (("\n")) ; + } + ASSERT (cnt == n - nel) ; + } + +} + +#endif diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Source/amd_info.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Source/amd_info.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,115 @@ +/* ========================================================================= */ +/* === AMD_info ============================================================ */ +/* ========================================================================= */ + +/* ------------------------------------------------------------------------- */ +/* AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis, */ +/* Patrick R. Amestoy, and Iain S. Duff. See ../README for License. */ +/* email: davis@cise.ufl.edu CISE Department, Univ. of Florida. */ +/* web: http://www.cise.ufl.edu/research/sparse/amd */ +/* ------------------------------------------------------------------------- */ + +/* User-callable. Prints the output statistics for AMD. See amd.h + * for details. If the Info array is not present, nothing is printed. + */ + +#include "amd_internal.h" + +#define PRI(format,x) { if (x >= 0) { PRINTF ((format, x)) ; }} + +GLOBAL void AMD_info +( + double Info [ ] +) +{ + double n, ndiv, nmultsubs_ldl, nmultsubs_lu, lnz, lnzd ; + + if (!Info) + { + return ; + } + + n = Info [AMD_N] ; + ndiv = Info [AMD_NDIV] ; + nmultsubs_ldl = Info [AMD_NMULTSUBS_LDL] ; + nmultsubs_lu = Info [AMD_NMULTSUBS_LU] ; + lnz = Info [AMD_LNZ] ; + lnzd = (n >= 0 && lnz >= 0) ? (n + lnz) : (-1) ; + + /* AMD return status */ + PRINTF (( + "\namd: approximate minimum degree ordering, results:\n" + " status: ")) ; + if (Info [AMD_STATUS] == AMD_OK) + { + PRINTF (("OK\n")) ; + } + else if (Info [AMD_STATUS] == AMD_OUT_OF_MEMORY) + { + PRINTF (("out of memory\n")) ; + } + else if (Info [AMD_STATUS] == AMD_INVALID) + { + PRINTF (("invalid matrix\n")) ; + } + else + { + PRINTF (("unknown\n")) ; + } + + /* statistics about the input matrix */ + PRI (" n, dimension of A: %.20g\n", n); + PRI (" nz, number of nonzeros in A: %.20g\n", + Info [AMD_NZ]) ; + PRI (" symmetry of A: %.4f\n", + Info [AMD_SYMMETRY]) ; + PRI (" number of nonzeros on diagonal: %.20g\n", + Info [AMD_NZDIAG]) ; + PRI (" nonzeros in pattern of A+A' (excl. diagonal): %.20g\n", + Info [AMD_NZ_A_PLUS_AT]) ; + PRI (" # dense rows/columns of A+A': %.20g\n", + Info [AMD_NDENSE]) ; + + /* statistics about AMD's behavior */ + PRI (" memory used, in bytes: %.20g\n", + Info [AMD_MEMORY]) ; + PRI (" # of memory compactions: %.20g\n", + Info [AMD_NCMPA]) ; + + /* statistics about the ordering quality */ + PRINTF (("\n" + " The following approximate statistics are for a subsequent\n" + " factorization of A(P,P) + A(P,P)'. They are slight upper\n" + " bounds if there are no dense rows/columns in A+A', and become\n" + " looser if dense rows/columns exist.\n\n")) ; + + PRI (" nonzeros in L (excluding diagonal): %.20g\n", + lnz) ; + PRI (" nonzeros in L (including diagonal): %.20g\n", + lnzd) ; + PRI (" # divide operations for LDL' or LU: %.20g\n", + ndiv) ; + PRI (" # multiply-subtract operations for LDL': %.20g\n", + nmultsubs_ldl) ; + PRI (" # multiply-subtract operations for LU: %.20g\n", + nmultsubs_lu) ; + PRI (" max nz. in any column of L (incl. diagonal): %.20g\n", + Info [AMD_DMAX]) ; + + /* total flop counts for various factorizations */ + + if (n >= 0 && ndiv >= 0 && nmultsubs_ldl >= 0 && nmultsubs_lu >= 0) + { + PRINTF (("\n" + " chol flop count for real A, sqrt counted as 1 flop: %.20g\n" + " LDL' flop count for real A: %.20g\n" + " LDL' flop count for complex A: %.20g\n" + " LU flop count for real A (with no pivoting): %.20g\n" + " LU flop count for complex A (with no pivoting): %.20g\n\n", + n + ndiv + 2*nmultsubs_ldl, + ndiv + 2*nmultsubs_ldl, + 9*ndiv + 8*nmultsubs_ldl, + ndiv + 2*nmultsubs_lu, + 9*ndiv + 8*nmultsubs_lu)) ; + } +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Source/amd_internal.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Source/amd_internal.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,426 @@ +/* ========================================================================= */ +/* === amd_internal.h ====================================================== */ +/* ========================================================================= */ + +/* ------------------------------------------------------------------------- */ +/* AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis, */ +/* Patrick R. Amestoy, and Iain S. Duff. See ../README for License. */ +/* email: davis@cise.ufl.edu CISE Department, Univ. of Florida. */ +/* web: http://www.cise.ufl.edu/research/sparse/amd */ +/* ------------------------------------------------------------------------- */ + +/* This file is for internal use in AMD itself, and does not normally need to + * be included in user code. Use amd.h instead. + * + * The following compile-time definitions affect how AMD is compiled. + * + * -DMATLAB_MEX_FILE + * + * This flag is turned on when compiling the amd mexFunction for + * use in MATLAB. + * + * -DMATHWORKS + * + * This flag is turned on when compiling amd as a built-in routine + * in MATLAB. Internal routines utMalloc, utFree, utRealloc, and + * utPrintf are used, and the MathWorks "util.h" file is included. + * This option is intended for use by The MathWorks, Inc., only. + * + * -DNDEBUG + * + * Debugging mode (if NDEBUG is not defined). The default, of course, + * is no debugging. Turning on debugging takes some work (see below). + * If you do not edit this file, then debugging is turned off anyway, + * regardless of whether or not -DNDEBUG is specified in your compiler + * options. + * + * -DALLOCATE=allocation_routine + * -DFREE=free_routine + * + * If you do not wish to use malloc or free, you can define the + * routines to be used here. You must specify both of them, or + * neither. + * + * -DPRINTF=printf_routine + * + * If you wish to use a routine other than printf, you can define it + * with -DPRINTF= followed by the name of the printf replacement. + */ + +/* ========================================================================= */ +/* === NDEBUG ============================================================== */ +/* ========================================================================= */ + +/* + 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: malloc, free, realloc (when not compiling for MATLAB) */ +#include + +/* from stdio.h: printf. When in debug mode: fopen, fscanf */ +#include + +/* 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 MATHWORKS +#include "util.h" +#endif + +#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 + +/* ------------------------------------------------------------------------- */ +/* integer type for AMD: int or long */ +/* ------------------------------------------------------------------------- */ + +#if defined (DLONG) || defined (ZLONG) + +#define Int long +#define ID "%ld" +#define Int_MAX LONG_MAX +#define Int_MIN LONG_MIN + +#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_wpreprocess amd_l_wpreprocess +#define AMD_preprocess amd_l_preprocess +#define AMD_preprocess_valid amd_l_preprocess_valid + +#else + +#define Int int +#define ID "%d" +#define Int_MAX INT_MAX +#define Int_MIN INT_MIN + +#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_wpreprocess amd_wpreprocess +#define AMD_preprocess amd_preprocess +#define AMD_preprocess_valid amd_preprocess_valid + +#endif + +/* ========================================================================= */ +/* === Memory allocator ==================================================== */ +/* ========================================================================= */ + +/* The MATLAB mexFunction uses MATLAB's memory manager, while the C-callable */ +/* AMD routine uses the ANSI C malloc, free, and realloc routines. */ + +#ifndef ALLOCATE +#ifdef MATLAB_MEX_FILE +#define ALLOCATE mxMalloc +#define FREE mxFree +#else +#ifdef MATHWORKS +/* Compiling as a built-in routine. Since out-of-memory conditions are checked + * after every allocation, we can use ut* routines here. */ +#define ALLOCATE utMalloc +#define FREE utFree +#else +/* use the ANSI C memory allocation routines */ +#define ALLOCATE malloc +#define FREE free +#endif +#endif +#endif + + +/* ========================================================================= */ +/* === PRINTF macro ======================================================== */ +/* ========================================================================= */ + +/* All output goes through the PRINTF macro. */ + +#ifndef PRINTF +#ifdef MATLAB_MEX_FILE +#define PRINTF(params) { (void) mexPrintf params ; } +#else +#ifdef MATHWORKS +#define PRINTF(params) { (void) utPrintf params ; } +#else +#define PRINTF(params) { (void) printf params ; } +#endif +#endif +#endif + +/* ------------------------------------------------------------------------- */ +/* AMD routine definitions (user-callable) */ +/* ------------------------------------------------------------------------- */ + +#include "amd.h" + +/* ------------------------------------------------------------------------- */ +/* AMD routine definitions (not user-callable) */ +/* ------------------------------------------------------------------------- */ + +GLOBAL Int AMD_valid +( + Int n_row, + Int n_col, + const Int Ap [ ], + const Int Ai [ ] +) ; + +GLOBAL Int 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_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 [ ] +) ; + +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_wpreprocess +( + Int n, + const Int Ap [ ], + const Int Ai [ ], + Int Rp [ ], + Int Ri [ ], + Int W [ ], + Int Flag [ ] +) ; + +GLOBAL Int AMD_preprocess_valid +( + Int n, + const Int Ap [ ], + const Int Ai [ ] +) ; + +/* ------------------------------------------------------------------------- */ +/* debugging definitions */ +/* ------------------------------------------------------------------------- */ + +/* from assert.h: assert macro */ +#if !defined (MATHWORKS) && !defined (MATLAB_MEX_FILE) +#include +#endif + +#ifndef NDEBUG + +GLOBAL 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 + +#ifdef MATLAB_MEX_FILE +#define ASSERT(expression) (mxAssert ((expression), "")) +#else +#ifdef MATHWORKS +#define ASSERT(expression) (utAssert (expression)) +#else +#define ASSERT(expression) (assert (expression)) +#endif +#endif /* MATLAB_MEX_FILE */ + +#define AMD_DEBUG0(params) { PRINTF (params) ; } +#define AMD_DEBUG1(params) { if (AMD_debug >= 1) PRINTF (params) ; } +#define AMD_DEBUG2(params) { if (AMD_debug >= 2) PRINTF (params) ; } +#define AMD_DEBUG3(params) { if (AMD_debug >= 3) PRINTF (params) ; } +#define AMD_DEBUG4(params) { if (AMD_debug >= 4) PRINTF (params) ; } + +#else + +#define AMD_DEBUG0(params) +#define AMD_DEBUG1(params) +#define AMD_DEBUG2(params) +#define AMD_DEBUG3(params) +#define AMD_DEBUG4(params) + +#define ASSERT(expression) + +#endif diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Source/amd_order.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Source/amd_order.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,139 @@ +/* ========================================================================= */ +/* === AMD_order =========================================================== */ +/* ========================================================================= */ + +/* ------------------------------------------------------------------------- */ +/* AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis, */ +/* Patrick R. Amestoy, and Iain S. Duff. See ../README for License. */ +/* email: davis@cise.ufl.edu CISE Department, Univ. of Florida. */ +/* web: http://www.cise.ufl.edu/research/sparse/amd */ +/* ------------------------------------------------------------------------- */ + +/* User-callable AMD minimum degree ordering routine. See amd.h for + * documentation. + */ + +#include "amd_internal.h" + +GLOBAL Int AMD_order +( + Int n, + const Int Ap [ ], + const Int Ai [ ], + Int P [ ], + double Control [ ], + double Info [ ] +) +{ + Int slen, *Len, *S, nz, nzaat, i, *Pinv, info ; + +#ifndef NDEBUG + AMD_debug_init ("amd") ; +#endif + + /* clear the Info array, if it exists */ + info = Info != (double *) NULL ; + if (info) + { + for (i = 0 ; i < AMD_INFO ; i++) + { + Info [i] = EMPTY ; + } + Info [AMD_N] = n ; + Info [AMD_STATUS] = AMD_OK ; + } + + /* make sure inputs exist and n is >= 0 */ + if (Ai == (Int *) NULL || Ap == (Int *) NULL || P == (Int *) NULL || n < 0) + { + if (info) Info [AMD_STATUS] = AMD_INVALID ; + return (AMD_INVALID) ; /* arguments are invalid */ + } + + if (n == 0) + { + return (AMD_OK) ; /* n is 0 so there's nothing to do */ + } + + nz = Ap [n] ; + if (info) + { + Info [AMD_NZ] = nz ; + } + if (nz < 0) + { + if (info) Info [AMD_STATUS] = AMD_INVALID ; + return (AMD_INVALID) ; + } + + /* Avoid integer overflow in memory size calculations. The space required + * by AMD is at most 2.4nz + 8n for S, and n for Len. + * Note nz - n <= nzaat <= 2*nz, below. */ + if ((2.4 * (double) nz + 8 * (double) n) > (double) Int_MAX / sizeof (Int)) + { + /* :: int overflow :: */ + if (info) Info [AMD_STATUS] = AMD_OUT_OF_MEMORY ; + return (AMD_OUT_OF_MEMORY) ; + } + + if (!AMD_valid (n, n, Ap, Ai)) + { + if (info) Info [AMD_STATUS] = AMD_INVALID ; + return (AMD_INVALID) ; /* matrix is invalid */ + } + + /* --------------------------------------------------------------------- */ + /* determine the symmetry and count off-diagonal nonzeros in A+A' */ + /* --------------------------------------------------------------------- */ + + /* allocate size-n integer workspace */ + Len = (Int *) ALLOCATE (n * sizeof (Int)) ; + if (!Len) + { + /* :: out of memory :: */ + if (info) Info [AMD_STATUS] = AMD_OUT_OF_MEMORY ; + return (AMD_OUT_OF_MEMORY) ; + } + nzaat = AMD_aat (n, Ap, Ai, Len, P, Info) ; + AMD_DEBUG1 (("nzaat: "ID"\n", nzaat)) ; + ASSERT (nz-n <= nzaat && nzaat <= 2*nz) ; + + /* --------------------------------------------------------------------- */ + /* allocate workspace for matrix, elbow room, and 7 size-n vectors */ + /* --------------------------------------------------------------------- */ + + slen = (nzaat + nzaat/5 + n) + 7*n ; + if (info) + { + /* memory usage (Len and S), in bytes. */ + Info [AMD_MEMORY] = ((double) slen + n) * sizeof (Int) ; + } + S = (Int *) ALLOCATE (slen * sizeof (Int)) ; + AMD_DEBUG1 ((" S "ID" Len "ID" n "ID" nzaat "ID" slen "ID"\n", + (Int) S, (Int) Len, n, nzaat, slen)) ; + if (S == (Int *) NULL) + { + /* :: out of memory :: */ + FREE (Len) ; + if (Info != (double *) NULL) Info [AMD_STATUS] = AMD_OUT_OF_MEMORY ; + return (AMD_OUT_OF_MEMORY) ; + } + + /* allocate space from S for Pinv */ + Pinv = S + slen - n ; + slen -= n ; + + /* --------------------------------------------------------------------- */ + /* order the matrix */ + /* --------------------------------------------------------------------- */ + + AMD_1 (n, Ap, Ai, P, Pinv, Len, slen, S, Control, Info) ; + + /* --------------------------------------------------------------------- */ + /* free the workspace */ + /* --------------------------------------------------------------------- */ + + FREE (Len) ; + FREE (S) ; + return (AMD_OK) ; /* successful ordering */ +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Source/amd_post_tree.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Source/amd_post_tree.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,121 @@ +/* ========================================================================= */ +/* === AMD_post_tree ======================================================= */ +/* ========================================================================= */ + +/* ------------------------------------------------------------------------- */ +/* AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis, */ +/* Patrick R. Amestoy, and Iain S. Duff. See ../README for License. */ +/* email: davis@cise.ufl.edu CISE Department, Univ. of Florida. */ +/* web: http://www.cise.ufl.edu/research/sparse/amd */ +/* ------------------------------------------------------------------------- */ + +/* Post-ordering of a supernodal elimination tree. */ + +#include "amd_internal.h" + +GLOBAL Int AMD_post_tree +( + Int root, /* root of the tree */ + Int k, /* start numbering at k */ + Int Child [ ], /* input argument of size nn, undefined on + * output. Child [i] is the head of a link + * list of all nodes that are children of node + * i in the tree. */ + const Int Sibling [ ], /* input argument of size nn, not modified. + * If f is a node in the link list of the + * children of node i, then Sibling [f] is the + * next child of node i. + */ + Int Order [ ], /* output order, of size nn. Order [i] = k + * if node i is the kth node of the reordered + * tree. */ + Int Stack [ ] /* workspace of size nn */ +#ifndef NDEBUG + , Int nn /* nodes are in the range 0..nn-1. */ +#endif +) +{ + Int f, head, h, i ; + +#if 0 + /* --------------------------------------------------------------------- */ + /* recursive version (Stack [ ] is not used): */ + /* --------------------------------------------------------------------- */ + + /* this is simple, but can caouse stack overflow if nn is large */ + i = root ; + for (f = Child [i] ; f != EMPTY ; f = Sibling [f]) + { + k = AMD_post_tree (f, k, Child, Sibling, Order, Stack, nn) ; + } + Order [i] = k++ ; + return (k) ; +#endif + + /* --------------------------------------------------------------------- */ + /* non-recursive version, using an explicit stack */ + /* --------------------------------------------------------------------- */ + + /* push root on the stack */ + head = 0 ; + Stack [0] = root ; + + while (head >= 0) + { + /* get head of stack */ + ASSERT (head < nn) ; + i = Stack [head] ; + AMD_DEBUG1 (("head of stack "ID" \n", i)) ; + ASSERT (i >= 0 && i < nn) ; + + if (Child [i] != EMPTY) + { + /* the children of i are not yet ordered */ + /* push each child onto the stack in reverse order */ + /* so that small ones at the head of the list get popped first */ + /* and the biggest one at the end of the list gets popped last */ + for (f = Child [i] ; f != EMPTY ; f = Sibling [f]) + { + head++ ; + ASSERT (head < nn) ; + ASSERT (f >= 0 && f < nn) ; + } + h = head ; + ASSERT (head < nn) ; + for (f = Child [i] ; f != EMPTY ; f = Sibling [f]) + { + ASSERT (h > 0) ; + Stack [h--] = f ; + AMD_DEBUG1 (("push "ID" on stack\n", f)) ; + ASSERT (f >= 0 && f < nn) ; + } + ASSERT (Stack [h] == i) ; + + /* delete child list so that i gets ordered next time we see it */ + Child [i] = EMPTY ; + } + else + { + /* the children of i (if there were any) are already ordered */ + /* remove i from the stack and order it. Front i is kth front */ + head-- ; + AMD_DEBUG1 (("pop "ID" order "ID"\n", i, k)) ; + Order [i] = k++ ; + ASSERT (k <= nn) ; + } + +#ifndef NDEBUG + AMD_DEBUG1 (("\nStack:")) ; + for (h = head ; h >= 0 ; h--) + { + Int j = Stack [h] ; + AMD_DEBUG1 ((" "ID, j)) ; + ASSERT (j >= 0 && j < nn) ; + } + AMD_DEBUG1 (("\n\n")) ; + ASSERT (head < nn) ; +#endif + + } + return (k) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Source/amd_postorder.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Source/amd_postorder.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,207 @@ +/* ========================================================================= */ +/* === AMD_postorder ======================================================= */ +/* ========================================================================= */ + +/* ------------------------------------------------------------------------- */ +/* AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis, */ +/* Patrick R. Amestoy, and Iain S. Duff. See ../README for License. */ +/* email: davis@cise.ufl.edu CISE Department, Univ. of Florida. */ +/* web: http://www.cise.ufl.edu/research/sparse/amd */ +/* ------------------------------------------------------------------------- */ + +/* Perform a postordering (via depth-first search) of an assembly tree. */ + +#include "amd_internal.h" + +GLOBAL void AMD_postorder +( + /* inputs, not modified on output: */ + Int nn, /* nodes are in the range 0..nn-1 */ + Int Parent [ ], /* Parent [j] is the parent of j, or EMPTY if root */ + Int Nv [ ], /* Nv [j] > 0 number of pivots represented by node j, + * or zero if j is not a node. */ + Int Fsize [ ], /* Fsize [j]: size of node j */ + + /* output, not defined on input: */ + Int Order [ ], /* output post-order */ + + /* workspaces of size nn: */ + Int Child [ ], + Int Sibling [ ], + Int Stack [ ] +) +{ + Int i, j, k, parent, frsize, f, fprev, maxfrsize, bigfprev, bigf, fnext ; + + for (j = 0 ; j < nn ; j++) + { + Child [j] = EMPTY ; + Sibling [j] = EMPTY ; + } + + /* --------------------------------------------------------------------- */ + /* place the children in link lists - bigger elements tend to be last */ + /* --------------------------------------------------------------------- */ + + for (j = nn-1 ; j >= 0 ; j--) + { + if (Nv [j] > 0) + { + /* this is an element */ + parent = Parent [j] ; + if (parent != EMPTY) + { + /* place the element in link list of the children its parent */ + /* bigger elements will tend to be at the end of the list */ + Sibling [j] = Child [parent] ; + Child [parent] = j ; + } + } + } + +#ifndef NDEBUG + { + Int nels, ff, nchild ; + AMD_DEBUG1 (("\n\n================================ AMD_postorder:\n")); + nels = 0 ; + for (j = 0 ; j < nn ; j++) + { + if (Nv [j] > 0) + { + AMD_DEBUG1 (( ""ID" : nels "ID" npiv "ID" size "ID + " parent "ID" maxfr "ID"\n", j, nels, + Nv [j], Fsize [j], Parent [j], Fsize [j])) ; + /* this is an element */ + /* dump the link list of children */ + nchild = 0 ; + AMD_DEBUG1 ((" Children: ")) ; + for (ff = Child [j] ; ff != EMPTY ; ff = Sibling [ff]) + { + AMD_DEBUG1 ((ID" ", ff)) ; + ASSERT (Parent [ff] == j) ; + nchild++ ; + ASSERT (nchild < nn) ; + } + AMD_DEBUG1 (("\n")) ; + parent = Parent [j] ; + if (parent != EMPTY) + { + ASSERT (Nv [parent] > 0) ; + } + nels++ ; + } + } + } + AMD_DEBUG1 (("\n\nGo through the children of each node, and put\n" + "the biggest child last in each list:\n")) ; +#endif + + /* --------------------------------------------------------------------- */ + /* place the largest child last in the list of children for each node */ + /* --------------------------------------------------------------------- */ + + for (i = 0 ; i < nn ; i++) + { + if (Nv [i] > 0 && Child [i] != EMPTY) + { + +#ifndef NDEBUG + Int nchild ; + AMD_DEBUG1 (("Before partial sort, element "ID"\n", i)) ; + nchild = 0 ; + for (f = Child [i] ; f != EMPTY ; f = Sibling [f]) + { + ASSERT (f >= 0 && f < nn) ; + AMD_DEBUG1 ((" f: "ID" size: "ID"\n", f, Fsize [f])) ; + nchild++ ; + ASSERT (nchild <= nn) ; + } +#endif + + /* find the biggest element in the child list */ + fprev = EMPTY ; + maxfrsize = EMPTY ; + bigfprev = EMPTY ; + bigf = EMPTY ; + for (f = Child [i] ; f != EMPTY ; f = Sibling [f]) + { + ASSERT (f >= 0 && f < nn) ; + frsize = Fsize [f] ; + if (frsize >= maxfrsize) + { + /* this is the biggest seen so far */ + maxfrsize = frsize ; + bigfprev = fprev ; + bigf = f ; + } + fprev = f ; + } + ASSERT (bigf != EMPTY) ; + + fnext = Sibling [bigf] ; + + AMD_DEBUG1 (("bigf "ID" maxfrsize "ID" bigfprev "ID" fnext "ID + " fprev " ID"\n", bigf, maxfrsize, bigfprev, fnext, fprev)) ; + + if (fnext != EMPTY) + { + /* if fnext is EMPTY then bigf is already at the end of list */ + + if (bigfprev == EMPTY) + { + /* delete bigf from the element of the list */ + Child [i] = fnext ; + } + else + { + /* delete bigf from the middle of the list */ + Sibling [bigfprev] = fnext ; + } + + /* put bigf at the end of the list */ + Sibling [bigf] = EMPTY ; + ASSERT (Child [i] != EMPTY) ; + ASSERT (fprev != bigf) ; + ASSERT (fprev != EMPTY) ; + Sibling [fprev] = bigf ; + } + +#ifndef NDEBUG + AMD_DEBUG1 (("After partial sort, element "ID"\n", i)) ; + for (f = Child [i] ; f != EMPTY ; f = Sibling [f]) + { + ASSERT (f >= 0 && f < nn) ; + AMD_DEBUG1 ((" "ID" "ID"\n", f, Fsize [f])) ; + ASSERT (Nv [f] > 0) ; + nchild-- ; + } + ASSERT (nchild == 0) ; +#endif + + } + } + + /* --------------------------------------------------------------------- */ + /* postorder the assembly tree */ + /* --------------------------------------------------------------------- */ + + for (i = 0 ; i < nn ; i++) + { + Order [i] = EMPTY ; + } + + k = 0 ; + + for (i = 0 ; i < nn ; i++) + { + if (Parent [i] == EMPTY && Nv [i] > 0) + { + AMD_DEBUG1 (("Root of assembly tree "ID"\n", i)) ; + k = AMD_post_tree (i, k, Child, Sibling, Order, Stack +#ifndef NDEBUG + , nn +#endif + ) ; + } + } +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Source/amd_preprocess.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Source/amd_preprocess.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,225 @@ +/* ========================================================================= */ +/* === AMD_preprocess ====================================================== */ +/* ========================================================================= */ + +/* ------------------------------------------------------------------------- */ +/* AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis, */ +/* Patrick R. Amestoy, and Iain S. Duff. See ../README for License. */ +/* email: davis@cise.ufl.edu CISE Department, Univ. of Florida. */ +/* web: http://www.cise.ufl.edu/research/sparse/amd */ +/* ------------------------------------------------------------------------- */ + +/* Sorts, removes duplicate entries, and transposes from the nonzero pattern of + * a column-form matrix A, to obtain the matrix R. + * See amd.h for a complete description of AMD_preprocess + */ + +#include "amd_internal.h" + +GLOBAL Int AMD_preprocess /* returns AMD_OK if input is OK, AMD_INVALID + * if the matrix is invalid, or AMD_OUT_OF_MEMORY + * if out of memory for the 2n workspace. */ +( + Int n, /* input matrix: A is n-by-n */ + const Int Ap [ ], /* size n+1 */ + const Int Ai [ ], /* size nz = Ap [n] */ + + /* output matrix R: */ + Int Rp [ ], /* size n+1 */ + Int Ri [ ] /* size nz (or less, if duplicates present) */ +) +{ + /* --------------------------------------------------------------------- */ + /* local variables */ + /* --------------------------------------------------------------------- */ + + Int *Flag, *W ; + + /* --------------------------------------------------------------------- */ + /* check inputs (note: fewer restrictions than AMD_order) */ + /* --------------------------------------------------------------------- */ + + if (!AMD_preprocess_valid (n, Ap, Ai) || !Ri || !Rp) + { + return (AMD_INVALID) ; + } + + /* --------------------------------------------------------------------- */ + /* allocate workspace */ + /* --------------------------------------------------------------------- */ + + W = (Int *) ALLOCATE (MAX (n,1) * sizeof (Int)) ; + if (!W) + { + return (AMD_OUT_OF_MEMORY) ; + } + Flag = (Int *) ALLOCATE (MAX (n,1) * sizeof (Int)) ; + if (!Flag) + { + FREE (W) ; + return (AMD_OUT_OF_MEMORY) ; + } + + /* --------------------------------------------------------------------- */ + /* preprocess the matrix: sort, remove duplicates, and transpose */ + /* --------------------------------------------------------------------- */ + + AMD_wpreprocess (n, Ap, Ai, Rp, Ri, W, Flag) ; + + /* --------------------------------------------------------------------- */ + /* free the workspace */ + /* --------------------------------------------------------------------- */ + + FREE (W) ; + FREE (Flag) ; + return (AMD_OK) ; +} + + +/* ========================================================================= */ +/* === AMD_wpreprocess ===================================================== */ +/* ========================================================================= */ + +/* The AMD_wpreprocess routine is not user-callable. It does not check its + * input for errors or allocate workspace (that is done by the user-callable + * AMD_preprocess routine). It does handle the n=0 case. */ + +GLOBAL void AMD_wpreprocess +( + Int n, /* input matrix: A is n-by-n */ + const Int Ap [ ], /* size n+1 */ + const Int Ai [ ], /* size nz = Ap [n] */ + + /* output matrix R: */ + Int Rp [ ], /* size n+1 */ + Int Ri [ ], /* size nz (or less, if duplicates present) */ + + Int W [ ], /* workspace of size n */ + Int Flag [ ] /* workspace of size n */ +) +{ + + /* --------------------------------------------------------------------- */ + /* local variables */ + /* --------------------------------------------------------------------- */ + + Int i, j, p, p2 ; + + /* --------------------------------------------------------------------- */ + /* count the entries in each row of A (excluding duplicates) */ + /* --------------------------------------------------------------------- */ + + for (i = 0 ; i < n ; i++) + { + W [i] = 0 ; /* # of nonzeros in row i (excl duplicates) */ + Flag [i] = EMPTY ; /* Flag [i] = j if i appears in column j */ + } + for (j = 0 ; j < n ; j++) + { + p2 = Ap [j+1] ; + for (p = Ap [j] ; p < p2 ; p++) + { + i = Ai [p] ; + if (Flag [i] != j) + { + /* row index i has not yet appeared in column j */ + W [i]++ ; /* one more entry in row i */ + Flag [i] = j ; /* flag row index i as appearing in col j*/ + } + } + } + + /* --------------------------------------------------------------------- */ + /* compute the row pointers for R */ + /* --------------------------------------------------------------------- */ + + Rp [0] = 0 ; + for (i = 0 ; i < n ; i++) + { + Rp [i+1] = Rp [i] + W [i] ; + } + for (i = 0 ; i < n ; i++) + { + W [i] = Rp [i] ; + Flag [i] = EMPTY ; + } + + /* --------------------------------------------------------------------- */ + /* construct the row form matrix R */ + /* --------------------------------------------------------------------- */ + + /* R = row form of pattern of A */ + for (j = 0 ; j < n ; j++) + { + p2 = Ap [j+1] ; + for (p = Ap [j] ; p < p2 ; p++) + { + i = Ai [p] ; + if (Flag [i] != j) + { + /* row index i has not yet appeared in column j */ + Ri [W [i]++] = j ; /* put col j in row i */ + Flag [i] = j ; /* flag row index i as appearing in col j*/ + } + } + } + +#ifndef NDEBUG + for (j = 0 ; j < n ; j++) + { + ASSERT (W [j] == Rp [j+1]) ; + } + ASSERT (AMD_valid (n, n, Rp, Ri)) ; +#endif +} + + +/* ========================================================================= */ +/* === AMD_preprocess_valid ================================================ */ +/* ========================================================================= */ + +/* Not user-callable. Checks a matrix and returns TRUE if it is valid as input + * to AMD_wpreprocess, FALSE otherwise. */ + +GLOBAL Int AMD_preprocess_valid +( + Int n, + const Int Ap [ ], + const Int Ai [ ] +) +{ + Int i, j, p, nz ; + + if (n < 0 || !Ai || !Ap) + { + return (FALSE) ; + } + nz = Ap [n] ; + if (Ap [0] != 0 || nz < 0) + { + /* column pointers must start at Ap [0] = 0, and Ap [n] must be >= 0 */ + AMD_DEBUG0 (("column 0 pointer bad or nz < 0\n")) ; + return (FALSE) ; + } + for (j = 0 ; j < n ; j++) + { + if (Ap [j] > Ap [j+1]) + { + /* column pointers must be ascending */ + AMD_DEBUG0 (("column "ID" pointer bad\n", j)) ; + return (FALSE) ; + } + } + for (p = 0 ; p < nz ; p++) + { + i = Ai [p] ; + AMD_DEBUG3 (("row: "ID"\n", i)) ; + if (i < 0 || i >= n) + { + /* row index out of range */ + AMD_DEBUG0 (("index out of range, col "ID" row "ID"\n", j, i)) ; + return (FALSE) ; + } + } + return (TRUE) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Source/amd_valid.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Source/amd_valid.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,78 @@ +/* ========================================================================= */ +/* === AMD_valid =========================================================== */ +/* ========================================================================= */ + +/* ------------------------------------------------------------------------- */ +/* AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis, */ +/* Patrick R. Amestoy, and Iain S. Duff. See ../README for License. */ +/* email: davis@cise.ufl.edu CISE Department, Univ. of Florida. */ +/* web: http://www.cise.ufl.edu/research/sparse/amd */ +/* ------------------------------------------------------------------------- */ + +/* Check if a column-form matrix is valid or not. The matrix A is + * n_row-by-n_col. The row indices of entries in column j are in + * Ai [Ap [j] ... Ap [j+1]-1]. Required conditions are: + * + * n_row >= 0 + * n_col >= 0 + * nz = Ap [n_col] >= 0 number of entries in the matrix + * Ap [0] == 0 + * Ap [j] <= Ap [j+1] for all j in the range 0 to n_col. + * row indices in Ai [Ap [j] ... Ap [j+1]-1] must be sorted in ascending + * order, must be in the range 0 to n_row-1, and no duplicate entries + * can exist. + * + * Not user-callable. + */ + +#include "amd_internal.h" + +GLOBAL Int AMD_valid +( + /* inputs, not modified on output: */ + Int n_row, /* A is n_row-by-n_col */ + Int n_col, + const Int Ap [ ], /* column pointers of A, of size n_col+1 */ + const Int Ai [ ] /* row indices of A, of size nz = Ap [n_col] */ +) +{ + Int nz, j, p1, p2, ilast, i, p ; + if (n_row < 0 || n_col < 0) + { + AMD_DEBUG0 (("n must be >= 0: "ID" "ID"\n", n_row, n_col)) ; + return (FALSE) ; + } + nz = Ap [n_col] ; + if (Ap [0] != 0 || nz < 0) + { + /* column pointers must start at Ap [0] = 0, and Ap [n] must be >= 0 */ + AMD_DEBUG0 (("column 0 pointer bad or nz < 0\n")) ; + return (FALSE) ; + } + for (j = 0 ; j < n_col ; j++) + { + p1 = Ap [j] ; + p2 = Ap [j+1] ; + AMD_DEBUG2 (("\nColumn: "ID" p1: "ID" p2: "ID"\n", j, p1, p2)) ; + if (p1 > p2) + { + /* column pointers must be ascending */ + AMD_DEBUG0 (("column "ID" pointer bad\n", j)) ; + return (FALSE) ; + } + ilast = EMPTY ; + for (p = p1 ; p < p2 ; p++) + { + i = Ai [p] ; + AMD_DEBUG3 (("row: "ID"\n", i)) ; + if (i <= ilast || i >= n_row) + { + /* row index out of range, or unsorted */ + AMD_DEBUG0 (("index out of range, col "ID" row "ID"\n", j, i)); + return (FALSE) ; + } + ilast = i ; + } + } + return (TRUE) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/AMD/Source/amdbar.f --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/AMD/Source/amdbar.f Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,1206 @@ +C----------------------------------------------------------------------- +C AMDBAR: approximate minimum degree, without aggressive absorption +C----------------------------------------------------------------------- + + SUBROUTINE AMDBAR + $ (N, PE, IW, LEN, IWLEN, PFREE, NV, NEXT, + $ LAST, HEAD, ELEN, DEGREE, NCMPA, W) + + 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) + +C Given a representation of the nonzero pattern of a symmetric matrix, +C A, (excluding the diagonal) perform an approximate minimum +C (UMFPACK/MA38-style) degree ordering to compute a pivot order +C such that the introduction of nonzeros (fill-in) in the Cholesky +C factors A = LL^T are kept low. At each step, the pivot +C selected is the one with the minimum UMFPACK/MA38-style +C upper-bound on the external degree. +C +C This routine does not do aggresive absorption (as done by AMD). + +C ********************************************************************** +C ***** CAUTION: ARGUMENTS ARE NOT CHECKED FOR ERRORS ON INPUT. ****** +C ********************************************************************** + +C References: +C +C [1] Timothy A. Davis and Iain Duff, "An unsymmetric-pattern +C multifrontal method for sparse LU factorization", SIAM J. +C Matrix Analysis and Applications, vol. 18, no. 1, pp. +C 140-158. Discusses UMFPACK / MA38, which first introduced +C the approximate minimum degree used by this routine. +C +C [2] Patrick Amestoy, Timothy A. Davis, and Iain S. Duff, "An +C approximate degree ordering algorithm," SIAM J. Matrix +C Analysis and Applications, vol. 17, no. 4, pp. 886-905, +C 1996. Discusses AMD, AMDBAR, and MC47B. +C +C [3] Alan George and Joseph Liu, "The evolution of the minimum +C degree ordering algorithm," SIAM Review, vol. 31, no. 1, +C pp. 1-19, 1989. We list below the features mentioned in +C that paper that this code includes: +C +C mass elimination: +C Yes. MA27 relied on supervariable detection for mass +C elimination. +C indistinguishable nodes: +C Yes (we call these "supervariables"). This was also in +C the MA27 code - although we modified the method of +C detecting them (the previous hash was the true degree, +C which we no longer keep track of). A supervariable is +C a set of rows with identical nonzero pattern. All +C variables in a supervariable are eliminated together. +C Each supervariable has as its numerical name that of +C one of its variables (its principal variable). +C quotient graph representation: +C Yes. We use the term "element" for the cliques formed +C during elimination. This was also in the MA27 code. +C The algorithm can operate in place, but it will work +C more efficiently if given some "elbow room." +C element absorption: +C Yes. This was also in the MA27 code. +C external degree: +C Yes. The MA27 code was based on the true degree. +C incomplete degree update and multiple elimination: +C No. This was not in MA27, either. Our method of +C degree update within MC47B/BD is element-based, not +C variable-based. It is thus not well-suited for use +C with incomplete degree update or multiple elimination. + +C----------------------------------------------------------------------- +C Authors, and Copyright (C) 1995 by: +C Timothy A. Davis, Patrick Amestoy, Iain S. Duff, & John K. Reid. +C +C Acknowledgements: +C This work (and the UMFPACK package) was supported by the +C National Science Foundation (ASC-9111263 and DMS-9223088). +C The UMFPACK/MA38 approximate degree update algorithm, the +C unsymmetric analog which forms the basis of MC47B/BD, was +C developed while Tim Davis was supported by CERFACS (Toulouse, +C France) in a post-doctoral position. +C +C Date: September, 1995 +C----------------------------------------------------------------------- + +C----------------------------------------------------------------------- +C INPUT ARGUMENTS (unaltered): +C----------------------------------------------------------------------- + +C n: The matrix order. +C +C Restriction: 1 .le. n .lt. (iovflo/2)-2, where iovflo is +C the largest positive integer that your computer can represent. + +C iwlen: The length of iw (1..iwlen). On input, the matrix is +C stored in iw (1..pfree-1). However, iw (1..iwlen) should be +C slightly larger than what is required to hold the matrix, at +C least iwlen .ge. pfree + n is recommended. Otherwise, +C excessive compressions will take place. +C *** We do not recommend running this algorithm with *** +C *** iwlen .lt. pfree + n. *** +C *** Better performance will be obtained if *** +C *** iwlen .ge. pfree + n *** +C *** or better yet *** +C *** iwlen .gt. 1.2 * pfree *** +C *** (where pfree is its value on input). *** +C The algorithm will not run at all if iwlen .lt. pfree-1. +C +C Restriction: iwlen .ge. pfree-1 + +C----------------------------------------------------------------------- +C INPUT/OUPUT ARGUMENTS: +C----------------------------------------------------------------------- + +C pe: On input, pe (i) is the index in iw of the start of row i, or +C zero if row i has no off-diagonal non-zeros. +C +C During execution, it is used for both supervariables and +C elements: +C +C * Principal supervariable i: index into iw of the +C description of supervariable i. A supervariable +C represents one or more rows of the matrix +C with identical nonzero pattern. +C * Non-principal supervariable i: if i has been absorbed +C into another supervariable j, then pe (i) = -j. +C That is, j has the same pattern as i. +C Note that j might later be absorbed into another +C supervariable j2, in which case pe (i) is still -j, +C and pe (j) = -j2. +C * Unabsorbed element e: the index into iw of the description +C of element e, if e has not yet been absorbed by a +C subsequent element. Element e is created when +C the supervariable of the same name is selected as +C the pivot. +C * Absorbed element e: if element e is absorbed into element +C e2, then pe (e) = -e2. This occurs when the pattern of +C e (that is, Le) is found to be a subset of the pattern +C of e2 (that is, Le2). If element e is "null" (it has +C no nonzeros outside its pivot block), then pe (e) = 0. +C +C On output, pe holds the assembly tree/forest, which implicitly +C represents a pivot order with identical fill-in as the actual +C order (via a depth-first search of the tree). +C +C On output: +C If nv (i) .gt. 0, then i represents a node in the assembly tree, +C and the parent of i is -pe (i), or zero if i is a root. +C If nv (i) = 0, then (i,-pe (i)) represents an edge in a +C subtree, the root of which is a node in the assembly tree. + +C pfree: On input the tail end of the array, iw (pfree..iwlen), +C is empty, and the matrix is stored in iw (1..pfree-1). +C During execution, additional data is placed in iw, and pfree +C is modified so that iw (pfree..iwlen) is always the unused part +C of iw. On output, pfree is set equal to the size of iw that +C would have been needed for no compressions to occur. If +C ncmpa is zero, then pfree (on output) is less than or equal to +C iwlen, and the space iw (pfree+1 ... iwlen) was not used. +C Otherwise, pfree (on output) is greater than iwlen, and all the +C memory in iw was used. + +C----------------------------------------------------------------------- +C INPUT/MODIFIED (undefined on output): +C----------------------------------------------------------------------- + +C len: On input, len (i) holds the number of entries in row i of the +C matrix, excluding the diagonal. The contents of len (1..n) +C are undefined on output. + +C iw: On input, iw (1..pfree-1) holds the description of each row i +C in the matrix. The matrix must be symmetric, and both upper +C and lower triangular parts must be present. The diagonal must +C not be present. Row i is held as follows: +C +C len (i): the length of the row i data structure +C iw (pe (i) ... pe (i) + len (i) - 1): +C the list of column indices for nonzeros +C in row i (simple supervariables), excluding +C the diagonal. All supervariables start with +C one row/column each (supervariable i is just +C row i). +C if len (i) is zero on input, then pe (i) is ignored +C on input. +C +C Note that the rows need not be in any particular order, +C and there may be empty space between the rows. +C +C During execution, the supervariable i experiences fill-in. +C This is represented by placing in i a list of the elements +C that cause fill-in in supervariable i: +C +C len (i): the length of supervariable i +C iw (pe (i) ... pe (i) + elen (i) - 1): +C the list of elements that contain i. This list +C is kept short by removing absorbed elements. +C iw (pe (i) + elen (i) ... pe (i) + len (i) - 1): +C the list of supervariables in i. This list +C is kept short by removing nonprincipal +C variables, and any entry j that is also +C contained in at least one of the elements +C (j in Le) in the list for i (e in row i). +C +C When supervariable i is selected as pivot, we create an +C element e of the same name (e=i): +C +C len (e): the length of element e +C iw (pe (e) ... pe (e) + len (e) - 1): +C the list of supervariables in element e. +C +C An element represents the fill-in that occurs when supervariable +C i is selected as pivot (which represents the selection of row i +C and all non-principal variables whose principal variable is i). +C We use the term Le to denote the set of all supervariables +C in element e. Absorbed supervariables and elements are pruned +C from these lists when computationally convenient. +C +C CAUTION: THE INPUT MATRIX IS OVERWRITTEN DURING COMPUTATION. +C The contents of iw are undefined on output. + +C----------------------------------------------------------------------- +C OUTPUT (need not be set on input): +C----------------------------------------------------------------------- + +C nv: During execution, abs (nv (i)) is equal to the number of rows +C that are represented by the principal supervariable i. If i is +C a nonprincipal variable, then nv (i) = 0. Initially, +C nv (i) = 1 for all i. nv (i) .lt. 0 signifies that i is a +C principal variable in the pattern Lme of the current pivot +C element me. On output, nv (e) holds the true degree of element +C e at the time it was created (including the diagonal part). + +C ncmpa: The number of times iw was compressed. If this is +C excessive, then the execution took longer than what could have +C been. To reduce ncmpa, try increasing iwlen to be 10% or 20% +C larger than the value of pfree on input (or at least +C iwlen .ge. pfree + n). The fastest performance will be +C obtained when ncmpa is returned as zero. If iwlen is set to +C the value returned by pfree on *output*, then no compressions +C will occur. + +C elen: See the description of iw above. At the start of execution, +C elen (i) is set to zero. During execution, elen (i) is the +C number of elements in the list for supervariable i. When e +C becomes an element, elen (e) = -nel is set, where nel is the +C current step of factorization. elen (i) = 0 is done when i +C becomes nonprincipal. +C +C For variables, elen (i) .ge. 0 holds until just before the +C permutation vectors are computed. For elements, +C elen (e) .lt. 0 holds. +C +C On output elen (1..n) holds the inverse permutation (the same +C as the 'INVP' argument in Sparspak). That is, if k = elen (i), +C then row i is the kth pivot row. Row i of A appears as the +C (elen(i))-th row in the permuted matrix, PAP^T. + +C last: In a degree list, last (i) is the supervariable preceding i, +C or zero if i is the head of the list. In a hash bucket, +C last (i) is the hash key for i. last (head (hash)) is also +C used as the head of a hash bucket if head (hash) contains a +C degree list (see head, below). +C +C On output, last (1..n) holds the permutation (the same as the +C 'PERM' argument in Sparspak). That is, if i = last (k), then +C row i is the kth pivot row. Row last (k) of A is the k-th row +C in the permuted matrix, PAP^T. + +C----------------------------------------------------------------------- +C LOCAL (not input or output - used only during execution): +C----------------------------------------------------------------------- + +C degree: If i is a supervariable, then degree (i) holds the +C current approximation of the external degree of row i (an upper +C bound). The external degree is the number of nonzeros in row i, +C minus abs (nv (i)) (the diagonal part). The bound is equal to +C the external degree if elen (i) is less than or equal to two. +C +C We also use the term "external degree" for elements e to refer +C to |Le \ Lme|. If e is an element, then degree (e) holds |Le|, +C which is the degree of the off-diagonal part of the element e +C (not including the diagonal part). + +C head: head is used for degree lists. head (deg) is the first +C supervariable in a degree list (all supervariables i in a +C degree list deg have the same approximate degree, namely, +C deg = degree (i)). If the list deg is empty then +C head (deg) = 0. +C +C During supervariable detection head (hash) also serves as a +C pointer to a hash bucket. +C If head (hash) .gt. 0, there is a degree list of degree hash. +C The hash bucket head pointer is last (head (hash)). +C If head (hash) = 0, then the degree list and hash bucket are +C both empty. +C If head (hash) .lt. 0, then the degree list is empty, and +C -head (hash) is the head of the hash bucket. +C After supervariable detection is complete, all hash buckets +C are empty, and the (last (head (hash)) = 0) condition is +C restored for the non-empty degree lists. + +C next: next (i) is the supervariable following i in a link list, or +C zero if i is the last in the list. Used for two kinds of +C lists: degree lists and hash buckets (a supervariable can be +C in only one kind of list at a time). + +C w: The flag array w determines the status of elements and +C variables, and the external degree of elements. +C +C for elements: +C if w (e) = 0, then the element e is absorbed +C if w (e) .ge. wflg, then w (e) - wflg is the size of +C the set |Le \ Lme|, in terms of nonzeros (the +C sum of abs (nv (i)) for each principal variable i that +C is both in the pattern of element e and NOT in the +C pattern of the current pivot element, me). +C if wflg .gt. w (e) .gt. 0, then e is not absorbed and has +C not yet been seen in the scan of the element lists in +C the computation of |Le\Lme| in loop 150 below. +C +C for variables: +C during supervariable detection, if w (j) .ne. wflg then j is +C not in the pattern of variable i +C +C The w array is initialized by setting w (i) = 1 for all i, +C and by setting wflg = 2. It is reinitialized if wflg becomes +C too large (to ensure that wflg+n does not cause integer +C overflow). + +C----------------------------------------------------------------------- +C LOCAL INTEGERS: +C----------------------------------------------------------------------- + + INTEGER DEG, DEGME, DMAX, E, ELENME, ELN, HASH, HMOD, I, + $ ILAST, INEXT, J, JLAST, JNEXT, K, KNT1, KNT2, KNT3, + $ LENJ, LN, MAXMEM, ME, MEM, MINDEG, NEL, NEWMEM, + $ NLEFT, NVI, NVJ, NVPIV, SLENME, WE, WFLG, WNVI, X + +C deg: the degree of a variable or element +C degme: size, |Lme|, of the current element, me (= degree (me)) +C dext: external degree, |Le \ Lme|, of some element e +C dmax: largest |Le| seen so far +C e: an element +C elenme: the length, elen (me), of element list of pivotal var. +C eln: the length, elen (...), of an element list +C hash: the computed value of the hash function +C hmod: the hash function is computed modulo hmod = max (1,n-1) +C i: a supervariable +C ilast: the entry in a link list preceding i +C inext: the entry in a link list following i +C j: a supervariable +C jlast: the entry in a link list preceding j +C jnext: the entry in a link list, or path, following j +C k: the pivot order of an element or variable +C knt1: loop counter used during element construction +C knt2: loop counter used during element construction +C knt3: loop counter used during compression +C lenj: len (j) +C ln: length of a supervariable list +C maxmem: amount of memory needed for no compressions +C me: current supervariable being eliminated, and the +C current element created by eliminating that +C supervariable +C mem: memory in use assuming no compressions have occurred +C mindeg: current minimum degree +C nel: number of pivots selected so far +C newmem: amount of new memory needed for current pivot element +C nleft: n - nel, the number of nonpivotal rows/columns remaining +C nvi: the number of variables in a supervariable i (= nv (i)) +C nvj: the number of variables in a supervariable j (= nv (j)) +C nvpiv: number of pivots in current element +C slenme: number of variables in variable list of pivotal variable +C we: w (e) +C wflg: used for flagging the w array. See description of iw. +C wnvi: wflg - nv (i) +C x: either a supervariable or an element + +C----------------------------------------------------------------------- +C LOCAL POINTERS: +C----------------------------------------------------------------------- + + INTEGER P, P1, P2, P3, PDST, PEND, PJ, PME, PME1, PME2, PN, PSRC + +C Any parameter (pe (...) or pfree) or local variable +C starting with "p" (for Pointer) is an index into iw, +C and all indices into iw use variables starting with +C "p." The only exception to this rule is the iwlen +C input argument. + +C p: pointer into lots of things +C p1: pe (i) for some variable i (start of element list) +C p2: pe (i) + elen (i) - 1 for some var. i (end of el. list) +C p3: index of first supervariable in clean list +C pdst: destination pointer, for compression +C pend: end of memory to compress +C pj: pointer into an element or variable +C pme: pointer into the current element (pme1...pme2) +C pme1: the current element, me, is stored in iw (pme1...pme2) +C pme2: the end of the current element +C pn: pointer into a "clean" variable, also used to compress +C psrc: source pointer, for compression + +C----------------------------------------------------------------------- +C FUNCTIONS CALLED: +C----------------------------------------------------------------------- + + INTRINSIC MAX, MIN, MOD + +C======================================================================= +C INITIALIZATIONS +C======================================================================= + + WFLG = 2 + MINDEG = 1 + NCMPA = 0 + NEL = 0 + HMOD = MAX (1, N-1) + DMAX = 0 + MEM = PFREE - 1 + MAXMEM = MEM + ME = 0 + + DO 10 I = 1, N + LAST (I) = 0 + HEAD (I) = 0 + NV (I) = 1 + W (I) = 1 + ELEN (I) = 0 + DEGREE (I) = LEN (I) +10 CONTINUE + +C ---------------------------------------------------------------- +C initialize degree lists and eliminate rows with no off-diag. nz. +C ---------------------------------------------------------------- + + DO 20 I = 1, N + + DEG = DEGREE (I) + + IF (DEG .GT. 0) THEN + +C ---------------------------------------------------------- +C place i in the degree list corresponding to its degree +C ---------------------------------------------------------- + + INEXT = HEAD (DEG) + IF (INEXT .NE. 0) LAST (INEXT) = I + NEXT (I) = INEXT + HEAD (DEG) = I + + ELSE + +C ---------------------------------------------------------- +C we have a variable that can be eliminated at once because +C there is no off-diagonal non-zero in its row. +C ---------------------------------------------------------- + + NEL = NEL + 1 + ELEN (I) = -NEL + PE (I) = 0 + W (I) = 0 + + ENDIF + +20 CONTINUE + +C======================================================================= +C WHILE (selecting pivots) DO +C======================================================================= + +30 CONTINUE + IF (NEL .LT. N) THEN + +C======================================================================= +C GET PIVOT OF MINIMUM DEGREE +C======================================================================= + +C ------------------------------------------------------------- +C find next supervariable for elimination +C ------------------------------------------------------------- + + DO 40 DEG = MINDEG, N + ME = HEAD (DEG) + IF (ME .GT. 0) GOTO 50 +40 CONTINUE +50 CONTINUE + MINDEG = DEG + +C ------------------------------------------------------------- +C remove chosen variable from link list +C ------------------------------------------------------------- + + INEXT = NEXT (ME) + IF (INEXT .NE. 0) LAST (INEXT) = 0 + HEAD (DEG) = INEXT + +C ------------------------------------------------------------- +C me represents the elimination of pivots nel+1 to nel+nv(me). +C place me itself as the first in this set. It will be moved +C to the nel+nv(me) position when the permutation vectors are +C computed. +C ------------------------------------------------------------- + + ELENME = ELEN (ME) + ELEN (ME) = - (NEL + 1) + NVPIV = NV (ME) + NEL = NEL + NVPIV + +C======================================================================= +C CONSTRUCT NEW ELEMENT +C======================================================================= + +C ------------------------------------------------------------- +C At this point, me is the pivotal supervariable. It will be +C converted into the current element. Scan list of the +C pivotal supervariable, me, setting tree pointers and +C constructing new list of supervariables for the new element, +C me. p is a pointer to the current position in the old list. +C ------------------------------------------------------------- + +C flag the variable "me" as being in Lme by negating nv (me) + NV (ME) = -NVPIV + DEGME = 0 + + IF (ELENME .EQ. 0) THEN + +C ---------------------------------------------------------- +C construct the new element in place +C ---------------------------------------------------------- + + PME1 = PE (ME) + PME2 = PME1 - 1 + + DO 60 P = PME1, PME1 + LEN (ME) - 1 + I = IW (P) + NVI = NV (I) + IF (NVI .GT. 0) THEN + +C ---------------------------------------------------- +C i is a principal variable not yet placed in Lme. +C store i in new list +C ---------------------------------------------------- + + DEGME = DEGME + NVI +C flag i as being in Lme by negating nv (i) + NV (I) = -NVI + PME2 = PME2 + 1 + IW (PME2) = I + +C ---------------------------------------------------- +C remove variable i from degree list. +C ---------------------------------------------------- + + ILAST = LAST (I) + INEXT = NEXT (I) + IF (INEXT .NE. 0) LAST (INEXT) = ILAST + IF (ILAST .NE. 0) THEN + NEXT (ILAST) = INEXT + ELSE +C i is at the head of the degree list + HEAD (DEGREE (I)) = INEXT + ENDIF + + ENDIF +60 CONTINUE +C this element takes no new memory in iw: + NEWMEM = 0 + + ELSE + +C ---------------------------------------------------------- +C construct the new element in empty space, iw (pfree ...) +C ---------------------------------------------------------- + + P = PE (ME) + PME1 = PFREE + SLENME = LEN (ME) - ELENME + + DO 120 KNT1 = 1, ELENME + 1 + + IF (KNT1 .GT. ELENME) THEN +C search the supervariables in me. + E = ME + PJ = P + LN = SLENME + ELSE +C search the elements in me. + E = IW (P) + P = P + 1 + PJ = PE (E) + LN = LEN (E) + ENDIF + +C ------------------------------------------------------- +C search for different supervariables and add them to the +C new list, compressing when necessary. this loop is +C executed once for each element in the list and once for +C all the supervariables in the list. +C ------------------------------------------------------- + + DO 110 KNT2 = 1, LN + I = IW (PJ) + PJ = PJ + 1 + NVI = NV (I) + IF (NVI .GT. 0) THEN + +C ------------------------------------------------- +C compress iw, if necessary +C ------------------------------------------------- + + IF (PFREE .GT. IWLEN) THEN +C prepare for compressing iw by adjusting +C pointers and lengths so that the lists being +C searched in the inner and outer loops contain +C only the remaining entries. + + PE (ME) = P + LEN (ME) = LEN (ME) - KNT1 + IF (LEN (ME) .EQ. 0) THEN +C nothing left of supervariable me + PE (ME) = 0 + ENDIF + PE (E) = PJ + LEN (E) = LN - KNT2 + IF (LEN (E) .EQ. 0) THEN +C nothing left of element e + PE (E) = 0 + ENDIF + + NCMPA = NCMPA + 1 +C store first item in pe +C set first entry to -item + DO 70 J = 1, N + PN = PE (J) + IF (PN .GT. 0) THEN + PE (J) = IW (PN) + IW (PN) = -J + ENDIF +70 CONTINUE + +C psrc/pdst point to source/destination + PDST = 1 + PSRC = 1 + PEND = PME1 - 1 + +C while loop: +80 CONTINUE + IF (PSRC .LE. PEND) THEN +C search for next negative entry + J = -IW (PSRC) + PSRC = PSRC + 1 + IF (J .GT. 0) THEN + IW (PDST) = PE (J) + PE (J) = PDST + PDST = PDST + 1 +C copy from source to destination + LENJ = LEN (J) + DO 90 KNT3 = 0, LENJ - 2 + IW (PDST + KNT3) = IW (PSRC + KNT3) +90 CONTINUE + PDST = PDST + LENJ - 1 + PSRC = PSRC + LENJ - 1 + ENDIF + GOTO 80 + ENDIF + +C move the new partially-constructed element + P1 = PDST + DO 100 PSRC = PME1, PFREE - 1 + IW (PDST) = IW (PSRC) + PDST = PDST + 1 +100 CONTINUE + PME1 = P1 + PFREE = PDST + PJ = PE (E) + P = PE (ME) + ENDIF + +C ------------------------------------------------- +C i is a principal variable not yet placed in Lme +C store i in new list +C ------------------------------------------------- + + DEGME = DEGME + NVI +C flag i as being in Lme by negating nv (i) + NV (I) = -NVI + IW (PFREE) = I + PFREE = PFREE + 1 + +C ------------------------------------------------- +C remove variable i from degree link list +C ------------------------------------------------- + + ILAST = LAST (I) + INEXT = NEXT (I) + IF (INEXT .NE. 0) LAST (INEXT) = ILAST + IF (ILAST .NE. 0) THEN + NEXT (ILAST) = INEXT + ELSE +C i is at the head of the degree list + HEAD (DEGREE (I)) = INEXT + ENDIF + + ENDIF +110 CONTINUE + + IF (E .NE. ME) THEN +C set tree pointer and flag to indicate element e is +C absorbed into new element me (the parent of e is me) + PE (E) = -ME + W (E) = 0 + ENDIF +120 CONTINUE + + PME2 = PFREE - 1 +C this element takes newmem new memory in iw (possibly zero) + NEWMEM = PFREE - PME1 + MEM = MEM + NEWMEM + MAXMEM = MAX (MAXMEM, MEM) + ENDIF + +C ------------------------------------------------------------- +C me has now been converted into an element in iw (pme1..pme2) +C ------------------------------------------------------------- + +C degme holds the external degree of new element + DEGREE (ME) = DEGME + PE (ME) = PME1 + LEN (ME) = PME2 - PME1 + 1 + +C ------------------------------------------------------------- +C make sure that wflg is not too large. With the current +C value of wflg, wflg+n must not cause integer overflow +C ------------------------------------------------------------- + + IF (WFLG + N .LE. WFLG) THEN + DO 130 X = 1, N + IF (W (X) .NE. 0) W (X) = 1 +130 CONTINUE + WFLG = 2 + ENDIF + +C======================================================================= +C COMPUTE (w (e) - wflg) = |Le\Lme| FOR ALL ELEMENTS +C======================================================================= + +C ------------------------------------------------------------- +C Scan 1: compute the external degrees of previous elements +C with respect to the current element. That is: +C (w (e) - wflg) = |Le \ Lme| +C for each element e that appears in any supervariable in Lme. +C The notation Le refers to the pattern (list of +C supervariables) of a previous element e, where e is not yet +C absorbed, stored in iw (pe (e) + 1 ... pe (e) + iw (pe (e))). +C The notation Lme refers to the pattern of the current element +C (stored in iw (pme1..pme2)). If (w (e) - wflg) becomes +C zero, then the element e will be absorbed in scan 2. +C ------------------------------------------------------------- + + DO 150 PME = PME1, PME2 + I = IW (PME) + ELN = ELEN (I) + IF (ELN .GT. 0) THEN +C note that nv (i) has been negated to denote i in Lme: + NVI = -NV (I) + WNVI = WFLG - NVI + DO 140 P = PE (I), PE (I) + ELN - 1 + E = IW (P) + WE = W (E) + IF (WE .GE. WFLG) THEN +C unabsorbed element e has been seen in this loop + WE = WE - NVI + ELSE IF (WE .NE. 0) THEN +C e is an unabsorbed element +C this is the first we have seen e in all of Scan 1 + WE = DEGREE (E) + WNVI + ENDIF + W (E) = WE +140 CONTINUE + ENDIF +150 CONTINUE + +C======================================================================= +C DEGREE UPDATE AND ELEMENT ABSORPTION +C======================================================================= + +C ------------------------------------------------------------- +C Scan 2: for each i in Lme, sum up the degree of Lme (which +C is degme), plus the sum of the external degrees of each Le +C for the elements e appearing within i, plus the +C supervariables in i. Place i in hash list. +C ------------------------------------------------------------- + + DO 180 PME = PME1, PME2 + I = IW (PME) + P1 = PE (I) + P2 = P1 + ELEN (I) - 1 + PN = P1 + HASH = 0 + DEG = 0 + +C ---------------------------------------------------------- +C scan the element list associated with supervariable i +C ---------------------------------------------------------- + +C UMFPACK/MA38-style approximate degree: + DO 160 P = P1, P2 + E = IW (P) + WE = W (E) + IF (WE .NE. 0) THEN +C e is an unabsorbed element + DEG = DEG + WE - WFLG + IW (PN) = E + PN = PN + 1 + HASH = HASH + E + ENDIF +160 CONTINUE + +C count the number of elements in i (including me): + ELEN (I) = PN - P1 + 1 + +C ---------------------------------------------------------- +C scan the supervariables in the list associated with i +C ---------------------------------------------------------- + + P3 = PN + DO 170 P = P2 + 1, P1 + LEN (I) - 1 + J = IW (P) + NVJ = NV (J) + IF (NVJ .GT. 0) THEN +C j is unabsorbed, and not in Lme. +C add to degree and add to new list + DEG = DEG + NVJ + IW (PN) = J + PN = PN + 1 + HASH = HASH + J + ENDIF +170 CONTINUE + +C ---------------------------------------------------------- +C update the degree and check for mass elimination +C ---------------------------------------------------------- + + IF (ELEN (I) .EQ. 1 .AND. P3 .EQ. PN) THEN + +C ------------------------------------------------------- +C mass elimination +C ------------------------------------------------------- + +C There is nothing left of this node except for an +C edge to the current pivot element. elen (i) is 1, +C and there are no variables adjacent to node i. +C Absorb i into the current pivot element, me. + + PE (I) = -ME + NVI = -NV (I) + DEGME = DEGME - NVI + NVPIV = NVPIV + NVI + NEL = NEL + NVI + NV (I) = 0 + ELEN (I) = 0 + + ELSE + +C ------------------------------------------------------- +C update the upper-bound degree of i +C ------------------------------------------------------- + +C the following degree does not yet include the size +C of the current element, which is added later: + DEGREE (I) = MIN (DEGREE (I), DEG) + +C ------------------------------------------------------- +C add me to the list for i +C ------------------------------------------------------- + +C move first supervariable to end of list + IW (PN) = IW (P3) +C move first element to end of element part of list + IW (P3) = IW (P1) +C add new element to front of list. + IW (P1) = ME +C store the new length of the list in len (i) + LEN (I) = PN - P1 + 1 + +C ------------------------------------------------------- +C place in hash bucket. Save hash key of i in last (i). +C ------------------------------------------------------- + + HASH = MOD (HASH, HMOD) + 1 + J = HEAD (HASH) + IF (J .LE. 0) THEN +C the degree list is empty, hash head is -j + NEXT (I) = -J + HEAD (HASH) = -I + ELSE +C degree list is not empty +C use last (head (hash)) as hash head + NEXT (I) = LAST (J) + LAST (J) = I + ENDIF + LAST (I) = HASH + ENDIF +180 CONTINUE + + DEGREE (ME) = DEGME + +C ------------------------------------------------------------- +C Clear the counter array, w (...), by incrementing wflg. +C ------------------------------------------------------------- + + DMAX = MAX (DMAX, DEGME) + WFLG = WFLG + DMAX + +C make sure that wflg+n does not cause integer overflow + IF (WFLG + N .LE. WFLG) THEN + DO 190 X = 1, N + IF (W (X) .NE. 0) W (X) = 1 +190 CONTINUE + WFLG = 2 + ENDIF +C at this point, w (1..n) .lt. wflg holds + +C======================================================================= +C SUPERVARIABLE DETECTION +C======================================================================= + + DO 250 PME = PME1, PME2 + I = IW (PME) + IF (NV (I) .LT. 0) THEN +C i is a principal variable in Lme + +C ------------------------------------------------------- +C examine all hash buckets with 2 or more variables. We +C do this by examing all unique hash keys for super- +C variables in the pattern Lme of the current element, me +C ------------------------------------------------------- + + HASH = LAST (I) +C let i = head of hash bucket, and empty the hash bucket + J = HEAD (HASH) + IF (J .EQ. 0) GOTO 250 + IF (J .LT. 0) THEN +C degree list is empty + I = -J + HEAD (HASH) = 0 + ELSE +C degree list is not empty, restore last () of head + I = LAST (J) + LAST (J) = 0 + ENDIF + IF (I .EQ. 0) GOTO 250 + +C while loop: +200 CONTINUE + IF (NEXT (I) .NE. 0) THEN + +C ---------------------------------------------------- +C this bucket has one or more variables following i. +C scan all of them to see if i can absorb any entries +C that follow i in hash bucket. Scatter i into w. +C ---------------------------------------------------- + + LN = LEN (I) + ELN = ELEN (I) +C do not flag the first element in the list (me) + DO 210 P = PE (I) + 1, PE (I) + LN - 1 + W (IW (P)) = WFLG +210 CONTINUE + +C ---------------------------------------------------- +C scan every other entry j following i in bucket +C ---------------------------------------------------- + + JLAST = I + J = NEXT (I) + +C while loop: +220 CONTINUE + IF (J .NE. 0) THEN + +C ------------------------------------------------- +C check if j and i have identical nonzero pattern +C ------------------------------------------------- + + IF (LEN (J) .NE. LN) THEN +C i and j do not have same size data structure + GOTO 240 + ENDIF + IF (ELEN (J) .NE. ELN) THEN +C i and j do not have same number of adjacent el + GOTO 240 + ENDIF +C do not flag the first element in the list (me) + DO 230 P = PE (J) + 1, PE (J) + LN - 1 + IF (W (IW (P)) .NE. WFLG) THEN +C an entry (iw(p)) is in j but not in i + GOTO 240 + ENDIF +230 CONTINUE + +C ------------------------------------------------- +C found it! j can be absorbed into i +C ------------------------------------------------- + + PE (J) = -I +C both nv (i) and nv (j) are negated since they +C are in Lme, and the absolute values of each +C are the number of variables in i and j: + NV (I) = NV (I) + NV (J) + NV (J) = 0 + ELEN (J) = 0 +C delete j from hash bucket + J = NEXT (J) + NEXT (JLAST) = J + GOTO 220 + +C ------------------------------------------------- +240 CONTINUE +C j cannot be absorbed into i +C ------------------------------------------------- + + JLAST = J + J = NEXT (J) + GOTO 220 + ENDIF + +C ---------------------------------------------------- +C no more variables can be absorbed into i +C go to next i in bucket and clear flag array +C ---------------------------------------------------- + + WFLG = WFLG + 1 + I = NEXT (I) + IF (I .NE. 0) GOTO 200 + ENDIF + ENDIF +250 CONTINUE + +C======================================================================= +C RESTORE DEGREE LISTS AND REMOVE NONPRINCIPAL SUPERVAR. FROM ELEMENT +C======================================================================= + + P = PME1 + NLEFT = N - NEL + DO 260 PME = PME1, PME2 + I = IW (PME) + NVI = -NV (I) + IF (NVI .GT. 0) THEN +C i is a principal variable in Lme +C restore nv (i) to signify that i is principal + NV (I) = NVI + +C ------------------------------------------------------- +C compute the external degree (add size of current elem) +C ------------------------------------------------------- + + DEG = MAX (1, MIN (DEGREE (I) + DEGME-NVI, NLEFT-NVI)) + +C ------------------------------------------------------- +C place the supervariable at the head of the degree list +C ------------------------------------------------------- + + INEXT = HEAD (DEG) + IF (INEXT .NE. 0) LAST (INEXT) = I + NEXT (I) = INEXT + LAST (I) = 0 + HEAD (DEG) = I + +C ------------------------------------------------------- +C save the new degree, and find the minimum degree +C ------------------------------------------------------- + + MINDEG = MIN (MINDEG, DEG) + DEGREE (I) = DEG + +C ------------------------------------------------------- +C place the supervariable in the element pattern +C ------------------------------------------------------- + + IW (P) = I + P = P + 1 + ENDIF +260 CONTINUE + +C======================================================================= +C FINALIZE THE NEW ELEMENT +C======================================================================= + + NV (ME) = NVPIV + DEGME +C nv (me) is now the degree of pivot (including diagonal part) +C save the length of the list for the new element me + LEN (ME) = P - PME1 + IF (LEN (ME) .EQ. 0) THEN +C there is nothing left of the current pivot element + PE (ME) = 0 + W (ME) = 0 + ENDIF + IF (NEWMEM .NE. 0) THEN +C element was not constructed in place: deallocate part +C of it (final size is less than or equal to newmem, +C since newly nonprincipal variables have been removed). + PFREE = P + MEM = MEM - NEWMEM + LEN (ME) + ENDIF + +C======================================================================= +C END WHILE (selecting pivots) + GOTO 30 + ENDIF +C======================================================================= + +C======================================================================= +C COMPUTE THE PERMUTATION VECTORS +C======================================================================= + +C ---------------------------------------------------------------- +C The time taken by the following code is O(n). At this +C point, elen (e) = -k has been done for all elements e, +C and elen (i) = 0 has been done for all nonprincipal +C variables i. At this point, there are no principal +C supervariables left, and all elements are absorbed. +C ---------------------------------------------------------------- + +C ---------------------------------------------------------------- +C compute the ordering of unordered nonprincipal variables +C ---------------------------------------------------------------- + + DO 290 I = 1, N + IF (ELEN (I) .EQ. 0) THEN + +C ---------------------------------------------------------- +C i is an un-ordered row. Traverse the tree from i until +C reaching an element, e. The element, e, was the +C principal supervariable of i and all nodes in the path +C from i to when e was selected as pivot. +C ---------------------------------------------------------- + + J = -PE (I) +C while (j is a variable) do: +270 CONTINUE + IF (ELEN (J) .GE. 0) THEN + J = -PE (J) + GOTO 270 + ENDIF + E = J + +C ---------------------------------------------------------- +C get the current pivot ordering of e +C ---------------------------------------------------------- + + K = -ELEN (E) + +C ---------------------------------------------------------- +C traverse the path again from i to e, and compress the +C path (all nodes point to e). Path compression allows +C this code to compute in O(n) time. Order the unordered +C nodes in the path, and place the element e at the end. +C ---------------------------------------------------------- + + J = I +C while (j is a variable) do: +280 CONTINUE + IF (ELEN (J) .GE. 0) THEN + JNEXT = -PE (J) + PE (J) = -E + IF (ELEN (J) .EQ. 0) THEN +C j is an unordered row + ELEN (J) = K + K = K + 1 + ENDIF + J = JNEXT + GOTO 280 + ENDIF +C leave elen (e) negative, so we know it is an element + ELEN (E) = -K + ENDIF +290 CONTINUE + +C ---------------------------------------------------------------- +C reset the inverse permutation (elen (1..n)) to be positive, +C and compute the permutation (last (1..n)). +C ---------------------------------------------------------------- + + DO 300 I = 1, N + K = ABS (ELEN (I)) + LAST (K) = I + ELEN (I) = K +300 CONTINUE + +C======================================================================= +C RETURN THE MEMORY USAGE IN IW +C======================================================================= + +C If maxmem is less than or equal to iwlen, then no compressions +C occurred, and iw (maxmem+1 ... iwlen) was unused. Otherwise +C compressions did occur, and iwlen would have had to have been +C greater than or equal to maxmem for no compressions to occur. +C Return the value of maxmem in the pfree argument. + + PFREE = MAXMEM + + RETURN + END + diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/README.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/README.txt Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,5 @@ +UMFPACK v4.4 and AMD v1.1. + +See UMFPACK/README.txt and AMD/README.txt for details. Documention is in +UMFPACK/Doc and AMD/Doc. + diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Demo/HB/arc130.rua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Demo/HB/arc130.rua Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,506 @@ +1UNSYMMETRIC MATRIX FROM LASER PROBLEM. A.R.CURTIS, OCT 1974 ARC130 + 502 9 65 428 0 +RUA 130 130 1282 0 +(16I5) (20I4) (1P3D24.15) + 1 41 102 163 224 285 325 344 363 380 397 413 423 433 443 452 + 461 471 595 597 721 722 723 724 725 726 732 737 744 750 755 761 + 766 773 779 785 791 796 801 806 812 818 824 830 836 841 847 852 + 858 863 868 874 879 884 889 896 903 908 914 919 925 931 936 943 + 948 953 959 964 971 976 981 986 991 997 1002 1008 1013 1018 1023 1028 + 1033 1038 1043 1048 1053 1058 1063 1068 1073 1078 1083 1088 1093 1098 1103 1108 + 1113 1118 1123 1128 1133 1138 1143 1148 1153 1158 1163 1168 1173 1178 1183 1188 + 1193 1198 1203 1208 1213 1218 1223 1228 1233 1238 1243 1248 1253 1258 1263 1268 + 1273 1278 1283 + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 17 18 19 20 26 + 31 36 41 46 51 56 61 66 71 76 81 86 91 96 101 106 111 116 121 126 + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 17 18 19 20 26 + 27 31 32 36 37 41 42 46 47 51 52 56 57 61 62 66 67 71 72 76 + 77 81 82 86 87 91 92 96 97 101 102 106 107 111 112 116 117 121 122 126 + 127 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 17 18 19 20 + 27 28 32 33 37 38 42 43 47 48 52 53 57 58 62 63 67 68 72 73 + 77 78 82 83 87 88 92 93 97 98 102 103 107 108 112 113 117 118 122 123 + 127 128 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 17 18 19 + 20 28 29 33 34 38 39 43 44 48 49 53 54 58 59 63 64 68 69 73 + 74 78 79 83 84 88 89 93 94 98 99 103 104 108 109 113 114 118 119 123 + 124 128 129 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 17 18 + 19 20 29 30 34 35 39 40 44 45 49 50 54 55 59 60 64 65 69 70 + 74 75 79 80 84 85 89 90 94 95 99 100 104 105 109 110 114 115 119 120 + 124 125 129 130 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 17 + 18 19 20 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100 105 110 + 115 120 125 130 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 17 + 18 19 20 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 17 18 + 19 20 1 2 3 4 5 6 7 8 9 12 13 14 15 17 18 19 20 1 + 2 3 4 5 6 7 8 10 11 12 14 15 17 18 19 20 1 2 3 4 + 5 6 7 8 11 12 14 15 17 18 19 20 7 9 11 12 13 14 15 18 + 19 20 7 9 11 12 13 14 15 18 19 20 8 10 11 12 14 15 17 18 + 19 20 1 2 3 4 5 6 15 18 20 1 2 3 4 5 6 16 18 20 + 1 2 3 4 5 6 11 17 18 20 1 2 3 4 5 6 7 8 9 10 + 11 12 13 14 15 17 18 19 20 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 67 68 69 70 71 72 73 74 75 76 + 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 + 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 + 117 118 119 120 121 122 123 124 125 126 127 128 129 130 18 19 1 2 3 4 + 5 6 7 8 9 10 11 12 13 14 15 17 18 19 20 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 67 68 69 70 + 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 + 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 + 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 + 21 22 23 24 25 1 2 11 20 21 26 2 3 20 22 27 3 4 11 18 + 20 23 28 4 5 11 20 24 29 5 6 20 25 30 1 2 11 20 21 31 + 2 3 20 22 32 3 4 11 18 20 23 33 4 5 11 20 24 34 5 6 + 18 20 25 35 1 2 11 20 21 36 2 3 20 22 37 3 4 20 23 38 + 4 5 20 24 39 5 6 18 20 25 40 1 2 18 20 21 41 2 3 18 + 20 22 42 3 4 11 20 23 43 4 5 11 20 24 44 5 6 20 25 45 + 1 2 18 20 21 46 2 3 20 22 47 3 4 11 20 23 48 4 5 20 + 24 49 5 6 20 25 50 1 2 11 20 21 51 2 3 20 22 52 3 4 + 20 23 53 4 5 20 24 54 5 6 11 18 20 25 55 1 2 11 18 20 + 21 56 2 3 20 22 57 3 4 18 20 23 58 4 5 20 24 59 5 6 + 18 20 25 60 1 2 11 20 21 61 2 3 20 22 62 3 4 11 18 20 + 23 63 4 5 20 24 64 5 6 20 25 65 1 2 11 20 21 66 2 3 + 20 22 67 3 4 11 18 20 23 68 4 5 20 24 69 5 6 20 25 70 + 1 2 20 21 71 2 3 20 22 72 3 4 11 20 23 73 4 5 20 24 + 74 5 6 11 20 25 75 1 2 20 21 76 2 3 20 22 77 3 4 20 + 23 78 4 5 20 24 79 5 6 20 25 80 1 2 20 21 81 2 3 20 + 22 82 3 4 20 23 83 4 5 20 24 84 5 6 20 25 85 1 2 20 + 21 86 2 3 20 22 87 3 4 20 23 88 4 5 20 24 89 5 6 20 + 25 90 1 2 20 21 91 2 3 20 22 92 3 4 20 23 93 4 5 20 + 24 94 5 6 20 25 95 1 2 20 21 96 2 3 20 22 97 3 4 20 + 23 98 4 5 20 24 99 5 6 20 25 100 1 2 20 21 101 2 3 20 + 22 102 3 4 20 23 103 4 5 20 24 104 5 6 20 25 105 1 2 20 + 21 106 2 3 20 22 107 3 4 20 23 108 4 5 20 24 109 5 6 20 + 25 110 1 2 20 21 111 2 3 20 22 112 3 4 20 23 113 4 5 20 + 24 114 5 6 20 25 115 1 2 20 21 116 2 3 20 22 117 3 4 20 + 23 118 4 5 20 24 119 5 6 20 25 120 1 2 20 21 121 2 3 20 + 22 122 3 4 20 23 123 4 5 20 24 124 5 6 20 25 125 1 2 20 + 21 126 2 3 20 22 127 3 4 20 23 128 4 5 20 24 129 5 6 20 + 25 130 + 1.000000408955316D+00 -6.310289677458059D-07 2.096665525641583D-07 + 6.421004172807443D-08 3.956404981408923D-09 6.194351698241007D-10 + 5.637896549615107D-08 -5.637896549615107D-08 -5.637896549615107D-08 + 0.0 0.0 1.127578798332252D-06 + -5.637896549615107D-08 -5.074106752545049D-07 6.088927761993546D-07 + -5.637896549615107D-08 -2.043932134654369D-09 0.0 + 1.878335326910019D-02 3.624941025245822D-16 6.846256028048394D-16 + 8.682574753301250D-16 8.829475677343563D-16 7.596007241310538D-16 + 5.641173783660228D-16 3.637011244744196D-16 2.010050211992837D-16 + 9.149849743076945D-17 3.147608842710462D-17 7.345189304361637D-18 + 1.130718674232424D-18 1.234088333455879D-19 1.030108373210172D-20 + 6.833493328871848D-22 3.659321266573640D-23 1.588981222142243D-24 + 5.608268555010370D-26 1.610701819995700D-27 3.764561095514044D-29 + 7.172442880553562D-31 -1.426527305739000D-04 1.000147870872752D+00 + -5.613608664134517D-06 4.753307507598947D-07 -5.725276253087941D-09 + -1.773762647871990D-08 5.637896549615107D-08 -5.637896549615107D-08 + -5.637896549615107D-08 0.0 8.516936613432724D-15 + 1.127578798332252D-06 -5.637896549615107D-08 -5.074106752545049D-07 + 6.088927761993546D-07 -5.637896549615107D-08 1.437741730114794D-07 + 0.0 -1.321256637573242D+00 -1.114484955602561D-14 + 1.733296665917816D-12 -2.074384704265318D-14 2.677037702625285D-09 + -2.624046067782083D-14 6.328248787212942D-07 -2.673591396559240D-14 + 3.107915290456731D-06 -2.314677109379638D-14 3.159706807309703D-07 + -1.742469422872858D-14 2.779751095971505D-09 -1.155559277280817D-14 + 1.449127970398756D-11 -6.786512676696180D-15 1.984121417511475D-13 + -3.535647235462748D-15 1.024009300748183D-14 -1.631147863670078D-15 + 1.059880891954518D-15 -6.681999398916840D-16 1.302165587382207D-16 + -2.461975376577509D-16 1.523580661538971D-17 -8.232749965727973D-17 + 1.550961994175702D-18 -2.496269623029467D-17 1.321670733700876D-19 + -6.841421422065817D-18 9.270355296549564D-21 -1.693073277773537D-18 + 5.325857707782005D-22 -3.781317617533563D-19 2.498061216103135D-23 + -7.624842319058412D-20 9.576834498255501D-25 -1.388670166119169D-20 + 3.002645577625813D-26 -2.284276225230092D-21 7.695759909088791D-28 + -3.396618468231539D-22 1.614779109984465D-29 3.172130163875408D-06 + -4.288838244974613D-04 1.050343558192253D+00 -4.991767182946205D-02 + -9.393625077791512D-08 -2.995422221374611D-08 5.637896549615107D-08 + -5.637896549615107D-08 -5.637896549615107D-08 0.0 + -1.143995922298080D-15 1.127578798332252D-06 -5.637896549615107D-08 + -5.074106752545049D-07 6.088927761993546D-07 -5.637896549615107D-08 + -1.144809175457340D-06 0.0 1.052057933807373D+01 + -1.889024527079730D-12 2.473666237123862D-12 -3.191809705427318D-09 + 4.265404740522172D-08 -8.364604013877397D-07 3.888504579663277D-04 + -4.564798473438714D-06 3.816828131675720D-02 -5.168877237338165D-07 + 1.131986826658249D-02 -5.076469022924357D-09 3.749688039533794D-05 + -2.963390643984098D-11 1.865166154857434D-08 -4.676906106317047D-13 + 1.635970525715180D-11 -3.327468305774385D-14 1.099596759132626D-13 + -6.362139005726408D-15 5.006533924413470D-15 -1.834683316389945D-15 + 4.881095121188686D-16 -5.997685715994827D-16 5.444201036336569D-17 + -1.954991746932328D-16 5.645564756136680D-18 -5.996761655988932D-17 + 5.045512223359075D-19 -1.687755499051556D-17 3.764540326759457D-20 + -4.318695916068944D-18 2.317379201706768D-21 -1.000719796344203D-18 + 1.172540887632911D-22 -2.099449018144940D-19 4.871730427049952D-24 + -3.988113352283189D-20 1.662654519802644D-25 -6.857663320188449D-21 + 4.662922914394380D-27 -1.068200969380841D-21 1.074941789167073D-28 + 9.677614798420109D-07 -1.245291059603915D-06 -7.536840438842773D-02 + 1.075373947620392D+00 -5.109401172376238D-06 -1.163272145277006D-07 + 5.637896549615107D-08 -5.637896549615107D-08 -5.637896549615107D-08 + 0.0 2.726002957774963D-15 1.127578798332252D-06 + -5.637896549615107D-08 -5.074106752545049D-07 6.088927761993546D-07 + -5.637896549615107D-08 3.242677848902531D-06 0.0 + -2.979957580566406D+01 -2.690164063734457D-12 1.124147229838481D-14 + -5.062177166337278D-08 2.393615836679235D-14 -5.103659350425005D-04 + 3.258340252883067D-14 -5.552677810192108D-02 3.506025222747844D-14 + -1.829450204968452D-02 3.150090797476683D-14 -6.747333100065589D-05 + 2.389203133837219D-14 -3.745336840665914D-08 1.510693087010233D-14 + -3.676196846935653D-11 7.677818342037568D-15 -2.876134660295682D-13 + 2.945648553635133D-15 -1.940820822197292D-14 8.095830795573460D-16 + -3.855263683164370D-15 1.612334891334645D-16 -1.105984048240622D-15 + 2.450439846627089D-17 -3.484403436219757D-16 2.962714454342404D-18 + -1.076261635651689D-16 2.911501014282256D-19 -3.103228286741277D-17 + 2.346465182333734D-20 -8.193536641609284D-18 1.555002212474875D-21 + -1.967818836691188D-18 8.483679018543260D-23 -4.290093147860203D-19 + 3.815631846132649D-24 -8.487715775043102D-20 1.415514258958216D-25 + -1.524028579840669D-20 4.334547236644489D-27 -2.483863638318878D-21 + 1.096037222071676D-28 2.067174023068219D-07 -3.464035103206697D-07 + 8.871005547916866D-07 -1.004851656034589D-03 1.001007388811558D+00 + -3.227999513910618D-06 5.637894062715532D-08 -5.637894062715532D-08 + -5.637894062715532D-08 0.0 0.0 + 1.127578798332252D-06 -5.637894062715532D-08 -5.074106752545049D-07 + 6.088923782954225D-07 -5.637894062715532D-08 9.148621415988600D-07 + 0.0 -8.407408714294434D+00 -4.977862197962091D-14 + 8.301786856698343D-15 -9.878084678352494D-14 1.892736794660739D-14 + -1.325998230487790D-13 2.600578511758635D-14 -1.439277841873421D-13 + 2.763043835613335D-14 -1.330588200385008D-13 2.406133628386938D-14 + -1.065598347407826D-13 1.723105233259088D-14 -7.396622377087159D-14 + 9.875153944354995D-15 -4.402636024844475D-14 4.349897043042991D-15 + -2.220723876057012D-14 1.437176048199422D-15 -9.662081112407281D-15 + 3.596410837999929D-16 -3.830770878461565D-15 7.011335073232172D-17 + -1.436664440299280D-15 1.093826418912559D-17 -5.079756111055342D-16 + 1.388715480107101D-18 -1.665747200801725D-16 1.447536603658476D-19 + -5.007023509456983D-17 1.243767186728059D-20 -1.371575222480206D-17 + 8.829125121689631D-22 -3.416913538430984D-18 5.181441636060790D-23 + -7.740067027423400D-19 2.517640901542902D-24 -1.594267587579844D-19 + 1.013315498583546D-25 -2.986853872288083D-20 3.380210430601726D-27 + -5.090734445941291D-21 9.355154149199958D-29 1.471342443437607D-07 + -1.266278104594676D-07 4.008210794381739D-07 1.813951712392736D-06 + -1.041745999827981D-03 1.001039566937834D+00 5.637089728338651D-08 + -5.637089728338651D-08 -5.637896549615107D-08 -8.085981537120368D-12 + -4.542686146409396D-14 1.127425093727652D-06 -5.637896549615107D-08 + -5.073379156783631D-07 6.087796009524027D-07 -5.637089728338651D-08 + 9.095310815609992D-07 0.0 -8.358414649963379D+00 + -5.387848167289801D-14 -1.065863976940085D-13 -1.420175283796399D-13 + -1.525375420592667D-13 -1.390970129876157D-13 -1.094549255918620D-13 + -7.446164995358884D-14 -4.389770949628398D-14 -2.282676882258729D-14 + -1.078032045684525D-14 -4.709645488269049D-15 -1.906120381095478D-15 + -7.101397174837966D-16 -2.421286031373780D-16 -7.530431274023090D-17 + -2.133795108141790D-17 -5.505686860192738D-18 -1.294189415607603D-18 + -2.771874994834836D-19 -5.410633946266530D-20 -9.630518136308248D-21 + -1.259340933756903D-05 -1.634575164644048D-04 -3.157716710120440D-04 + -5.238812882453203D-04 -1.138667576014996D-04 -2.637367288116366D-05 + 1.001156237442046D+00 -1.022412441670895D-03 -1.463538410462206D-07 + 1.089178491383791D-03 6.691245653200895D-05 2.203556895256042D-02 + -1.463538410462206D-07 -9.134795516729355D-03 1.585229113698006D-02 + -1.022412441670895D-03 4.045813511766028D-06 6.691245653200895D-05 + -3.734263610839844D+01 -4.186565638519824D-05 -1.590017291164258D-07 + -1.589597218298877D-07 -1.589597218298877D-07 -1.589597218298877D-07 + -1.589597218298877D-07 -4.075298784300685D-05 1.000055276526837D+00 + 4.170673491898924D-05 -6.308013325906359D-06 7.261772225319874D-06 + -8.087516762316227D-04 4.170673491898924D-05 5.047505255788565D-04 + -4.733889363706112D-04 5.527652683667839D-05 4.606268078077846D-08 + 7.261772225319874D-06 -4.409304857254028D-01 -1.230297129950486D-06 + -1.238937771819160D-12 -2.037324342022181D-18 0.0 + 0.0 0.0 -1.230298039445188D-06 + 1.230298039445188D-06 1.000001230298039D+00 -2.460596442688257D-05 + 1.230298039445188D-06 1.107268144551199D-05 -1.328722373727942D-05 + 1.230298039445188D-06 -2.200477799974010D-09 0.0 + 2.022196725010872D-02 -7.543263791376376D-09 -7.543263791376376D-07 + -1.508652530901600D-06 -2.539273737056646D-06 -5.087317163088301D-07 + -7.543263791376376D-08 5.393962055677548D-06 -5.393962055677548D-06 + 1.000005393962056D+00 0.0 1.024852826958522D-04 + -4.854565486311913D-05 7.551546150352806D-05 -5.393962055677548D-06 + 1.420877993041358D-08 0.0 -1.305759549140930D-01 + -4.203418058068564D-09 -4.203418058068564D-09 -4.203418058068564D-09 + -4.203418058068564D-09 -4.203418058068564D-09 -4.203418058068564D-09 + 2.522051900655242D-08 2.522051900655242D-08 1.000000025220519D+00 + 5.044103090767749D-07 2.522051545383874D-07 2.269846390845487D-07 + 2.522051900655242D-08 2.554505496021875D-10 2.522051900655242D-08 + -2.408750355243683D-03 2.477248961518796D-11 -1.238624654231746D-11 + 1.238624654231746D-11 1.000000000495450D+00 -1.238624654231746D-11 + 1.238625261384962D-11 2.452476000058823D-10 1.574671382870152D-13 + 1.238624654231746D-11 -1.477152181905694D-06 2.184934178028897D-11 + -1.092467522695317D-11 1.092467522695317D-11 4.369868911169306D-10 + 9.999999999890753D-01 1.092467522695317D-11 2.163085821571542D-10 + 1.388860272448500D-13 1.092467522695317D-11 -1.302848431805614D-06 + 1.345329678770213D-07 -6.726645551680122D-08 6.726645551680122D-08 + 6.726645551680122D-08 1.000001278062882D+00 -3.363325618011004D-07 + 1.345329678770213D-07 4.668525566131621D-10 6.726645551680122D-08 + -4.453532397747040D-03 -1.054020426494162D-09 -4.277477927416840D-09 + -1.088280576766465D-09 4.067786107952998D-09 1.694434592636185D-09 + 6.575595623559138D-10 1.000000000000000D+00 1.521864578801768D-11 + -1.398565364070237D-04 -5.132014604947166D-12 -2.082700678585070D-11 + -5.298826481758834D-12 1.980600405904198D-11 8.250184389824167D-12 + 3.201650750073171D-12 1.000000000000000D+00 7.409947221787005D-14 + -6.809601131863019D-07 -6.473783287219703D-08 -4.636610242414463D-07 + -5.365741913010424D-07 7.723452881691628D-07 2.271788730467961D-07 + 6.544928510265891D-08 0.0 1.000000000000000D+00 + 1.931242499253472D-09 -1.774775609374046D-02 -4.218190908432007D-03 + -3.070430830121040D-04 -2.048411639407277D-03 8.487612940371037D-04 + -1.524399995105341D-04 -4.570157034322619D-05 -2.428856445476413D-03 + 4.073116928339005D-03 4.175942391157150D-03 9.249553550034761D-04 + 8.221305906772614D-04 -4.950208216905594D-02 4.175942391157150D-03 + 3.748018294572830D-02 -2.475163340568542D-02 4.073116928339005D-03 + 1.000018495076802D+00 8.221305906772614D-04 -1.014492340087891D+02 + -2.471087598205393D-17 -1.873189645930362D-13 4.888664885231708D-14 + -3.043990772877252D-16 -1.286887362945006D-16 -2.790847829749812D-17 + -3.319902130982655D-10 3.139515314387609D-10 -4.006040206456845D-16 + -1.686210855062899D-16 -3.125035414666135D-17 -9.123220934270648D-08 + -3.244133949920069D-06 -4.812402866748730D-16 -1.976705171837396D-16 + -3.494794412900199D-17 -5.191453169572924D-07 -9.969023521989584D-04 + -5.606729188860132D-16 -2.226699269983418D-16 -3.903872945243604D-17 + -6.099668325987295D-08 -5.238358862698078D-04 -6.322302622700565D-16 + -2.419947719317118D-16 -4.343730537307861D-17 -6.189664336631040D-10 + -2.593829776742496D-06 -6.731455535124650D-16 -2.488745852875481D-16 + -4.778463580041231D-17 -3.720013880270656D-12 -1.776293334643242D-09 + -6.517935469780786D-16 -2.327123496209888D-16 -5.103115426856043D-17 + -6.057437537676513D-14 -2.046598134020083D-12 -5.521360973271107D-16 + -1.877159742293702D-16 -5.069799238760367D-17 -4.548197620390590D-15 + -1.881829720805535D-14 -3.943213655176626D-16 -1.259239545802135D-16 + -4.296864469034077D-17 -9.248773926893387D-16 -1.645467590918122D-15 + -2.305333573641771D-16 -7.042313979789018D-17 -2.772176047218775D-17 + -2.775064164871116D-16 -4.056637719561081D-16 -1.113570922349179D-16 + -3.375268799619757D-17 -1.308748704287211D-17 -9.240036252646867D-17 + -1.296943629262385D-16 -4.625534428392427D-17 -1.425923056676471D-17 + -4.840895863954283D-18 -3.032876906515887D-17 -4.265090145600200D-17 + -1.706723743114132D-17 -5.404603734977533D-18 -1.517272582187642D-18 + -9.324217265533531D-18 -1.336685488705270D-17 -5.681662918068494D-18 + -1.854034353170231D-18 -4.197349140592874D-19 -2.625968399791454D-18 + -3.870900037102137D-18 -1.715837288230996D-18 -5.777406282236940D-19 + -1.041151557505182D-19 -6.720563303536613D-19 -1.023229862353608D-18 + -4.706283903187430D-19 -1.637971158256200D-19 -2.326514296817294D-20 + -1.557337075156648D-19 -2.458146584996669D-19 -1.172823201387139D-19 + -4.226950445047938D-20 -4.691781359097844D-21 -3.267222217268957D-20 + -5.359393661610564D-20 -2.656896049584655D-20 -9.936381092496801D-21 + -8.545038260582033D-22 -6.206423377690597D-21 -1.060338916542145D-20 + -5.472649550870706D-21 -2.128172137901634D-21 -1.405610283842565D-22 + -1.067211220312940D-21 -1.903915315123482D-21 -1.025301274472632D-21 + -4.154147080474621D-22 -2.090081288584553D-23 -1.662368100185176D-22 + -3.103005701485727D-22 -1.747504367213780D-22 -7.394070257460893D-23 + 2.863205506020705D-11 1.000000000000000D+00 -4.014349741510159D-09 + -9.617298624142734D-11 1.790963349845853D-10 -6.729825585694016D-10 + -5.825459559183344D-11 -4.065924680274335D-12 -3.366472656196606D-09 + 3.135385950869818D-09 4.016598609268840D-09 7.656726364047017D-10 + -1.155434775634845D-10 -6.809511887695407D-08 4.016598609268840D-09 + 2.810291377386420D-08 -3.369975942746350D-08 3.135385950869818D-09 + -1.771422635313269D-13 -1.155434775634845D-10 9.999941390788081D-01 + 9.258888843571604D-24 1.602456287903206D-20 2.057477099391917D-22 + 3.790063917561350D-23 1.265028470551178D-23 2.967497825759503D-23 + 2.640151404010411D-17 1.192485938020208D-16 8.872690943367984D-23 + 2.428638932088789D-23 5.485064732149495D-23 5.627280325742889D-15 + 2.097305835946361D-12 1.503074364226984D-22 3.654340714362437D-23 + 7.372330513090450D-23 1.681930622879878D-14 2.737321480594801D-10 + 1.947877940148048D-22 4.299390383295486D-23 7.854277825614900D-23 + -4.953118332693719D-16 8.360855063838102D-11 1.958871505723208D-22 + 3.781022940498793D-23 6.825535047624489D-23 -3.696815741287290D-17 + 1.911188763671634D-13 1.445337823900475D-22 1.984496358497428D-23 + 4.766340503378597D-23 -4.550524242880046D-19 -1.640866931465110D-17 + 5.772616522788313D-23 -4.807225270830030D-24 2.362661130331001D-23 + -1.189888325165020D-20 -1.973999840420913D-19 -2.738506020014500D-23 + -2.428158042480967D-23 2.509290808861137D-24 -1.294584510672371D-21 + -3.717966827098453D-21 -7.478883533280463D-23 -2.996065950125539D-23 + -1.037705815595532D-23 -3.566438890326746D-22 -5.413638615218143D-22 + -7.477866218257090D-23 -2.431505337074001D-23 -1.238172726552106D-23 + -1.375019772551033D-22 -1.876708297674201D-22 -5.030145687504091D-23 + -1.532134485362388D-23 -7.948924568162411D-24 -5.671434067641046D-23 + -7.661519347879783D-23 -2.663720744022099D-23 -8.085988361583657D-24 + -3.645409862282249D-24 -2.248603203033078D-23 -3.072957800279242D-23 + -1.198979750198010D-23 -3.714077048638117D-24 -1.364280504177280D-24 + -8.197194872253568D-24 -1.145321036994424D-23 -4.748082791043800D-24 + -1.512755170592547D-24 -4.417921329419716D-25 -2.697872741419652D-24 + -3.879402572849811D-24 -1.677462227854547D-24 -5.512122187882033D-25 + -1.265862414857133D-25 -7.973125637443234D-25 -1.184497526155601D-24 + -5.315078538823665D-25 -1.805181470815384D-25 -3.233673662629892D-26 + -2.112101611057460D-25 -3.253289983263135D-25 -1.514428048749681D-25 + -5.326447996620163D-26 -7.390221523433456D-27 -5.021731366753499D-26 + -8.038901845796694D-26 -3.888457796247278D-26 -1.419193740413248D-26 + -1.513852580882299D-27 -1.072950979457684D-26 -1.788974446777135D-26 + -9.009346205447938D-27 -3.419209741603590D-27 -2.782304323808742D-28 + -2.061430478961550D-27 -3.589193859239163D-27 -1.886021979637610D-27 + -7.457784301440527D-28 -4.595369958630025D-29 -3.566718256788164D-28 + -6.497723631603045D-28 -3.570664487244213D-28 -1.474525909938138D-28 + 1.000000000000000D+00 1.000000000000000D+00 1.000000000000000D+00 + 1.000000000000000D+00 1.000000000000000D+00 7.811995148658752D-01 + -7.201683521270752D-01 0.0 0.0 + -5.653844921875000D+04 1.740456342697144D+00 -8.308809995651245D-02 + 8.304953575134277D-02 -5.771726608276367D+00 -5.449882812500000D+04 + 9.420697018504143D-01 2.393694594502449D-02 -2.386506274342537D-02 + 7.188270683400333D-05 0.0 0.0 + -5.246062109375000D+04 1.049086261540651D+00 1.366583108901978D-01 + -1.281171441078186D-01 0.0 0.0 + -5.045838671875000D+04 1.151831865310669D+00 4.490368068218231D-02 + -4.476334899663925D-02 0.0 -4.844616015625000D+04 + 1.070025980472565D+00 1.036765098571777D+00 -1.198760032653809D+00 + -1.727943420410156D-01 0.0 -5.611478125000000D+04 + 2.215560913085937D+00 -1.629607677459717D-01 1.629607677459717D-01 + -2.116955566406250D+01 -5.408718359375000D+04 8.621966838836670D-01 + 1.399642601609230D-02 -1.399642601609230D-02 0.0 + -2.007014927585260D-07 1.844083786010742D+00 -5.207436718750000D+04 + 1.039153832942247D+00 2.189477086067200D-01 -2.052634358406067D-01 + 1.824564114212990D-02 0.0 -5.007060937500000D+04 + 1.231180489063263D+00 7.386076450347900D-02 -7.407057285308838D-02 + 0.0 0.0 -4.807021875000000D+04 + 1.099351406097412D+00 1.389152526855469D+00 -1.331271171569824D+00 + 0.0 0.0 -5.567945703125000D+04 + 2.367364883422852D+00 -2.162640094757080D-01 2.162640094757080D-01 + -4.326069641113281D+01 -5.366410156250000D+04 8.088933825492859D-01 + -1.824025437235832D-02 1.824025437235832D-02 -3.646347999572754D+00 + -5.166330859375000D+04 1.006917160004377D+00 2.334227561950684D-01 + -2.275872230529785D-01 0.0 -4.967141796875000D+04 + 1.252006113529205D+00 8.269733190536499D-02 -8.349931240081787D-02 + 0.0 0.0 -4.768283984375000D+04 + 1.108648717403412D+00 1.188438415527344D+00 -1.216734886169434D+00 + 0.0 0.0 -5.523291015625000D+04 + 2.239842414855957D+00 -2.303062677383423D-01 2.303062677383423D-01 + 6.817922439950053D-06 -6.265542602539062D+01 -5.322976562500000D+04 + 7.948511838912964D-01 -5.301721021533012D-02 5.301721021533012D-02 + 0.0 -1.431075477600098D+01 -5.124100000000000D+04 + 9.721402078866959D-01 2.035216093063354D-01 -2.001296281814575D-01 + 0.0 0.0 -4.926116406250000D+04 + 1.225186288356781D+00 7.491928339004517D-02 -7.571291923522949D-02 + 0.0 -4.728442578125000D+04 1.100826203823090D+00 + 9.620693325996399D-01 -9.302363991737366D-01 0.0 + 0.0 -5.477548437500000D+04 1.955817461013794D+00 + -2.077405452728271D-01 2.077405452728271D-01 -7.184405517578125D+01 + -5.278476953125000D+04 8.174169063568115D-01 -7.419836521148682D-02 + 7.419836521148682D-02 0.0 -2.535458374023437D+01 + -5.080805859375000D+04 9.509590044617653D-01 1.569298505783081D-01 + -1.486306786537170D-01 0.0 -4.884024609375000D+04 + 1.173709630966187D+00 5.782072991132736D-02 -5.818950012326241D-02 + 0.0 -4.687537109375000D+04 1.083329916000366D+00 + 6.685049533843994D-01 -6.127962470054626D-01 1.114175319671631D-01 + 0.0 -5.430739843750000D+04 1.642910003662109D+00 + -1.625726222991943D-01 1.625726222991943D-01 -6.851022338867187D+01 + -5.232892187500000D+04 8.625847697257996D-01 -7.636785507202148D-02 + 7.636785507202148D-02 -3.171057128906250D+01 -5.036466406250000D+04 + 9.487895332276821D-01 8.871358633041382D-02 -9.425818920135498D-02 + 0.0 -4.840866406250000D+04 1.119902253150940D+00 + 3.970580548048019D-02 -3.875695168972015D-02 -1.868509128689766D-02 + 0.0 0.0 -4.645562890625000D+04 + 1.063922047615051D+00 4.062695503234863D-01 -3.618338108062744D-01 + 0.0 0.0 0.0 + -5.382864453125000D+04 1.385215580463409D+00 -1.119138002395630D-01 + 1.119064092636108D-01 -5.542092895507812D+01 -5.186281250000000D+04 + 9.132438302040100D-01 -6.388950347900391D-02 6.388950347900391D-02 + 3.410244971746579D-06 -3.133937072753906D+01 -4.991057812500000D+04 + 9.612678736448288D-01 5.389992520213127D-02 -5.187865719199181D-02 + 0.0 -4.796682031250000D+04 1.077387571334839D+00 + 2.305793017148972D-02 -2.265761792659760D-02 0.0 + 0.0 -4.602543750000000D+04 1.047769121825695D+00 + 1.912040114402771D-01 -1.852288842201233D-01 0.0 + 0.0 -5.333987500000000D+04 1.210645496845245D+00 + -6.831127405166626D-02 6.840813159942627D-02 -2.901747131347656D+01 + -5.138643750000000D+04 9.568538181483746D-01 -4.531185328960419D-02 + 4.531185328960419D-02 0.0 2.789366590150166D-06 + -2.550216674804687D+01 -4.944372265625000D+04 9.798460863530636D-01 + 2.319774404168129D-02 -2.464760094881058D-02 0.0 + -4.751471484375000D+04 1.049969587475061D+00 1.143456250429153D-02 + -1.153665781021118D-02 0.0 -4.558538281250000D+04 + 1.036741930991411D+00 9.722059965133667D-02 -8.506804704666138D-02 + 0.0 0.0 -5.284100000000000D+04 + 1.110036253929138D+00 -3.708969801664352D-02 3.684729337692261D-02 + 0.0 -5.090041796875000D+04 9.880154319107533D-01 + -2.788387611508369D-02 2.788387611508369D-02 0.0 + 2.178428985644132D-06 -1.827397155761719D+01 -4.882808593750000D+04 + 9.973230699542910D-01 0.0 -1.018907129764557D-02 + 0.0 -4.705296093750000D+04 1.035176958888769D+00 + 4.984032362699509D-03 -5.139783024787903D-03 0.0 + -4.513525781250000D+04 1.030361384153366D+00 1.168304681777954D-01 + -2.920761704444885D-02 0.0 -5.233266406250000D+04 + 1.059764284640551D+00 -1.802648976445198D-02 2.338571846485138D-02 + 0.0 -5.040475000000000D+04 1.007092889398336D+00 + -1.836121454834938D-02 1.836121454834938D-02 0.0 + 0.0 -4.950804687500000D+04 1.010153356939554D+00 + 2.381398528814316D-02 -4.465121775865555D-03 0.0 + -4.658174609375000D+04 1.028476625680923D+00 0.0 + -1.977193402126431D-03 0.0 0.0 + -4.467566796875000D+04 1.027193285524845D+00 0.0 + -1.157634705305099D-02 0.0 -5.181486718750000D+04 + 1.037754297256470D+00 -7.477629929780960D-03 0.0 + 0.0 -4.989975390625000D+04 1.017277095466852D+00 + 0.0 0.0 0.0 + -4.388837500000000D+04 1.017999485135078D+00 0.0 + -2.978397300466895D-03 0.0 -4.610101562500000D+04 + 1.025970183312893D+00 0.0 0.0 + 0.0 -4.420680468750000D+04 1.025839652866125D+00 + 0.0 0.0 0.0 + -5.128776953125000D+04 1.029255405068398D+00 -4.347227513790131D-03 + 0.0 0.0 -4.938562109375000D+04 + 1.022067971527576D+00 0.0 0.0 + 0.0 -3.449262500000000D+04 1.022117994725704D+00 + 0.0 0.0 0.0 + -4.561122656250000D+04 1.025238625705242D+00 0.0 + -1.408393494784832D-03 0.0 -4.372866796875000D+04 + 1.025346063077450D+00 0.0 0.0 + 0.0 -5.075201562500000D+04 1.026350062340498D+00 + 0.0 0.0 0.0 + -4.886151953125000D+04 1.024067506194115D+00 0.0 + 0.0 0.0 -1.051556250000000D+05 + 1.024003818631172D+00 0.0 1.899568364024162D-02 + 0.0 -4.511256640625000D+04 1.025104723870754D+00 + 0.0 3.719797125086188D-03 0.0 + -4.324184375000000D+04 1.025196127593517D+00 0.0 + 0.0 0.0 -5.020757421875000D+04 + 1.025468096137047D+00 0.0 0.0 + 0.0 -4.833664062500000D+04 1.024810910224915D+00 + 0.0 0.0 0.0 + 0.0 1.024764768779278D+00 0.0 + 0.0 0.0 -4.460540625000000D+04 + 1.025115087628365D+00 0.0 0.0 + 0.0 -4.274633984375000D+04 1.025160629302263D+00 + 0.0 0.0 0.0 + -4.965484765625000D+04 1.025229826569557D+00 0.0 + 0.0 0.0 -4.778404687500000D+04 + 1.025058060884476D+00 0.0 0.0 + 0.0 0.0 1.025037329643965D+00 + 0.0 0.0 0.0 + -4.408996093750000D+04 1.025137882679701D+00 0.0 + 0.0 0.0 -4.224254687500000D+04 + 1.025155592709780D+00 0.0 0.0 + 0.0 -4.909400000000000D+04 1.025172512978315D+00 + 0.0 0.0 0.0 + -4.720000000000000D+04 1.025131687521935D+00 0.0 + 0.0 0.0 0.0 + 1.025124348700047D+00 0.0 0.0 + 0.0 -4.356644531250000D+04 1.025150395929813D+00 + 0.0 0.0 0.0 + -4.173044140625000D+04 1.025156177580357D+00 0.0 + 0.0 0.0 -4.852547656250000D+04 + 1.025160226970911D+00 0.0 0.0 + 0.0 -4.671788281250000D+04 1.025151398032904D+00 + 0.0 0.0 0.0 + 0.0 1.025149203836918D+00 0.0 + 0.0 0.0 -4.303501953125000D+04 + 1.025155294686556D+00 0.0 0.0 + 0.0 -4.121045312500000D+04 1.025156926363707D+00 + 0.0 0.0 0.0 + -4.794926171875000D+04 1.025157883763313D+00 0.0 + 0.0 0.0 -4.640971484375000D+04 + 1.025156144052744D+00 0.0 0.0 + 0.0 0.0 1.025155574083328D+00 + 0.0 0.0 0.0 + -4.249608593750000D+04 1.025156859308481D+00 0.0 + 0.0 0.0 -4.068298437500000D+04 + 1.025157265365124D+00 0.0 0.0 + 0.0 -4.736593359375000D+04 1.025157485157251D+00 + 0.0 0.0 0.0 + -4.888311328125000D+04 1.025157172232866D+00 0.0 + 0.0 0.0 0.0 + 1.025157041847706D+00 0.0 0.0 + 0.0 -4.194966796875000D+04 1.025157287716866D+00 + 0.0 0.0 0.0 + -4.014781640625000D+04 1.025157377123833D+00 0.0 + 0.0 0.0 -4.677552734375000D+04 + 1.025157421827316D+00 0.0 0.0 + 0.0 -9.480337500000000D+04 1.025157373398542D+00 + 0.0 0.0 0.0 + 0.0 1.025157347321510D+00 0.0 + 0.0 0.0 -4.139616796875000D+04 + 1.025157388299704D+00 0.0 0.0 + 0.0 -3.960572656250000D+04 1.025157406926155D+00 + 0.0 0.0 0.0 + -4.617843750000000D+04 1.025157414376736D+00 0.0 + 0.0 0.0 0.0 + 1.025157406926155D+00 0.0 0.0 + 0.0 0.0 1.025157403200865D+00 + 0.0 0.0 0.0 + -4.083592968750000D+04 1.025157410651445D+00 0.0 + 0.0 0.0 -3.905636718750000D+04 + 1.025157410651445D+00 diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Demo/HB/can_24.psa --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Demo/HB/can_24.psa Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,12 @@ +1SYMMETRIC PATTERN FROM CANNES,LUCIEN MARRO,JUNE 1981. CAN 24 + 8 2 6 0 0 +PSA 24 24 92 0 +(16I5) (16I5) + 1 10 16 22 28 34 39 45 52 55 60 65 69 71 73 74 + 77 78 81 83 86 89 91 92 93 + 1 6 7 13 14 18 19 20 22 2 9 10 14 15 18 3 + 7 12 21 22 23 4 8 11 16 19 20 5 8 10 15 16 + 17 6 7 13 14 18 7 12 13 20 22 24 8 10 15 16 + 17 18 19 9 10 15 10 14 15 18 19 11 19 20 21 22 + 12 13 22 24 13 24 14 18 15 16 17 19 17 18 19 20 + 19 20 20 21 22 21 22 23 22 23 23 24 diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Demo/HB/fs_183_6.rua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Demo/HB/fs_183_6.rua Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,361 @@ +1UNSYMMETRIC FACSIMILE CONVERGENCE MATRIX FS 183 6 + 357 17 72 268 0 +RUA 183 183 1069 0 +(11I7) (15I5) (4D20.12) + 1 106 142 149 152 155 158 162 166 170 175 + 181 187 196 199 203 207 210 213 216 224 232 + 239 248 255 264 270 275 280 287 292 296 300 + 303 306 309 312 315 318 321 324 327 342 352 + 356 362 365 371 374 431 435 439 440 441 442 + 443 449 456 460 466 472 479 486 490 496 503 + 507 509 515 517 523 529 532 538 545 547 554 + 558 565 567 574 581 588 590 595 599 601 607 + 610 612 618 625 632 639 646 648 655 659 661 + 668 672 674 676 682 685 690 693 697 701 706 + 709 711 717 720 726 732 736 739 744 747 749 + 753 759 765 768 773 779 785 790 795 801 807 + 813 819 828 837 844 948 950 953 965 969 971 + 973 976 977 978 979 980 981 982 983 984 985 + 986 987 988 989 991 996 1001 1006 1009 1012 1017 + 1020 1024 1027 1030 1033 1036 1039 1042 1045 1048 1050 + 1053 1056 1058 1061 1063 1065 1068 1070 + 1 2 20 21 22 23 24 26 27 42 43 44 49 50 51 + 56 57 59 60 61 62 64 65 67 68 70 71 72 73 74 + 75 76 78 79 80 81 82 83 84 86 87 89 90 91 92 + 93 94 95 96 98 99 101 102 103 104 105 106 107 109 110 + 112 113 114 115 116 118 119 122 123 124 125 126 127 128 129 + 130 131 132 133 136 137 140 144 158 159 160 161 162 163 164 + 165 166 167 168 169 170 171 172 173 174 175 176 177 179 182 + 1 2 42 43 45 46 51 52 53 57 58 62 63 65 66 + 76 77 84 85 96 97 99 100 108 109 110 111 118 119 120 + 121 136 137 140 141 147 3 49 137 142 143 144 146 4 137 + 138 5 137 158 6 56 137 7 64 70 137 8 59 60 137 + 9 74 78 137 10 80 81 82 137 11 91 92 93 94 137 + 12 20 42 68 69 137 13 20 21 42 43 69 73 137 158 + 14 125 137 15 103 137 178 16 115 137 181 17 112 137 18 + 122 137 19 123 137 4 20 43 45 48 137 138 140 4 21 + 43 45 57 137 140 158 4 6 22 43 56 62 137 4 7 + 12 21 23 43 64 65 137 4 7 24 43 70 76 137 4 + 8 13 21 25 43 60 84 137 4 26 57 71 137 158 27 + 56 57 61 137 28 56 62 90 137 29 57 64 65 87 137 + 158 30 57 70 76 158 20 31 43 137 21 32 43 137 33 + 127 137 34 128 137 35 130 137 36 129 137 37 131 137 38 + 132 137 39 133 137 40 126 137 41 137 180 1 2 12 13 + 20 21 42 43 69 136 137 139 140 148 158 1 2 42 43 + 46 47 49 55 136 137 1 2 44 137 2 45 53 137 140 + 145 2 43 46 43 45 47 54 137 140 48 137 138 1 2 + 3 20 31 43 49 55 56 57 59 60 61 62 64 65 67 + 68 70 71 73 74 76 78 80 81 82 87 90 91 92 93 + 94 96 99 143 144 158 159 160 161 162 163 164 165 166 167 + 168 169 170 171 172 173 174 175 176 177 1 2 50 51 2 + 51 52 53 52 53 54 55 1 2 49 56 144 159 1 2 + 49 57 58 144 158 2 57 58 149 1 2 49 59 144 160 + 1 2 49 60 144 161 1 2 43 49 61 67 144 1 2 + 49 56 62 63 144 2 62 63 150 1 2 49 64 144 162 + 1 2 49 64 65 66 144 2 65 66 151 57 67 1 2 + 49 68 144 163 43 69 1 2 49 70 144 164 1 2 49 + 71 144 165 4 21 72 1 2 49 73 144 166 1 2 49 + 74 75 144 167 53 75 1 2 49 70 76 77 144 2 76 + 77 152 1 2 49 78 79 144 168 53 79 1 2 49 80 + 83 144 169 1 2 49 81 86 144 170 1 2 49 82 89 + 144 171 53 83 1 2 60 84 85 2 84 85 153 53 86 + 1 2 49 87 144 172 57 62 88 53 89 1 2 49 90 + 144 173 1 2 49 91 95 144 174 1 2 49 92 98 144 + 175 1 2 49 93 101 144 176 1 2 49 94 102 144 177 + 53 95 1 2 49 59 96 97 144 2 96 97 154 53 98 + 1 2 49 74 99 100 144 2 99 100 155 53 101 53 102 + 1 2 43 72 103 104 104 105 137 1 2 43 105 106 4 + 20 106 1 2 107 179 2 108 109 156 1 2 108 109 110 + 2 110 111 53 111 1 2 43 72 112 113 113 114 137 1 + 2 43 72 106 114 1 2 43 67 104 115 1 2 116 182 + 117 137 183 1 2 118 119 121 2 119 120 53 120 2 118 + 121 157 1 2 43 72 113 122 1 2 43 104 123 124 4 + 22 124 1 2 43 106 125 1 2 20 26 43 126 1 2 + 20 22 43 127 1 2 21 43 128 1 2 23 43 129 1 + 2 21 22 43 130 1 2 20 27 43 131 1 2 20 24 + 43 132 1 2 21 26 43 133 4 8 13 21 43 59 96 + 134 137 4 9 13 21 43 74 99 135 137 1 2 42 43 + 136 137 138 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 31 32 33 34 35 36 37 38 39 40 41 42 43 + 44 45 47 48 56 57 59 60 61 62 64 65 68 70 71 + 73 74 76 78 80 81 82 84 87 90 91 92 93 94 96 + 99 103 104 105 112 113 114 115 117 122 123 125 126 127 128 + 129 130 131 132 133 134 135 136 137 138 140 142 158 178 180 + 181 183 43 138 136 137 139 1 2 4 20 21 43 45 47 + 57 136 140 141 2 53 140 141 50 142 52 143 20 43 144 + 145 146 147 148 149 150 151 152 153 154 155 156 157 49 158 + 20 21 43 158 159 21 27 43 56 160 20 23 43 64 161 + 22 43 162 20 43 163 21 26 43 158 164 43 72 165 20 + 21 43 166 24 43 167 26 158 168 25 43 169 29 43 170 + 28 43 171 43 88 172 43 88 173 43 134 174 135 175 30 + 43 176 26 56 177 107 178 41 43 179 109 180 116 181 43 + 117 182 118 183 + 1.847033583457D-01 -3.719276202958D-07 -4.461673147532D-09 -8.427241381743D-09 + -2.952632177562D-09 -1.230224173345D-09 -5.684978286767D-10 -1.382403178450D-09 + -1.856794974832D-09 1.144783933290D-10 1.190860003543D-07 -4.043289140002D-08 + 6.134758538482D-08 2.882401728331D-09 -2.882401728331D-09 4.701102853922D-09 + 5.438916710635D-08 2.074214768257D-09 4.409820290234D-10 2.310863880436D-10 + 9.891607491932D-09 2.684350720208D-09 1.838141765470D-09 -2.566882438264D-09 + 9.518614355670D-09 1.651578667869D-09 1.400407236018D-10 -1.388193610099D-08 + 8.256918013496D-09 4.026496986174D-10 -9.548140743659D-11 1.319228178802D-09 + 9.872533764800D-10 -8.178430337704D-11 2.995364457734D-10 1.165688277582D-09 + 6.650224788487D-10 -4.160228413520D-11 5.159413302221D-10 -1.619011496642D-10 + 1.298098286898D-10 -9.236423317343D-11 1.182732136117D-10 4.400353753151D-10 + 2.727607746019D-10 1.082721999108D-09 1.434879053241D-09 -6.111602434929D-11 + 7.081639208067D-10 -3.788344091693D-11 7.499472911528D-10 -1.503780554317D-10 + -1.992887573946D-10 3.841609782970D-09 -7.828529540224D-09 4.552122268525D-10 + -2.273182572124D-09 8.045368924923D-10 2.793167046723D-09 -2.793167046724D-09 + 6.855383527411D-09 -9.555567765423D-09 4.847585525976D-10 2.335796050220D-09 + 7.201575068565D-10 1.991127877266D-09 -1.991127877266D-09 2.700184238015D-09 + 1.651123707030D-09 -1.651123707030D-09 8.779995658213D-10 7.625016818901D-10 + 1.273878662141D-09 3.064293184879D-09 1.230224173345D-09 1.678753515422D-09 + 1.856794974828D-09 5.684978286771D-10 6.199014965641D-10 2.448465652502D-52 + -1.103713326844D-07 1.040881988802D-12 -6.134758538482D-08 -5.438916710635D-08 + -1.459271034585D-08 -2.782378689063D-09 -9.569233592455D-10 -4.522492485678D-09 + -9.518614355670D-09 -2.970806846671D-09 -1.400407236018D-10 -8.256918013496D-09 + -1.057115582334D-09 -9.054690731029D-10 -2.579341616382D-10 -1.003787127918D-09 + -5.726582456752D-10 -1.298098286898D-10 -1.182732136117D-10 -3.789193509658D-10 + -2.348773336850D-10 -9.323439436764D-10 -1.235590295847D-09 -8.045368924923D-10 + -7.201575068565D-10 -4.250627856579D-16 1.847055555443D-01 2.206024722187D-13 + 1.904376186660D-08 -3.706348378336D-08 -1.904376186660D-08 3.861889986008D-09 + -3.861889986002D-09 -3.861889986015D-09 2.928647459573D-08 -2.928647459573D-08 + 5.757801375901D-09 -5.757801375901D-09 1.069963117214D-09 -1.069963117214D-09 + 7.679089398996D-10 -7.679089398996D-10 3.003240578905D-10 -3.003240578905D-10 + 4.122148195741D-10 -4.122148195741D-10 4.365364829098D-10 -4.365364829098D-10 + -3.513984349104D-09 3.513984349104D-09 3.746925132324D-09 -3.746925132324D-09 + 2.504967329464D-09 2.713294194836D-09 -2.713294194836D-09 -2.504967329464D-09 + 1.203714182606D-51 3.706348378336D-08 -7.008254286648D-14 -1.500950157540D-13 + -2.500000000000D-06 1.847229489334D-01 1.625711012677D-10 3.706348378340D-09 + -3.706348378335D-09 -1.625711012698D-10 -1.625711012677D-10 -2.000000000000D-05 + 1.847029460547D-01 9.902723341668D-10 -9.902723341667D-10 1.847029450890D-01 + 2.457629270846D-11 -2.457629270846D-11 1.847029460141D-01 -9.496895772062D-10 + 9.496895772072D-10 1.847029527910D-01 -4.020236988304D-09 -3.706348378335D-09 + 7.726585366653D-09 1.847029529962D-01 -6.798659578255D-09 -1.133109929709D-09 + 7.931769507959D-09 1.847029530529D-01 -1.982942376991D-09 -6.005482627459D-09 + 7.988425004450D-09 1.847029570932D-01 -1.246680818167D-09 -7.075755995003D-09 + -3.706348378335D-09 1.202878519150D-08 1.847029556781D-01 -1.246680818167D-09 + -6.064933710003D-10 -3.706348378335D-09 -5.054111425002D-09 1.061363399250D-08 + 1.847029723998D-01 -1.139575996950D-14 1.139576217480D-14 -2.733538205877D-08 + -1.139576217480D-14 2.733538205877D-08 1.847030326876D-01 -3.617187029084D-14 + -3.617175913233D-14 7.234362556953D-14 -3.617181471159D-14 -3.617181278477D-14 + -8.762304482526D-08 8.762304482526D-08 -3.617181254052D-14 1.847029472803D-01 + -2.215887192612D-09 2.215887192612D-09 1.847029666287D-01 -1.819480113001D-08 + 2.156420874667D-08 -3.369407616668D-09 1.847029922362D-01 -3.706348378335D-08 + 4.717170663335D-08 -1.010822285000D-08 1.847030259302D-01 -8.086578280003D-08 + 8.086578280003D-08 1.847029956056D-01 -5.054111425002D-08 5.054111425002D-08 + 1.847029703350D-01 -2.527055712501D-08 2.527055712501D-08 -3.125510468576D-08 + 1.847029763195D-01 -3.125510469012D-08 -4.383761260308D-17 0.0 + 3.125510464629D-08 0.0 4.382661005511D-17 0.0 + 1.847030008084D-01 0.0 -2.259574994278D-17 -5.574398606689D-08 + 5.574398604462D-08 2.246113765381D-17 0.0 0.0 + 0.0 1.847030124526D-01 0.0 0.0 + -6.738815233337D-08 6.738815233413D-08 0.0 0.0 + 0.0 0.0 1.847029956056D-01 0.0 + 0.0 -5.054111425002D-08 5.054111424976D-08 0.0 + 0.0 1.847029956056D-01 0.0 0.0 + -5.054111425002D-08 5.054111425034D-08 0.0 0.0 + 0.0 0.0 1.847029501186D-01 0.0 + 0.0 -5.054111425056D-09 5.054111424340D-09 0.0 + 1.847029467491D-01 0.0 -1.684703808334D-09 1.684703808322D-09 + 0.0 1.847029565204D-01 0.0 0.0 + -1.145598589667D-08 1.145598589640D-08 1.847029642701D-01 0.0 + 0.0 -1.920562341501D-08 1.920562341711D-08 1.847029642701D-01 + 0.0 0.0 0.0 -1.920562341501D-08 + 1.920562341525D-08 0.0 1.847029450644D-01 0.0 + 0.0 0.0 0.0 -3.706348346422D-09 + 1.847029487708D-01 -3.706348346422D-09 3.706348346422D-09 -1.111904513493D-08 + 1.847029561835D-01 -1.111904513493D-08 1.111904513493D-08 1.847030710273D-01 + -1.259628398745D-07 1.259628398745D-07 1.847031578433D-01 -2.127788399299D-07 + 2.127788399299D-07 1.847032483111D-01 -3.032466855001D-07 3.032466855001D-07 + 1.847030479367D-01 -1.028722755757D-07 1.028722755758D-07 1.847031472617D-01 + -2.021972313040D-07 2.021972313040D-07 1.847030531121D-01 -1.080476738911D-07 + 1.080476738911D-07 1.847029753940D-01 -3.032958469560D-08 3.032958469560D-08 + 1.847031167522D-01 -1.716877491549D-07 1.716877491550D-07 1.847029888667D-01 + 4.380229901688D-08 -4.380229901668D-08 2.162322755874D-02 -2.159089062210D-02 + 7.403155341658D-07 1.269397070520D-06 -1.375006599097D-06 -6.346985352602D-07 + 2.063755196007D-01 -6.349214311879D-07 -1.375004465968D-06 1.715103318883D-53 + 2.226157903684D-10 0.0 -3.233695633350D-05 -1.500000000000D-05 + -6.346987395270D-07 1.136828992780D+01 -1.025418486412D+01 1.456594534583D-11 + 1.266709834095D+01 -1.114105063695D+00 -9.632867826155D-08 3.987593050105D-08 + -3.987593050105D-08 4.632458716482D-51 -1.136828975598D+01 0.0 + -2.223809030011D-08 1.847029673025D-01 2.223809027155D-08 0.0 + 1.847579453340D-01 -3.000000000000D-05 2.695526101250D-10 -2.695526093335D-10 + -2.500000000000D-05 -6.072063216193D-02 -6.072063216165D-02 2.454235772261D-01 + -2.651534895039D-09 0.0 1.847329477160D-01 -3.000000000000D-05 + 2.651534895039D-09 2.244826079078D-17 1.847029450831D-01 1.867160023467D-11 + -1.867160023409D-11 2.806985167356D+00 -2.806985167362D+00 5.553294944544D-03 + -2.025786930574D-08 -2.025780774980D-08 2.418462261829D-08 2.997241497978D+00 + -2.420314707957D-08 8.077212345811D-10 5.438916911567D-10 1.615750248838D-10 + 6.465663647432D-11 1.863605937612D-11 3.690836612132D-10 2.369817612475D-10 + 6.858762712566D-11 -1.863570149278D-11 7.676301581984D-10 1.903564507687D-10 + 1.129363521820D-11 6.658804341147D-10 5.726902954421D-11 4.922613821110D-11 + 7.302162281710D-11 2.080107466611D-11 8.095061777596D-11 4.618207195721D-11 + 1.046853516843D-11 9.538217415503D-12 3.055804827568D-11 1.894169175196D-11 + 7.518905381967D-11 9.964438584132D-11 2.642467459327D-11 2.798361444007D-11 + -5.553294889907D-03 -2.812538488194D+00 -5.438910648609D-10 -1.176812053461D-09 + -1.879989837104D-10 -6.465663647432D-11 -3.055693883732D-10 -7.676454577113D-10 + -2.395814258589D-10 -1.129363521820D-11 -6.658806130563D-10 -8.525210715926D-11 + -7.302108599209D-11 -2.080161149113D-11 -8.095034936346D-11 -4.618269825307D-11 + -1.046853516843D-11 -9.538217415503D-12 -3.055751145067D-11 -1.894204963531D-11 + -7.518842752382D-11 -9.964474372466D-11 1.403492583625D+00 -1.403492583686D+00 + 1.588195528744D+00 -1.403492583680D+00 1.089185606479D+00 1.273888551548D+00 + -1.089185606482D+00 -1.089185606482D+00 1.847029450644D-01 1.847029450644D-01 + 1.847029450644D-01 1.847029450644D-01 4.350827009395D-01 -4.350827009433D-01 + 7.668448156647D-10 6.197856467720D-01 -7.668448156647D-10 -4.350827017076D-01 + 3.649080717567D+00 -2.124220868494D+00 7.975186647603D-10 5.358643512506D+00 + -1.524859849077D+00 -7.975186075522D-10 -3.649080718365D+00 -2.849177309245D-04 + -2.849177309245D-04 1.849928627954D-01 -5.000000000000D-06 5.192922559506D-01 + -5.192922559754D-01 7.668446736793D-10 7.039952017928D-01 -7.668448157585D-10 + -5.192922567283D-01 5.192922559568D-01 -5.192922559568D-01 7.668444858664D-10 + 7.039952017928D-01 -7.668448457748D-10 -5.192922567284D-01 4.350827008612D-01 + -4.350827008612D-01 -4.350827017073D-01 7.668467484525D-10 6.197856467720D-01 + -4.350827017076D-01 -7.668449040245D-10 9.403400310568D-01 -5.155576445380D-01 + 7.668448049200D-10 -9.403400318322D-01 1.549825363425D+00 -4.247823865286D-01 + -7.668448167006D-10 -2.849177309250D-04 -2.849177309245D-04 1.849928627954D-01 + -5.000000000000D-06 5.192922559592D-01 -5.192922559592D-01 7.668449471519D-10 + 7.039952017928D-01 -7.668448155349D-10 -5.192922567284D-01 9.403400310659D-01 + -5.155576445636D-01 7.668452184158D-10 -9.403400318323D-01 1.549825363425D+00 + -4.247823865286D-01 -7.668448258865D-10 -2.849177309199D-04 -2.849177309245D-04 + 1.849928627954D-01 -5.000000000000D-06 0.0 1.847029450644D-01 + 4.350827009381D-01 -4.350827009381D-01 7.668448205427D-10 6.197856467720D-01 + -7.668448149473D-10 -4.350827017076D-01 -4.472000000002D+03 2.236184702945D+03 + 4.350827009255D-01 -4.350827009448D-01 7.668446561058D-10 6.197856468258D-01 + -7.668448218254D-10 -4.350827017613D-01 4.350827007568D-01 -4.350827007568D-01 + 7.668427698781D-10 6.197856467720D-01 -7.668446900881D-10 -4.350827017076D-01 + 0.0 0.0 1.847029450644D-01 4.350827009364D-01 + -4.350827009364D-01 7.668448049201D-10 6.197856467720D-01 -7.668448177886D-10 + -4.350827017076D-01 4.743804932312D-01 -4.350827009500D-01 7.668441251095D-10 + 6.590834391150D-01 -3.929779234304D-02 -7.668448253707D-10 -4.350827017076D-01 + -2.999999999975D-05 1.847329450644D-01 9.403400309955D-01 -5.155576444381D-01 + 7.668444001463D-10 -9.403400318322D-01 1.549825363425D+00 -4.247823865285D-01 + -7.668447696707D-10 -2.849177309241D-04 -2.849177309245D-04 1.849928627954D-01 + -5.000000000000D-06 4.743804932838D-01 -4.350827009530D-01 7.668440849248D-10 + 6.590834391152D-01 -3.929779234303D-02 -7.668448602203D-10 -4.350827017077D-01 + -2.999999999999D-05 1.847329450644D-01 5.052573299108D-01 -4.350827009926D-01 + 7.668427470318D-10 6.899602759560D-01 -7.017462918400D-02 -7.668448254578D-10 + -4.350827017076D-01 5.052573301008D-01 -4.350827009046D-01 7.668446147586D-10 + 6.899602759560D-01 -7.017462918399D-02 -7.668447743280D-10 -4.350827017076D-01 + 5.052573300679D-01 -4.350827009326D-01 7.668438364657D-10 6.899602759560D-01 + -7.017462918399D-02 -7.668448631294D-10 -4.350827017076D-01 -3.000000000044D-05 + 1.847329450644D-01 9.403400308871D-01 -5.155576445108D-01 -9.403400310654D-01 + 1.549825362658D+00 -4.247823865286D-01 -2.849177309421D-04 -2.849177309245D-04 + 1.849928627954D-01 -5.000000000000D-06 -2.999999999987D-05 1.847329450644D-01 + 4.350827006437D-01 -4.350827010779D-01 7.668440769557D-10 6.197856467720D-01 + -7.668449051812D-10 -4.350827017076D-01 0.0 0.0 + 1.847029450644D-01 -2.999999999970D-05 1.847329450644D-01 4.350827005205D-01 + -4.350827005205D-01 7.668488614599D-10 6.197856467720D-01 -7.668447518146D-10 + -4.350827017076D-01 5.052573300039D-01 -4.350827010178D-01 7.668460149417D-10 + 6.899602759560D-01 -7.017462918399D-02 -7.668448844073D-10 -4.350827017075D-01 + 5.052573301274D-01 -4.350827008233D-01 7.668442740500D-10 6.899602759559D-01 + -7.017462918395D-02 -7.668449594799D-10 -4.350827017075D-01 5.052573300968D-01 + -4.350827009617D-01 7.668445556523D-10 6.899602759560D-01 -7.017462918398D-02 + -7.668447849049D-10 -4.350827017076D-01 5.052573300844D-01 -4.350827009337D-01 + 7.668448795622D-10 6.899602759560D-01 -7.017462918399D-02 -7.668448363304D-10 + -4.350827017076D-01 -2.999999999962D-05 1.847329450644D-01 9.403400309788D-01 + -5.155576446611D-01 7.668446717407D-10 -9.403400318323D-01 1.549825363425D+00 + -4.247823865285D-01 -7.668448516647D-10 -2.849177308965D-04 -2.849177309245D-04 + 1.849928627954D-01 -5.000000000000D-06 -3.000000000037D-05 1.847329450644D-01 + 9.403400310374D-01 -5.155576445930D-01 7.668453760661D-10 -9.403400318323D-01 + 1.549825363425D+00 -4.247823865285D-01 -7.668448690614D-10 -2.849177309083D-04 + -2.849177309245D-04 1.849928627954D-01 -5.000000000000D-06 -2.999999999990D-05 + 1.847329450644D-01 -3.000000000006D-05 1.847329450644D-01 4.350827009285D-01 + -4.350827009431D-01 -4.350827009407D-01 -4.350827009407D-01 6.197856460051D-01 + -4.350827009413D-01 1.847030124526D-01 -6.738815233336D-08 6.738815233336D-08 + 4.350827008982D-01 -4.350827008982D-01 -4.350827009408D-01 6.197856460051D-01 + -8.701654018812D-01 0.0 0.0 1.847029450644D-01 + 4.350827009215D-01 -4.350827009215D-01 6.197856460051D-01 -4.350827009407D-01 + -2.849177309244D-04 1.849928627954D-01 -2.849177309245D-04 -5.000000000000D-06 + 4.350827009261D-01 -1.030031442269D-02 -4.247823865285D-01 1.044568032534D+00 + -4.350827009407D-01 4.247823865384D-01 6.094853315930D-01 -4.247823865286D-01 + -2.999999999995D-05 1.847329450644D-01 4.350827009375D-01 -4.350827009458D-01 + -4.350827009408D-01 -4.350827009408D-01 6.197856460052D-01 -4.350827009406D-01 + 1.847030124526D-01 -6.738815233337D-08 6.738815233335D-08 4.350827008530D-01 + -4.350827009655D-01 -4.350827009404D-01 -4.350827009409D-01 -4.350827009404D-01 + 6.197856460052D-01 4.350827009246D-01 -4.350827009487D-01 -4.350827009408D-01 + -4.350827009407D-01 -4.350827009411D-01 6.197856460052D-01 4.350827009394D-01 + -4.350827009394D-01 6.197856460051D-01 -4.350827009407D-01 1.847030124526D-01 + 6.738815233404D-08 -6.738815233336D-08 4.350827009232D-01 -1.030031443112D-02 + 1.044568032534D+00 -4.350827009407D-01 -4.247823865285D-01 4.247823865426D-01 + 6.094853315930D-01 -4.247823865285D-01 -2.999999999994D-05 1.847329450644D-01 + -2.852765693834D-04 -2.852765693766D-04 1.849932216338D-01 -5.000000000000D-06 + 4.350827009321D-01 -4.350827009321D-01 -4.350827009407D-01 -4.350827009406D-01 + -4.350827009399D-01 6.197856460052D-01 4.350827009333D-01 -4.350827009672D-01 + -4.350827009407D-01 -4.350827009418D-01 6.197856460052D-01 -4.350827009407D-01 + 0.0 0.0 1.847029450644D-01 4.350827009443D-01 + -4.350827009443D-01 -4.350827009405D-01 -4.350827009405D-01 6.197856460052D-01 + 4.350827009142D-01 -4.350827009867D-01 -4.350827009414D-01 -4.350827009414D-01 + -4.350827009405D-01 6.197856460052D-01 4.350827009181D-01 -4.350827009613D-01 + -4.350827009424D-01 -4.350827009397D-01 -4.350827009407D-01 6.197856460052D-01 + 4.350827009249D-01 -4.350827009249D-01 -8.701654018813D-01 -4.350827009407D-01 + 6.197856460052D-01 4.350827009103D+00 -4.350827009103D+00 -4.350827009408D+00 + -8.701654018815D+00 4.535529954472D+00 4.350827009378D-01 -4.350827009378D-01 + -4.350827009399D-01 -4.350827009399D-01 -4.350827009408D-01 6.197856460052D-01 + 4.350827009142D-01 -4.350827009142D-01 -4.350827009402D-01 -4.350827009421D-01 + -4.350827009407D-01 6.197856460052D-01 4.350827009067D-01 -4.350827009067D-01 + -4.350827009371D-01 -4.350827009405D-01 -4.350827009407D-01 6.197856460051D-01 + 4.350827008840D-01 -4.350827009730D-01 -4.350827009396D-01 -4.350827009396D-01 + -4.350827009407D-01 6.197856460052D-01 0.0 0.0 + 0.0 0.0 0.0 0.0 + -5.054111424998D-08 1.847029956056D-01 5.054111424909D-08 0.0 + 0.0 0.0 0.0 0.0 + 0.0 -1.617315655999D-07 1.847031067960D-01 1.617315655999D-07 + -7.321241211920D+00 7.305730107658D+00 -8.216644762503D+04 0.0 + 8.217914180010D+04 0.0 0.0 1.684191100414D+01 + 1.194789706065D+01 1.152570637560D+00 3.203752497504D+00 5.801590314942D-01 + 7.877230884797D-01 1.334284295919D+00 9.522628221382D-01 4.836031467433D-01 + 7.443160981249D-01 1.154866622749D+00 3.916088093325D+00 3.390590023192D+00 + 3.180521162968D-01 1.839620866156D+00 1.177388037480D+00 2.807229515941D+00 + 1.076822896977D+00 6.399743827870D-01 1.221654249014D+00 4.544019124820D-01 + 1.612808099323D-01 3.488652332781D-02 1.823010530775D-02 5.786837962657D-04 + 1.072060324264D-02 4.862946661956D-02 1.657310781745D-03 6.460785183840D-03 + 9.641696141492D-05 2.800172909824D-01 4.827856220525D-01 1.228202872892D+00 + 6.513945810814D-01 4.647322366774D-01 7.254763669924D-01 1.891034737044D-01 + 2.105061559182D-01 2.698759421753D-01 4.190646638201D-02 5.718157988633D-10 + -1.501867945347D+00 -1.680876639348D+01 -1.198067969175D+01 4.520363481073D-06 + 7.772471985027D-02 -7.877230884717D-01 -7.344192034644D-01 -8.162252761229D-01 + -1.360375460205D-01 -4.862946662078D-02 -1.612808099323D-01 -6.942444591950D-01 + -3.488652332776D-02 -3.916088093312D+00 -6.400398367040D-01 -1.072060324096D-02 + -3.390590023191D+00 -1.200433342982D-01 -1.823010530772D-02 -3.635598124461D-01 + -7.714200456749D-02 -4.378329988966D-01 -2.293410946601D-01 -5.786837962657D-04 + -6.460785183864D-03 -1.657310781756D-03 -1.356510001334D-01 -6.599237844325D-02 + -4.032867571532D-01 -5.499364870271D-01 -3.692655530801D-03 -4.959949739895D-03 + -1.552180105819D+00 1.419500447260D-01 -1.419500447255D-01 -2.807229515941D+00 + 1.542530815584D-01 -1.542530815580D-01 -9.250906008783D-01 1.146811089419D-02 + -1.076822896977D+00 -6.399743827853D-01 -3.180521162486D-01 -2.698759421752D-01 + -4.827856220511D-01 -1.228202872895D+00 -4.647322366781D-01 -6.513945810810D-01 + -7.254763669918D-01 -1.891034737043D-01 -2.105061559178D-01 3.692655530801D-03 + 4.959949739895D-03 5.544942290657D-51 6.299896663454D+01 -4.503227883208D+00 + -3.619795712679D-04 -1.152570637528D+00 -5.801590381620D-01 -2.874407603369D-01 + -4.190646638189D-02 -2.522974366032D-01 -1.146811089416D-02 -7.441570462111D+06 + 7.441570646800D+06 -7.650000000000D+08 -2.162948497570D+08 8.731391781590D+08 + 2.665790957288D+01 -5.034857288321D+01 -9.125978334718D-05 1.053408827308D-04 + 1.818065996370D-05 -1.053408827308D-04 -1.236997844589D-04 2.349867010473D-09 + -1.818065996370D-05 0.0 2.984376498507D+01 -2.984147403773D+00 + -8.054210242782D-02 -6.000094255021D-05 -8.054208350577D-02 2.652589908414D-01 + -5.200000000000D+03 5.200184686907D+03 -4.278550085040D+05 4.278551931939D+05 + -9.360000000000D+03 -9.360000000000D+03 9.360184686907D+03 1.846869073356D-01 + 1.846869073356D-01 1.846869073356D-01 1.846869073356D-01 1.846869073356D-01 + 1.846869073356D-01 1.846869073356D-01 1.846869073356D-01 1.846869073356D-01 + 1.846869073356D-01 1.846869073356D-01 1.846869073356D-01 1.846869073356D-01 + -2.652000000000D+06 2.652000184687D+06 -3.300000000007D+01 -1.924000000000D+02 + -1.924000000000D+02 -3.299999999994D+01 2.255846869073D+02 -1.200000000002D+03 + -1.091999999999D+03 -1.092000000006D+03 -1.200000000000D+03 2.292184686907D+03 + -3.200000000005D+03 -1.923999999994D+02 -1.923999999821D+02 -3.200000000001D+03 + 3.392584686907D+03 -1.924000000000D+02 -1.924000000000D+02 1.925846869073D+02 + -4.472000000000D+03 -2.236000000000D+03 2.236184686907D+03 -1.099999999998D+03 + -1.924000000000D+02 -1.924000000000D+02 -1.100000000000D+03 1.292584686907D+03 + -1.923999999998D+02 -1.924000000005D+02 1.925846869073D+02 -2.236000000000D+03 + -2.236000000000D+03 -2.236000000000D+03 2.236184686907D+03 -1.923999999999D+02 + -1.923999999999D+02 1.925846869073D+02 -3.329999999981D+01 -3.330000000000D+01 + 3.348468690734D+01 -1.924000000000D+02 -1.924000000002D+02 1.925846869073D+02 + -1.924000000000D+02 -1.924000000000D+02 1.925846869073D+02 -1.924000000000D+02 + -1.923999999999D+02 1.925846869073D+02 -1.923999999995D+02 -1.924000000000D+02 + 1.925846869073D+02 -1.924000000006D+02 -1.924000000000D+02 1.925846869073D+02 + -1.924000000001D+02 -1.924000000000D+02 1.925846869073D+02 -1.924000000000D+02 + 1.925846869073D+02 -1.924000000000D+02 -1.924000000000D+02 1.925846869073D+02 + -3.200000000000D+03 -3.200000000000D+03 3.200184686907D+03 -2.236000000000D+03 + 2.236184686907D+03 -2.235999999999D+03 -2.236000000000D+03 2.236184686907D+03 + -2.235999999997D+03 2.236184686907D+03 -2.236000000000D+03 2.236184686907D+03 + -2.236000000000D+03 -2.236000000000D+03 2.236184686907D+03 -2.235999999997D+03 + 2.236184686907D+03 diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Demo/HB/qc324.cua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Demo/HB/qc324.cua Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,19516 @@ +MODEL H2+ IN AN ELECTROMAGNETIC FIELD, S.I. CHU QC324 + 19512 21 1671 17820 0 +CUA 324 324 26730 0 +(16I5) (16I5) (3D22.16) (3D22.16) + 1 83 165 247 329 411 493 575 657 739 821 903 985 1067 1149 1231 + 1313 1395 1477 1559 1641 1723 1805 1887 1969 2051 2133 2215 2297 2379 2461 2543 + 2625 2707 2789 2871 2953 3035 3117 3199 3281 3363 3445 3527 3609 3691 3773 3855 + 3937 4019 4101 4183 4265 4347 4429 4511 4593 4675 4757 4839 4921 5003 5085 5167 + 5249 5331 5413 5495 5577 5659 5741 5823 5905 5987 6069 6151 6233 6315 6397 6479 + 6561 6643 6726 6809 6892 6975 7058 7141 7224 7307 7390 7473 7556 7639 7722 7805 + 7888 7971 8054 8137 8220 8303 8386 8469 8552 8635 8718 8801 8884 8967 9050 9133 + 9216 9299 9382 9465 9548 9631 9714 9797 9880 9963100461012910212102951037810461 +10544106271071010793108761095911042111251120811291113741145711540116231170611789 +11872119551203812121122041228712370124531253612619127021278512868129511303413117 +13200132831336613449135321361513698137811386413947140301411314196142791436214445 +14528146111469414777148601494315026151091519215275153581544115524156071569015773 +15856159391602216105161881627116354164371652016603166861676916852169351701817101 +17184172671735017433175161759917682177651784817931180141809718180182631834618429 +18512185951867818761188441892719010190931917619259193421942519508195911967419757 +19840199232000620089201712025320335204172049920581206632074520827209092099121073 +21155212372131921401214832156521647217292181121893219752205722139222212230322385 +22467225492263122713227952287722959230412312323205232872336923451235332361523697 +23779238612394324025241072418924271243532443524517245992468124763248452492725009 +25091251732525525337254192550125583256652574725829259112599326075261572623926321 +2640326485265672664926731 + 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 67 68 69 70 71 72 73 74 75 76 77 78 79 80 + 81 82 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 67 68 69 70 71 72 73 74 75 76 77 78 + 79 80 81 83 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 67 68 69 70 71 72 73 74 75 76 + 77 78 79 80 81 84 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 67 68 69 70 71 72 73 74 + 75 76 77 78 79 80 81 85 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 67 68 69 70 71 72 + 73 74 75 76 77 78 79 80 81 86 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 67 68 69 70 + 71 72 73 74 75 76 77 78 79 80 81 87 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 67 68 + 69 70 71 72 73 74 75 76 77 78 79 80 81 88 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 + 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 89 + 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 67 68 69 70 71 72 73 74 75 76 77 78 79 80 + 81 90 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 67 68 69 70 71 72 73 74 75 76 77 78 + 79 80 81 91 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 67 68 69 70 71 72 73 74 75 76 + 77 78 79 80 81 92 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 67 68 69 70 71 72 73 74 + 75 76 77 78 79 80 81 93 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 67 68 69 70 71 72 + 73 74 75 76 77 78 79 80 81 94 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 67 68 69 70 + 71 72 73 74 75 76 77 78 79 80 81 95 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 67 68 + 69 70 71 72 73 74 75 76 77 78 79 80 81 96 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 + 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 97 + 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 67 68 69 70 71 72 73 74 75 76 77 78 79 80 + 81 98 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 67 68 69 70 71 72 73 74 75 76 77 78 + 79 80 81 99 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 67 68 69 70 71 72 73 74 75 76 + 77 78 79 80 81 100 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 67 68 69 70 71 72 73 74 + 75 76 77 78 79 80 81 101 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 67 68 69 70 71 72 + 73 74 75 76 77 78 79 80 81 102 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 67 68 69 70 + 71 72 73 74 75 76 77 78 79 80 81 103 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 67 68 + 69 70 71 72 73 74 75 76 77 78 79 80 81 104 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 + 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 105 + 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 67 68 69 70 71 72 73 74 75 76 77 78 79 80 + 81 106 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 67 68 69 70 71 72 73 74 75 76 77 78 + 79 80 81 107 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 67 68 69 70 71 72 73 74 75 76 + 77 78 79 80 81 108 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 67 68 69 70 71 72 73 74 + 75 76 77 78 79 80 81 109 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 67 68 69 70 71 72 + 73 74 75 76 77 78 79 80 81 110 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 67 68 69 70 + 71 72 73 74 75 76 77 78 79 80 81 111 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 67 68 + 69 70 71 72 73 74 75 76 77 78 79 80 81 112 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 + 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 113 + 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 67 68 69 70 71 72 73 74 75 76 77 78 79 80 + 81 114 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 67 68 69 70 71 72 73 74 75 76 77 78 + 79 80 81 115 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 67 68 69 70 71 72 73 74 75 76 + 77 78 79 80 81 116 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 67 68 69 70 71 72 73 74 + 75 76 77 78 79 80 81 117 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 67 68 69 70 71 72 + 73 74 75 76 77 78 79 80 81 118 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 67 68 69 70 + 71 72 73 74 75 76 77 78 79 80 81 119 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 67 68 + 69 70 71 72 73 74 75 76 77 78 79 80 81 120 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 + 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 121 + 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 67 68 69 70 71 72 73 74 75 76 77 78 79 80 + 81 122 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 67 68 69 70 71 72 73 74 75 76 77 78 + 79 80 81 123 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 67 68 69 70 71 72 73 74 75 76 + 77 78 79 80 81 124 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 67 68 69 70 71 72 73 74 + 75 76 77 78 79 80 81 125 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 67 68 69 70 71 72 + 73 74 75 76 77 78 79 80 81 126 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 67 68 69 70 + 71 72 73 74 75 76 77 78 79 80 81 127 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 67 68 + 69 70 71 72 73 74 75 76 77 78 79 80 81 128 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 + 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 129 + 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 67 68 69 70 71 72 73 74 75 76 77 78 79 80 + 81 130 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 67 68 69 70 71 72 73 74 75 76 77 78 + 79 80 81 131 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 67 68 69 70 71 72 73 74 75 76 + 77 78 79 80 81 132 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 67 68 69 70 71 72 73 74 + 75 76 77 78 79 80 81 133 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 67 68 69 70 71 72 + 73 74 75 76 77 78 79 80 81 134 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 67 68 69 70 + 71 72 73 74 75 76 77 78 79 80 81 135 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 67 68 + 69 70 71 72 73 74 75 76 77 78 79 80 81 136 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 + 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 137 + 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 67 68 69 70 71 72 73 74 75 76 77 78 79 80 + 81 138 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 67 68 69 70 71 72 73 74 75 76 77 78 + 79 80 81 139 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 67 68 69 70 71 72 73 74 75 76 + 77 78 79 80 81 140 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 67 68 69 70 71 72 73 74 + 75 76 77 78 79 80 81 141 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 67 68 69 70 71 72 + 73 74 75 76 77 78 79 80 81 142 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 67 68 69 70 + 71 72 73 74 75 76 77 78 79 80 81 143 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 67 68 + 69 70 71 72 73 74 75 76 77 78 79 80 81 144 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 + 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 145 + 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 67 68 69 70 71 72 73 74 75 76 77 78 79 80 + 81 146 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 67 68 69 70 71 72 73 74 75 76 77 78 + 79 80 81 147 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 67 68 69 70 71 72 73 74 75 76 + 77 78 79 80 81 148 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 67 68 69 70 71 72 73 74 + 75 76 77 78 79 80 81 149 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 67 68 69 70 71 72 + 73 74 75 76 77 78 79 80 81 150 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 67 68 69 70 + 71 72 73 74 75 76 77 78 79 80 81 151 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 67 68 + 69 70 71 72 73 74 75 76 77 78 79 80 81 152 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 + 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 153 + 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 67 68 69 70 71 72 73 74 75 76 77 78 79 80 + 81 154 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 67 68 69 70 71 72 73 74 75 76 77 78 + 79 80 81 155 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 67 68 69 70 71 72 73 74 75 76 + 77 78 79 80 81 156 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 67 68 69 70 71 72 73 74 + 75 76 77 78 79 80 81 157 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 67 68 69 70 71 72 + 73 74 75 76 77 78 79 80 81 158 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 67 68 69 70 + 71 72 73 74 75 76 77 78 79 80 81 159 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 67 68 + 69 70 71 72 73 74 75 76 77 78 79 80 81 160 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 + 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 161 + 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 67 68 69 70 71 72 73 74 75 76 77 78 79 80 + 81 162 1 82 83 84 85 86 87 88 89 90 91 92 93 94 + 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 + 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 + 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 + 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 + 159 160 161 162 163 2 82 83 84 85 86 87 88 89 90 91 + 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 + 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 + 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 + 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 + 156 157 158 159 160 161 162 164 3 82 83 84 85 86 87 88 + 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 + 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 + 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 + 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 + 153 154 155 156 157 158 159 160 161 162 165 4 82 83 84 85 + 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 + 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 + 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 + 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 + 150 151 152 153 154 155 156 157 158 159 160 161 162 166 5 82 + 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 + 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 + 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 + 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 + 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 + 167 6 82 83 84 85 86 87 88 89 90 91 92 93 94 95 + 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 + 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 + 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 + 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 + 160 161 162 168 7 82 83 84 85 86 87 88 89 90 91 92 + 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 + 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 + 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 + 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 + 157 158 159 160 161 162 169 8 82 83 84 85 86 87 88 89 + 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 + 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 + 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 + 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 + 154 155 156 157 158 159 160 161 162 170 9 82 83 84 85 86 + 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 + 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 + 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 + 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 + 151 152 153 154 155 156 157 158 159 160 161 162 171 10 82 83 + 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 + 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 + 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 + 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 + 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 172 + 11 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 + 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 + 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 + 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 + 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 + 161 162 173 12 82 83 84 85 86 87 88 89 90 91 92 93 + 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 + 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 + 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 + 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 + 158 159 160 161 162 174 13 82 83 84 85 86 87 88 89 90 + 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 + 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 + 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 + 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 + 155 156 157 158 159 160 161 162 175 14 82 83 84 85 86 87 + 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 + 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 + 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 + 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 + 152 153 154 155 156 157 158 159 160 161 162 176 15 82 83 84 + 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 + 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 + 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 + 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 + 149 150 151 152 153 154 155 156 157 158 159 160 161 162 177 16 + 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 + 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 + 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 + 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 + 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 + 162 178 17 82 83 84 85 86 87 88 89 90 91 92 93 94 + 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 + 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 + 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 + 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 + 159 160 161 162 179 18 82 83 84 85 86 87 88 89 90 91 + 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 + 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 + 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 + 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 + 156 157 158 159 160 161 162 180 19 82 83 84 85 86 87 88 + 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 + 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 + 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 + 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 + 153 154 155 156 157 158 159 160 161 162 181 20 82 83 84 85 + 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 + 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 + 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 + 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 + 150 151 152 153 154 155 156 157 158 159 160 161 162 182 21 82 + 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 + 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 + 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 + 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 + 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 + 183 22 82 83 84 85 86 87 88 89 90 91 92 93 94 95 + 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 + 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 + 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 + 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 + 160 161 162 184 23 82 83 84 85 86 87 88 89 90 91 92 + 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 + 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 + 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 + 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 + 157 158 159 160 161 162 185 24 82 83 84 85 86 87 88 89 + 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 + 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 + 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 + 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 + 154 155 156 157 158 159 160 161 162 186 25 82 83 84 85 86 + 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 + 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 + 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 + 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 + 151 152 153 154 155 156 157 158 159 160 161 162 187 26 82 83 + 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 + 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 + 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 + 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 + 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 188 + 27 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 + 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 + 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 + 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 + 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 + 161 162 189 28 82 83 84 85 86 87 88 89 90 91 92 93 + 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 + 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 + 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 + 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 + 158 159 160 161 162 190 29 82 83 84 85 86 87 88 89 90 + 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 + 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 + 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 + 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 + 155 156 157 158 159 160 161 162 191 30 82 83 84 85 86 87 + 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 + 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 + 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 + 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 + 152 153 154 155 156 157 158 159 160 161 162 192 31 82 83 84 + 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 + 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 + 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 + 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 + 149 150 151 152 153 154 155 156 157 158 159 160 161 162 193 32 + 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 + 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 + 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 + 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 + 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 + 162 194 33 82 83 84 85 86 87 88 89 90 91 92 93 94 + 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 + 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 + 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 + 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 + 159 160 161 162 195 34 82 83 84 85 86 87 88 89 90 91 + 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 + 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 + 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 + 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 + 156 157 158 159 160 161 162 196 35 82 83 84 85 86 87 88 + 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 + 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 + 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 + 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 + 153 154 155 156 157 158 159 160 161 162 197 36 82 83 84 85 + 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 + 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 + 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 + 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 + 150 151 152 153 154 155 156 157 158 159 160 161 162 198 37 82 + 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 + 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 + 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 + 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 + 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 + 199 38 82 83 84 85 86 87 88 89 90 91 92 93 94 95 + 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 + 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 + 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 + 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 + 160 161 162 200 39 82 83 84 85 86 87 88 89 90 91 92 + 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 + 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 + 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 + 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 + 157 158 159 160 161 162 201 40 82 83 84 85 86 87 88 89 + 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 + 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 + 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 + 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 + 154 155 156 157 158 159 160 161 162 202 41 82 83 84 85 86 + 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 + 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 + 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 + 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 + 151 152 153 154 155 156 157 158 159 160 161 162 203 42 82 83 + 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 + 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 + 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 + 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 + 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 204 + 43 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 + 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 + 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 + 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 + 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 + 161 162 205 44 82 83 84 85 86 87 88 89 90 91 92 93 + 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 + 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 + 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 + 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 + 158 159 160 161 162 206 45 82 83 84 85 86 87 88 89 90 + 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 + 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 + 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 + 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 + 155 156 157 158 159 160 161 162 207 46 82 83 84 85 86 87 + 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 + 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 + 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 + 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 + 152 153 154 155 156 157 158 159 160 161 162 208 47 82 83 84 + 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 + 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 + 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 + 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 + 149 150 151 152 153 154 155 156 157 158 159 160 161 162 209 48 + 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 + 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 + 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 + 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 + 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 + 162 210 49 82 83 84 85 86 87 88 89 90 91 92 93 94 + 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 + 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 + 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 + 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 + 159 160 161 162 211 50 82 83 84 85 86 87 88 89 90 91 + 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 + 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 + 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 + 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 + 156 157 158 159 160 161 162 212 51 82 83 84 85 86 87 88 + 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 + 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 + 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 + 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 + 153 154 155 156 157 158 159 160 161 162 213 52 82 83 84 85 + 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 + 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 + 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 + 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 + 150 151 152 153 154 155 156 157 158 159 160 161 162 214 53 82 + 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 + 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 + 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 + 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 + 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 + 215 54 82 83 84 85 86 87 88 89 90 91 92 93 94 95 + 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 + 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 + 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 + 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 + 160 161 162 216 55 82 83 84 85 86 87 88 89 90 91 92 + 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 + 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 + 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 + 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 + 157 158 159 160 161 162 217 56 82 83 84 85 86 87 88 89 + 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 + 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 + 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 + 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 + 154 155 156 157 158 159 160 161 162 218 57 82 83 84 85 86 + 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 + 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 + 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 + 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 + 151 152 153 154 155 156 157 158 159 160 161 162 219 58 82 83 + 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 + 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 + 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 + 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 + 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 220 + 59 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 + 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 + 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 + 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 + 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 + 161 162 221 60 82 83 84 85 86 87 88 89 90 91 92 93 + 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 + 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 + 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 + 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 + 158 159 160 161 162 222 61 82 83 84 85 86 87 88 89 90 + 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 + 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 + 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 + 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 + 155 156 157 158 159 160 161 162 223 62 82 83 84 85 86 87 + 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 + 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 + 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 + 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 + 152 153 154 155 156 157 158 159 160 161 162 224 63 82 83 84 + 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 + 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 + 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 + 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 + 149 150 151 152 153 154 155 156 157 158 159 160 161 162 225 64 + 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 + 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 + 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 + 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 + 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 + 162 226 65 82 83 84 85 86 87 88 89 90 91 92 93 94 + 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 + 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 + 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 + 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 + 159 160 161 162 227 66 82 83 84 85 86 87 88 89 90 91 + 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 + 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 + 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 + 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 + 156 157 158 159 160 161 162 228 67 82 83 84 85 86 87 88 + 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 + 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 + 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 + 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 + 153 154 155 156 157 158 159 160 161 162 229 68 82 83 84 85 + 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 + 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 + 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 + 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 + 150 151 152 153 154 155 156 157 158 159 160 161 162 230 69 82 + 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 + 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 + 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 + 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 + 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 + 231 70 82 83 84 85 86 87 88 89 90 91 92 93 94 95 + 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 + 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 + 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 + 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 + 160 161 162 232 71 82 83 84 85 86 87 88 89 90 91 92 + 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 + 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 + 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 + 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 + 157 158 159 160 161 162 233 72 82 83 84 85 86 87 88 89 + 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 + 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 + 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 + 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 + 154 155 156 157 158 159 160 161 162 234 73 82 83 84 85 86 + 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 + 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 + 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 + 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 + 151 152 153 154 155 156 157 158 159 160 161 162 235 74 82 83 + 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 + 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 + 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 + 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 + 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 236 + 75 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 + 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 + 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 + 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 + 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 + 161 162 237 76 82 83 84 85 86 87 88 89 90 91 92 93 + 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 + 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 + 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 + 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 + 158 159 160 161 162 238 77 82 83 84 85 86 87 88 89 90 + 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 + 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 + 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 + 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 + 155 156 157 158 159 160 161 162 239 78 82 83 84 85 86 87 + 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 + 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 + 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 + 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 + 152 153 154 155 156 157 158 159 160 161 162 240 79 82 83 84 + 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 + 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 + 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 + 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 + 149 150 151 152 153 154 155 156 157 158 159 160 161 162 241 80 + 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 + 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 + 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 + 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 + 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 + 162 242 81 82 83 84 85 86 87 88 89 90 91 92 93 94 + 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 + 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 + 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 + 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 + 159 160 161 162 243 82 163 164 165 166 167 168 169 170 171 172 + 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 + 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 + 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 + 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 + 237 238 239 240 241 242 243 244 83 163 164 165 166 167 168 169 + 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 + 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 + 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 + 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 + 234 235 236 237 238 239 240 241 242 243 245 84 163 164 165 166 + 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 + 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 + 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 + 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 + 231 232 233 234 235 236 237 238 239 240 241 242 243 246 85 163 + 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 + 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 + 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 + 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 + 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 + 247 86 163 164 165 166 167 168 169 170 171 172 173 174 175 176 + 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 + 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 + 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 + 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 + 241 242 243 248 87 163 164 165 166 167 168 169 170 171 172 173 + 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 + 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 + 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 + 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 + 238 239 240 241 242 243 249 88 163 164 165 166 167 168 169 170 + 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 + 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 + 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 + 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 + 235 236 237 238 239 240 241 242 243 250 89 163 164 165 166 167 + 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 + 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 + 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 + 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 + 232 233 234 235 236 237 238 239 240 241 242 243 251 90 163 164 + 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 + 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 + 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 + 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 + 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 252 + 91 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 + 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 + 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 + 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 + 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 + 242 243 253 92 163 164 165 166 167 168 169 170 171 172 173 174 + 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 + 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 + 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 + 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 + 239 240 241 242 243 254 93 163 164 165 166 167 168 169 170 171 + 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 + 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 + 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 + 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 + 236 237 238 239 240 241 242 243 255 94 163 164 165 166 167 168 + 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 + 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 + 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 + 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 + 233 234 235 236 237 238 239 240 241 242 243 256 95 163 164 165 + 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 + 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 + 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 + 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 + 230 231 232 233 234 235 236 237 238 239 240 241 242 243 257 96 + 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 + 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 + 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 + 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 + 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 + 243 258 97 163 164 165 166 167 168 169 170 171 172 173 174 175 + 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 + 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 + 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 + 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 + 240 241 242 243 259 98 163 164 165 166 167 168 169 170 171 172 + 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 + 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 + 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 + 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 + 237 238 239 240 241 242 243 260 99 163 164 165 166 167 168 169 + 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 + 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 + 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 + 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 + 234 235 236 237 238 239 240 241 242 243 261 100 163 164 165 166 + 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 + 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 + 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 + 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 + 231 232 233 234 235 236 237 238 239 240 241 242 243 262 101 163 + 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 + 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 + 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 + 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 + 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 + 263 102 163 164 165 166 167 168 169 170 171 172 173 174 175 176 + 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 + 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 + 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 + 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 + 241 242 243 264 103 163 164 165 166 167 168 169 170 171 172 173 + 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 + 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 + 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 + 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 + 238 239 240 241 242 243 265 104 163 164 165 166 167 168 169 170 + 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 + 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 + 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 + 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 + 235 236 237 238 239 240 241 242 243 266 105 163 164 165 166 167 + 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 + 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 + 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 + 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 + 232 233 234 235 236 237 238 239 240 241 242 243 267 106 163 164 + 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 + 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 + 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 + 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 + 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 268 + 107 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 + 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 + 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 + 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 + 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 + 242 243 269 108 163 164 165 166 167 168 169 170 171 172 173 174 + 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 + 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 + 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 + 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 + 239 240 241 242 243 270 109 163 164 165 166 167 168 169 170 171 + 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 + 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 + 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 + 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 + 236 237 238 239 240 241 242 243 271 110 163 164 165 166 167 168 + 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 + 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 + 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 + 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 + 233 234 235 236 237 238 239 240 241 242 243 272 111 163 164 165 + 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 + 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 + 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 + 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 + 230 231 232 233 234 235 236 237 238 239 240 241 242 243 273 112 + 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 + 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 + 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 + 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 + 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 + 243 274 113 163 164 165 166 167 168 169 170 171 172 173 174 175 + 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 + 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 + 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 + 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 + 240 241 242 243 275 114 163 164 165 166 167 168 169 170 171 172 + 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 + 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 + 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 + 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 + 237 238 239 240 241 242 243 276 115 163 164 165 166 167 168 169 + 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 + 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 + 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 + 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 + 234 235 236 237 238 239 240 241 242 243 277 116 163 164 165 166 + 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 + 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 + 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 + 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 + 231 232 233 234 235 236 237 238 239 240 241 242 243 278 117 163 + 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 + 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 + 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 + 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 + 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 + 279 118 163 164 165 166 167 168 169 170 171 172 173 174 175 176 + 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 + 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 + 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 + 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 + 241 242 243 280 119 163 164 165 166 167 168 169 170 171 172 173 + 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 + 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 + 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 + 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 + 238 239 240 241 242 243 281 120 163 164 165 166 167 168 169 170 + 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 + 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 + 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 + 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 + 235 236 237 238 239 240 241 242 243 282 121 163 164 165 166 167 + 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 + 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 + 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 + 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 + 232 233 234 235 236 237 238 239 240 241 242 243 283 122 163 164 + 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 + 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 + 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 + 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 + 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 284 + 123 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 + 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 + 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 + 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 + 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 + 242 243 285 124 163 164 165 166 167 168 169 170 171 172 173 174 + 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 + 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 + 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 + 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 + 239 240 241 242 243 286 125 163 164 165 166 167 168 169 170 171 + 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 + 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 + 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 + 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 + 236 237 238 239 240 241 242 243 287 126 163 164 165 166 167 168 + 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 + 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 + 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 + 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 + 233 234 235 236 237 238 239 240 241 242 243 288 127 163 164 165 + 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 + 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 + 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 + 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 + 230 231 232 233 234 235 236 237 238 239 240 241 242 243 289 128 + 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 + 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 + 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 + 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 + 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 + 243 290 129 163 164 165 166 167 168 169 170 171 172 173 174 175 + 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 + 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 + 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 + 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 + 240 241 242 243 291 130 163 164 165 166 167 168 169 170 171 172 + 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 + 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 + 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 + 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 + 237 238 239 240 241 242 243 292 131 163 164 165 166 167 168 169 + 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 + 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 + 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 + 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 + 234 235 236 237 238 239 240 241 242 243 293 132 163 164 165 166 + 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 + 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 + 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 + 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 + 231 232 233 234 235 236 237 238 239 240 241 242 243 294 133 163 + 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 + 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 + 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 + 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 + 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 + 295 134 163 164 165 166 167 168 169 170 171 172 173 174 175 176 + 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 + 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 + 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 + 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 + 241 242 243 296 135 163 164 165 166 167 168 169 170 171 172 173 + 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 + 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 + 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 + 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 + 238 239 240 241 242 243 297 136 163 164 165 166 167 168 169 170 + 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 + 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 + 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 + 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 + 235 236 237 238 239 240 241 242 243 298 137 163 164 165 166 167 + 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 + 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 + 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 + 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 + 232 233 234 235 236 237 238 239 240 241 242 243 299 138 163 164 + 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 + 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 + 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 + 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 + 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 300 + 139 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 + 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 + 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 + 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 + 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 + 242 243 301 140 163 164 165 166 167 168 169 170 171 172 173 174 + 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 + 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 + 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 + 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 + 239 240 241 242 243 302 141 163 164 165 166 167 168 169 170 171 + 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 + 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 + 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 + 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 + 236 237 238 239 240 241 242 243 303 142 163 164 165 166 167 168 + 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 + 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 + 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 + 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 + 233 234 235 236 237 238 239 240 241 242 243 304 143 163 164 165 + 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 + 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 + 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 + 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 + 230 231 232 233 234 235 236 237 238 239 240 241 242 243 305 144 + 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 + 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 + 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 + 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 + 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 + 243 306 145 163 164 165 166 167 168 169 170 171 172 173 174 175 + 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 + 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 + 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 + 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 + 240 241 242 243 307 146 163 164 165 166 167 168 169 170 171 172 + 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 + 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 + 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 + 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 + 237 238 239 240 241 242 243 308 147 163 164 165 166 167 168 169 + 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 + 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 + 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 + 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 + 234 235 236 237 238 239 240 241 242 243 309 148 163 164 165 166 + 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 + 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 + 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 + 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 + 231 232 233 234 235 236 237 238 239 240 241 242 243 310 149 163 + 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 + 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 + 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 + 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 + 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 + 311 150 163 164 165 166 167 168 169 170 171 172 173 174 175 176 + 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 + 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 + 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 + 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 + 241 242 243 312 151 163 164 165 166 167 168 169 170 171 172 173 + 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 + 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 + 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 + 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 + 238 239 240 241 242 243 313 152 163 164 165 166 167 168 169 170 + 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 + 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 + 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 + 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 + 235 236 237 238 239 240 241 242 243 314 153 163 164 165 166 167 + 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 + 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 + 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 + 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 + 232 233 234 235 236 237 238 239 240 241 242 243 315 154 163 164 + 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 + 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 + 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 + 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 + 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 316 + 155 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 + 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 + 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 + 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 + 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 + 242 243 317 156 163 164 165 166 167 168 169 170 171 172 173 174 + 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 + 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 + 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 + 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 + 239 240 241 242 243 318 157 163 164 165 166 167 168 169 170 171 + 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 + 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 + 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 + 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 + 236 237 238 239 240 241 242 243 319 158 163 164 165 166 167 168 + 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 + 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 + 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 + 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 + 233 234 235 236 237 238 239 240 241 242 243 320 159 163 164 165 + 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 + 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 + 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 + 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 + 230 231 232 233 234 235 236 237 238 239 240 241 242 243 321 160 + 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 + 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 + 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 + 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 + 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 + 243 322 161 163 164 165 166 167 168 169 170 171 172 173 174 175 + 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 + 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 + 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 + 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 + 240 241 242 243 323 162 163 164 165 166 167 168 169 170 171 172 + 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 + 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 + 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 + 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 + 237 238 239 240 241 242 243 324 163 244 245 246 247 248 249 250 + 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 + 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 + 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 + 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 + 315 316 317 318 319 320 321 322 323 324 164 244 245 246 247 248 + 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 + 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 + 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 + 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 + 313 314 315 316 317 318 319 320 321 322 323 324 165 244 245 246 + 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 + 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 + 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 + 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 + 311 312 313 314 315 316 317 318 319 320 321 322 323 324 166 244 + 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 + 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 + 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 + 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 + 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 + 167 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 + 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 + 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 + 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 + 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 + 323 324 168 244 245 246 247 248 249 250 251 252 253 254 255 256 + 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 + 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 + 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 + 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 + 321 322 323 324 169 244 245 246 247 248 249 250 251 252 253 254 + 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 + 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 + 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 + 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 + 319 320 321 322 323 324 170 244 245 246 247 248 249 250 251 252 + 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 + 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 + 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 + 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 + 317 318 319 320 321 322 323 324 171 244 245 246 247 248 249 250 + 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 + 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 + 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 + 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 + 315 316 317 318 319 320 321 322 323 324 172 244 245 246 247 248 + 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 + 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 + 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 + 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 + 313 314 315 316 317 318 319 320 321 322 323 324 173 244 245 246 + 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 + 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 + 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 + 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 + 311 312 313 314 315 316 317 318 319 320 321 322 323 324 174 244 + 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 + 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 + 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 + 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 + 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 + 175 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 + 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 + 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 + 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 + 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 + 323 324 176 244 245 246 247 248 249 250 251 252 253 254 255 256 + 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 + 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 + 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 + 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 + 321 322 323 324 177 244 245 246 247 248 249 250 251 252 253 254 + 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 + 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 + 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 + 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 + 319 320 321 322 323 324 178 244 245 246 247 248 249 250 251 252 + 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 + 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 + 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 + 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 + 317 318 319 320 321 322 323 324 179 244 245 246 247 248 249 250 + 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 + 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 + 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 + 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 + 315 316 317 318 319 320 321 322 323 324 180 244 245 246 247 248 + 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 + 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 + 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 + 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 + 313 314 315 316 317 318 319 320 321 322 323 324 181 244 245 246 + 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 + 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 + 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 + 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 + 311 312 313 314 315 316 317 318 319 320 321 322 323 324 182 244 + 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 + 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 + 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 + 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 + 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 + 183 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 + 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 + 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 + 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 + 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 + 323 324 184 244 245 246 247 248 249 250 251 252 253 254 255 256 + 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 + 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 + 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 + 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 + 321 322 323 324 185 244 245 246 247 248 249 250 251 252 253 254 + 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 + 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 + 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 + 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 + 319 320 321 322 323 324 186 244 245 246 247 248 249 250 251 252 + 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 + 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 + 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 + 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 + 317 318 319 320 321 322 323 324 187 244 245 246 247 248 249 250 + 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 + 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 + 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 + 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 + 315 316 317 318 319 320 321 322 323 324 188 244 245 246 247 248 + 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 + 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 + 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 + 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 + 313 314 315 316 317 318 319 320 321 322 323 324 189 244 245 246 + 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 + 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 + 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 + 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 + 311 312 313 314 315 316 317 318 319 320 321 322 323 324 190 244 + 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 + 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 + 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 + 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 + 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 + 191 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 + 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 + 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 + 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 + 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 + 323 324 192 244 245 246 247 248 249 250 251 252 253 254 255 256 + 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 + 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 + 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 + 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 + 321 322 323 324 193 244 245 246 247 248 249 250 251 252 253 254 + 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 + 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 + 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 + 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 + 319 320 321 322 323 324 194 244 245 246 247 248 249 250 251 252 + 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 + 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 + 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 + 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 + 317 318 319 320 321 322 323 324 195 244 245 246 247 248 249 250 + 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 + 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 + 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 + 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 + 315 316 317 318 319 320 321 322 323 324 196 244 245 246 247 248 + 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 + 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 + 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 + 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 + 313 314 315 316 317 318 319 320 321 322 323 324 197 244 245 246 + 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 + 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 + 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 + 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 + 311 312 313 314 315 316 317 318 319 320 321 322 323 324 198 244 + 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 + 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 + 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 + 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 + 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 + 199 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 + 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 + 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 + 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 + 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 + 323 324 200 244 245 246 247 248 249 250 251 252 253 254 255 256 + 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 + 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 + 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 + 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 + 321 322 323 324 201 244 245 246 247 248 249 250 251 252 253 254 + 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 + 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 + 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 + 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 + 319 320 321 322 323 324 202 244 245 246 247 248 249 250 251 252 + 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 + 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 + 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 + 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 + 317 318 319 320 321 322 323 324 203 244 245 246 247 248 249 250 + 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 + 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 + 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 + 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 + 315 316 317 318 319 320 321 322 323 324 204 244 245 246 247 248 + 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 + 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 + 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 + 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 + 313 314 315 316 317 318 319 320 321 322 323 324 205 244 245 246 + 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 + 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 + 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 + 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 + 311 312 313 314 315 316 317 318 319 320 321 322 323 324 206 244 + 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 + 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 + 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 + 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 + 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 + 207 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 + 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 + 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 + 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 + 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 + 323 324 208 244 245 246 247 248 249 250 251 252 253 254 255 256 + 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 + 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 + 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 + 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 + 321 322 323 324 209 244 245 246 247 248 249 250 251 252 253 254 + 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 + 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 + 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 + 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 + 319 320 321 322 323 324 210 244 245 246 247 248 249 250 251 252 + 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 + 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 + 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 + 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 + 317 318 319 320 321 322 323 324 211 244 245 246 247 248 249 250 + 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 + 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 + 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 + 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 + 315 316 317 318 319 320 321 322 323 324 212 244 245 246 247 248 + 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 + 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 + 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 + 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 + 313 314 315 316 317 318 319 320 321 322 323 324 213 244 245 246 + 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 + 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 + 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 + 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 + 311 312 313 314 315 316 317 318 319 320 321 322 323 324 214 244 + 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 + 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 + 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 + 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 + 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 + 215 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 + 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 + 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 + 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 + 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 + 323 324 216 244 245 246 247 248 249 250 251 252 253 254 255 256 + 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 + 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 + 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 + 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 + 321 322 323 324 217 244 245 246 247 248 249 250 251 252 253 254 + 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 + 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 + 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 + 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 + 319 320 321 322 323 324 218 244 245 246 247 248 249 250 251 252 + 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 + 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 + 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 + 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 + 317 318 319 320 321 322 323 324 219 244 245 246 247 248 249 250 + 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 + 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 + 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 + 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 + 315 316 317 318 319 320 321 322 323 324 220 244 245 246 247 248 + 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 + 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 + 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 + 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 + 313 314 315 316 317 318 319 320 321 322 323 324 221 244 245 246 + 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 + 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 + 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 + 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 + 311 312 313 314 315 316 317 318 319 320 321 322 323 324 222 244 + 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 + 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 + 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 + 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 + 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 + 223 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 + 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 + 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 + 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 + 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 + 323 324 224 244 245 246 247 248 249 250 251 252 253 254 255 256 + 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 + 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 + 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 + 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 + 321 322 323 324 225 244 245 246 247 248 249 250 251 252 253 254 + 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 + 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 + 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 + 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 + 319 320 321 322 323 324 226 244 245 246 247 248 249 250 251 252 + 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 + 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 + 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 + 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 + 317 318 319 320 321 322 323 324 227 244 245 246 247 248 249 250 + 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 + 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 + 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 + 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 + 315 316 317 318 319 320 321 322 323 324 228 244 245 246 247 248 + 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 + 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 + 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 + 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 + 313 314 315 316 317 318 319 320 321 322 323 324 229 244 245 246 + 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 + 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 + 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 + 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 + 311 312 313 314 315 316 317 318 319 320 321 322 323 324 230 244 + 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 + 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 + 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 + 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 + 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 + 231 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 + 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 + 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 + 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 + 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 + 323 324 232 244 245 246 247 248 249 250 251 252 253 254 255 256 + 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 + 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 + 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 + 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 + 321 322 323 324 233 244 245 246 247 248 249 250 251 252 253 254 + 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 + 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 + 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 + 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 + 319 320 321 322 323 324 234 244 245 246 247 248 249 250 251 252 + 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 + 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 + 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 + 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 + 317 318 319 320 321 322 323 324 235 244 245 246 247 248 249 250 + 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 + 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 + 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 + 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 + 315 316 317 318 319 320 321 322 323 324 236 244 245 246 247 248 + 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 + 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 + 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 + 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 + 313 314 315 316 317 318 319 320 321 322 323 324 237 244 245 246 + 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 + 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 + 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 + 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 + 311 312 313 314 315 316 317 318 319 320 321 322 323 324 238 244 + 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 + 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 + 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 + 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 + 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 + 239 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 + 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 + 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 + 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 + 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 + 323 324 240 244 245 246 247 248 249 250 251 252 253 254 255 256 + 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 + 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 + 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 + 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 + 321 322 323 324 241 244 245 246 247 248 249 250 251 252 253 254 + 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 + 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 + 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 + 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 + 319 320 321 322 323 324 242 244 245 246 247 248 249 250 251 252 + 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 + 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 + 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 + 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 + 317 318 319 320 321 322 323 324 243 244 245 246 247 248 249 250 + 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 + 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 + 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 + 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 + 315 316 317 318 319 320 321 322 323 324 +0.3907880596378435D+00-.5085988217165716D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03 +-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04 +0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03 +0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04 +-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03 +-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04 +0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04 +0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04 +-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04 +-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05 +0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04 +0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05 +-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04 +-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05 +0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04 +0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05 +-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05 +-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06 +-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05 +-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05 +0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04 +0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05 +-.3006329973746788D-040.4851599099553577D-050.3478916893609630D-04 +-.5614257322333374D-05-.3981401266047105D-040.6425163892851680D-05 +0.4519256146756725D-04-.7293151198878877D-05-.5098776122625716D-04 +0.8228377410789080D-050.5727272713271265D-04-.9242641819512053D-05 +-.6413319184916952D-040.1034977991584680D-040.7167060586276605D-04 +-.1156616372469904D-04-.8000610566205314D-040.1291134218726644D-04 +0.8928564729752786D-04-.1440886961226929D-04-.9968672138364864D-04 +0.1608738933935444D-040.1114272391272199D-03-.1798206776156415D-04 +-.1247774371157844D-030.2013651551366699D-040.1400760388418106D-03 +-.2260539561021587D-04-.1577525118211425D-030.2545801528732096D-04 +0.1783582025511267D-03-.2878335054540236D-04-.2026106452901076D-03 +0.3269719667613068D-040.2314578281220329D-03-.3735253948527681D-04 +-.2661733971656788D-030.4295491929665637D-040.3085010747980624D-03 +-.4978573708714430D-04-.3608796739013979D-030.5823856716450639D-04 +0.4268045368520104D-03-.6887748599651892D-04-.5114288231755168D-03 +0.8253410768850847D-040.6226054234809117D-03-.1004757274921672D-03 +-.7727812230408974D-030.1247110170406368D-030.9826448017572174D-03 +-.1585786882018380D-03-.1288661285438230D-020.2079634633143654D-03 +0.1760064559812521D-02-.2840382695217011D-03-.2541776982554263D-02 +0.4101905987537787D-030.3980741565709959D-02-.6424099272005126D-03 +-.7089509216132388D-020.1144101174176753D-020.1597157490519940D-01 +-.2577484145293108D-02-.6393452627818492D-010.1031771937313466D-01 +0.1315499101020305D-030.3980931060364731D-05-.6393452627818429D-01 +0.1031771937313455D-010.2927527143407817D+00-.5061033237937254D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03 +-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03 +0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04 +-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03 +-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04 +0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04 +0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04 +-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04 +-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04 +0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04 +0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05 +-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04 +-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05 +0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04 +0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05 +-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05 +-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06 +0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05 +-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06 +0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04 +0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05 +-.2132146425429693D-040.3440846403443515D-050.2558831255668139D-04 +-.4129428081521270D-05-.3006329973746788D-040.4851599099553577D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3981401266047105D-04 +0.6425163892851680D-050.4519256146756725D-04-.7293151198878877D-05 +-.5098776122625716D-040.8228377410789080D-050.5727272713271265D-04 +-.9242641819512053D-05-.6413319184916952D-040.1034977991584680D-04 +0.7167060586276605D-04-.1156616372469904D-04-.8000610566205314D-04 +0.1291134218726644D-040.8928564729752786D-04-.1440886961226929D-04 +-.9968672138364864D-040.1608738933935444D-040.1114272391272199D-03 +-.1798206776156415D-04-.1247774371157844D-030.2013651551366699D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1577525118211425D-03 +0.2545801528732096D-040.1783582025511267D-03-.2878335054540236D-04 +-.2026106452901076D-030.3269719667613068D-040.2314578281220329D-03 +-.3735253948527681D-04-.2661733971656788D-030.4295491929665637D-04 +0.3085010747980624D-03-.4978573708714430D-04-.3608796739013979D-03 +0.5823856716450639D-040.4268045368520104D-03-.6887748599651892D-04 +-.5114288231755168D-030.8253410768850847D-040.6226054234809117D-03 +-.1004757274921672D-03-.7727812230408974D-030.1247110170406368D-03 +0.9826448017572174D-03-.1585786882018380D-03-.1288661285438230D-02 +0.2079634633143654D-030.1760064559812521D-02-.2840382695217011D-03 +-.2541776982554263D-020.4101905987537787D-030.3980741565709959D-02 +-.6424099272005126D-03-.7089509216132388D-020.1144101174176753D-02 +0.1597157490519940D-01-.2577484145293108D-020.1444546692054133D-03 +0.5038740027685473D-050.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.2157239452786765D+00 +-.4868036798000584D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03 +0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04 +-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03 +-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04 +0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03 +0.1247110170406368D-030.9826448017572174D-03-.1585786882018380D-03 +-.1288661285438230D-020.2079634633143654D-030.1760064559812521D-02 +-.2840382695217011D-03-.2541776982554263D-020.4101905987537787D-03 +0.3980741565709959D-02-.6424099272005126D-03-.7089509216132388D-02 +0.1144101174176753D-020.1574251928385321D-030.6107296557512106D-05 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +0.1557709757413722D+00-.4569036816326588D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03 +-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04 +0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03 +0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04 +-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03 +-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04 +0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04 +0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04 +-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04 +-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05 +0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04 +0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05 +-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04 +-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05 +0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04 +0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05 +-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05 +-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06 +-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05 +-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05 +0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04 +0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05 +-.3006329973746788D-040.4851599099553577D-050.3478916893609630D-04 +-.5614257322333374D-05-.3981401266047105D-040.6425163892851680D-05 +0.4519256146756725D-04-.7293151198878877D-05-.5098776122625716D-04 +0.8228377410789080D-050.5727272713271265D-04-.9242641819512053D-05 +-.6413319184916952D-040.1034977991584680D-040.7167060586276605D-04 +-.1156616372469904D-04-.8000610566205314D-040.1291134218726644D-04 +0.8928564729752786D-04-.1440886961226929D-04-.9968672138364864D-04 +0.1608738933935444D-040.1114272391272199D-03-.1798206776156415D-04 +-.1247774371157844D-030.2013651551366699D-040.1400760388418106D-03 +-.2260539561021587D-04-.1577525118211425D-030.2545801528732096D-04 +0.1783582025511267D-03-.2878335054540236D-04-.2026106452901076D-03 +0.3269719667613068D-040.2314578281220329D-03-.3735253948527681D-04 +-.2661733971656788D-030.4295491929665637D-040.3085010747980624D-03 +-.4978573708714430D-04-.3608796739013979D-030.5823856716450639D-04 +0.4268045368520104D-03-.6887748599651892D-04-.5114288231755168D-03 +0.8253410768850847D-040.6226054234809117D-03-.1004757274921672D-03 +-.7727812230408974D-030.1247110170406368D-030.9826448017572174D-03 +-.1585786882018380D-03-.1288661285438230D-020.2079634633143654D-03 +0.1760064559812521D-02-.2840382695217011D-03-.2541776982554263D-02 +0.4101905987537787D-030.3980741565709959D-02-.6424099272005126D-03 +0.1704618139382066D-030.7186682901146465D-050.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-010.1096566252142961D+00-.4209739735795140D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03 +-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03 +0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04 +-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03 +-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04 +0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04 +0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04 +-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04 +-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04 +0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04 +0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05 +-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04 +-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05 +0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04 +0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05 +-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05 +-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06 +0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05 +-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06 +0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04 +0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05 +-.2132146425429693D-040.3440846403443515D-050.2558831255668139D-04 +-.4129428081521270D-05-.3006329973746788D-040.4851599099553577D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3981401266047105D-04 +0.6425163892851680D-050.4519256146756725D-04-.7293151198878877D-05 +-.5098776122625716D-040.8228377410789080D-050.5727272713271265D-04 +-.9242641819512053D-05-.6413319184916952D-040.1034977991584680D-04 +0.7167060586276605D-04-.1156616372469904D-04-.8000610566205314D-04 +0.1291134218726644D-040.8928564729752786D-04-.1440886961226929D-04 +-.9968672138364864D-040.1608738933935444D-040.1114272391272199D-03 +-.1798206776156415D-04-.1247774371157844D-030.2013651551366699D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1577525118211425D-03 +0.2545801528732096D-040.1783582025511267D-03-.2878335054540236D-04 +-.2026106452901076D-030.3269719667613068D-040.2314578281220329D-03 +-.3735253948527681D-04-.2661733971656788D-030.4295491929665637D-04 +0.3085010747980624D-03-.4978573708714430D-04-.3608796739013979D-03 +0.5823856716450639D-040.4268045368520104D-03-.6887748599651892D-04 +-.5114288231755168D-030.8253410768850847D-040.6226054234809117D-03 +-.1004757274921672D-03-.7727812230408974D-030.1247110170406368D-03 +0.9826448017572174D-03-.1585786882018380D-03-.1288661285438230D-02 +0.2079634633143654D-030.1760064559812521D-02-.2840382695217011D-03 +-.2541776982554263D-020.4101905987537787D-030.1835648671152865D-03 +0.8276981869115928D-05-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.7471858919825108D-01 +-.3823258786163024D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03 +0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04 +-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03 +-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04 +0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03 +0.1247110170406368D-030.9826448017572174D-03-.1585786882018380D-03 +-.1288661285438230D-020.2079634633143654D-030.1760064559812521D-02 +-.2840382695217011D-030.1967346886630121D-030.9378276834732454D-05 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +0.4877067593222251D-01-.3433058868290575D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03 +-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04 +0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03 +0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04 +-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03 +-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04 +0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04 +0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04 +-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04 +-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05 +0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04 +0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05 +-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04 +-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05 +0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04 +0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05 +-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05 +-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06 +-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05 +-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05 +0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04 +0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05 +-.3006329973746788D-040.4851599099553577D-050.3478916893609630D-04 +-.5614257322333374D-05-.3981401266047105D-040.6425163892851680D-05 +0.4519256146756725D-04-.7293151198878877D-05-.5098776122625716D-04 +0.8228377410789080D-050.5727272713271265D-04-.9242641819512053D-05 +-.6413319184916952D-040.1034977991584680D-040.7167060586276605D-04 +-.1156616372469904D-04-.8000610566205314D-040.1291134218726644D-04 +0.8928564729752786D-04-.1440886961226929D-04-.9968672138364864D-04 +0.1608738933935444D-040.1114272391272199D-03-.1798206776156415D-04 +-.1247774371157844D-030.2013651551366699D-040.1400760388418106D-03 +-.2260539561021587D-04-.1577525118211425D-030.2545801528732096D-04 +0.1783582025511267D-03-.2878335054540236D-04-.2026106452901076D-03 +0.3269719667613068D-040.2314578281220329D-03-.3735253948527681D-04 +-.2661733971656788D-030.4295491929665637D-040.3085010747980624D-03 +-.4978573708714430D-04-.3608796739013979D-030.5823856716450639D-04 +0.4268045368520104D-03-.6887748599651892D-04-.5114288231755168D-03 +0.8253410768850847D-040.6226054234809117D-03-.1004757274921672D-03 +-.7727812230408974D-030.1247110170406368D-030.9826448017572174D-03 +-.1585786882018380D-03-.1288661285438230D-020.2079634633143654D-03 +0.2099716165654131D-030.1049065173767338D-04-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-010.3002068643018266D-01-.3055268727498139D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03 +-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03 +0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04 +-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03 +-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04 +0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04 +0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04 +-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04 +-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04 +0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04 +0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05 +-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04 +-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05 +0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04 +0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05 +-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05 +-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06 +0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05 +-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06 +0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04 +0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05 +-.2132146425429693D-040.3440846403443515D-050.2558831255668139D-04 +-.4129428081521270D-05-.3006329973746788D-040.4851599099553577D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3981401266047105D-04 +0.6425163892851680D-050.4519256146756725D-04-.7293151198878877D-05 +-.5098776122625716D-040.8228377410789080D-050.5727272713271265D-04 +-.9242641819512053D-05-.6413319184916952D-040.1034977991584680D-04 +0.7167060586276605D-04-.1156616372469904D-04-.8000610566205314D-04 +0.1291134218726644D-040.8928564729752786D-04-.1440886961226929D-04 +-.9968672138364864D-040.1608738933935444D-040.1114272391272199D-03 +-.1798206776156415D-04-.1247774371157844D-030.2013651551366699D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1577525118211425D-03 +0.2545801528732096D-040.1783582025511267D-03-.2878335054540236D-04 +-.2026106452901076D-030.3269719667613068D-040.2314578281220329D-03 +-.3735253948527681D-04-.2661733971656788D-030.4295491929665637D-04 +0.3085010747980624D-03-.4978573708714430D-04-.3608796739013979D-03 +0.5823856716450639D-040.4268045368520104D-03-.6887748599651892D-04 +-.5114288231755168D-030.8253410768850847D-040.6226054234809117D-03 +-.1004757274921672D-03-.7727812230408974D-030.1247110170406368D-03 +0.9826448017572174D-03-.1585786882018380D-030.2232759905057449D-03 +0.1161419108758396D-040.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.1700216908900937D-01 +-.2700489567358313D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03 +0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04 +-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03 +-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04 +0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03 +0.1247110170406368D-030.2366481518749747D-030.1274897996770195D-04 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +0.8517736161626044D-02-.2375203779188533D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03 +-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04 +0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03 +0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04 +-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03 +-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04 +0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04 +0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04 +-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04 +-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05 +0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04 +0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05 +-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04 +-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05 +0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04 +0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05 +-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05 +-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06 +-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05 +-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05 +0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04 +0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05 +-.3006329973746788D-040.4851599099553577D-050.3478916893609630D-04 +-.5614257322333374D-05-.3981401266047105D-040.6425163892851680D-05 +0.4519256146756725D-04-.7293151198878877D-05-.5098776122625716D-04 +0.8228377410789080D-050.5727272713271265D-04-.9242641819512053D-05 +-.6413319184916952D-040.1034977991584680D-040.7167060586276605D-04 +-.1156616372469904D-04-.8000610566205314D-040.1291134218726644D-04 +0.8928564729752786D-04-.1440886961226929D-04-.9968672138364864D-04 +0.1608738933935444D-040.1114272391272199D-03-.1798206776156415D-04 +-.1247774371157844D-030.2013651551366699D-040.1400760388418106D-03 +-.2260539561021587D-04-.1577525118211425D-030.2545801528732096D-04 +0.1783582025511267D-03-.2878335054540236D-04-.2026106452901076D-03 +0.3269719667613068D-040.2314578281220329D-03-.3735253948527681D-04 +-.2661733971656788D-030.4295491929665637D-040.3085010747980624D-03 +-.4978573708714430D-04-.3608796739013979D-030.5823856716450639D-04 +0.4268045368520104D-03-.6887748599651892D-04-.5114288231755168D-03 +0.8253410768850847D-040.6226054234809117D-03-.1004757274921672D-03 +0.2500884437803040D-030.1389510403850428D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-010.3592010968872295D-02-.2082866889705388D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03 +-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03 +0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04 +-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03 +-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04 +0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04 +0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04 +-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04 +-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04 +0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04 +0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05 +-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04 +-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05 +0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04 +0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05 +-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05 +-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06 +0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05 +-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06 +0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04 +0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05 +-.2132146425429693D-040.3440846403443515D-050.2558831255668139D-04 +-.4129428081521270D-05-.3006329973746788D-040.4851599099553577D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3981401266047105D-04 +0.6425163892851680D-050.4519256146756725D-04-.7293151198878877D-05 +-.5098776122625716D-040.8228377410789080D-050.5727272713271265D-04 +-.9242641819512053D-05-.6413319184916952D-040.1034977991584680D-04 +0.7167060586276605D-04-.1156616372469904D-04-.8000610566205314D-04 +0.1291134218726644D-040.8928564729752786D-04-.1440886961226929D-04 +-.9968672138364864D-040.1608738933935444D-040.1114272391272199D-03 +-.1798206776156415D-04-.1247774371157844D-030.2013651551366699D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1577525118211425D-03 +0.2545801528732096D-040.1783582025511267D-03-.2878335054540236D-04 +-.2026106452901076D-030.3269719667613068D-040.2314578281220329D-03 +-.3735253948527681D-04-.2661733971656788D-030.4295491929665637D-04 +0.3085010747980624D-03-.4978573708714430D-04-.3608796739013979D-03 +0.5823856716450639D-040.4268045368520104D-03-.6887748599651892D-04 +-.5114288231755168D-030.8253410768850847D-040.2635972110537330D-03 +0.1505264954137583D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.1432593898717735D-02 +-.1824749233535114D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03 +0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04 +-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03 +-.6887748599651892D-040.2771748002606731D-030.1622170330230075D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +0.1397702131734624D-02-.1600580484709967D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03 +-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04 +0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03 +0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04 +-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03 +-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04 +0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04 +0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04 +-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04 +-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05 +0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04 +0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05 +-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04 +-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05 +0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04 +0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05 +-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05 +-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06 +-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05 +-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05 +0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04 +0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05 +-.3006329973746788D-040.4851599099553577D-050.3478916893609630D-04 +-.5614257322333374D-05-.3981401266047105D-040.6425163892851680D-05 +0.4519256146756725D-04-.7293151198878877D-05-.5098776122625716D-04 +0.8228377410789080D-050.5727272713271265D-04-.9242641819512053D-05 +-.6413319184916952D-040.1034977991584680D-040.7167060586276605D-04 +-.1156616372469904D-04-.8000610566205314D-040.1291134218726644D-04 +0.8928564729752786D-04-.1440886961226929D-04-.9968672138364864D-04 +0.1608738933935444D-040.1114272391272199D-03-.1798206776156415D-04 +-.1247774371157844D-030.2013651551366699D-040.1400760388418106D-03 +-.2260539561021587D-04-.1577525118211425D-030.2545801528732096D-04 +0.1783582025511267D-03-.2878335054540236D-04-.2026106452901076D-03 +0.3269719667613068D-040.2314578281220329D-03-.3735253948527681D-04 +-.2661733971656788D-030.4295491929665637D-040.3085010747980624D-03 +-.4978573708714430D-04-.3608796739013979D-030.5823856716450639D-04 +0.2908215597085934D-030.1740235273557609D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-010.2969361130056608D-02-.1409039418766617D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03 +-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03 +0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04 +-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03 +-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04 +0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04 +0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04 +-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04 +-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04 +0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04 +0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05 +-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04 +-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05 +0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04 +0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05 +-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05 +-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06 +0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05 +-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06 +0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04 +0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05 +-.2132146425429693D-040.3440846403443515D-050.2558831255668139D-04 +-.4129428081521270D-05-.3006329973746788D-040.4851599099553577D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3981401266047105D-04 +0.6425163892851680D-050.4519256146756725D-04-.7293151198878877D-05 +-.5098776122625716D-040.8228377410789080D-050.5727272713271265D-04 +-.9242641819512053D-05-.6413319184916952D-040.1034977991584680D-04 +0.7167060586276605D-04-.1156616372469904D-04-.8000610566205314D-04 +0.1291134218726644D-040.8928564729752786D-04-.1440886961226929D-04 +-.9968672138364864D-040.1608738933935444D-040.1114272391272199D-03 +-.1798206776156415D-04-.1247774371157844D-030.2013651551366699D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1577525118211425D-03 +0.2545801528732096D-040.1783582025511267D-03-.2878335054540236D-04 +-.2026106452901076D-030.3269719667613068D-040.2314578281220329D-03 +-.3735253948527681D-04-.2661733971656788D-030.4295491929665637D-04 +0.3085010747980624D-03-.4978573708714430D-040.3045378394557195D-03 +0.1859468584754816D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.5731212358601079D-02 +-.1248122626208860D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03 +0.4295491929665637D-040.3183239913197660D-030.1979879124037159D-04 +-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03 +-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +0.9350157447874083D-02-.1115418954076180D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03 +-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04 +0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03 +0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04 +-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03 +-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04 +0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04 +0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04 +-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04 +-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05 +0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04 +0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05 +-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04 +-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05 +0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04 +0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05 +-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05 +-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06 +-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05 +-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05 +0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04 +0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05 +-.3006329973746788D-040.4851599099553577D-050.3478916893609630D-04 +-.5614257322333374D-05-.3981401266047105D-040.6425163892851680D-05 +0.4519256146756725D-04-.7293151198878877D-05-.5098776122625716D-04 +0.8228377410789080D-050.5727272713271265D-04-.9242641819512053D-05 +-.6413319184916952D-040.1034977991584680D-040.7167060586276605D-04 +-.1156616372469904D-04-.8000610566205314D-040.1291134218726644D-04 +0.8928564729752786D-04-.1440886961226929D-04-.9968672138364864D-04 +0.1608738933935444D-040.1114272391272199D-03-.1798206776156415D-04 +-.1247774371157844D-030.2013651551366699D-040.1400760388418106D-03 +-.2260539561021587D-04-.1577525118211425D-030.2545801528732096D-04 +0.1783582025511267D-03-.2878335054540236D-04-.2026106452901076D-03 +0.3269719667613068D-040.2314578281220329D-03-.3735253948527681D-04 +0.3321803688867207D-030.2101475811579130D-040.2314578281220545D-03 +-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-010.1356118906725279D-01-.1008310886583305D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03 +-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03 +0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04 +-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03 +-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04 +0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04 +0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04 +-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04 +-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04 +0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04 +0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05 +-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04 +-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05 +0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04 +0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05 +-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05 +-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06 +0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05 +-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06 +0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04 +0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05 +-.2132146425429693D-040.3440846403443515D-050.2558831255668139D-04 +-.4129428081521270D-05-.3006329973746788D-040.4851599099553577D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3981401266047105D-04 +0.6425163892851680D-050.4519256146756725D-04-.7293151198878877D-05 +-.5098776122625716D-040.8228377410789080D-050.5727272713271265D-04 +-.9242641819512053D-05-.6413319184916952D-040.1034977991584680D-04 +0.7167060586276605D-04-.1156616372469904D-04-.8000610566205314D-04 +0.1291134218726644D-040.8928564729752786D-04-.1440886961226929D-04 +-.9968672138364864D-040.1608738933935444D-040.1114272391272199D-03 +-.1798206776156415D-04-.1247774371157844D-030.2013651551366699D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1577525118211425D-03 +0.2545801528732096D-040.1783582025511267D-03-.2878335054540236D-04 +-.2026106452901076D-030.3269719667613068D-040.3461073275196676D-03 +0.2224267627894746D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.1815486735526482D-01 +-.9241196217609635D-02-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-040.3601052243676528D-030.2348263614220369D-04 +0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03 +0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04 +-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03 +-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +0.2296699136715612D-01-.8602070427593237D-02-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03 +-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04 +0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03 +0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04 +-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03 +-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04 +0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04 +0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04 +-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04 +-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05 +0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04 +0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05 +-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04 +-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05 +0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04 +0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05 +-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05 +-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06 +-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05 +-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05 +0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04 +0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05 +-.3006329973746788D-040.4851599099553577D-050.3478916893609630D-04 +-.5614257322333374D-05-.3981401266047105D-040.6425163892851680D-05 +0.4519256146756725D-04-.7293151198878877D-05-.5098776122625716D-04 +0.8228377410789080D-050.5727272713271265D-04-.9242641819512053D-05 +-.6413319184916952D-040.1034977991584680D-040.7167060586276605D-04 +-.1156616372469904D-04-.8000610566205314D-040.1291134218726644D-04 +0.8928564729752786D-04-.1440886961226929D-04-.9968672138364864D-04 +0.1608738933935444D-040.1114272391272199D-03-.1798206776156415D-04 +-.1247774371157844D-030.2013651551366699D-040.1400760388418106D-03 +-.2260539561021587D-04-.1577525118211425D-030.2545801528732096D-04 +0.3741744183745985D-030.2473472872899837D-04-.1577525118210161D-03 +0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04 +-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03 +-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-010.2787009059662764D-01-.8140449450940520D-02 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03 +-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03 +0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04 +-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03 +-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04 +0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04 +0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04 +-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04 +-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04 +0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04 +0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05 +-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04 +-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05 +0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04 +0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05 +-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05 +-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06 +0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05 +-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06 +0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04 +0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05 +-.2132146425429693D-040.3440846403443515D-050.2558831255668139D-04 +-.4129428081521270D-05-.3006329973746788D-040.4851599099553577D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3981401266047105D-04 +0.6425163892851680D-050.4519256146756725D-04-.7293151198878877D-05 +-.5098776122625716D-040.8228377410789080D-050.5727272713271265D-04 +-.9242641819512053D-05-.6413319184916952D-040.1034977991584680D-04 +0.7167060586276605D-04-.1156616372469904D-04-.8000610566205314D-04 +0.1291134218726644D-040.8928564729752786D-04-.1440886961226929D-04 +-.9968672138364864D-040.1608738933935444D-040.1114272391272199D-03 +-.1798206776156415D-04-.1247774371157844D-030.2013651551366699D-04 +0.1400760388418106D-03-.2260539561021587D-040.3883152702882559D-03 +0.2599904567771967D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.3276642467527989D-01 +-.7832596231436846D-02-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.4025281426692064D-030.2727567924560386D-04 +-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03 +-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04 +0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03 +0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04 +-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03 +-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +0.3758223191522410D-01-.7656581262990280D-02-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03 +-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04 +0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03 +0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04 +-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03 +-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04 +0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04 +0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04 +-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04 +-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05 +0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04 +0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05 +-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04 +-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05 +0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04 +0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05 +-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05 +-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06 +-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05 +-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05 +0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04 +0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05 +-.3006329973746788D-040.4851599099553577D-050.3478916893609630D-04 +-.5614257322333374D-05-.3981401266047105D-040.6425163892851680D-05 +0.4519256146756725D-04-.7293151198878877D-05-.5098776122625716D-04 +0.8228377410789080D-050.5727272713271265D-04-.9242641819512053D-05 +-.6413319184916952D-040.1034977991584680D-040.7167060586276605D-04 +-.1156616372469904D-04-.8000610566205314D-040.1291134218726644D-04 +0.8928564729752786D-04-.1440886961226929D-04-.9968672138364864D-04 +0.1608738933935444D-040.1114272391272199D-03-.1798206776156415D-04 +0.4168133998999086D-030.2856472231265750D-040.1114272391270168D-03 +-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03 +0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04 +-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03 +-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-010.4226301116560104D-01-.7592410749930865D-02 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03 +-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03 +0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04 +-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03 +-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04 +0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04 +0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04 +-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04 +-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04 +0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04 +0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05 +-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04 +-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05 +0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04 +0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05 +-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05 +-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06 +0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05 +-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06 +0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04 +0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05 +-.2132146425429693D-040.3440846403443515D-050.2558831255668139D-04 +-.4129428081521270D-05-.3006329973746788D-040.4851599099553577D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3981401266047105D-04 +0.6425163892851680D-050.4519256146756725D-04-.7293151198878877D-05 +-.5098776122625716D-040.8228377410789080D-050.5727272713271265D-04 +-.9242641819512053D-05-.6413319184916952D-040.1034977991584680D-04 +0.7167060586276605D-04-.1156616372469904D-04-.8000610566205314D-04 +0.1291134218726644D-040.8928564729752786D-04-.1440886961226929D-04 +-.9968672138364864D-040.1608738933935444D-040.4311714081937841D-03 +0.2986626838560346D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.4676965794798595D-01 +-.7622058049335034D-02-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-040.4456025356043519D-030.3118041160185087D-04 +0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04 +0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04 +-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03 +-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04 +0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03 +0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04 +-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03 +-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +0.5107530622773573D-01-.7729427242199239D-02-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03 +-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04 +0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03 +0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04 +-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03 +-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04 +0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04 +0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04 +-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04 +-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05 +0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04 +0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05 +-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04 +-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05 +0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04 +0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05 +-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05 +-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06 +-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05 +-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05 +0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04 +0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05 +-.3006329973746788D-040.4851599099553577D-050.3478916893609630D-04 +-.5614257322333374D-05-.3981401266047105D-040.6425163892851680D-05 +0.4519256146756725D-04-.7293151198878877D-05-.5098776122625716D-04 +0.8228377410789080D-050.5727272713271265D-04-.9242641819512053D-05 +-.6413319184916952D-040.1034977991584680D-040.7167060586276605D-04 +-.1156616372469904D-04-.8000610566205314D-040.1291134218726644D-04 +0.4601071520344119D-030.3250724673348925D-04-.8000610566205206D-04 +0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04 +-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03 +-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03 +0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04 +-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03 +-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-010.5516275247888457D-01-.7900270743738223D-02 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03 +-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03 +0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04 +-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03 +-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04 +0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04 +0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04 +-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04 +-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04 +0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04 +0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05 +-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04 +-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05 +0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04 +0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05 +-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05 +-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06 +0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05 +-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06 +0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04 +0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05 +-.2132146425429693D-040.3440846403443515D-050.2558831255668139D-04 +-.4129428081521270D-05-.3006329973746788D-040.4851599099553577D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3981401266047105D-04 +0.6425163892851680D-050.4519256146756725D-04-.7293151198878877D-05 +-.5098776122625716D-040.8228377410789080D-050.5727272713271265D-04 +-.9242641819512053D-05-.6413319184916952D-040.1034977991584680D-04 +0.7167060586276605D-04-.1156616372469904D-040.4746856292452647D-03 +0.3384686919130694D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.5902235975385258D-01 +-.8122077438341108D-02-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.4893383408659858D-030.3519937502883382D-04 +-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04 +-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04 +0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04 +0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04 +-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03 +-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04 +0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03 +0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04 +-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03 +-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +0.6265035698167873D-01-.8383943600343269D-02-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03 +-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04 +0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03 +0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04 +-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03 +-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04 +0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04 +0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04 +-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04 +-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05 +0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04 +0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05 +-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04 +-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05 +0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04 +0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05 +-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05 +-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06 +-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05 +-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05 +0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04 +0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05 +-.3006329973746788D-040.4851599099553577D-050.3478916893609630D-04 +-.5614257322333374D-05-.3981401266047105D-040.6425163892851680D-05 +0.4519256146756725D-04-.7293151198878877D-05-.5098776122625716D-04 +0.8228377410789080D-050.5727272713271265D-04-.9242641819512053D-05 +0.5040656624027409D-030.3656486094640881D-040.5727272713271211D-04 +-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04 +0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04 +0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04 +-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03 +-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03 +0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04 +-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03 +-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-010.6604746327913752D-01-.8676435588169473D-02 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03 +-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03 +0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04 +-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03 +-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04 +0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04 +0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04 +-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04 +-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04 +0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04 +0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05 +-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04 +-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05 +0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04 +0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05 +-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05 +-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06 +0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05 +-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06 +0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04 +0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05 +-.2132146425429693D-040.3440846403443515D-050.2558831255668139D-04 +-.4129428081521270D-05-.3006329973746788D-040.4851599099553577D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3981401266047105D-04 +0.6425163892851680D-050.4519256146756725D-04-.7293151198878877D-05 +-.5098776122625716D-040.8228377410789080D-050.5188679712481502D-03 +0.3794342429527186D-04-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.6921777916009794D-01 +-.8991450776860036D-02-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-050.5337456466906940D-030.3933516308168090D-04 +0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04 +0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05 +-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04 +-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04 +0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04 +0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04 +-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03 +-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04 +0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03 +0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04 +-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03 +-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +0.7216789658063694D-01-.9322081262977695D-02-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03 +-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04 +0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03 +0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04 +-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03 +-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04 +0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04 +0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04 +-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04 +-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05 +0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04 +0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05 +-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04 +-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05 +0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04 +0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05 +-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05 +-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06 +-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05 +-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05 +0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04 +0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05 +-.3006329973746788D-040.4851599099553577D-050.3478916893609630D-04 +-.5614257322333374D-05-.3981401266047105D-040.6425163892851680D-05 +0.5486990699241699D-030.4074017597105377D-04-.3981401266032415D-04 +0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05 +-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04 +-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04 +0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04 +0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04 +-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03 +-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03 +0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04 +-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03 +-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-010.7490618810353455D-01-.9662483409213413D-02 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03 +-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03 +0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04 +-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03 +-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04 +0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04 +0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04 +-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04 +-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04 +0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04 +0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05 +-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04 +-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05 +0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04 +0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05 +-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05 +-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06 +0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05 +-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06 +0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04 +0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05 +-.2132146425429693D-040.3440846403443515D-050.2558831255668139D-04 +-.4129428081521270D-05-.3006329973746788D-040.4851599099553577D-05 +0.3478916893609630D-04-.5614257322333374D-050.5637286240571986D-03 +0.4215856229213537D-040.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.7744224239182489D-01 +-.1000775519245637D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.5788346941227656D-030.4359042204118991D-04 +-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04 +-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05 +0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04 +0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05 +-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04 +-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04 +0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04 +0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04 +-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03 +-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04 +0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03 +0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04 +-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03 +-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +0.7978641898553364D-01-.1035382249831074D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03 +-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04 +0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03 +0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04 +-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03 +-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04 +0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04 +0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04 +-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04 +-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05 +0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04 +0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05 +-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04 +-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05 +0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04 +0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05 +-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05 +-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06 +-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05 +-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05 +0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04 +0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05 +0.5940176670878278D-030.4503585588621884D-040.2558831255660659D-04 +-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04 +0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05 +-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04 +-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04 +0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04 +0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04 +-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03 +-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03 +0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04 +-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03 +-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-010.8194950007742326D-01-.1069733490338830D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03 +-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03 +0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04 +-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03 +-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04 +0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04 +0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04 +-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04 +-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04 +0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04 +0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05 +-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04 +-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05 +0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04 +0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05 +-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05 +-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06 +0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05 +-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06 +0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04 +0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05 +-.2132146425429693D-040.3440846403443515D-050.6092779318629489D-03 +0.4649496517120420D-04-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.8394242094818047D-01 +-.1103557105390731D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-050.6246158793119950D-030.4796785192037780D-04 +0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04 +0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05 +-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04 +-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05 +0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04 +0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05 +-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04 +-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04 +0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04 +0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04 +-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03 +-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04 +0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03 +0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04 +-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03 +-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +0.8577606398706922D-01-.1136635344559469D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03 +-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04 +0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03 +0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04 +-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03 +-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04 +0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04 +0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04 +-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04 +-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05 +0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04 +0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05 +-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04 +-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05 +0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04 +0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05 +-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05 +-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06 +-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05 +-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05 +0.6400319022618756D-030.4945461884251627D-04-.1326172498190355D-04 +0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05 +-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04 +-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04 +0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05 +-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04 +-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04 +0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04 +0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04 +-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03 +-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03 +0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04 +-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03 +-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-010.8746110392560591D-01-.1168797220454049D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03 +-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03 +0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04 +-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03 +-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04 +0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04 +0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04 +-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04 +-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04 +0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04 +0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05 +-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04 +-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05 +0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04 +0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05 +-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05 +-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06 +0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05 +-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06 +0.9401297415863014D-05-.1517176307183306D-050.6555263955123291D-03 +0.5095536933526217D-040.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.8900789414501604D-01 +-.1199911733718971D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.6710997558457615D-030.5247020748947131D-04 +-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05 +-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05 +0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04 +0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05 +-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04 +-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05 +0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04 +0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05 +-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04 +-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04 +0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04 +0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04 +-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03 +-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04 +0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03 +0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04 +-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03 +-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +0.9042638576277094D-01-.1229881884115071D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03 +-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04 +0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03 +0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04 +-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03 +-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04 +0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04 +0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04 +-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04 +-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05 +0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04 +0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05 +-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04 +-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05 +0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04 +0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05 +-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05 +-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06 +0.6867523820371290D-030.5399923809358637D-040.1866143715712640D-05 +-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06 +0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04 +0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05 +-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04 +-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04 +0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05 +-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04 +-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04 +0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04 +0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04 +-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03 +-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03 +0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04 +-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03 +-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-010.9172607272565819D-01-.1258639403228736D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03 +-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03 +0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04 +-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03 +-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04 +0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04 +0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04 +-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04 +-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04 +0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04 +0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05 +-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04 +-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05 +0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04 +0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05 +-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05 +-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06 +0.1866143715712640D-05-.3011572664961087D-060.7024846748638742D-03 +0.5554256663803711D-040.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.9291595739173754D-01 +-.1286140143634197D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.7182970371159094D-030.5710029931966725D-04 +-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05 +-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06 +-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05 +-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05 +0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04 +0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05 +-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04 +-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05 +0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04 +0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05 +-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04 +-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04 +0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04 +0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04 +-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03 +-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04 +0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03 +0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04 +-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03 +-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +0.9400453211699690D-01-.1312360060645681D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03 +-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04 +0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03 +0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04 +-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03 +-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04 +0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04 +0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04 +-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04 +-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05 +0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04 +0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05 +-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04 +-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05 +0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04 +0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05 +0.7341898736056463D-030.5867254304618804D-040.9401297415863014D-05 +-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06 +0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05 +-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06 +0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04 +0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05 +-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04 +-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04 +0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05 +-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04 +-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04 +0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04 +0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04 +-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03 +-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03 +0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04 +-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03 +-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-010.9499977321263603D-01-.1337291725485198D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03 +-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03 +0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04 +-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03 +-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04 +0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04 +0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04 +-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04 +-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04 +0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04 +0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05 +-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04 +-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05 +0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04 +0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05 +-.1326172498190355D-040.2140170025998270D-050.7501635911780829D-03 +0.6025940544065905D-04-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.9590914433729904D-01 +-.1360941312262982D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-050.7662185987209308D-030.6186099484599586D-04 +0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04 +0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05 +-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05 +-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06 +-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05 +-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05 +0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04 +0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05 +-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04 +-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05 +0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04 +0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05 +-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04 +-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04 +0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04 +0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04 +-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03 +-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04 +0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03 +0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04 +-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03 +-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +0.9673960696151584D-01-.1383326005253246D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03 +-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04 +0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03 +0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04 +-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03 +-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04 +0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04 +0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04 +-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04 +-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05 +0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04 +0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05 +-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04 +-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05 +0.7823553071748006D-030.6347742032950520D-04-.2132146425429693D-04 +0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05 +-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05 +-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06 +0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05 +-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06 +0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04 +0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05 +-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04 +-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04 +0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05 +-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04 +-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04 +0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04 +0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04 +-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03 +-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03 +0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04 +-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03 +-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-010.9749763601089485D-01-.1404471777278064D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03 +-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03 +0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04 +-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03 +-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04 +0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04 +0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04 +-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04 +-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04 +0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04 +0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05 +-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04 +-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05 +0.2558831255660659D-04-.4129428081509198D-050.7985741295434327D-03 +0.6510879168744751D-040.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.9818923917831297D-01 +-.1424411494392620D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.8148754809039821D-030.6675521944962719D-04 +-.3006329973746788D-040.4851599099553577D-050.2558831255668139D-04 +-.4129428081521270D-05-.2132146425429693D-040.3440846403443515D-05 +0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04 +0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05 +-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05 +-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06 +-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05 +-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05 +0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04 +0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05 +-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04 +-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05 +0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04 +0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05 +-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04 +-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04 +0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04 +0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04 +-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03 +-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04 +0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03 +0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04 +-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03 +-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +0.9881997870846726D-01-.1443183306359489D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03 +-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04 +0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03 +0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04 +-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03 +-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04 +0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04 +0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04 +-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04 +-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05 +0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04 +0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05 +0.8312597784173505D-030.6841681488401041D-040.3478916893609630D-04 +-.5614257322333374D-05-.3006329973746788D-040.4851599099553577D-05 +0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04 +0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05 +-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05 +-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06 +0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05 +-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06 +0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04 +0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05 +-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04 +-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04 +0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05 +-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04 +-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04 +0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04 +0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04 +-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03 +-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03 +0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04 +-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03 +-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-010.9939499471310484D-01-.1460829286515623D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03 +-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03 +0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04 +-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03 +-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04 +0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04 +0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04 +-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04 +-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04 +0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04 +0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05 +-.3981401266032415D-040.6425163892827973D-050.8477274413385733D-03 +0.7009369000137130D-04-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.9991902928232077D-01 +-.1477394288514098D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-050.8642788910272550D-030.7178595755996570D-04 +0.4519256146756725D-04-.7293151198878877D-05-.3981401266047105D-04 +0.6425163892851680D-050.3478916893609630D-04-.5614257322333374D-05 +-.3006329973746788D-040.4851599099553577D-050.2558831255668139D-04 +-.4129428081521270D-05-.2132146425429693D-040.3440846403443515D-05 +0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04 +0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05 +-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05 +-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06 +-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05 +-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05 +0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04 +0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05 +-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04 +-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05 +0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04 +0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05 +-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04 +-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04 +0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04 +0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04 +-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03 +-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04 +0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03 +0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04 +-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03 +-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +0.1003964508250222D+00-.1492924991028709D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03 +-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04 +0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03 +0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04 +-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03 +-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04 +0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04 +0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04 +-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04 +-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05 +0.8809145509580565D-030.7349373107023372D-04-.5098776122625716D-04 +0.8228377410789080D-050.4519256146756725D-04-.7293151198878877D-05 +-.3981401266047105D-040.6425163892851680D-050.3478916893609630D-04 +-.5614257322333374D-05-.3006329973746788D-040.4851599099553577D-05 +0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04 +0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05 +-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05 +-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06 +0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05 +-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06 +0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04 +0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05 +-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04 +-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04 +0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05 +-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04 +-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04 +0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04 +0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04 +-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03 +-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03 +0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04 +-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03 +-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-010.1008312782070416D+00-.1507469104826736D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03 +-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03 +0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04 +-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03 +-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04 +0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04 +0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04 +-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04 +-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04 +0.5727272713271211D-04-.9242641819511967D-050.8976348467312377D-03 +0.7521712479953038D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.1012272043642645D+00 +-.1521074719639924D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.9144402060832480D-030.7695625377688507D-04 +-.6413319184916952D-040.1034977991584680D-040.5727272713271265D-04 +-.9242641819512053D-05-.5098776122625716D-040.8228377410789080D-05 +0.4519256146756725D-04-.7293151198878877D-05-.3981401266047105D-04 +0.6425163892851680D-050.3478916893609630D-04-.5614257322333374D-05 +-.3006329973746788D-040.4851599099553577D-050.2558831255668139D-04 +-.4129428081521270D-05-.2132146425429693D-040.3440846403443515D-05 +0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04 +0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05 +-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05 +-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06 +-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05 +-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05 +0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04 +0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05 +-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04 +-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05 +0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04 +0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05 +-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04 +-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04 +0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04 +0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04 +-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03 +-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04 +0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03 +0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04 +-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03 +-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +0.1015876191553175D+00-.1533789771001627D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03 +-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04 +0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03 +0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04 +-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03 +-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04 +0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04 +0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04 +0.9313310588973688D-030.7871123379778959D-040.7167060586276605D-04 +-.1156616372469904D-04-.6413319184916952D-040.1034977991584680D-04 +0.5727272713271265D-04-.9242641819512053D-05-.5098776122625716D-04 +0.8228377410789080D-050.4519256146756725D-04-.7293151198878877D-05 +-.3981401266047105D-040.6425163892851680D-050.3478916893609630D-04 +-.5614257322333374D-05-.3006329973746788D-040.4851599099553577D-05 +0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04 +0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05 +-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05 +-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06 +0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05 +-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06 +0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04 +0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05 +-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04 +-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04 +0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05 +-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04 +-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04 +0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04 +0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04 +-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03 +-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03 +0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04 +-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03 +-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-010.1019156312878210D+00-.1545661609680803D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03 +-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03 +0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04 +-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03 +-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04 +0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04 +0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04 +-.8000610566205206D-040.1291134218726627D-040.9483078372144148D-03 +0.8048218142901548D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.1022140892071981D+00 +-.1556736658546946D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-040.9653709752434816D-030.8226921401346013D-04 +0.8928564729752786D-04-.1440886961226929D-04-.8000610566205314D-04 +0.1291134218726644D-040.7167060586276605D-04-.1156616372469904D-04 +-.6413319184916952D-040.1034977991584680D-040.5727272713271265D-04 +-.9242641819512053D-05-.5098776122625716D-040.8228377410789080D-05 +0.4519256146756725D-04-.7293151198878877D-05-.3981401266047105D-04 +0.6425163892851680D-050.3478916893609630D-04-.5614257322333374D-05 +-.3006329973746788D-040.4851599099553577D-050.2558831255668139D-04 +-.4129428081521270D-05-.2132146425429693D-040.3440846403443515D-05 +0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04 +0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05 +-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05 +-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06 +-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05 +-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05 +0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04 +0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05 +-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04 +-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05 +0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04 +0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05 +-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04 +-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04 +0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04 +0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04 +-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03 +-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04 +0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03 +0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04 +-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03 +-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +0.1024856008802586D+00-.1567060143662068D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03 +-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04 +0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03 +0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04 +-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03 +-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04 +0.9825209093727470D-030.8407244967502225D-04-.9968672138364864D-04 +0.1608738933935444D-040.8928564729752786D-04-.1440886961226929D-04 +-.8000610566205314D-040.1291134218726644D-040.7167060586276605D-04 +-.1156616372469904D-04-.6413319184916952D-040.1034977991584680D-04 +0.5727272713271265D-04-.9242641819512053D-05-.5098776122625716D-04 +0.8228377410789080D-050.4519256146756725D-04-.7293151198878877D-05 +-.3981401266047105D-040.6425163892851680D-050.3478916893609630D-04 +-.5614257322333374D-05-.3006329973746788D-040.4851599099553577D-05 +0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04 +0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05 +-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05 +-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06 +0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05 +-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06 +0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04 +0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05 +-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04 +-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04 +0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05 +-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04 +-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04 +0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04 +0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04 +-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03 +-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03 +0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04 +-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03 +-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-010.1027325524394487D+00-.1576675888135830D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03 +-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03 +0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04 +-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03 +-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04 +0.1114272391270168D-03-.1798206776153138D-040.9997580781803323D-03 +0.8589200732350710D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.1029571256795995D+00 +-.1585626158817118D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1017082922445208D-020.8772800665956083D-04 +-.1247774371157844D-030.2013651551366699D-040.1114272391272199D-03 +-.1798206776156415D-04-.9968672138364864D-040.1608738933935444D-04 +0.8928564729752786D-04-.1440886961226929D-04-.8000610566205314D-04 +0.1291134218726644D-040.7167060586276605D-04-.1156616372469904D-04 +-.6413319184916952D-040.1034977991584680D-040.5727272713271265D-04 +-.9242641819512053D-05-.5098776122625716D-040.8228377410789080D-05 +0.4519256146756725D-04-.7293151198878877D-05-.3981401266047105D-04 +0.6425163892851680D-050.3478916893609630D-04-.5614257322333374D-05 +-.3006329973746788D-040.4851599099553577D-050.2558831255668139D-04 +-.4129428081521270D-05-.2132146425429693D-040.3440846403443515D-05 +0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04 +0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05 +-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05 +-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06 +-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05 +-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05 +0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04 +0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05 +-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04 +-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05 +0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04 +0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05 +-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04 +-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04 +0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04 +0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04 +-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03 +-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04 +0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03 +0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04 +-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03 +-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +0.1031613144187102D+00-.1593951557249072D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03 +-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04 +0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03 +0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04 +0.1034495885158160D-020.8958056817963518D-040.1400760388418106D-03 +-.2260539561021587D-04-.1247774371157844D-030.2013651551366699D-04 +0.1114272391272199D-03-.1798206776156415D-04-.9968672138364864D-04 +0.1608738933935444D-040.8928564729752786D-04-.1440886961226929D-04 +-.8000610566205314D-040.1291134218726644D-040.7167060586276605D-04 +-.1156616372469904D-04-.6413319184916952D-040.1034977991584680D-04 +0.5727272713271265D-04-.9242641819512053D-05-.5098776122625716D-04 +0.8228377410789080D-050.4519256146756725D-04-.7293151198878877D-05 +-.3981401266047105D-040.6425163892851680D-050.3478916893609630D-04 +-.5614257322333374D-05-.3006329973746788D-040.4851599099553577D-05 +0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04 +0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05 +-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05 +-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06 +0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05 +-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06 +0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04 +0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05 +-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04 +-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04 +0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05 +-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04 +-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04 +0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04 +0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04 +-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03 +-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03 +0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04 +-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03 +-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-010.1033469397490001D+00-.1601690947502950D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03 +-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03 +0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04 +-.1577525118210161D-030.2545801528730057D-040.1051997411532808D-02 +0.9144981318098186D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.1035156642151411D+00 +-.1608881414546571D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-040.1069587949016678D-020.9333586376667711D-04 +0.1783582025511267D-03-.2878335054540236D-04-.1577525118211425D-03 +0.2545801528732096D-040.1400760388418106D-03-.2260539561021587D-04 +-.1247774371157844D-030.2013651551366699D-040.1114272391272199D-03 +-.1798206776156415D-04-.9968672138364864D-040.1608738933935444D-04 +0.8928564729752786D-04-.1440886961226929D-04-.8000610566205314D-04 +0.1291134218726644D-040.7167060586276605D-04-.1156616372469904D-04 +-.6413319184916952D-040.1034977991584680D-040.5727272713271265D-04 +-.9242641819512053D-05-.5098776122625716D-040.8228377410789080D-05 +0.4519256146756725D-04-.7293151198878877D-05-.3981401266047105D-04 +0.6425163892851680D-050.3478916893609630D-04-.5614257322333374D-05 +-.3006329973746788D-040.4851599099553577D-050.2558831255668139D-04 +-.4129428081521270D-05-.2132146425429693D-040.3440846403443515D-05 +0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04 +0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05 +-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05 +-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06 +-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05 +-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05 +0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04 +0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05 +-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04 +-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05 +0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04 +0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05 +-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04 +-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04 +0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04 +0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04 +-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03 +-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04 +0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03 +0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04 +-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03 +-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +0.1036690049640822D+00-.1615558247711579D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03 +-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04 +0.1087267947302331D-020.9523884285067672D-04-.2026106452901076D-03 +0.3269719667613068D-040.1783582025511267D-03-.2878335054540236D-04 +-.1577525118211425D-030.2545801528732096D-040.1400760388418106D-03 +-.2260539561021587D-04-.1247774371157844D-030.2013651551366699D-04 +0.1114272391272199D-03-.1798206776156415D-04-.9968672138364864D-04 +0.1608738933935444D-040.8928564729752786D-04-.1440886961226929D-04 +-.8000610566205314D-040.1291134218726644D-040.7167060586276605D-04 +-.1156616372469904D-04-.6413319184916952D-040.1034977991584680D-04 +0.5727272713271265D-04-.9242641819512053D-05-.5098776122625716D-04 +0.8228377410789080D-050.4519256146756725D-04-.7293151198878877D-05 +-.3981401266047105D-040.6425163892851680D-050.3478916893609630D-04 +-.5614257322333374D-05-.3006329973746788D-040.4851599099553577D-05 +0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04 +0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05 +-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05 +-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06 +0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05 +-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06 +0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04 +0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05 +-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04 +-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04 +0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05 +-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04 +-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04 +0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04 +0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04 +-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03 +-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03 +0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04 +-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03 +-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-010.1038083459158393D+00-.1621754944615051D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03 +-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04 +0.2314578281220545D-03-.3735253948528030D-040.1105037858338542D-02 +0.9715887416290131D-040.2314578281220329D-03-.3735253948527681D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.1039349490076170D+00 +-.1627503231578771D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.1122898136341541D-020.9909608225435285D-04 +-.2661733971656788D-030.4295491929665637D-040.2314578281220329D-03 +-.3735253948527681D-04-.2026106452901076D-030.3269719667613068D-04 +0.1783582025511267D-03-.2878335054540236D-04-.1577525118211425D-03 +0.2545801528732096D-040.1400760388418106D-03-.2260539561021587D-04 +-.1247774371157844D-030.2013651551366699D-040.1114272391272199D-03 +-.1798206776156415D-04-.9968672138364864D-040.1608738933935444D-04 +0.8928564729752786D-04-.1440886961226929D-04-.8000610566205314D-04 +0.1291134218726644D-040.7167060586276605D-04-.1156616372469904D-04 +-.6413319184916952D-040.1034977991584680D-040.5727272713271265D-04 +-.9242641819512053D-05-.5098776122625716D-040.8228377410789080D-05 +0.4519256146756725D-04-.7293151198878877D-05-.3981401266047105D-04 +0.6425163892851680D-050.3478916893609630D-04-.5614257322333374D-05 +-.3006329973746788D-040.4851599099553577D-050.2558831255668139D-04 +-.4129428081521270D-05-.2132146425429693D-040.3440846403443515D-05 +0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04 +0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05 +-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05 +-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06 +-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05 +-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05 +0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04 +0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05 +-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04 +-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05 +0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04 +0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05 +-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04 +-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04 +0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04 +0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04 +-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03 +-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04 +0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03 +0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04 +-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03 +-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +0.1040499645650695D+00-.1632833097185782D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +0.1140849237806308D-020.1010505925022613D-030.3085010747980624D-03 +-.4978573708714430D-04-.2661733971656788D-030.4295491929665637D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2026106452901076D-03 +0.3269719667613068D-040.1783582025511267D-03-.2878335054540236D-04 +-.1577525118211425D-030.2545801528732096D-040.1400760388418106D-03 +-.2260539561021587D-04-.1247774371157844D-030.2013651551366699D-04 +0.1114272391272199D-03-.1798206776156415D-04-.9968672138364864D-04 +0.1608738933935444D-040.8928564729752786D-04-.1440886961226929D-04 +-.8000610566205314D-040.1291134218726644D-040.7167060586276605D-04 +-.1156616372469904D-04-.6413319184916952D-040.1034977991584680D-04 +0.5727272713271265D-04-.9242641819512053D-05-.5098776122625716D-04 +0.8228377410789080D-050.4519256146756725D-04-.7293151198878877D-05 +-.3981401266047105D-040.6425163892851680D-050.3478916893609630D-04 +-.5614257322333374D-05-.3006329973746788D-040.4851599099553577D-05 +0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04 +0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05 +-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05 +-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06 +0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05 +-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06 +0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04 +0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05 +-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04 +-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04 +0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05 +-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04 +-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04 +0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04 +0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04 +-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03 +-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03 +0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04 +-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03 +-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-010.1041544408547741D+00-.1637772836129954D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.1158891621517917D-02 +0.1030225311152631D-03-.3608796739013979D-030.5823856716450639D-04 +0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03 +0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.1042493328713475D+00 +-.1642349100959841D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-040.1177025748562945D-020.1050120251386102D-03 +0.4268045368520104D-03-.6887748599651892D-04-.3608796739013979D-03 +0.5823856716450639D-040.3085010747980624D-03-.4978573708714430D-04 +-.2661733971656788D-030.4295491929665637D-040.2314578281220329D-03 +-.3735253948527681D-04-.2026106452901076D-030.3269719667613068D-04 +0.1783582025511267D-03-.2878335054540236D-04-.1577525118211425D-03 +0.2545801528732096D-040.1400760388418106D-03-.2260539561021587D-04 +-.1247774371157844D-030.2013651551366699D-040.1114272391272199D-03 +-.1798206776156415D-04-.9968672138364864D-040.1608738933935444D-04 +0.8928564729752786D-04-.1440886961226929D-04-.8000610566205314D-04 +0.1291134218726644D-040.7167060586276605D-04-.1156616372469904D-04 +-.6413319184916952D-040.1034977991584680D-040.5727272713271265D-04 +-.9242641819512053D-05-.5098776122625716D-040.8228377410789080D-05 +0.4519256146756725D-04-.7293151198878877D-05-.3981401266047105D-04 +0.6425163892851680D-050.3478916893609630D-04-.5614257322333374D-05 +-.3006329973746788D-040.4851599099553577D-050.2558831255668139D-04 +-.4129428081521270D-05-.2132146425429693D-040.3440846403443515D-05 +0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04 +0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05 +-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05 +-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06 +-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05 +-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05 +0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04 +0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05 +-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04 +-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05 +0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04 +0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05 +-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04 +-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04 +0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04 +0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04 +-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03 +-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04 +0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03 +0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04 +-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03 +-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +0.1043355104113325D+00-.1646586959702118D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.1195252082340932D-020.1070192024594111D-03-.5114288231755168D-03 +0.8253410768850847D-040.4268045368520104D-03-.6887748599651892D-04 +-.3608796739013979D-030.5823856716450639D-040.3085010747980624D-03 +-.4978573708714430D-04-.2661733971656788D-030.4295491929665637D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2026106452901076D-03 +0.3269719667613068D-040.1783582025511267D-03-.2878335054540236D-04 +-.1577525118211425D-030.2545801528732096D-040.1400760388418106D-03 +-.2260539561021587D-04-.1247774371157844D-030.2013651551366699D-04 +0.1114272391272199D-03-.1798206776156415D-04-.9968672138364864D-04 +0.1608738933935444D-040.8928564729752786D-04-.1440886961226929D-04 +-.8000610566205314D-040.1291134218726644D-040.7167060586276605D-04 +-.1156616372469904D-04-.6413319184916952D-040.1034977991584680D-04 +0.5727272713271265D-04-.9242641819512053D-05-.5098776122625716D-04 +0.8228377410789080D-050.4519256146756725D-04-.7293151198878877D-05 +-.3981401266047105D-040.6425163892851680D-050.3478916893609630D-04 +-.5614257322333374D-05-.3006329973746788D-040.4851599099553577D-05 +0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04 +0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05 +-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05 +-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06 +0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05 +-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06 +0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04 +0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05 +-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04 +-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04 +0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05 +-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04 +-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04 +0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04 +0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04 +-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03 +-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03 +0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04 +-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03 +-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-010.1044137654841926D+00-.1650509957680039D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-030.1213571088575899D-02 +0.1090441918119028D-030.6226054234809117D-03-.1004757274921672D-03 +-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03 +-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04 +0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03 +0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.1044848191086251D+00 +-.1654140182125686D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.1231983235327929D-020.1110871227827559D-03 +-.7727812230408974D-030.1247110170406368D-030.6226054234809117D-03 +-.1004757274921672D-03-.5114288231755168D-030.8253410768850847D-04 +0.4268045368520104D-03-.6887748599651892D-04-.3608796739013979D-03 +0.5823856716450639D-040.3085010747980624D-03-.4978573708714430D-04 +-.2661733971656788D-030.4295491929665637D-040.2314578281220329D-03 +-.3735253948527681D-04-.2026106452901076D-030.3269719667613068D-04 +0.1783582025511267D-03-.2878335054540236D-04-.1577525118211425D-03 +0.2545801528732096D-040.1400760388418106D-03-.2260539561021587D-04 +-.1247774371157844D-030.2013651551366699D-040.1114272391272199D-03 +-.1798206776156415D-04-.9968672138364864D-040.1608738933935444D-04 +0.8928564729752786D-04-.1440886961226929D-04-.8000610566205314D-04 +0.1291134218726644D-040.7167060586276605D-04-.1156616372469904D-04 +-.6413319184916952D-040.1034977991584680D-040.5727272713271265D-04 +-.9242641819512053D-05-.5098776122625716D-040.8228377410789080D-05 +0.4519256146756725D-04-.7293151198878877D-05-.3981401266047105D-04 +0.6425163892851680D-050.3478916893609630D-04-.5614257322333374D-05 +-.3006329973746788D-040.4851599099553577D-050.2558831255668139D-04 +-.4129428081521270D-05-.2132146425429693D-040.3440846403443515D-05 +0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04 +0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05 +-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05 +-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06 +-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05 +-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05 +0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04 +0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05 +-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04 +-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05 +0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04 +0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05 +-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04 +-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04 +0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04 +0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04 +-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03 +-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04 +0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03 +0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04 +-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03 +-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +0.1045493275400524D+00-.1657498328427346D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +0.1250488993004788D-020.1131481258164096D-030.9826448017572174D-03 +-.1585786882018380D-03-.7727812230408974D-030.1247110170406368D-03 +0.6226054234809117D-03-.1004757274921672D-03-.5114288231755168D-03 +0.8253410768850847D-040.4268045368520104D-03-.6887748599651892D-04 +-.3608796739013979D-030.5823856716450639D-040.3085010747980624D-03 +-.4978573708714430D-04-.2661733971656788D-030.4295491929665637D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2026106452901076D-03 +0.3269719667613068D-040.1783582025511267D-03-.2878335054540236D-04 +-.1577525118211425D-030.2545801528732096D-040.1400760388418106D-03 +-.2260539561021587D-04-.1247774371157844D-030.2013651551366699D-04 +0.1114272391272199D-03-.1798206776156415D-04-.9968672138364864D-04 +0.1608738933935444D-040.8928564729752786D-04-.1440886961226929D-04 +-.8000610566205314D-040.1291134218726644D-040.7167060586276605D-04 +-.1156616372469904D-04-.6413319184916952D-040.1034977991584680D-04 +0.5727272713271265D-04-.9242641819512053D-05-.5098776122625716D-04 +0.8228377410789080D-050.4519256146756725D-04-.7293151198878877D-05 +-.3981401266047105D-040.6425163892851680D-050.3478916893609630D-04 +-.5614257322333374D-05-.3006329973746788D-040.4851599099553577D-05 +0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04 +0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05 +-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05 +-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06 +0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05 +-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06 +0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04 +0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05 +-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04 +-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04 +0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05 +-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04 +-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04 +0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04 +0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04 +-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03 +-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03 +0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04 +-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03 +-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-010.1046078879726769D+00-.1660603767060543D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.1269088834373626D-02 +0.1152273322204408D-03-.1288661285438230D-020.2079634633143654D-03 +0.9826448017572174D-03-.1585786882018380D-03-.7727812230408974D-03 +0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03 +-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03 +-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04 +0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03 +0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.1046610437569370D+00 +-.1663474610427858D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-030.1287783234572715D-020.1173248741709648D-03 +0.1760064559812521D-02-.2840382695217011D-03-.1288661285438230D-02 +0.2079634633143654D-030.9826448017572174D-03-.1585786882018380D-03 +-.7727812230408974D-030.1247110170406368D-030.6226054234809117D-03 +-.1004757274921672D-03-.5114288231755168D-030.8253410768850847D-04 +0.4268045368520104D-03-.6887748599651892D-04-.3608796739013979D-03 +0.5823856716450639D-040.3085010747980624D-03-.4978573708714430D-04 +-.2661733971656788D-030.4295491929665637D-040.2314578281220329D-03 +-.3735253948527681D-04-.2026106452901076D-030.3269719667613068D-04 +0.1783582025511267D-03-.2878335054540236D-04-.1577525118211425D-03 +0.2545801528732096D-040.1400760388418106D-03-.2260539561021587D-04 +-.1247774371157844D-030.2013651551366699D-040.1114272391272199D-03 +-.1798206776156415D-04-.9968672138364864D-040.1608738933935444D-04 +0.8928564729752786D-04-.1440886961226929D-04-.8000610566205314D-04 +0.1291134218726644D-040.7167060586276605D-04-.1156616372469904D-04 +-.6413319184916952D-040.1034977991584680D-040.5727272713271265D-04 +-.9242641819512053D-05-.5098776122625716D-040.8228377410789080D-05 +0.4519256146756725D-04-.7293151198878877D-05-.3981401266047105D-04 +0.6425163892851680D-050.3478916893609630D-04-.5614257322333374D-05 +-.3006329973746788D-040.4851599099553577D-050.2558831255668139D-04 +-.4129428081521270D-05-.2132146425429693D-040.3440846403443515D-05 +0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04 +0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05 +-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05 +-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06 +-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05 +-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05 +0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04 +0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05 +-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04 +-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05 +0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04 +0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05 +-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04 +-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04 +0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04 +0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04 +-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03 +-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04 +0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03 +0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04 +-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03 +-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +0.1047092891706644D+00-.1666127778982718D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1306572671123266D-020.1194408847180681D-03-.2541776982554263D-02 +0.4101905987537787D-030.1760064559812521D-02-.2840382695217011D-03 +-.1288661285438230D-020.2079634633143654D-030.9826448017572174D-03 +-.1585786882018380D-03-.7727812230408974D-030.1247110170406368D-03 +0.6226054234809117D-03-.1004757274921672D-03-.5114288231755168D-03 +0.8253410768850847D-040.4268045368520104D-03-.6887748599651892D-04 +-.3608796739013979D-030.5823856716450639D-040.3085010747980624D-03 +-.4978573708714430D-04-.2661733971656788D-030.4295491929665637D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2026106452901076D-03 +0.3269719667613068D-040.1783582025511267D-03-.2878335054540236D-04 +-.1577525118211425D-030.2545801528732096D-040.1400760388418106D-03 +-.2260539561021587D-04-.1247774371157844D-030.2013651551366699D-04 +0.1114272391272199D-03-.1798206776156415D-04-.9968672138364864D-04 +0.1608738933935444D-040.8928564729752786D-04-.1440886961226929D-04 +-.8000610566205314D-040.1291134218726644D-040.7167060586276605D-04 +-.1156616372469904D-04-.6413319184916952D-040.1034977991584680D-04 +0.5727272713271265D-04-.9242641819512053D-05-.5098776122625716D-04 +0.8228377410789080D-050.4519256146756725D-04-.7293151198878877D-05 +-.3981401266047105D-040.6425163892851680D-050.3478916893609630D-04 +-.5614257322333374D-05-.3006329973746788D-040.4851599099553577D-05 +0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04 +0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05 +-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05 +-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06 +0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05 +-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06 +0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04 +0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05 +-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04 +-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04 +0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05 +-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04 +-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04 +0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04 +0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04 +-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03 +-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03 +0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04 +-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03 +-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-010.1047530737797218D+00-.1668579066139561D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-030.1325457623941280D-02 +0.1215754977912746D-030.3980741565709959D-02-.6424099272005126D-03 +-.2541776982554263D-020.4101905987537787D-030.1760064559812521D-02 +-.2840382695217011D-03-.1288661285438230D-020.2079634633143654D-03 +0.9826448017572174D-03-.1585786882018380D-03-.7727812230408974D-03 +0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03 +-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03 +-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04 +0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03 +0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.1047928064214595D+00 +-.1670843201580279D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.1344438575349479D-020.1237288482050448D-03 +-.7089509216132388D-020.1144101174176753D-020.3980741565709959D-02 +-.6424099272005126D-03-.2541776982554263D-020.4101905987537787D-03 +0.1760064559812521D-02-.2840382695217011D-03-.1288661285438230D-02 +0.2079634633143654D-030.9826448017572174D-03-.1585786882018380D-03 +-.7727812230408974D-030.1247110170406368D-030.6226054234809117D-03 +-.1004757274921672D-03-.5114288231755168D-030.8253410768850847D-04 +0.4268045368520104D-03-.6887748599651892D-04-.3608796739013979D-03 +0.5823856716450639D-040.3085010747980624D-03-.4978573708714430D-04 +-.2661733971656788D-030.4295491929665637D-040.2314578281220329D-03 +-.3735253948527681D-04-.2026106452901076D-030.3269719667613068D-04 +0.1783582025511267D-03-.2878335054540236D-04-.1577525118211425D-03 +0.2545801528732096D-040.1400760388418106D-03-.2260539561021587D-04 +-.1247774371157844D-030.2013651551366699D-040.1114272391272199D-03 +-.1798206776156415D-04-.9968672138364864D-040.1608738933935444D-04 +0.8928564729752786D-04-.1440886961226929D-04-.8000610566205314D-04 +0.1291134218726644D-040.7167060586276605D-04-.1156616372469904D-04 +-.6413319184916952D-040.1034977991584680D-040.5727272713271265D-04 +-.9242641819512053D-05-.5098776122625716D-040.8228377410789080D-05 +0.4519256146756725D-04-.7293151198878877D-05-.3981401266047105D-04 +0.6425163892851680D-050.3478916893609630D-04-.5614257322333374D-05 +-.3006329973746788D-040.4851599099553577D-050.2558831255668139D-04 +-.4129428081521270D-05-.2132146425429693D-040.3440846403443515D-05 +0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04 +0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05 +-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05 +-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06 +-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05 +-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05 +0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04 +0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05 +-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04 +-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05 +0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04 +0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05 +-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04 +-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04 +0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04 +0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04 +-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03 +-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04 +0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03 +0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04 +-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03 +-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +0.1048288588419666D+00-.1672933912657333D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +0.1363516010089288D-020.1259010716643076D-030.1597157490519940D-01 +-.2577484145293108D-02-.7089509216132388D-020.1144101174176753D-02 +0.3980741565709959D-02-.6424099272005126D-03-.2541776982554263D-02 +0.4101905987537787D-030.1760064559812521D-02-.2840382695217011D-03 +-.1288661285438230D-020.2079634633143654D-030.9826448017572174D-03 +-.1585786882018380D-03-.7727812230408974D-030.1247110170406368D-03 +0.6226054234809117D-03-.1004757274921672D-03-.5114288231755168D-03 +0.8253410768850847D-040.4268045368520104D-03-.6887748599651892D-04 +-.3608796739013979D-030.5823856716450639D-040.3085010747980624D-03 +-.4978573708714430D-04-.2661733971656788D-030.4295491929665637D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2026106452901076D-03 +0.3269719667613068D-040.1783582025511267D-03-.2878335054540236D-04 +-.1577525118211425D-030.2545801528732096D-040.1400760388418106D-03 +-.2260539561021587D-04-.1247774371157844D-030.2013651551366699D-04 +0.1114272391272199D-03-.1798206776156415D-04-.9968672138364864D-04 +0.1608738933935444D-040.8928564729752786D-04-.1440886961226929D-04 +-.8000610566205314D-040.1291134218726644D-040.7167060586276605D-04 +-.1156616372469904D-04-.6413319184916952D-040.1034977991584680D-04 +0.5727272713271265D-04-.9242641819512053D-05-.5098776122625716D-04 +0.8228377410789080D-050.4519256146756725D-04-.7293151198878877D-05 +-.3981401266047105D-040.6425163892851680D-050.3478916893609630D-04 +-.5614257322333374D-05-.3006329973746788D-040.4851599099553577D-05 +0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04 +0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05 +-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05 +-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06 +0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05 +-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06 +0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04 +0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05 +-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04 +-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04 +0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05 +-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04 +-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04 +0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04 +0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04 +-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03 +-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03 +0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04 +-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03 +-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-010.1048615690158307D+00-.1674863983669926D-01 +-.6393452627818429D-010.1031771937313455D-010.1382690415332871D-02 +0.1280923047700254D-03-.6393452627818492D-010.1031771937313466D-01 +0.1597157490519940D-01-.2577484145293108D-02-.7089509216132388D-02 +0.1144101174176753D-020.3980741565709959D-02-.6424099272005126D-03 +-.2541776982554263D-020.4101905987537787D-030.1760064559812521D-02 +-.2840382695217011D-03-.1288661285438230D-020.2079634633143654D-03 +0.9826448017572174D-03-.1585786882018380D-03-.7727812230408974D-03 +0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03 +-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03 +-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04 +0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03 +0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.1048912441749794D+00 +-.1676645312853028D-010.1401962280695231D-020.1303026850247933D-03 +0.1315499101020305D-030.3980931060364731D-050.1495712768796483D+01 +-.8758582323213338D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03 +0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04 +-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03 +-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04 +0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03 +0.1247110170406368D-030.9826448017572174D-03-.1585786882018380D-03 +-.1288661285438230D-020.2079634633143654D-030.1760064559812521D-02 +-.2840382695217011D-03-.2541776982554263D-020.4101905987537787D-03 +0.3980741565709959D-02-.6424099272005126D-03-.7089509216132388D-02 +0.1144101174176753D-020.1597157490519940D-01-.2577484145293108D-02 +-.6393452627818492D-010.1031771937313466D-010.1315499101020305D-03 +0.3980931060364731D-050.1444546692054133D-030.5038740027685473D-05 +-.6393452627818429D-010.1031771937313455D-010.1284018775367995D+01 +-.9274586432417488D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03 +0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04 +-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03 +-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04 +0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03 +0.1247110170406368D-030.9826448017572174D-03-.1585786882018380D-03 +-.1288661285438230D-020.2079634633143654D-030.1760064559812521D-02 +-.2840382695217011D-03-.2541776982554263D-020.4101905987537787D-03 +0.3980741565709959D-02-.6424099272005126D-03-.7089509216132388D-02 +0.1144101174176753D-020.1597157490519940D-01-.2577484145293108D-02 +0.1444546692054133D-030.5038740027685473D-050.1574251928385321D-03 +0.6107296557512106D-050.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.1103394708518522D+01 +-.9497234835585190D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03 +0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04 +-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03 +-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04 +0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03 +0.1247110170406368D-030.9826448017572174D-03-.1585786882018380D-03 +-.1288661285438230D-020.2079634633143654D-030.1760064559812521D-02 +-.2840382695217011D-03-.2541776982554263D-020.4101905987537787D-03 +0.3980741565709959D-02-.6424099272005126D-03-.7089509216132388D-02 +0.1144101174176753D-020.1574251928385321D-030.6107296557512106D-05 +0.1704618139382066D-030.7186682901146465D-05-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.9490240426135286D+00 +-.9506540400453242D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03 +0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04 +-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03 +-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04 +0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03 +0.1247110170406368D-030.9826448017572174D-03-.1585786882018380D-03 +-.1288661285438230D-020.2079634633143654D-030.1760064559812521D-02 +-.2840382695217011D-03-.2541776982554263D-020.4101905987537787D-03 +0.3980741565709959D-02-.6424099272005126D-030.1704618139382066D-03 +0.7186682901146465D-050.1835648671152865D-030.8276981869115928D-05 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.8168613374502116D+00 +-.9363985243360058D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03 +0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04 +-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03 +-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04 +0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03 +0.1247110170406368D-030.9826448017572174D-03-.1585786882018380D-03 +-.1288661285438230D-020.2079634633143654D-030.1760064559812521D-02 +-.2840382695217011D-03-.2541776982554263D-020.4101905987537787D-03 +0.1835648671152865D-030.8276981869115928D-050.1967346886630121D-03 +0.9378276834732454D-05-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.7035067815698437D+00 +-.9116507089552443D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03 +0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04 +-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03 +-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04 +0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03 +0.1247110170406368D-030.9826448017572174D-03-.1585786882018380D-03 +-.1288661285438230D-020.2079634633143654D-030.1760064559812521D-02 +-.2840382695217011D-030.1967346886630121D-030.9378276834732454D-05 +0.2099716165654131D-030.1049065173767338D-040.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.6061012742425287D+00 +-.8799665629787737D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03 +0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04 +-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03 +-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04 +0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03 +0.1247110170406368D-030.9826448017572174D-03-.1585786882018380D-03 +-.1288661285438230D-020.2079634633143654D-030.2099716165654131D-03 +0.1049065173767338D-040.2232759905057449D-030.1161419108758396D-04 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.5222386826466781D+00 +-.8440152302463712D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03 +0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04 +-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03 +-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04 +0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03 +0.1247110170406368D-030.9826448017572174D-03-.1585786882018380D-03 +0.2232759905057449D-030.1161419108758396D-040.2366481518749747D-03 +0.1274897996770195D-040.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.4498924598572777D+00 +-.8057775134654636D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03 +0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04 +-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03 +-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04 +0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03 +0.1247110170406368D-030.2366481518749747D-030.1274897996770195D-04 +0.2500884437803040D-030.1389510403850428D-04-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.3873542691813320D+00 +-.7667024547805577D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03 +0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04 +-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03 +-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04 +0.6226054234809117D-03-.1004757274921672D-030.2500884437803040D-03 +0.1389510403850428D-040.2635972110537330D-030.1505264954137583D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.3331826455172370D+00 +-.7278305234447378D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03 +0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04 +-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03 +-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04 +0.2635972110537330D-030.1505264954137583D-040.2771748002606731D-03 +0.1622170330230075D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.2861600468480754D+00 +-.6898902412495479D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03 +0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04 +-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03 +-.6887748599651892D-040.2771748002606731D-030.1622170330230075D-04 +0.2908215597085934D-030.1740235273557609D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.2452569188515565D+00 +-.6533737207443764D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03 +0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04 +-.3608796739013979D-030.5823856716450639D-040.2908215597085934D-03 +0.1740235273557609D-040.3045378394557195D-030.1859468584754816D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.2096016214375600D+00 +-.6185954984913972D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03 +0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04 +0.3045378394557195D-030.1859468584754816D-040.3183239913197660D-03 +0.1979879124037159D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.1784552549543353D+00 +-.5857381656377866D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03 +0.4295491929665637D-040.3183239913197660D-030.1979879124037159D-04 +0.3321803688867207D-030.2101475811579130D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.1511905818315803D+00 +-.5548875902979072D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.2314578281220329D-03-.3735253948527681D-040.3321803688867207D-03 +0.2101475811579130D-040.3461073275196676D-030.2224267627894746D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.1272743715807420D+00 +-.5260599576185822D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.3461073275196676D-030.2224267627894746D-040.3601052243676528D-03 +0.2348263614220369D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.1062526075652616D+00 +-.4992223971674474D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-040.3601052243676528D-030.2348263614220369D-04 +0.3741744183745985D-030.2473472872899837D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.8773808631923941D-01 +-.4743086017203506D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.3741744183745985D-03 +0.2473472872899837D-040.3883152702882559D-030.2599904567771967D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.7140001739248367D-01 +-.4512305490328010D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +0.3883152702882559D-030.2599904567771967D-040.4025281426692064D-03 +0.2727567924560386D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.5695529621298243D-01 +-.4298872045172876D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.4025281426692064D-030.2727567924560386D-04 +0.4168133998999086D-030.2856472231265750D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.4416117636119962D-01 +-.4101708963900788D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-040.4168133998999086D-03 +0.2856472231265750D-040.4311714081937841D-030.2986626838560346D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.3280911268293057D-01 +-.3919719064856946D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.4311714081937841D-030.2986626838560346D-040.4456025356043519D-03 +0.3118041160185087D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.2271958428400390D-01 +-.3751817020459010D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-040.4456025356043519D-030.3118041160185087D-04 +0.4601071520344119D-030.3250724673348925D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.1373773786865687D-01 +-.3596951403082874D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.4601071520344119D-03 +0.3250724673348925D-040.4746856292452647D-030.3384686919130694D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.5729718122685731D-02 +-.3454119037607182D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +0.4746856292452647D-030.3384686919130694D-040.4893383408659858D-03 +0.3519937502883382D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.1420426245443279D-02 +-.3322373655592117D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.4893383408659858D-030.3519937502883382D-04 +0.5040656624027409D-030.3656486094640881D-04-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.7813353894945640D-02 +-.3200830386663087D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-050.5040656624027409D-03 +0.3656486094640881D-040.5188679712481502D-030.3794342429527186D-04 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.1353663748560101D-01 +-.3088667262160822D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5188679712481502D-030.3794342429527186D-040.5337456466906940D-03 +0.3933516308168090D-04-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.1866663060706036D-01 +-.2985124624149579D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-050.5337456466906940D-030.3933516308168090D-04 +0.5486990699241699D-030.4074017597105377D-040.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2327004940642635D-01 +-.2889503113144904D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.5486990699241699D-03 +0.4074017597105377D-040.5637286240571986D-030.4215856229213537D-04 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2740531442145211D-01 +-.2801160737399670D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +0.5637286240571986D-030.4215856229213537D-040.5788346941227656D-03 +0.4359042204118991D-040.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.3112369069937826D-01 +-.2719509394869411D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.5788346941227656D-030.4359042204118991D-04 +0.5940176670878278D-030.4503585588621884D-04-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.3447025807878468D-01 +-.2644011117776505D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-050.5940176670878278D-03 +0.4503585588621884D-040.6092779318629489D-030.4649496517120420D-04 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.3748473833137467D-01 +-.2574174232414716D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.6092779318629489D-030.4649496517120420D-040.6246158793119950D-03 +0.4796785192037780D-04-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.4020220153327811D-01 +-.2509549568248576D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-050.6246158793119950D-030.4796785192037780D-04 +0.6400319022618756D-030.4945461884251627D-040.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.4265367042011983D-01 +-.2449726806321739D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.6400319022618756D-03 +0.4945461884251627D-040.6555263955123291D-030.5095536933526217D-04 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.4486663845896954D-01 +-.2394331024220700D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +0.6555263955123291D-030.5095536933526217D-040.6710997558457615D-03 +0.5247020748947131D-040.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.4686551484505416D-01 +-.2343019470765194D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.6710997558457615D-030.5247020748947131D-04 +0.6867523820371290D-030.5399923809358637D-04-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.4867200751975501D-01 +-.2295478586186883D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-060.6867523820371290D-03 +0.5399923809358637D-040.7024846748638742D-030.5554256663803711D-04 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.5030545354048027D-01 +-.2251421271226276D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.7024846748638742D-030.5554256663803711D-040.7182970371159094D-03 +0.5710029931966725D-040.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.5178310465540323D-01 +-.2210584400084966D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.7182970371159094D-030.5710029931966725D-04 +0.7341898736056463D-030.5867254304618804D-04-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.5312037469915137D-01 +-.2172726566553483D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-050.7341898736056463D-03 +0.5867254304618804D-040.7501635911780829D-030.6025940544065905D-04 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.5433105438958483D-01 +-.2137626049149093D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.7501635911780829D-030.6025940544065905D-040.7662185987209308D-03 +0.6186099484599586D-04-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.5542749823766951D-01 +-.2105078979169252D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-050.7662185987209308D-030.6186099484599586D-04 +0.7823553071748006D-030.6347742032950520D-040.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.5642078755448146D-01 +-.2074897694756246D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.7823553071748006D-03 +0.6347742032950520D-040.7985741295434327D-030.6510879168744751D-04 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.5732087292851082D-01 +-.2046909264043303D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +0.7985741295434327D-030.6510879168744751D-040.8148754809039821D-03 +0.6675521944962719D-040.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.5813669903342966D-01 +-.2020954160960765D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.8148754809039821D-030.6675521944962719D-04 +0.8312597784173505D-030.6841681488401041D-04-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.5887631419529668D-01 +-.1996885078135194D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-050.8312597784173505D-03 +0.6841681488401041D-040.8477274413385733D-030.7009369000137130D-04 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.5954696678540483D-01 +-.1974565862376031D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.8477274413385733D-030.7009369000137130D-040.8642788910272550D-03 +0.7178595755996570D-04-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.6015519019946330D-01 +-.1953870559413300D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-050.8642788910272550D-030.7178595755996570D-04 +0.8809145509580565D-030.7349373107023372D-040.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.6070687792621943D-01 +-.1934682555754028D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.8809145509580565D-03 +0.7349373107023372D-040.8976348467312377D-030.7521712479953038D-04 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.6120734999118643D-01 +-.1916893806714917D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +0.8976348467312377D-030.7521712479953038D-040.9144402060832480D-03 +0.7695625377688507D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.6166141187735572D-01 +-.1900404140831033D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.9144402060832480D-030.7695625377688507D-04 +0.9313310588973688D-030.7871123379778959D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.6207340686920948D-01 +-.1885120631913809D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-040.9313310588973688D-03 +0.7871123379778959D-040.9483078372144148D-030.8048218142901548D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.6244726263448086D-01 +-.1870957031024471D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.9483078372144148D-030.8048218142901548D-040.9653709752434816D-03 +0.8226921401346013D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.6278653274614820D-01 +-.1857833251535415D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-040.9653709752434816D-030.8226921401346013D-04 +0.9825209093727470D-030.8407244967502225D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.6309443375193149D-01 +-.1845674901271196D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.9825209093727470D-03 +0.8407244967502225D-040.9997580781803323D-030.8589200732350710D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.6337387831743405D-01 +-.1834412856454672D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +0.9997580781803323D-030.8589200732350710D-040.1017082922445208D-02 +0.8772800665956083D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.6362750489982794D-01 +-.1823982872836648D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1017082922445208D-020.8772800665956083D-04 +0.1034495885158160D-020.8958056817963518D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.6385770434976151D-01 +-.1814325229964734D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-040.1034495885158160D-02 +0.8958056817963518D-040.1051997411532808D-020.9144981318098186D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.6406664378841609D-01 +-.1805384405054882D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1051997411532808D-020.9144981318098186D-040.1069587949016678D-02 +0.9333586376667711D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.6425628806305758D-01 +-.1797108773373967D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-040.1069587949016678D-020.9333586376667711D-04 +0.1087267947302331D-020.9523884285067672D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.6442841904691948D-01 +-.1789450332429918D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1087267947302331D-02 +0.9523884285067672D-040.1105037858338542D-020.9715887416290131D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.6458465301690153D-01 +-.1782364447603602D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +0.1105037858338542D-020.9715887416290131D-040.1122898136341541D-02 +0.9909608225435285D-040.2314578281220329D-03-.3735253948527681D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.6472645631459964D-01 +-.1775809617149684D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.1122898136341541D-020.9909608225435285D-04 +0.1140849237806308D-020.1010505925022613D-03-.2661733971656788D-03 +0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.6485515947194923D-01 +-.1769747254747372D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-040.1140849237806308D-02 +0.1010505925022613D-030.1158891621517917D-020.1030225311152631D-03 +0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03 +0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.6497196996171620D-01 +-.1764141488001286D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.1158891621517917D-020.1030225311152631D-030.1177025748562945D-02 +0.1050120251386102D-03-.3608796739013979D-030.5823856716450639D-04 +0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03 +0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.6507798371474940D-01 +-.1758958971482033D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-040.1177025748562945D-020.1050120251386102D-03 +0.1195252082340932D-020.1070192024594111D-030.4268045368520104D-03 +-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04 +0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03 +0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.6517419552992140D-01 +-.1754168713059499D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.1195252082340932D-02 +0.1070192024594111D-030.1213571088575899D-020.1090441918119028D-03 +-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03 +-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04 +0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03 +0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.6526150848870371D-01 +-.1749741912422772D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +0.1213571088575899D-020.1090441918119028D-030.1231983235327929D-02 +0.1110871227827559D-030.6226054234809117D-03-.1004757274921672D-03 +-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03 +-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04 +0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03 +0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.6534074247406860D-01 +-.1745651810802267D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.1231983235327929D-020.1110871227827559D-03 +0.1250488993004788D-020.1131481258164096D-03-.7727812230408974D-03 +0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03 +-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03 +-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04 +0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03 +0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.6541264188264254D-01 +-.1741873551014634D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-030.1250488993004788D-02 +0.1131481258164096D-030.1269088834373626D-020.1152273322204408D-03 +0.9826448017572174D-03-.1585786882018380D-03-.7727812230408974D-03 +0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03 +-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03 +-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04 +0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03 +0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.6547788260955756D-01 +-.1738384047041783D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.1269088834373626D-020.1152273322204408D-030.1287783234572715D-02 +0.1173248741709648D-03-.1288661285438230D-020.2079634633143654D-03 +0.9826448017572174D-03-.1585786882018380D-03-.7727812230408974D-03 +0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03 +-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03 +-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04 +0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03 +0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.6553707837708347D-01 +-.1735161862434064D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-030.1287783234572715D-020.1173248741709648D-03 +0.1306572671123266D-020.1194408847180681D-030.1760064559812521D-02 +-.2840382695217011D-03-.1288661285438230D-020.2079634633143654D-03 +0.9826448017572174D-03-.1585786882018380D-03-.7727812230408974D-03 +0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03 +-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03 +-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04 +0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03 +0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.6559078647072791D-01 +-.1732187096895809D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1306572671123266D-02 +0.1194408847180681D-030.1325457623941280D-020.1215754977912746D-03 +-.2541776982554263D-020.4101905987537787D-030.1760064559812521D-02 +-.2840382695217011D-03-.1288661285438230D-020.2079634633143654D-03 +0.9826448017572174D-03-.1585786882018380D-03-.7727812230408974D-03 +0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03 +-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03 +-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04 +0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03 +0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.6563951293994072D-01 +-.1729441280470915D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +0.1325457623941280D-020.1215754977912746D-030.1344438575349479D-02 +0.1237288482050448D-030.3980741565709959D-02-.6424099272005126D-03 +-.2541776982554263D-020.4101905987537787D-030.1760064559812521D-02 +-.2840382695217011D-03-.1288661285438230D-020.2079634633143654D-03 +0.9826448017572174D-03-.1585786882018380D-03-.7727812230408974D-03 +0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03 +-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03 +-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04 +0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03 +0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.6568371731474190D-01 +-.1726907274797979D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.1344438575349479D-020.1237288482050448D-03 +0.1363516010089288D-020.1259010716643076D-03-.7089509216132388D-02 +0.1144101174176753D-020.3980741565709959D-02-.6424099272005126D-03 +-.2541776982554263D-020.4101905987537787D-030.1760064559812521D-02 +-.2840382695217011D-03-.1288661285438230D-020.2079634633143654D-03 +0.9826448017572174D-03-.1585786882018380D-03-.7727812230408974D-03 +0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03 +-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03 +-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04 +0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03 +0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.6572381688442269D-01 +-.1724569180949983D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-020.1363516010089288D-02 +0.1259010716643076D-030.1382690415332871D-020.1280923047700254D-03 +0.1597157490519940D-01-.2577484145293108D-02-.7089509216132388D-02 +0.1144101174176753D-020.3980741565709959D-02-.6424099272005126D-03 +-.2541776982554263D-020.4101905987537787D-030.1760064559812521D-02 +-.2840382695217011D-03-.1288661285438230D-020.2079634633143654D-03 +0.9826448017572174D-03-.1585786882018380D-03-.7727812230408974D-03 +0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03 +-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03 +-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04 +0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03 +0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.6576019057985988D-01 +-.1722412253413513D-01-.6393452627818429D-010.1031771937313455D-01 +0.1382690415332871D-020.1280923047700254D-030.1401962280695231D-02 +0.1303026850247933D-03-.6393452627818492D-010.1031771937313466D-01 +0.1597157490519940D-01-.2577484145293108D-02-.7089509216132388D-02 +0.1144101174176753D-020.3980741565709959D-02-.6424099272005126D-03 +-.2541776982554263D-020.4101905987537787D-030.1760064559812521D-02 +-.2840382695217011D-03-.1288661285438230D-020.2079634633143654D-03 +0.9826448017572174D-03-.1585786882018380D-03-.7727812230408974D-03 +0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03 +-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03 +-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04 +0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03 +0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.6579318249687402D-01 +-.1720422819797903D-010.1401962280695231D-020.1303026850247933D-03 +0.1315499101020305D-030.3980931060364731D-050.4820685663032476D-01 +-.5085988217165716D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03 +0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04 +-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03 +-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04 +0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03 +0.1247110170406368D-030.9826448017572174D-03-.1585786882018380D-03 +-.1288661285438230D-020.2079634633143654D-030.1760064559812521D-02 +-.2840382695217011D-03-.2541776982554263D-020.4101905987537787D-03 +0.3980741565709959D-02-.6424099272005126D-03-.7089509216132388D-02 +0.1144101174176753D-020.1597157490519940D-01-.2577484145293108D-02 +-.6393452627818492D-010.1031771937313466D-010.1315499101020305D-03 +0.3980931060364731D-050.1444546692054133D-030.5038740027685473D-05 +-.6393452627818429D-010.1031771937313455D-01-.4982848866673706D-01 +-.5061033237937254D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03 +0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04 +-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03 +-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04 +0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03 +0.1247110170406368D-030.9826448017572174D-03-.1585786882018380D-03 +-.1288661285438230D-020.2079634633143654D-030.1760064559812521D-02 +-.2840382695217011D-03-.2541776982554263D-020.4101905987537787D-03 +0.3980741565709959D-02-.6424099272005126D-03-.7089509216132388D-02 +0.1144101174176753D-020.1597157490519940D-01-.2577484145293108D-02 +0.1444546692054133D-030.5038740027685473D-050.1574251928385321D-03 +0.6107296557512106D-050.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.1268572577288423D+00 +-.4868036798000584D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03 +0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04 +-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03 +-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04 +0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03 +0.1247110170406368D-030.9826448017572174D-03-.1585786882018380D-03 +-.1288661285438230D-020.2079634633143654D-030.1760064559812521D-02 +-.2840382695217011D-03-.2541776982554263D-020.4101905987537787D-03 +0.3980741565709959D-02-.6424099272005126D-03-.7089509216132388D-02 +0.1144101174176753D-020.1574251928385321D-030.6107296557512106D-05 +0.1704618139382066D-030.7186682901146465D-05-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.1868102272661466D+00 +-.4569036816326588D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03 +0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04 +-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03 +-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04 +0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03 +0.1247110170406368D-030.9826448017572174D-03-.1585786882018380D-03 +-.1288661285438230D-020.2079634633143654D-030.1760064559812521D-02 +-.2840382695217011D-03-.2541776982554263D-020.4101905987537787D-03 +0.3980741565709959D-02-.6424099272005126D-030.1704618139382066D-03 +0.7186682901146465D-050.1835648671152865D-030.8276981869115928D-05 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2329245777932227D+00 +-.4209739735795140D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03 +0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04 +-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03 +-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04 +0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03 +0.1247110170406368D-030.9826448017572174D-03-.1585786882018380D-03 +-.1288661285438230D-020.2079634633143654D-030.1760064559812521D-02 +-.2840382695217011D-03-.2541776982554263D-020.4101905987537787D-03 +0.1835648671152865D-030.8276981869115928D-050.1967346886630121D-03 +0.9378276834732454D-05-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2678626138092677D+00 +-.3823258786163024D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03 +0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04 +-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03 +-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04 +0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03 +0.1247110170406368D-030.9826448017572174D-03-.1585786882018380D-03 +-.1288661285438230D-020.2079634633143654D-030.1760064559812521D-02 +-.2840382695217011D-030.1967346886630121D-030.9378276834732454D-05 +0.2099716165654131D-030.1049065173767338D-040.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2938105270752963D+00 +-.3433058868290575D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03 +0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04 +-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03 +-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04 +0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03 +0.1247110170406368D-030.9826448017572174D-03-.1585786882018380D-03 +-.1288661285438230D-020.2079634633143654D-030.2099716165654131D-03 +0.1049065173767338D-040.2232759905057449D-030.1161419108758396D-04 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.3125605165773361D+00 +-.3055268727498139D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03 +0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04 +-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03 +-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04 +0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03 +0.1247110170406368D-030.9826448017572174D-03-.1585786882018380D-03 +0.2232759905057449D-030.1161419108758396D-040.2366481518749747D-03 +0.1274897996770195D-040.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.3255790339185094D+00 +-.2700489567358313D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03 +0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04 +-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03 +-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04 +0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03 +0.1247110170406368D-030.2366481518749747D-030.1274897996770195D-04 +0.2500884437803040D-030.1389510403850428D-04-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.3340634668458927D+00 +-.2375203779188533D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03 +0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04 +-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03 +-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04 +0.6226054234809117D-03-.1004757274921672D-030.2500884437803040D-03 +0.1389510403850428D-040.2635972110537330D-030.1505264954137583D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.3389891920386465D+00 +-.2082866889705388D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03 +0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04 +-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03 +-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04 +0.2635972110537330D-030.1505264954137583D-040.2771748002606731D-03 +0.1622170330230075D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.3411486091088010D+00 +-.1824749233535114D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03 +0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04 +-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03 +-.6887748599651892D-040.2771748002606731D-030.1622170330230075D-04 +0.2908215597085934D-030.1740235273557609D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.3411835008757841D+00 +-.1600580484709967D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03 +0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04 +-.3608796739013979D-030.5823856716450639D-040.2908215597085934D-03 +0.1740235273557609D-040.3045378394557195D-030.1859468584754816D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.3396118418774621D+00 +-.1409039418766617D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03 +0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04 +0.3045378394557195D-030.1859468584754816D-040.3183239913197660D-03 +0.1979879124037159D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.3368499906489177D+00 +-.1248122626208860D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03 +0.4295491929665637D-040.3183239913197660D-030.1979879124037159D-04 +0.3321803688867207D-030.2101475811579130D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.3332310455596447D+00 +-.1115418954076180D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.2314578281220329D-03-.3735253948527681D-040.3321803688867207D-03 +0.2101475811579130D-040.3461073275196676D-030.2224267627894746D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.3290200139402660D+00 +-.1008310886583305D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.3461073275196676D-030.2224267627894746D-040.3601052243676528D-03 +0.2348263614220369D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.3244263356522539D+00 +-.9241196217609635D-02-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-040.3601052243676528D-030.2348263614220369D-04 +0.3741744183745985D-030.2473472872899837D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.3196142116403626D+00 +-.8602070427593237D-02-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.3741744183745985D-03 +0.2473472872899837D-040.3883152702882559D-030.2599904567771967D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.3147111124108911D+00 +-.8140449450940520D-02-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +0.3883152702882559D-030.2599904567771967D-040.4025281426692064D-03 +0.2727567924560386D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.3098147783322389D+00 +-.7832596231436846D-02-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.4025281426692064D-030.2727567924560386D-04 +0.4168133998999086D-030.2856472231265750D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.3049989710922947D+00 +-.7656581262990280D-02-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-040.4168133998999086D-03 +0.2856472231265750D-040.4311714081937841D-030.2986626838560346D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.3003181918419177D+00 +-.7592410749930865D-02-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.4311714081937841D-030.2986626838560346D-040.4456025356043519D-03 +0.3118041160185087D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2958115450595328D+00 +-.7622058049335034D-02-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-040.4456025356043519D-030.3118041160185087D-04 +0.4601071520344119D-030.3250724673348925D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2915058967797831D+00 +-.7729427242199239D-02-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.4601071520344119D-03 +0.3250724673348925D-040.4746856292452647D-030.3384686919130694D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2874184505286342D+00 +-.7900270743738223D-02-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +0.4746856292452647D-030.3384686919130694D-040.4893383408659858D-03 +0.3519937502883382D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2835588432536662D+00 +-.8122077438341108D-02-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.4893383408659858D-030.3519937502883382D-04 +0.5040656624027409D-030.3656486094640881D-04-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2799308460258400D+00 +-.8383943600343269D-02-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-050.5040656624027409D-03 +0.3656486094640881D-040.5188679712481502D-030.3794342429527186D-04 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2765337397283812D+00 +-.8676435588169473D-02-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5188679712481502D-030.3794342429527186D-040.5337456466906940D-03 +0.3933516308168090D-04-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2733634238474208D+00 +-.8991450776860036D-02-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-050.5337456466906940D-030.3933516308168090D-04 +0.5486990699241699D-030.4074017597105377D-040.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2704133064268818D+00 +-.9322081262977695D-02-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.5486990699241699D-03 +0.4074017597105377D-040.5637286240571986D-030.4215856229213537D-04 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2676750149039842D+00 +-.9662483409213413D-02-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +0.5637286240571986D-030.4215856229213537D-040.5788346941227656D-03 +0.4359042204118991D-040.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2651389606156939D+00 +-.1000775519245637D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.5788346941227656D-030.4359042204118991D-04 +0.5940176670878278D-030.4503585588621884D-04-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2627947840219851D+00 +-.1035382249831074D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-050.5940176670878278D-03 +0.4503585588621884D-040.6092779318629489D-030.4649496517120420D-04 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2606317029300955D+00 +-.1069733490338830D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.6092779318629489D-030.4649496517120420D-040.6246158793119950D-03 +0.4796785192037780D-04-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2586387820593383D+00 +-.1103557105390731D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-050.6246158793119950D-030.4796785192037780D-04 +0.6400319022618756D-030.4945461884251627D-040.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2568051390204495D+00 +-.1136635344559469D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.6400319022618756D-03 +0.4945461884251627D-040.6555263955123291D-030.5095536933526217D-04 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2551200990819129D+00 +-.1168797220454049D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +0.6555263955123291D-030.5095536933526217D-040.6710997558457615D-03 +0.5247020748947131D-040.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2535733088625027D+00 +-.1199911733718971D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.6710997558457615D-030.5247020748947131D-04 +0.6867523820371290D-030.5399923809358637D-04-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2521548172447478D+00 +-.1229881884115071D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-060.6867523820371290D-03 +0.5399923809358637D-040.7024846748638742D-030.5554256663803711D-04 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2508551302818606D+00 +-.1258639403228736D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.7024846748638742D-030.5554256663803711D-040.7182970371159094D-03 +0.5710029931966725D-040.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2496652456157812D+00 +-.1286140143634197D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.7182970371159094D-030.5710029931966725D-04 +0.7341898736056463D-030.5867254304618804D-04-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2485766708905219D+00 +-.1312360060645681D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-050.7341898736056463D-03 +0.5867254304618804D-040.7501635911780829D-030.6025940544065905D-04 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2475814297948827D+00 +-.1337291725485198D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.7501635911780829D-030.6025940544065905D-040.7662185987209308D-03 +0.6186099484599586D-04-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2466720586702197D+00 +-.1360941312262982D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-050.7662185987209308D-030.6186099484599586D-04 +0.7823553071748006D-030.6347742032950520D-040.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2458415960460029D+00 +-.1383326005253246D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.7823553071748006D-03 +0.6347742032950520D-040.7985741295434327D-030.6510879168744751D-04 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2450835669966239D+00 +-.1404471777278064D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +0.7985741295434327D-030.6510879168744751D-040.8148754809039821D-03 +0.6675521944962719D-040.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2443919638292058D+00 +-.1424411494392620D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.8148754809039821D-030.6675521944962719D-04 +0.8312597784173505D-030.6841681488401041D-04-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2437612242990515D+00 +-.1443183306359489D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-050.8312597784173505D-03 +0.6841681488401041D-040.8477274413385733D-030.7009369000137130D-04 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2431862082944139D+00 +-.1460829286515623D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.8477274413385733D-030.7009369000137130D-040.8642788910272550D-03 +0.7178595755996570D-04-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2426621737251980D+00 +-.1477394288514098D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-050.8642788910272550D-030.7178595755996570D-04 +0.8809145509580565D-030.7349373107023372D-040.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2421847521824966D+00 +-.1492924991028709D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.8809145509580565D-03 +0.7349373107023372D-040.8976348467312377D-030.7521712479953038D-04 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2417499248004771D+00 +-.1507469104826736D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +0.8976348467312377D-030.7521712479953038D-040.9144402060832480D-03 +0.7695625377688507D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2413539986432542D+00 +-.1521074719639924D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.9144402060832480D-030.7695625377688507D-04 +0.9313310588973688D-030.7871123379778959D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2409935838522013D+00 +-.1533789771001627D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-040.9313310588973688D-03 +0.7871123379778959D-040.9483078372144148D-030.8048218142901548D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2406655717196978D+00 +-.1545661609680803D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.9483078372144148D-030.8048218142901548D-040.9653709752434816D-03 +0.8226921401346013D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2403671138003207D+00 +-.1556736658546946D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-040.9653709752434816D-030.8226921401346013D-04 +0.9825209093727470D-030.8407244967502225D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2400956021272602D+00 +-.1567060143662068D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.9825209093727470D-03 +0.8407244967502225D-040.9997580781803323D-030.8589200732350710D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2398486505680700D+00 +-.1576675888135830D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +0.9997580781803323D-030.8589200732350710D-040.1017082922445208D-02 +0.8772800665956083D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2396240773279193D+00 +-.1585626158817118D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1017082922445208D-020.8772800665956083D-04 +0.1034495885158160D-020.8958056817963518D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2394198885888085D+00 +-.1593951557249072D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-040.1034495885158160D-02 +0.8958056817963518D-040.1051997411532808D-020.9144981318098186D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2392342632585187D+00 +-.1601690947502950D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1051997411532808D-020.9144981318098186D-040.1069587949016678D-02 +0.9333586376667711D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2390655387923777D+00 +-.1608881414546571D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-040.1069587949016678D-020.9333586376667711D-04 +0.1087267947302331D-020.9523884285067672D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2389121980434366D+00 +-.1615558247711579D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1087267947302331D-02 +0.9523884285067672D-040.1105037858338542D-020.9715887416290131D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2387728570916794D+00 +-.1621754944615051D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +0.1105037858338542D-020.9715887416290131D-040.1122898136341541D-02 +0.9909608225435285D-040.2314578281220329D-03-.3735253948527681D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2386462539999018D+00 +-.1627503231578771D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.1122898136341541D-020.9909608225435285D-04 +0.1140849237806308D-020.1010505925022613D-03-.2661733971656788D-03 +0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2385312384424493D+00 +-.1632833097185782D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-040.1140849237806308D-02 +0.1010505925022613D-030.1158891621517917D-020.1030225311152631D-03 +0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03 +0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2384267621527447D+00 +-.1637772836129954D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.1158891621517917D-020.1030225311152631D-030.1177025748562945D-02 +0.1050120251386102D-03-.3608796739013979D-030.5823856716450639D-04 +0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03 +0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2383318701361712D+00 +-.1642349100959841D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-040.1177025748562945D-020.1050120251386102D-03 +0.1195252082340932D-020.1070192024594111D-030.4268045368520104D-03 +-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04 +0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03 +0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2382456925961863D+00 +-.1646586959702118D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.1195252082340932D-02 +0.1070192024594111D-030.1213571088575899D-020.1090441918119028D-03 +-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03 +-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04 +0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03 +0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2381674375233261D+00 +-.1650509957680039D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +0.1213571088575899D-020.1090441918119028D-030.1231983235327929D-02 +0.1110871227827559D-030.6226054234809117D-03-.1004757274921672D-03 +-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03 +-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04 +0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03 +0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2380963838988937D+00 +-.1654140182125686D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.1231983235327929D-020.1110871227827559D-03 +0.1250488993004788D-020.1131481258164096D-03-.7727812230408974D-03 +0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03 +-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03 +-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04 +0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03 +0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2380318754674663D+00 +-.1657498328427346D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-030.1250488993004788D-02 +0.1131481258164096D-030.1269088834373626D-020.1152273322204408D-03 +0.9826448017572174D-03-.1585786882018380D-03-.7727812230408974D-03 +0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03 +-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03 +-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04 +0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03 +0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2379733150348419D+00 +-.1660603767060543D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.1269088834373626D-020.1152273322204408D-030.1287783234572715D-02 +0.1173248741709648D-03-.1288661285438230D-020.2079634633143654D-03 +0.9826448017572174D-03-.1585786882018380D-03-.7727812230408974D-03 +0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03 +-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03 +-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04 +0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03 +0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2379201592505817D+00 +-.1663474610427858D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-030.1287783234572715D-020.1173248741709648D-03 +0.1306572671123266D-020.1194408847180681D-030.1760064559812521D-02 +-.2840382695217011D-03-.1288661285438230D-020.2079634633143654D-03 +0.9826448017572174D-03-.1585786882018380D-03-.7727812230408974D-03 +0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03 +-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03 +-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04 +0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03 +0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2378719138368543D+00 +-.1666127778982718D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1306572671123266D-02 +0.1194408847180681D-030.1325457623941280D-020.1215754977912746D-03 +-.2541776982554263D-020.4101905987537787D-030.1760064559812521D-02 +-.2840382695217011D-03-.1288661285438230D-020.2079634633143654D-03 +0.9826448017572174D-03-.1585786882018380D-03-.7727812230408974D-03 +0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03 +-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03 +-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04 +0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03 +0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2378281292277970D+00 +-.1668579066139561D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +0.1325457623941280D-020.1215754977912746D-030.1344438575349479D-02 +0.1237288482050448D-030.3980741565709959D-02-.6424099272005126D-03 +-.2541776982554263D-020.4101905987537787D-030.1760064559812521D-02 +-.2840382695217011D-03-.1288661285438230D-020.2079634633143654D-03 +0.9826448017572174D-03-.1585786882018380D-03-.7727812230408974D-03 +0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03 +-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03 +-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04 +0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03 +0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2377883965860592D+00 +-.1670843201580279D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.1344438575349479D-020.1237288482050448D-03 +0.1363516010089288D-020.1259010716643076D-03-.7089509216132388D-02 +0.1144101174176753D-020.3980741565709959D-02-.6424099272005126D-03 +-.2541776982554263D-020.4101905987537787D-030.1760064559812521D-02 +-.2840382695217011D-03-.1288661285438230D-020.2079634633143654D-03 +0.9826448017572174D-03-.1585786882018380D-03-.7727812230408974D-03 +0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03 +-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03 +-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04 +0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03 +0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2377523441655522D+00 +-.1672933912657333D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-020.1363516010089288D-02 +0.1259010716643076D-030.1382690415332871D-020.1280923047700254D-03 +0.1597157490519940D-01-.2577484145293108D-02-.7089509216132388D-02 +0.1144101174176753D-020.3980741565709959D-02-.6424099272005126D-03 +-.2541776982554263D-020.4101905987537787D-030.1760064559812521D-02 +-.2840382695217011D-03-.1288661285438230D-020.2079634633143654D-03 +0.9826448017572174D-03-.1585786882018380D-03-.7727812230408974D-03 +0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03 +-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03 +-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04 +0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03 +0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2377196339916881D+00 +-.1674863983669926D-01-.6393452627818429D-010.1031771937313455D-01 +0.1382690415332871D-020.1280923047700254D-030.1401962280695231D-02 +0.1303026850247933D-03-.6393452627818492D-010.1031771937313466D-01 +0.1597157490519940D-01-.2577484145293108D-02-.7089509216132388D-02 +0.1144101174176753D-020.3980741565709959D-02-.6424099272005126D-03 +-.2541776982554263D-020.4101905987537787D-030.1760064559812521D-02 +-.2840382695217011D-03-.1288661285438230D-020.2079634633143654D-03 +0.9826448017572174D-03-.1585786882018380D-03-.7727812230408974D-03 +0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03 +-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03 +-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04 +0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03 +0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2376899588325394D+00 +-.1676645312853028D-010.1401962280695231D-020.1303026850247933D-03 +0.1315499101020305D-030.3980931060364731D-050.1153131565788964D+01 +-.8758582323213338D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03 +0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04 +-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03 +-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04 +0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03 +0.1247110170406368D-030.9826448017572174D-03-.1585786882018380D-03 +-.1288661285438230D-020.2079634633143654D-030.1760064559812521D-02 +-.2840382695217011D-03-.2541776982554263D-020.4101905987537787D-03 +0.3980741565709959D-02-.6424099272005126D-03-.7089509216132388D-02 +0.1144101174176753D-020.1597157490519940D-01-.2577484145293108D-02 +-.6393452627818492D-010.1031771937313466D-010.1444546692054133D-03 +0.5038740027685473D-05-.6393452627818429D-010.1031771937313455D-01 +0.9414375723604762D+00-.9274586432417488D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03 +-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04 +0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03 +0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04 +-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03 +-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04 +0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04 +0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04 +-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04 +-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05 +0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04 +0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05 +-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04 +-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05 +0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04 +0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05 +-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05 +-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06 +-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05 +-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05 +0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04 +0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05 +-.3006329973746788D-040.4851599099553577D-050.3478916893609630D-04 +-.5614257322333374D-05-.3981401266047105D-040.6425163892851680D-05 +0.4519256146756725D-04-.7293151198878877D-05-.5098776122625716D-04 +0.8228377410789080D-050.5727272713271265D-04-.9242641819512053D-05 +-.6413319184916952D-040.1034977991584680D-040.7167060586276605D-04 +-.1156616372469904D-04-.8000610566205314D-040.1291134218726644D-04 +0.8928564729752786D-04-.1440886961226929D-04-.9968672138364864D-04 +0.1608738933935444D-040.1114272391272199D-03-.1798206776156415D-04 +-.1247774371157844D-030.2013651551366699D-040.1400760388418106D-03 +-.2260539561021587D-04-.1577525118211425D-030.2545801528732096D-04 +0.1783582025511267D-03-.2878335054540236D-04-.2026106452901076D-03 +0.3269719667613068D-040.2314578281220329D-03-.3735253948527681D-04 +-.2661733971656788D-030.4295491929665637D-040.3085010747980624D-03 +-.4978573708714430D-04-.3608796739013979D-030.5823856716450639D-04 +0.4268045368520104D-03-.6887748599651892D-04-.5114288231755168D-03 +0.8253410768850847D-040.6226054234809117D-03-.1004757274921672D-03 +-.7727812230408974D-030.1247110170406368D-030.9826448017572174D-03 +-.1585786882018380D-03-.1288661285438230D-020.2079634633143654D-03 +0.1760064559812521D-02-.2840382695217011D-03-.2541776982554263D-02 +0.4101905987537787D-030.3980741565709959D-02-.6424099272005126D-03 +-.7089509216132388D-020.1144101174176753D-020.1597157490519940D-01 +-.2577484145293108D-020.1574251928385321D-030.6107296557512106D-05 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-010.7608135055110032D+00-.9497234835585190D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03 +-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03 +0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04 +-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03 +-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04 +0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04 +0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04 +-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04 +-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04 +0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04 +0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05 +-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04 +-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05 +0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04 +0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05 +-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05 +-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06 +0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05 +-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06 +0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04 +0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05 +-.2132146425429693D-040.3440846403443515D-050.2558831255668139D-04 +-.4129428081521270D-05-.3006329973746788D-040.4851599099553577D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3981401266047105D-04 +0.6425163892851680D-050.4519256146756725D-04-.7293151198878877D-05 +-.5098776122625716D-040.8228377410789080D-050.5727272713271265D-04 +-.9242641819512053D-05-.6413319184916952D-040.1034977991584680D-04 +0.7167060586276605D-04-.1156616372469904D-04-.8000610566205314D-04 +0.1291134218726644D-040.8928564729752786D-04-.1440886961226929D-04 +-.9968672138364864D-040.1608738933935444D-040.1114272391272199D-03 +-.1798206776156415D-04-.1247774371157844D-030.2013651551366699D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1577525118211425D-03 +0.2545801528732096D-040.1783582025511267D-03-.2878335054540236D-04 +-.2026106452901076D-030.3269719667613068D-040.2314578281220329D-03 +-.3735253948527681D-04-.2661733971656788D-030.4295491929665637D-04 +0.3085010747980624D-03-.4978573708714430D-04-.3608796739013979D-03 +0.5823856716450639D-040.4268045368520104D-03-.6887748599651892D-04 +-.5114288231755168D-030.8253410768850847D-040.6226054234809117D-03 +-.1004757274921672D-03-.7727812230408974D-030.1247110170406368D-03 +0.9826448017572174D-03-.1585786882018380D-03-.1288661285438230D-02 +0.2079634633143654D-030.1760064559812521D-02-.2840382695217011D-03 +-.2541776982554263D-020.4101905987537787D-030.3980741565709959D-02 +-.6424099272005126D-03-.7089509216132388D-020.1144101174176753D-02 +0.1704618139382066D-030.7186682901146465D-05-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.6064428396060100D+00 +-.9506540400453242D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03 +0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04 +-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03 +-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04 +0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03 +0.1247110170406368D-030.9826448017572174D-03-.1585786882018380D-03 +-.1288661285438230D-020.2079634633143654D-030.1760064559812521D-02 +-.2840382695217011D-03-.2541776982554263D-020.4101905987537787D-03 +0.3980741565709959D-02-.6424099272005126D-030.1835648671152865D-03 +0.8276981869115928D-050.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +0.4742801344426930D+00-.9363985243360058D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03 +-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04 +0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03 +0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04 +-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03 +-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04 +0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04 +0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04 +-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04 +-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05 +0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04 +0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05 +-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04 +-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05 +0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04 +0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05 +-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05 +-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06 +-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05 +-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05 +0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04 +0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05 +-.3006329973746788D-040.4851599099553577D-050.3478916893609630D-04 +-.5614257322333374D-05-.3981401266047105D-040.6425163892851680D-05 +0.4519256146756725D-04-.7293151198878877D-05-.5098776122625716D-04 +0.8228377410789080D-050.5727272713271265D-04-.9242641819512053D-05 +-.6413319184916952D-040.1034977991584680D-040.7167060586276605D-04 +-.1156616372469904D-04-.8000610566205314D-040.1291134218726644D-04 +0.8928564729752786D-04-.1440886961226929D-04-.9968672138364864D-04 +0.1608738933935444D-040.1114272391272199D-03-.1798206776156415D-04 +-.1247774371157844D-030.2013651551366699D-040.1400760388418106D-03 +-.2260539561021587D-04-.1577525118211425D-030.2545801528732096D-04 +0.1783582025511267D-03-.2878335054540236D-04-.2026106452901076D-03 +0.3269719667613068D-040.2314578281220329D-03-.3735253948527681D-04 +-.2661733971656788D-030.4295491929665637D-040.3085010747980624D-03 +-.4978573708714430D-04-.3608796739013979D-030.5823856716450639D-04 +0.4268045368520104D-03-.6887748599651892D-04-.5114288231755168D-03 +0.8253410768850847D-040.6226054234809117D-03-.1004757274921672D-03 +-.7727812230408974D-030.1247110170406368D-030.9826448017572174D-03 +-.1585786882018380D-03-.1288661285438230D-020.2079634633143654D-03 +0.1760064559812521D-02-.2840382695217011D-03-.2541776982554263D-02 +0.4101905987537787D-030.1967346886630121D-030.9378276834732454D-05 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-010.3609255785623250D+00-.9116507089552443D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03 +-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03 +0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04 +-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03 +-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04 +0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04 +0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04 +-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04 +-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04 +0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04 +0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05 +-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04 +-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05 +0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04 +0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05 +-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05 +-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06 +0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05 +-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06 +0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04 +0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05 +-.2132146425429693D-040.3440846403443515D-050.2558831255668139D-04 +-.4129428081521270D-05-.3006329973746788D-040.4851599099553577D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3981401266047105D-04 +0.6425163892851680D-050.4519256146756725D-04-.7293151198878877D-05 +-.5098776122625716D-040.8228377410789080D-050.5727272713271265D-04 +-.9242641819512053D-05-.6413319184916952D-040.1034977991584680D-04 +0.7167060586276605D-04-.1156616372469904D-04-.8000610566205314D-04 +0.1291134218726644D-040.8928564729752786D-04-.1440886961226929D-04 +-.9968672138364864D-040.1608738933935444D-040.1114272391272199D-03 +-.1798206776156415D-04-.1247774371157844D-030.2013651551366699D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1577525118211425D-03 +0.2545801528732096D-040.1783582025511267D-03-.2878335054540236D-04 +-.2026106452901076D-030.3269719667613068D-040.2314578281220329D-03 +-.3735253948527681D-04-.2661733971656788D-030.4295491929665637D-04 +0.3085010747980624D-03-.4978573708714430D-04-.3608796739013979D-03 +0.5823856716450639D-040.4268045368520104D-03-.6887748599651892D-04 +-.5114288231755168D-030.8253410768850847D-040.6226054234809117D-03 +-.1004757274921672D-03-.7727812230408974D-030.1247110170406368D-03 +0.9826448017572174D-03-.1585786882018380D-03-.1288661285438230D-02 +0.2079634633143654D-030.1760064559812521D-02-.2840382695217011D-03 +0.2099716165654131D-030.1049065173767338D-040.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.2635200712350100D+00 +-.8799665629787737D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03 +0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04 +-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03 +-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04 +0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03 +0.1247110170406368D-030.9826448017572174D-03-.1585786882018380D-03 +-.1288661285438230D-020.2079634633143654D-030.2232759905057449D-03 +0.1161419108758396D-04-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +0.1796574796391594D+00-.8440152302463712D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03 +-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04 +0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03 +0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04 +-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03 +-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04 +0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04 +0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04 +-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04 +-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05 +0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04 +0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05 +-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04 +-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05 +0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04 +0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05 +-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05 +-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06 +-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05 +-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05 +0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04 +0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05 +-.3006329973746788D-040.4851599099553577D-050.3478916893609630D-04 +-.5614257322333374D-05-.3981401266047105D-040.6425163892851680D-05 +0.4519256146756725D-04-.7293151198878877D-05-.5098776122625716D-04 +0.8228377410789080D-050.5727272713271265D-04-.9242641819512053D-05 +-.6413319184916952D-040.1034977991584680D-040.7167060586276605D-04 +-.1156616372469904D-04-.8000610566205314D-040.1291134218726644D-04 +0.8928564729752786D-04-.1440886961226929D-04-.9968672138364864D-04 +0.1608738933935444D-040.1114272391272199D-03-.1798206776156415D-04 +-.1247774371157844D-030.2013651551366699D-040.1400760388418106D-03 +-.2260539561021587D-04-.1577525118211425D-030.2545801528732096D-04 +0.1783582025511267D-03-.2878335054540236D-04-.2026106452901076D-03 +0.3269719667613068D-040.2314578281220329D-03-.3735253948527681D-04 +-.2661733971656788D-030.4295491929665637D-040.3085010747980624D-03 +-.4978573708714430D-04-.3608796739013979D-030.5823856716450639D-04 +0.4268045368520104D-03-.6887748599651892D-04-.5114288231755168D-03 +0.8253410768850847D-040.6226054234809117D-03-.1004757274921672D-03 +-.7727812230408974D-030.1247110170406368D-030.9826448017572174D-03 +-.1585786882018380D-030.2366481518749747D-030.1274897996770195D-04 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-010.1073112568497590D+00-.8057775134654636D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03 +-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03 +0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04 +-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03 +-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04 +0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04 +0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04 +-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04 +-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04 +0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04 +0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05 +-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04 +-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05 +0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04 +0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05 +-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05 +-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06 +0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05 +-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06 +0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04 +0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05 +-.2132146425429693D-040.3440846403443515D-050.2558831255668139D-04 +-.4129428081521270D-05-.3006329973746788D-040.4851599099553577D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3981401266047105D-04 +0.6425163892851680D-050.4519256146756725D-04-.7293151198878877D-05 +-.5098776122625716D-040.8228377410789080D-050.5727272713271265D-04 +-.9242641819512053D-05-.6413319184916952D-040.1034977991584680D-04 +0.7167060586276605D-04-.1156616372469904D-04-.8000610566205314D-04 +0.1291134218726644D-040.8928564729752786D-04-.1440886961226929D-04 +-.9968672138364864D-040.1608738933935444D-040.1114272391272199D-03 +-.1798206776156415D-04-.1247774371157844D-030.2013651551366699D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1577525118211425D-03 +0.2545801528732096D-040.1783582025511267D-03-.2878335054540236D-04 +-.2026106452901076D-030.3269719667613068D-040.2314578281220329D-03 +-.3735253948527681D-04-.2661733971656788D-030.4295491929665637D-04 +0.3085010747980624D-03-.4978573708714430D-04-.3608796739013979D-03 +0.5823856716450639D-040.4268045368520104D-03-.6887748599651892D-04 +-.5114288231755168D-030.8253410768850847D-040.6226054234809117D-03 +-.1004757274921672D-03-.7727812230408974D-030.1247110170406368D-03 +0.2500884437803040D-030.1389510403850428D-04-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-010.4477306617381333D-01 +-.7667024547805577D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03 +0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04 +-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03 +-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04 +0.6226054234809117D-03-.1004757274921672D-030.2635972110537330D-03 +0.1505264954137583D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +-.9398557490281734D-02-.7278305234447378D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03 +-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04 +0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03 +0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04 +-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03 +-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04 +0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04 +0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04 +-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04 +-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05 +0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04 +0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05 +-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04 +-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05 +0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04 +0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05 +-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05 +-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06 +-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05 +-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05 +0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04 +0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05 +-.3006329973746788D-040.4851599099553577D-050.3478916893609630D-04 +-.5614257322333374D-05-.3981401266047105D-040.6425163892851680D-05 +0.4519256146756725D-04-.7293151198878877D-05-.5098776122625716D-04 +0.8228377410789080D-050.5727272713271265D-04-.9242641819512053D-05 +-.6413319184916952D-040.1034977991584680D-040.7167060586276605D-04 +-.1156616372469904D-04-.8000610566205314D-040.1291134218726644D-04 +0.8928564729752786D-04-.1440886961226929D-04-.9968672138364864D-04 +0.1608738933935444D-040.1114272391272199D-03-.1798206776156415D-04 +-.1247774371157844D-030.2013651551366699D-040.1400760388418106D-03 +-.2260539561021587D-04-.1577525118211425D-030.2545801528732096D-04 +0.1783582025511267D-03-.2878335054540236D-04-.2026106452901076D-03 +0.3269719667613068D-040.2314578281220329D-03-.3735253948527681D-04 +-.2661733971656788D-030.4295491929665637D-040.3085010747980624D-03 +-.4978573708714430D-04-.3608796739013979D-030.5823856716450639D-04 +0.4268045368520104D-03-.6887748599651892D-04-.5114288231755168D-03 +0.8253410768850847D-040.2771748002606731D-030.1622170330230075D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-01-.5642115615944338D-01-.6898902412495479D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03 +-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03 +0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04 +-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03 +-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04 +0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04 +0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04 +-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04 +-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04 +0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04 +0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05 +-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04 +-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05 +0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04 +0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05 +-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05 +-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06 +0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05 +-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06 +0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04 +0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05 +-.2132146425429693D-040.3440846403443515D-050.2558831255668139D-04 +-.4129428081521270D-05-.3006329973746788D-040.4851599099553577D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3981401266047105D-04 +0.6425163892851680D-050.4519256146756725D-04-.7293151198878877D-05 +-.5098776122625716D-040.8228377410789080D-050.5727272713271265D-04 +-.9242641819512053D-05-.6413319184916952D-040.1034977991584680D-04 +0.7167060586276605D-04-.1156616372469904D-04-.8000610566205314D-04 +0.1291134218726644D-040.8928564729752786D-04-.1440886961226929D-04 +-.9968672138364864D-040.1608738933935444D-040.1114272391272199D-03 +-.1798206776156415D-04-.1247774371157844D-030.2013651551366699D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1577525118211425D-03 +0.2545801528732096D-040.1783582025511267D-03-.2878335054540236D-04 +-.2026106452901076D-030.3269719667613068D-040.2314578281220329D-03 +-.3735253948527681D-04-.2661733971656788D-030.4295491929665637D-04 +0.3085010747980624D-03-.4978573708714430D-04-.3608796739013979D-03 +0.5823856716450639D-040.4268045368520104D-03-.6887748599651892D-04 +0.2908215597085934D-030.1740235273557609D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.9732428415596228D-01 +-.6533737207443764D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03 +0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04 +-.3608796739013979D-030.5823856716450639D-040.3045378394557195D-03 +0.1859468584754816D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +-.1329795815699588D+00-.6185954984913972D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03 +-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04 +0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03 +0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04 +-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03 +-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04 +0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04 +0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04 +-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04 +-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05 +0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04 +0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05 +-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04 +-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05 +0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04 +0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05 +-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05 +-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06 +-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05 +-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05 +0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04 +0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05 +-.3006329973746788D-040.4851599099553577D-050.3478916893609630D-04 +-.5614257322333374D-05-.3981401266047105D-040.6425163892851680D-05 +0.4519256146756725D-04-.7293151198878877D-05-.5098776122625716D-04 +0.8228377410789080D-050.5727272713271265D-04-.9242641819512053D-05 +-.6413319184916952D-040.1034977991584680D-040.7167060586276605D-04 +-.1156616372469904D-04-.8000610566205314D-040.1291134218726644D-04 +0.8928564729752786D-04-.1440886961226929D-04-.9968672138364864D-04 +0.1608738933935444D-040.1114272391272199D-03-.1798206776156415D-04 +-.1247774371157844D-030.2013651551366699D-040.1400760388418106D-03 +-.2260539561021587D-04-.1577525118211425D-030.2545801528732096D-04 +0.1783582025511267D-03-.2878335054540236D-04-.2026106452901076D-03 +0.3269719667613068D-040.2314578281220329D-03-.3735253948527681D-04 +-.2661733971656788D-030.4295491929665637D-040.3085010747980624D-03 +-.4978573708714430D-040.3183239913197660D-030.1979879124037159D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-01-.1641259480531834D+00-.5857381656377866D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03 +-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03 +0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04 +-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03 +-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04 +0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04 +0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04 +-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04 +-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04 +0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04 +0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05 +-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04 +-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05 +0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04 +0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05 +-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05 +-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06 +0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05 +-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06 +0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04 +0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05 +-.2132146425429693D-040.3440846403443515D-050.2558831255668139D-04 +-.4129428081521270D-05-.3006329973746788D-040.4851599099553577D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3981401266047105D-04 +0.6425163892851680D-050.4519256146756725D-04-.7293151198878877D-05 +-.5098776122625716D-040.8228377410789080D-050.5727272713271265D-04 +-.9242641819512053D-05-.6413319184916952D-040.1034977991584680D-04 +0.7167060586276605D-04-.1156616372469904D-04-.8000610566205314D-04 +0.1291134218726644D-040.8928564729752786D-04-.1440886961226929D-04 +-.9968672138364864D-040.1608738933935444D-040.1114272391272199D-03 +-.1798206776156415D-04-.1247774371157844D-030.2013651551366699D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1577525118211425D-03 +0.2545801528732096D-040.1783582025511267D-03-.2878335054540236D-04 +-.2026106452901076D-030.3269719667613068D-040.2314578281220329D-03 +-.3735253948527681D-04-.2661733971656788D-030.4295491929665637D-04 +0.3321803688867207D-030.2101475811579130D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.1913906211759385D+00 +-.5548875902979072D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03 +-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04 +0.2314578281220329D-03-.3735253948527681D-040.3461073275196676D-03 +0.2224267627894746D-040.2314578281220545D-03-.3735253948528030D-04 +-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03 +-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +-.2153068314267767D+00-.5260599576185822D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03 +-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04 +0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03 +0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04 +-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03 +-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04 +0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04 +0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04 +-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04 +-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05 +0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04 +0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05 +-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04 +-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05 +0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04 +0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05 +-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05 +-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06 +-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05 +-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05 +0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04 +0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05 +-.3006329973746788D-040.4851599099553577D-050.3478916893609630D-04 +-.5614257322333374D-05-.3981401266047105D-040.6425163892851680D-05 +0.4519256146756725D-04-.7293151198878877D-05-.5098776122625716D-04 +0.8228377410789080D-050.5727272713271265D-04-.9242641819512053D-05 +-.6413319184916952D-040.1034977991584680D-040.7167060586276605D-04 +-.1156616372469904D-04-.8000610566205314D-040.1291134218726644D-04 +0.8928564729752786D-04-.1440886961226929D-04-.9968672138364864D-04 +0.1608738933935444D-040.1114272391272199D-03-.1798206776156415D-04 +-.1247774371157844D-030.2013651551366699D-040.1400760388418106D-03 +-.2260539561021587D-04-.1577525118211425D-030.2545801528732096D-04 +0.1783582025511267D-03-.2878335054540236D-04-.2026106452901076D-03 +0.3269719667613068D-040.3601052243676528D-030.2348263614220369D-04 +-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03 +-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-01-.2363285954422571D+00-.4992223971674474D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03 +-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03 +0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04 +-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03 +-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04 +0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04 +0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04 +-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04 +-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04 +0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04 +0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05 +-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04 +-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05 +0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04 +0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05 +-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05 +-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06 +0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05 +-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06 +0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04 +0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05 +-.2132146425429693D-040.3440846403443515D-050.2558831255668139D-04 +-.4129428081521270D-05-.3006329973746788D-040.4851599099553577D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3981401266047105D-04 +0.6425163892851680D-050.4519256146756725D-04-.7293151198878877D-05 +-.5098776122625716D-040.8228377410789080D-050.5727272713271265D-04 +-.9242641819512053D-05-.6413319184916952D-040.1034977991584680D-04 +0.7167060586276605D-04-.1156616372469904D-04-.8000610566205314D-04 +0.1291134218726644D-040.8928564729752786D-04-.1440886961226929D-04 +-.9968672138364864D-040.1608738933935444D-040.1114272391272199D-03 +-.1798206776156415D-04-.1247774371157844D-030.2013651551366699D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1577525118211425D-03 +0.2545801528732096D-040.1783582025511267D-03-.2878335054540236D-04 +0.3741744183745985D-030.2473472872899837D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2548431166882794D+00 +-.4743086017203506D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03 +0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04 +-.1577525118211425D-030.2545801528732096D-040.3883152702882559D-03 +0.2599904567771967D-04-.1577525118210161D-030.2545801528730057D-04 +0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03 +0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04 +-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03 +-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +-.2711811856150351D+00-.4512305490328010D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03 +-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04 +0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03 +0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04 +-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03 +-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04 +0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04 +0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04 +-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04 +-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05 +0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04 +0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05 +-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04 +-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05 +0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04 +0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05 +-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05 +-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06 +-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05 +-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05 +0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04 +0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05 +-.3006329973746788D-040.4851599099553577D-050.3478916893609630D-04 +-.5614257322333374D-05-.3981401266047105D-040.6425163892851680D-05 +0.4519256146756725D-04-.7293151198878877D-05-.5098776122625716D-04 +0.8228377410789080D-050.5727272713271265D-04-.9242641819512053D-05 +-.6413319184916952D-040.1034977991584680D-040.7167060586276605D-04 +-.1156616372469904D-04-.8000610566205314D-040.1291134218726644D-04 +0.8928564729752786D-04-.1440886961226929D-04-.9968672138364864D-04 +0.1608738933935444D-040.1114272391272199D-03-.1798206776156415D-04 +-.1247774371157844D-030.2013651551366699D-040.1400760388418106D-03 +-.2260539561021587D-040.4025281426692064D-030.2727567924560386D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03 +0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04 +-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03 +-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-01-.2856259067945363D+00-.4298872045172876D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03 +-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03 +0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04 +-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03 +-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04 +0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04 +0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04 +-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04 +-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04 +0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04 +0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05 +-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04 +-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05 +0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04 +0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05 +-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05 +-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06 +0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05 +-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06 +0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04 +0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05 +-.2132146425429693D-040.3440846403443515D-050.2558831255668139D-04 +-.4129428081521270D-05-.3006329973746788D-040.4851599099553577D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3981401266047105D-04 +0.6425163892851680D-050.4519256146756725D-04-.7293151198878877D-05 +-.5098776122625716D-040.8228377410789080D-050.5727272713271265D-04 +-.9242641819512053D-05-.6413319184916952D-040.1034977991584680D-04 +0.7167060586276605D-04-.1156616372469904D-04-.8000610566205314D-04 +0.1291134218726644D-040.8928564729752786D-04-.1440886961226929D-04 +-.9968672138364864D-040.1608738933935444D-040.1114272391272199D-03 +-.1798206776156415D-04-.1247774371157844D-030.2013651551366699D-04 +0.4168133998999086D-030.2856472231265750D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.2984200266463191D+00 +-.4101708963900788D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04 +-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04 +0.1114272391272199D-03-.1798206776156415D-040.4311714081937841D-03 +0.2986626838560346D-040.1114272391270168D-03-.1798206776153138D-04 +-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03 +-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04 +0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03 +0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04 +-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03 +-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +-.3097720903245881D+00-.3919719064856946D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03 +-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04 +0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03 +0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04 +-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03 +-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04 +0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04 +0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04 +-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04 +-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05 +0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04 +0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05 +-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04 +-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05 +0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04 +0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05 +-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05 +-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06 +-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05 +-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05 +0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04 +0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05 +-.3006329973746788D-040.4851599099553577D-050.3478916893609630D-04 +-.5614257322333374D-05-.3981401266047105D-040.6425163892851680D-05 +0.4519256146756725D-04-.7293151198878877D-05-.5098776122625716D-04 +0.8228377410789080D-050.5727272713271265D-04-.9242641819512053D-05 +-.6413319184916952D-040.1034977991584680D-040.7167060586276605D-04 +-.1156616372469904D-04-.8000610566205314D-040.1291134218726644D-04 +0.8928564729752786D-04-.1440886961226929D-04-.9968672138364864D-04 +0.1608738933935444D-040.4456025356043519D-030.3118041160185087D-04 +-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03 +-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03 +0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04 +-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03 +-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-01-.3198616187235148D+00-.3751817020459010D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03 +-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03 +0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04 +-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03 +-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04 +0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04 +0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04 +-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04 +-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04 +0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04 +0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05 +-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04 +-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05 +0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04 +0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05 +-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05 +-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06 +0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05 +-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06 +0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04 +0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05 +-.2132146425429693D-040.3440846403443515D-050.2558831255668139D-04 +-.4129428081521270D-05-.3006329973746788D-040.4851599099553577D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3981401266047105D-04 +0.6425163892851680D-050.4519256146756725D-04-.7293151198878877D-05 +-.5098776122625716D-040.8228377410789080D-050.5727272713271265D-04 +-.9242641819512053D-05-.6413319184916952D-040.1034977991584680D-04 +0.7167060586276605D-04-.1156616372469904D-04-.8000610566205314D-04 +0.1291134218726644D-040.8928564729752786D-04-.1440886961226929D-04 +0.4601071520344119D-030.3250724673348925D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.3288434651388619D+00 +-.3596951403082874D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04 +0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04 +-.8000610566205314D-040.1291134218726644D-040.4746856292452647D-03 +0.3384686919130694D-04-.8000610566205206D-040.1291134218726627D-04 +0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04 +0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04 +-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03 +-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04 +0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03 +0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04 +-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03 +-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +-.3368514848848330D+00-.3454119037607182D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03 +-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04 +0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03 +0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04 +-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03 +-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04 +0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04 +0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04 +-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04 +-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05 +0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04 +0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05 +-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04 +-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05 +0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04 +0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05 +-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05 +-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06 +-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05 +-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05 +0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04 +0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05 +-.3006329973746788D-040.4851599099553577D-050.3478916893609630D-04 +-.5614257322333374D-05-.3981401266047105D-040.6425163892851680D-05 +0.4519256146756725D-04-.7293151198878877D-05-.5098776122625716D-04 +0.8228377410789080D-050.5727272713271265D-04-.9242641819512053D-05 +-.6413319184916952D-040.1034977991584680D-040.7167060586276605D-04 +-.1156616372469904D-040.4893383408659858D-030.3519937502883382D-04 +0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04 +0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04 +-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03 +-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03 +0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04 +-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03 +-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-01-.3440016292529620D+00-.3322373655592117D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03 +-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03 +0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04 +-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03 +-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04 +0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04 +0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04 +-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04 +-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04 +0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04 +0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05 +-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04 +-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05 +0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04 +0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05 +-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05 +-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06 +0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05 +-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06 +0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04 +0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05 +-.2132146425429693D-040.3440846403443515D-050.2558831255668139D-04 +-.4129428081521270D-05-.3006329973746788D-040.4851599099553577D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3981401266047105D-04 +0.6425163892851680D-050.4519256146756725D-04-.7293151198878877D-05 +-.5098776122625716D-040.8228377410789080D-050.5727272713271265D-04 +-.9242641819512053D-05-.6413319184916952D-040.1034977991584680D-04 +0.5040656624027409D-030.3656486094640881D-04-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.3503945569024643D+00 +-.3200830386663087D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04 +-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05 +0.5727272713271265D-04-.9242641819512053D-050.5188679712481502D-03 +0.3794342429527186D-040.5727272713271211D-04-.9242641819511967D-05 +-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04 +-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04 +0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04 +0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04 +-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03 +-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04 +0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03 +0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04 +-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03 +-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +-.3561178404931197D+00-.3088667262160822D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03 +-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04 +0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03 +0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04 +-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03 +-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04 +0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04 +0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04 +-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04 +-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05 +0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04 +0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05 +-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04 +-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05 +0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04 +0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05 +-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05 +-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06 +-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05 +-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05 +0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04 +0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05 +-.3006329973746788D-040.4851599099553577D-050.3478916893609630D-04 +-.5614257322333374D-05-.3981401266047105D-040.6425163892851680D-05 +0.4519256146756725D-04-.7293151198878877D-05-.5098776122625716D-04 +0.8228377410789080D-050.5337456466906940D-030.3933516308168090D-04 +-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04 +-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04 +0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04 +0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04 +-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03 +-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03 +0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04 +-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03 +-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-01-.3612478336145791D+00-.2985124624149579D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03 +-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03 +0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04 +-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03 +-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04 +0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04 +0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04 +-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04 +-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04 +0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04 +0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05 +-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04 +-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05 +0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04 +0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05 +-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05 +-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06 +0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05 +-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06 +0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04 +0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05 +-.2132146425429693D-040.3440846403443515D-050.2558831255668139D-04 +-.4129428081521270D-05-.3006329973746788D-040.4851599099553577D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3981401266047105D-04 +0.6425163892851680D-050.4519256146756725D-04-.7293151198878877D-05 +0.5486990699241699D-030.4074017597105377D-040.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.3658512524139451D+00 +-.2889503113144904D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04 +0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05 +-.3981401266047105D-040.6425163892851680D-050.5637286240571986D-03 +0.4215856229213537D-04-.3981401266032415D-040.6425163892827973D-05 +0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04 +0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05 +-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04 +-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04 +0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04 +0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04 +-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03 +-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04 +0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03 +0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04 +-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03 +-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +-.3699865174289708D+00-.2801160737399670D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03 +-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04 +0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03 +0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04 +-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03 +-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04 +0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04 +0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04 +-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04 +-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05 +0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04 +0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05 +-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04 +-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05 +0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04 +0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05 +-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05 +-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06 +-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05 +-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05 +0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04 +0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05 +-.3006329973746788D-040.4851599099553577D-050.3478916893609630D-04 +-.5614257322333374D-050.5788346941227656D-030.4359042204118991D-04 +0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04 +0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05 +-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04 +-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04 +0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04 +0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04 +-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03 +-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03 +0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04 +-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03 +-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-01-.3737048937068970D+00-.2719509394869411D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03 +-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03 +0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04 +-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03 +-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04 +0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04 +0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04 +-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04 +-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04 +0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04 +0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05 +-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04 +-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05 +0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04 +0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05 +-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05 +-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06 +0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05 +-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06 +0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04 +0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05 +-.2132146425429693D-040.3440846403443515D-050.2558831255668139D-04 +-.4129428081521270D-05-.3006329973746788D-040.4851599099553577D-05 +0.5940176670878278D-030.4503585588621884D-04-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.3770514610863034D+00 +-.2644011117776505D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04 +-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05 +0.2558831255668139D-04-.4129428081521270D-050.6092779318629489D-03 +0.4649496517120420D-040.2558831255660659D-04-.4129428081509198D-05 +-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04 +-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05 +0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04 +0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05 +-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04 +-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04 +0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04 +0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04 +-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03 +-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04 +0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03 +0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04 +-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03 +-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +-.3800659413388934D+00-.2574174232414716D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03 +-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04 +0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03 +0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04 +-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03 +-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04 +0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04 +0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04 +-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04 +-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05 +0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04 +0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05 +-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04 +-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05 +0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04 +0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05 +-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05 +-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06 +-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05 +-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05 +0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04 +0.3440846403443515D-050.6246158793119950D-030.4796785192037780D-04 +-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04 +-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04 +0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05 +-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04 +-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04 +0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04 +0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04 +-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03 +-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03 +0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04 +-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03 +-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-01-.3827834045407968D+00-.2509549568248576D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03 +-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03 +0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04 +-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03 +-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04 +0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04 +0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04 +-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04 +-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04 +0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04 +0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05 +-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04 +-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05 +0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04 +0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05 +-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05 +-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06 +0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05 +-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06 +0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04 +0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05 +0.6400319022618756D-030.4945461884251627D-040.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.3852348734276386D+00 +-.2449726806321739D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05 +0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05 +-.1326172498198105D-040.2140170026010777D-050.6555263955123291D-03 +0.5095536933526217D-04-.1326172498190355D-040.2140170025998270D-05 +0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04 +0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05 +-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04 +-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05 +0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04 +0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05 +-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04 +-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04 +0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04 +0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04 +-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03 +-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04 +0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03 +0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04 +-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03 +-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +-.3874478414664883D+00-.2394331024220700D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03 +-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04 +0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03 +0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04 +-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03 +-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04 +0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04 +0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04 +-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04 +-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05 +0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04 +0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05 +-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04 +-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05 +0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04 +0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05 +-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05 +-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06 +-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05 +-.1517176307183306D-050.6710997558457615D-030.5247020748947131D-04 +0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04 +0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05 +-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04 +-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04 +0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05 +-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04 +-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04 +0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04 +0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04 +-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03 +-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03 +0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04 +-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03 +-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-01-.3894467178525729D+00-.2343019470765194D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03 +-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03 +0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04 +-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03 +-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04 +0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04 +0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04 +-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04 +-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04 +0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04 +0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05 +-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04 +-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05 +0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04 +0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05 +-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05 +-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06 +0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05 +-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06 +0.6867523820371290D-030.5399923809358637D-04-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.3912532105272737D+00 +-.2295478586186883D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05 +0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06 +0.1866143715512185D-05-.3011572664637594D-060.7024846748638742D-03 +0.5554256663803711D-040.1866143715712640D-05-.3011572664961087D-06 +-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05 +-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05 +0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04 +0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05 +-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04 +-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05 +0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04 +0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05 +-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04 +-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04 +0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04 +0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04 +-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03 +-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04 +0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03 +0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04 +-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03 +-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +-.3928866565479990D+00-.2251421271226276D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03 +-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04 +0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03 +0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04 +-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03 +-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04 +0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04 +0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04 +-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04 +-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05 +0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04 +0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05 +-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04 +-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05 +0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04 +0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05 +-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05 +-.3011572664961087D-060.7182970371159094D-030.5710029931966725D-04 +0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05 +-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06 +0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04 +0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05 +-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04 +-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04 +0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05 +-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04 +-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04 +0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04 +0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04 +-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03 +-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03 +0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04 +-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03 +-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-01-.3943643076629220D+00-.2210584400084966D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03 +-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03 +0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04 +-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03 +-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04 +0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04 +0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04 +-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04 +-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04 +0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04 +0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05 +-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04 +-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05 +0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04 +0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05 +-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05 +-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06 +0.7341898736056463D-030.5867254304618804D-04-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.3957015777066701D+00 +-.2172726566553483D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04 +-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05 +0.9401297415583386D-05-.1517176307138179D-050.7501635911780829D-03 +0.6025940544065905D-040.9401297415863014D-05-.1517176307183306D-05 +-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05 +-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06 +-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05 +-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05 +0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04 +0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05 +-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04 +-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05 +0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04 +0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05 +-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04 +-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04 +0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04 +0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04 +-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03 +-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04 +0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03 +0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04 +-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03 +-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +-.3969122573971036D+00-.2137626049149093D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03 +-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04 +0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03 +0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04 +-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03 +-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04 +0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04 +0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04 +-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04 +-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05 +0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04 +0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05 +-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04 +-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05 +0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04 +0.2140170025998270D-050.7662185987209308D-030.6186099484599586D-04 +-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05 +-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06 +0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05 +-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06 +0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04 +0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05 +-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04 +-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04 +0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05 +-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04 +-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04 +0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04 +0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04 +-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03 +-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03 +0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04 +-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03 +-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-01-.3980087012451882D+00-.2105078979169252D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03 +-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03 +0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04 +-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03 +-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04 +0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04 +0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04 +-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04 +-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04 +0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04 +0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05 +-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04 +-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05 +0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04 +0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05 +0.7823553071748006D-030.6347742032950520D-040.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.3990019905620002D+00 +-.2074897694756246D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04 +0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05 +-.2132146425430071D-040.3440846403444125D-050.7985741295434327D-03 +0.6510879168744751D-04-.2132146425429693D-040.3440846403443515D-05 +0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04 +0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05 +-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05 +-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06 +-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05 +-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05 +0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04 +0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05 +-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04 +-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05 +0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04 +0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05 +-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04 +-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04 +0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04 +0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04 +-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03 +-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04 +0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03 +0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04 +-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03 +-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +-.3999020759360296D+00-.2046909264043303D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03 +-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04 +0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03 +0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04 +-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03 +-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04 +0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04 +0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04 +-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04 +-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05 +0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04 +0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05 +-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04 +-.4129428081509198D-050.8148754809039821D-030.6675521944962719D-04 +0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04 +0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05 +-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05 +-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06 +0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05 +-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06 +0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04 +0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05 +-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04 +-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04 +0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05 +-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04 +-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04 +0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04 +0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04 +-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03 +-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03 +0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04 +-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03 +-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-01-.4007179020409484D+00-.2020954160960765D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03 +-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03 +0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04 +-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03 +-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04 +0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04 +0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04 +-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04 +-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04 +0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04 +0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05 +-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04 +-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05 +0.8312597784173505D-030.6841681488401041D-04-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.4014575172028155D+00 +-.1996885078135194D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04 +-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05 +0.3478916893617300D-04-.5614257322345751D-050.8477274413385733D-03 +0.7009369000137130D-040.3478916893609630D-04-.5614257322333374D-05 +-.3006329973746788D-040.4851599099553577D-050.2558831255668139D-04 +-.4129428081521270D-05-.2132146425429693D-040.3440846403443515D-05 +0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04 +0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05 +-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05 +-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06 +-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05 +-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05 +0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04 +0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05 +-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04 +-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05 +0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04 +0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05 +-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04 +-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04 +0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04 +0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04 +-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03 +-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04 +0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03 +0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04 +-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03 +-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +-.4021281697929236D+00-.1974565862376031D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03 +-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04 +0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03 +0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04 +-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03 +-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04 +0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04 +0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04 +-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04 +-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05 +0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04 +0.6425163892827973D-050.8642788910272550D-030.7178595755996570D-04 +-.3981401266047105D-040.6425163892851680D-050.3478916893609630D-04 +-.5614257322333374D-05-.3006329973746788D-040.4851599099553577D-05 +0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04 +0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05 +-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05 +-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06 +0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05 +-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06 +0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04 +0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05 +-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04 +-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04 +0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05 +-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04 +-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04 +0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04 +0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04 +-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03 +-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03 +0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04 +-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03 +-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-01-.4027363932069820D+00-.1953870559413300D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03 +-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03 +0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04 +-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03 +-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04 +0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04 +0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04 +-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04 +-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04 +0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04 +0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05 +0.8809145509580565D-030.7349373107023372D-040.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.4032880809337382D+00 +-.1934682555754028D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04 +0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05 +-.5098776122600387D-040.8228377410748204D-050.8976348467312377D-03 +0.7521712479953038D-04-.5098776122625716D-040.8228377410789080D-05 +0.4519256146756725D-04-.7293151198878877D-05-.3981401266047105D-04 +0.6425163892851680D-050.3478916893609630D-04-.5614257322333374D-05 +-.3006329973746788D-040.4851599099553577D-050.2558831255668139D-04 +-.4129428081521270D-05-.2132146425429693D-040.3440846403443515D-05 +0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04 +0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05 +-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05 +-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06 +-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05 +-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05 +0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04 +0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05 +-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04 +-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05 +0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04 +0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05 +-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04 +-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04 +0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04 +0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04 +-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03 +-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04 +0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03 +0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04 +-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03 +-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +-.4037885529987051D+00-.1916893806714917D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03 +-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04 +0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03 +0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04 +-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03 +-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04 +0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04 +0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04 +-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04 +-.9242641819511967D-050.9144402060832480D-030.7695625377688507D-04 +0.5727272713271265D-04-.9242641819512053D-05-.5098776122625716D-04 +0.8228377410789080D-050.4519256146756725D-04-.7293151198878877D-05 +-.3981401266047105D-040.6425163892851680D-050.3478916893609630D-04 +-.5614257322333374D-05-.3006329973746788D-040.4851599099553577D-05 +0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04 +0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05 +-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05 +-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06 +0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05 +-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06 +0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04 +0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05 +-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04 +-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04 +0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05 +-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04 +-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04 +0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04 +0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04 +-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03 +-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03 +0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04 +-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03 +-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-01-.4042426148848744D+00-.1900404140831033D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03 +-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03 +0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04 +-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03 +-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04 +0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04 +0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04 +-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04 +-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04 +0.9313310588973688D-030.7871123379778959D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.4046546098767282D+00 +-.1885120631913809D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04 +-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04 +0.7167060586256731D-04-.1156616372466696D-040.9483078372144148D-03 +0.8048218142901548D-040.7167060586276605D-04-.1156616372469904D-04 +-.6413319184916952D-040.1034977991584680D-040.5727272713271265D-04 +-.9242641819512053D-05-.5098776122625716D-040.8228377410789080D-05 +0.4519256146756725D-04-.7293151198878877D-05-.3981401266047105D-04 +0.6425163892851680D-050.3478916893609630D-04-.5614257322333374D-05 +-.3006329973746788D-040.4851599099553577D-050.2558831255668139D-04 +-.4129428081521270D-05-.2132146425429693D-040.3440846403443515D-05 +0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04 +0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05 +-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05 +-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06 +-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05 +-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05 +0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04 +0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05 +-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04 +-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05 +0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04 +0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05 +-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04 +-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04 +0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04 +0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04 +-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03 +-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04 +0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03 +0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04 +-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03 +-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +-.4050284656419996D+00-.1870957031024471D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03 +-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04 +0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03 +0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04 +-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03 +-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04 +0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04 +0.1291134218726627D-040.9653709752434816D-030.8226921401346013D-04 +-.8000610566205314D-040.1291134218726644D-040.7167060586276605D-04 +-.1156616372469904D-04-.6413319184916952D-040.1034977991584680D-04 +0.5727272713271265D-04-.9242641819512053D-05-.5098776122625716D-04 +0.8228377410789080D-050.4519256146756725D-04-.7293151198878877D-05 +-.3981401266047105D-040.6425163892851680D-050.3478916893609630D-04 +-.5614257322333374D-05-.3006329973746788D-040.4851599099553577D-05 +0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04 +0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05 +-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05 +-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06 +0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05 +-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06 +0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04 +0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05 +-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04 +-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04 +0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05 +-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04 +-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04 +0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04 +0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04 +-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03 +-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03 +0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04 +-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03 +-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-01-.4053677357536670D+00-.1857833251535415D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03 +-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03 +0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04 +-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03 +-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04 +0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04 +0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04 +0.9825209093727470D-030.8407244967502225D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.4056756367594502D+00 +-.1845674901271196D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03 +0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04 +-.9968672138332729D-040.1608738933930258D-040.9997580781803323D-03 +0.8589200732350710D-04-.9968672138364864D-040.1608738933935444D-04 +0.8928564729752786D-04-.1440886961226929D-04-.8000610566205314D-04 +0.1291134218726644D-040.7167060586276605D-04-.1156616372469904D-04 +-.6413319184916952D-040.1034977991584680D-040.5727272713271265D-04 +-.9242641819512053D-05-.5098776122625716D-040.8228377410789080D-05 +0.4519256146756725D-04-.7293151198878877D-05-.3981401266047105D-04 +0.6425163892851680D-050.3478916893609630D-04-.5614257322333374D-05 +-.3006329973746788D-040.4851599099553577D-050.2558831255668139D-04 +-.4129428081521270D-05-.2132146425429693D-040.3440846403443515D-05 +0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04 +0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05 +-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05 +-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06 +-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05 +-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05 +0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04 +0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05 +-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04 +-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05 +0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04 +0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05 +-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04 +-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04 +0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04 +0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04 +-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03 +-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04 +0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03 +0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04 +-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03 +-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +-.4059550813249528D+00-.1834412856454672D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03 +-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04 +0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03 +0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04 +-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03 +-.1798206776153138D-040.1017082922445208D-020.8772800665956083D-04 +0.1114272391272199D-03-.1798206776156415D-04-.9968672138364864D-04 +0.1608738933935444D-040.8928564729752786D-04-.1440886961226929D-04 +-.8000610566205314D-040.1291134218726644D-040.7167060586276605D-04 +-.1156616372469904D-04-.6413319184916952D-040.1034977991584680D-04 +0.5727272713271265D-04-.9242641819512053D-05-.5098776122625716D-04 +0.8228377410789080D-050.4519256146756725D-04-.7293151198878877D-05 +-.3981401266047105D-040.6425163892851680D-050.3478916893609630D-04 +-.5614257322333374D-05-.3006329973746788D-040.4851599099553577D-05 +0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04 +0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05 +-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05 +-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06 +0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05 +-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06 +0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04 +0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05 +-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04 +-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04 +0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05 +-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04 +-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04 +0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04 +0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04 +-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03 +-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03 +0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04 +-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03 +-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-01-.4062087079073467D+00-.1823982872836648D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03 +-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03 +0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04 +-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03 +-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04 +0.1034495885158160D-020.8958056817963518D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.4064389073572802D+00 +-.1814325229964734D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03 +-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04 +0.1400760388416475D-03-.2260539561018954D-040.1051997411532808D-02 +0.9144981318098186D-040.1400760388418106D-03-.2260539561021587D-04 +-.1247774371157844D-030.2013651551366699D-040.1114272391272199D-03 +-.1798206776156415D-04-.9968672138364864D-040.1608738933935444D-04 +0.8928564729752786D-04-.1440886961226929D-04-.8000610566205314D-04 +0.1291134218726644D-040.7167060586276605D-04-.1156616372469904D-04 +-.6413319184916952D-040.1034977991584680D-040.5727272713271265D-04 +-.9242641819512053D-05-.5098776122625716D-040.8228377410789080D-05 +0.4519256146756725D-04-.7293151198878877D-05-.3981401266047105D-04 +0.6425163892851680D-050.3478916893609630D-04-.5614257322333374D-05 +-.3006329973746788D-040.4851599099553577D-050.2558831255668139D-04 +-.4129428081521270D-05-.2132146425429693D-040.3440846403443515D-05 +0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04 +0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05 +-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05 +-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06 +-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05 +-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05 +0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04 +0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05 +-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04 +-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05 +0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04 +0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05 +-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04 +-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04 +0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04 +0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04 +-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03 +-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04 +0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03 +0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04 +-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03 +-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +-.4066478467959349D+00-.1805384405054882D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03 +-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04 +0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03 +0.2545801528730057D-040.1069587949016678D-020.9333586376667711D-04 +-.1577525118211425D-030.2545801528732096D-040.1400760388418106D-03 +-.2260539561021587D-04-.1247774371157844D-030.2013651551366699D-04 +0.1114272391272199D-03-.1798206776156415D-04-.9968672138364864D-04 +0.1608738933935444D-040.8928564729752786D-04-.1440886961226929D-04 +-.8000610566205314D-040.1291134218726644D-040.7167060586276605D-04 +-.1156616372469904D-04-.6413319184916952D-040.1034977991584680D-04 +0.5727272713271265D-04-.9242641819512053D-05-.5098776122625716D-04 +0.8228377410789080D-050.4519256146756725D-04-.7293151198878877D-05 +-.3981401266047105D-040.6425163892851680D-050.3478916893609630D-04 +-.5614257322333374D-05-.3006329973746788D-040.4851599099553577D-05 +0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04 +0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05 +-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05 +-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06 +0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05 +-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06 +0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04 +0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05 +-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04 +-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04 +0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05 +-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04 +-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04 +0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04 +0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04 +-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03 +-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03 +0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04 +-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03 +-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-01-.4068374910705764D+00-.1797108773373967D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03 +-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03 +0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04 +0.1087267947302331D-020.9523884285067672D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.4070096220544382D+00 +-.1789450332429918D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03 +0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04 +-.2026106452901065D-030.3269719667613051D-040.1105037858338542D-02 +0.9715887416290131D-04-.2026106452901076D-030.3269719667613068D-04 +0.1783582025511267D-03-.2878335054540236D-04-.1577525118211425D-03 +0.2545801528732096D-040.1400760388418106D-03-.2260539561021587D-04 +-.1247774371157844D-030.2013651551366699D-040.1114272391272199D-03 +-.1798206776156415D-04-.9968672138364864D-040.1608738933935444D-04 +0.8928564729752786D-04-.1440886961226929D-04-.8000610566205314D-04 +0.1291134218726644D-040.7167060586276605D-04-.1156616372469904D-04 +-.6413319184916952D-040.1034977991584680D-040.5727272713271265D-04 +-.9242641819512053D-05-.5098776122625716D-040.8228377410789080D-05 +0.4519256146756725D-04-.7293151198878877D-05-.3981401266047105D-04 +0.6425163892851680D-050.3478916893609630D-04-.5614257322333374D-05 +-.3006329973746788D-040.4851599099553577D-050.2558831255668139D-04 +-.4129428081521270D-05-.2132146425429693D-040.3440846403443515D-05 +0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04 +0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05 +-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05 +-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06 +-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05 +-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05 +0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04 +0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05 +-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04 +-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05 +0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04 +0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05 +-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04 +-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04 +0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04 +0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04 +-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03 +-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04 +0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03 +0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04 +-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03 +-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +-.4071658560244203D+00-.1782364447603602D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04 +-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03 +-.3735253948528030D-040.1122898136341541D-020.9909608225435285D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2026106452901076D-03 +0.3269719667613068D-040.1783582025511267D-03-.2878335054540236D-04 +-.1577525118211425D-030.2545801528732096D-040.1400760388418106D-03 +-.2260539561021587D-04-.1247774371157844D-030.2013651551366699D-04 +0.1114272391272199D-03-.1798206776156415D-04-.9968672138364864D-04 +0.1608738933935444D-040.8928564729752786D-04-.1440886961226929D-04 +-.8000610566205314D-040.1291134218726644D-040.7167060586276605D-04 +-.1156616372469904D-04-.6413319184916952D-040.1034977991584680D-04 +0.5727272713271265D-04-.9242641819512053D-05-.5098776122625716D-04 +0.8228377410789080D-050.4519256146756725D-04-.7293151198878877D-05 +-.3981401266047105D-040.6425163892851680D-050.3478916893609630D-04 +-.5614257322333374D-05-.3006329973746788D-040.4851599099553577D-05 +0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04 +0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05 +-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05 +-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06 +0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05 +-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06 +0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04 +0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05 +-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04 +-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04 +0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05 +-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04 +-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04 +0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04 +0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04 +-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03 +-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03 +0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04 +-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03 +-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-01-.4073076593221184D+00-.1775809617149684D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03 +-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04 +0.1140849237806308D-020.1010505925022613D-03-.2661733971656788D-03 +0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.4074363624794680D+00 +-.1769747254747372D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03 +-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04 +0.3085010747974997D-03-.4978573708705348D-040.1158891621517917D-02 +0.1030225311152631D-030.3085010747980624D-03-.4978573708714430D-04 +-.2661733971656788D-030.4295491929665637D-040.2314578281220329D-03 +-.3735253948527681D-04-.2026106452901076D-030.3269719667613068D-04 +0.1783582025511267D-03-.2878335054540236D-04-.1577525118211425D-03 +0.2545801528732096D-040.1400760388418106D-03-.2260539561021587D-04 +-.1247774371157844D-030.2013651551366699D-040.1114272391272199D-03 +-.1798206776156415D-04-.9968672138364864D-040.1608738933935444D-04 +0.8928564729752786D-04-.1440886961226929D-04-.8000610566205314D-04 +0.1291134218726644D-040.7167060586276605D-04-.1156616372469904D-04 +-.6413319184916952D-040.1034977991584680D-040.5727272713271265D-04 +-.9242641819512053D-05-.5098776122625716D-040.8228377410789080D-05 +0.4519256146756725D-04-.7293151198878877D-05-.3981401266047105D-04 +0.6425163892851680D-050.3478916893609630D-04-.5614257322333374D-05 +-.3006329973746788D-040.4851599099553577D-050.2558831255668139D-04 +-.4129428081521270D-05-.2132146425429693D-040.3440846403443515D-05 +0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04 +0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05 +-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05 +-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06 +-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05 +-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05 +0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04 +0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05 +-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04 +-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05 +0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04 +0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05 +-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04 +-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04 +0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04 +0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04 +-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03 +-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04 +0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03 +0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04 +-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03 +-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +-.4075531729692349D+00-.1764141488001286D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04 +0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03 +0.5823856716447153D-040.1177025748562945D-020.1050120251386102D-03 +-.3608796739013979D-030.5823856716450639D-040.3085010747980624D-03 +-.4978573708714430D-04-.2661733971656788D-030.4295491929665637D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2026106452901076D-03 +0.3269719667613068D-040.1783582025511267D-03-.2878335054540236D-04 +-.1577525118211425D-030.2545801528732096D-040.1400760388418106D-03 +-.2260539561021587D-04-.1247774371157844D-030.2013651551366699D-04 +0.1114272391272199D-03-.1798206776156415D-04-.9968672138364864D-04 +0.1608738933935444D-040.8928564729752786D-04-.1440886961226929D-04 +-.8000610566205314D-040.1291134218726644D-040.7167060586276605D-04 +-.1156616372469904D-04-.6413319184916952D-040.1034977991584680D-04 +0.5727272713271265D-04-.9242641819512053D-05-.5098776122625716D-04 +0.8228377410789080D-050.4519256146756725D-04-.7293151198878877D-05 +-.3981401266047105D-040.6425163892851680D-050.3478916893609630D-04 +-.5614257322333374D-05-.3006329973746788D-040.4851599099553577D-05 +0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04 +0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05 +-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05 +-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06 +0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05 +-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06 +0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04 +0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05 +-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04 +-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04 +0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05 +-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04 +-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04 +0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04 +0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04 +-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03 +-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03 +0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04 +-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03 +-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-01-.4076591867222681D+00-.1758958971482033D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03 +0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04 +0.1195252082340932D-020.1070192024594111D-030.4268045368520104D-03 +-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04 +0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03 +0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.4077553985374401D+00 +-.1754168713059499D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03 +0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03 +-.5114288231753483D-030.8253410768848127D-040.1213571088575899D-02 +0.1090441918119028D-03-.5114288231755168D-030.8253410768850847D-04 +0.4268045368520104D-03-.6887748599651892D-04-.3608796739013979D-03 +0.5823856716450639D-040.3085010747980624D-03-.4978573708714430D-04 +-.2661733971656788D-030.4295491929665637D-040.2314578281220329D-03 +-.3735253948527681D-04-.2026106452901076D-030.3269719667613068D-04 +0.1783582025511267D-03-.2878335054540236D-04-.1577525118211425D-03 +0.2545801528732096D-040.1400760388418106D-03-.2260539561021587D-04 +-.1247774371157844D-030.2013651551366699D-040.1114272391272199D-03 +-.1798206776156415D-04-.9968672138364864D-040.1608738933935444D-04 +0.8928564729752786D-04-.1440886961226929D-04-.8000610566205314D-04 +0.1291134218726644D-040.7167060586276605D-04-.1156616372469904D-04 +-.6413319184916952D-040.1034977991584680D-040.5727272713271265D-04 +-.9242641819512053D-05-.5098776122625716D-040.8228377410789080D-05 +0.4519256146756725D-04-.7293151198878877D-05-.3981401266047105D-04 +0.6425163892851680D-050.3478916893609630D-04-.5614257322333374D-05 +-.3006329973746788D-040.4851599099553577D-050.2558831255668139D-04 +-.4129428081521270D-05-.2132146425429693D-040.3440846403443515D-05 +0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04 +0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05 +-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05 +-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06 +-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05 +-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05 +0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04 +0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05 +-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04 +-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05 +0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04 +0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05 +-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04 +-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04 +0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04 +0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04 +-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03 +-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04 +0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03 +0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04 +-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03 +-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +-.4078427114962225D+00-.1749741912422772D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03 +-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03 +-.1004757274921541D-030.1231983235327929D-020.1110871227827559D-03 +0.6226054234809117D-03-.1004757274921672D-03-.5114288231755168D-03 +0.8253410768850847D-040.4268045368520104D-03-.6887748599651892D-04 +-.3608796739013979D-030.5823856716450639D-040.3085010747980624D-03 +-.4978573708714430D-04-.2661733971656788D-030.4295491929665637D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2026106452901076D-03 +0.3269719667613068D-040.1783582025511267D-03-.2878335054540236D-04 +-.1577525118211425D-030.2545801528732096D-040.1400760388418106D-03 +-.2260539561021587D-04-.1247774371157844D-030.2013651551366699D-04 +0.1114272391272199D-03-.1798206776156415D-04-.9968672138364864D-04 +0.1608738933935444D-040.8928564729752786D-04-.1440886961226929D-04 +-.8000610566205314D-040.1291134218726644D-040.7167060586276605D-04 +-.1156616372469904D-04-.6413319184916952D-040.1034977991584680D-04 +0.5727272713271265D-04-.9242641819512053D-05-.5098776122625716D-04 +0.8228377410789080D-050.4519256146756725D-04-.7293151198878877D-05 +-.3981401266047105D-040.6425163892851680D-050.3478916893609630D-04 +-.5614257322333374D-05-.3006329973746788D-040.4851599099553577D-05 +0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04 +0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05 +-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05 +-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06 +0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05 +-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06 +0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04 +0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05 +-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04 +-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04 +0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05 +-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04 +-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04 +0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04 +0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04 +-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03 +-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03 +0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04 +-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03 +-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-01-.4079219454815874D+00-.1745651810802267D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03 +-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03 +0.1250488993004788D-020.1131481258164096D-03-.7727812230408974D-03 +0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03 +-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03 +-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04 +0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03 +0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.4079938448901613D+00 +-.1741873551014634D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02 +-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03 +0.9826448017570867D-03-.1585786882018169D-030.1269088834373626D-02 +0.1152273322204408D-030.9826448017572174D-03-.1585786882018380D-03 +-.7727812230408974D-030.1247110170406368D-030.6226054234809117D-03 +-.1004757274921672D-03-.5114288231755168D-030.8253410768850847D-04 +0.4268045368520104D-03-.6887748599651892D-04-.3608796739013979D-03 +0.5823856716450639D-040.3085010747980624D-03-.4978573708714430D-04 +-.2661733971656788D-030.4295491929665637D-040.2314578281220329D-03 +-.3735253948527681D-04-.2026106452901076D-030.3269719667613068D-04 +0.1783582025511267D-03-.2878335054540236D-04-.1577525118211425D-03 +0.2545801528732096D-040.1400760388418106D-03-.2260539561021587D-04 +-.1247774371157844D-030.2013651551366699D-040.1114272391272199D-03 +-.1798206776156415D-04-.9968672138364864D-040.1608738933935444D-04 +0.8928564729752786D-04-.1440886961226929D-04-.8000610566205314D-04 +0.1291134218726644D-040.7167060586276605D-04-.1156616372469904D-04 +-.6413319184916952D-040.1034977991584680D-040.5727272713271265D-04 +-.9242641819512053D-05-.5098776122625716D-040.8228377410789080D-05 +0.4519256146756725D-04-.7293151198878877D-05-.3981401266047105D-04 +0.6425163892851680D-050.3478916893609630D-04-.5614257322333374D-05 +-.3006329973746788D-040.4851599099553577D-050.2558831255668139D-04 +-.4129428081521270D-05-.2132146425429693D-040.3440846403443515D-05 +0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04 +0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05 +-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05 +-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06 +-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05 +-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05 +0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04 +0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05 +-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04 +-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05 +0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04 +0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05 +-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04 +-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04 +0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04 +0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04 +-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03 +-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04 +0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03 +0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04 +-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03 +-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +-.4080590856170763D+00-.1738384047041783D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03 +0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02 +0.2079634633143379D-030.1287783234572715D-020.1173248741709648D-03 +-.1288661285438230D-020.2079634633143654D-030.9826448017572174D-03 +-.1585786882018380D-03-.7727812230408974D-030.1247110170406368D-03 +0.6226054234809117D-03-.1004757274921672D-03-.5114288231755168D-03 +0.8253410768850847D-040.4268045368520104D-03-.6887748599651892D-04 +-.3608796739013979D-030.5823856716450639D-040.3085010747980624D-03 +-.4978573708714430D-04-.2661733971656788D-030.4295491929665637D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2026106452901076D-03 +0.3269719667613068D-040.1783582025511267D-03-.2878335054540236D-04 +-.1577525118211425D-030.2545801528732096D-040.1400760388418106D-03 +-.2260539561021587D-04-.1247774371157844D-030.2013651551366699D-04 +0.1114272391272199D-03-.1798206776156415D-04-.9968672138364864D-04 +0.1608738933935444D-040.8928564729752786D-04-.1440886961226929D-04 +-.8000610566205314D-040.1291134218726644D-040.7167060586276605D-04 +-.1156616372469904D-04-.6413319184916952D-040.1034977991584680D-04 +0.5727272713271265D-04-.9242641819512053D-05-.5098776122625716D-04 +0.8228377410789080D-050.4519256146756725D-04-.7293151198878877D-05 +-.3981401266047105D-040.6425163892851680D-050.3478916893609630D-04 +-.5614257322333374D-05-.3006329973746788D-040.4851599099553577D-05 +0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04 +0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05 +-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05 +-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06 +0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05 +-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06 +0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04 +0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05 +-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04 +-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04 +0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05 +-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04 +-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04 +0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04 +0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04 +-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03 +-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03 +0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04 +-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03 +-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-01-.4081182813846022D+00-.1735161862434064D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02 +0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03 +0.1306572671123266D-020.1194408847180681D-030.1760064559812521D-02 +-.2840382695217011D-03-.1288661285438230D-020.2079634633143654D-03 +0.9826448017572174D-03-.1585786882018380D-03-.7727812230408974D-03 +0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03 +-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03 +-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04 +0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03 +0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.4081719894782467D+00 +-.1732187096895809D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02 +0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03 +-.2541776982553532D-020.4101905987536608D-030.1325457623941280D-02 +0.1215754977912746D-03-.2541776982554263D-020.4101905987537787D-03 +0.1760064559812521D-02-.2840382695217011D-03-.1288661285438230D-02 +0.2079634633143654D-030.9826448017572174D-03-.1585786882018380D-03 +-.7727812230408974D-030.1247110170406368D-030.6226054234809117D-03 +-.1004757274921672D-03-.5114288231755168D-030.8253410768850847D-04 +0.4268045368520104D-03-.6887748599651892D-04-.3608796739013979D-03 +0.5823856716450639D-040.3085010747980624D-03-.4978573708714430D-04 +-.2661733971656788D-030.4295491929665637D-040.2314578281220329D-03 +-.3735253948527681D-04-.2026106452901076D-030.3269719667613068D-04 +0.1783582025511267D-03-.2878335054540236D-04-.1577525118211425D-03 +0.2545801528732096D-040.1400760388418106D-03-.2260539561021587D-04 +-.1247774371157844D-030.2013651551366699D-040.1114272391272199D-03 +-.1798206776156415D-04-.9968672138364864D-040.1608738933935444D-04 +0.8928564729752786D-04-.1440886961226929D-04-.8000610566205314D-04 +0.1291134218726644D-040.7167060586276605D-04-.1156616372469904D-04 +-.6413319184916952D-040.1034977991584680D-040.5727272713271265D-04 +-.9242641819512053D-05-.5098776122625716D-040.8228377410789080D-05 +0.4519256146756725D-04-.7293151198878877D-05-.3981401266047105D-04 +0.6425163892851680D-050.3478916893609630D-04-.5614257322333374D-05 +-.3006329973746788D-040.4851599099553577D-050.2558831255668139D-04 +-.4129428081521270D-05-.2132146425429693D-040.3440846403443515D-05 +0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04 +0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05 +-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05 +-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06 +-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05 +-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05 +0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04 +0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05 +-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04 +-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05 +0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04 +0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05 +-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04 +-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04 +0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04 +0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04 +-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03 +-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04 +0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03 +0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04 +-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03 +-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +-.4082207159474594D+00-.1729441280470915D-01-.6393452627818429D-01 +0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02 +-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02 +-.6424099272004710D-030.1344438575349479D-020.1237288482050448D-03 +0.3980741565709959D-02-.6424099272005126D-03-.2541776982554263D-02 +0.4101905987537787D-030.1760064559812521D-02-.2840382695217011D-03 +-.1288661285438230D-020.2079634633143654D-030.9826448017572174D-03 +-.1585786882018380D-03-.7727812230408974D-030.1247110170406368D-03 +0.6226054234809117D-03-.1004757274921672D-03-.5114288231755168D-03 +0.8253410768850847D-040.4268045368520104D-03-.6887748599651892D-04 +-.3608796739013979D-030.5823856716450639D-040.3085010747980624D-03 +-.4978573708714430D-04-.2661733971656788D-030.4295491929665637D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2026106452901076D-03 +0.3269719667613068D-040.1783582025511267D-03-.2878335054540236D-04 +-.1577525118211425D-030.2545801528732096D-040.1400760388418106D-03 +-.2260539561021587D-04-.1247774371157844D-030.2013651551366699D-04 +0.1114272391272199D-03-.1798206776156415D-04-.9968672138364864D-04 +0.1608738933935444D-040.8928564729752786D-04-.1440886961226929D-04 +-.8000610566205314D-040.1291134218726644D-040.7167060586276605D-04 +-.1156616372469904D-04-.6413319184916952D-040.1034977991584680D-04 +0.5727272713271265D-04-.9242641819512053D-05-.5098776122625716D-04 +0.8228377410789080D-050.4519256146756725D-04-.7293151198878877D-05 +-.3981401266047105D-040.6425163892851680D-050.3478916893609630D-04 +-.5614257322333374D-05-.3006329973746788D-040.4851599099553577D-05 +0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04 +0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05 +-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05 +-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06 +0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05 +-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06 +0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04 +0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05 +-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04 +-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04 +0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05 +-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04 +-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04 +0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04 +0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04 +-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03 +-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03 +0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04 +-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03 +-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-01-.4082649203222606D+00-.1726907274797979D-01 +-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01 +-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02 +0.1363516010089288D-020.1259010716643076D-03-.7089509216132388D-02 +0.1144101174176753D-020.3980741565709959D-02-.6424099272005126D-03 +-.2541776982554263D-020.4101905987537787D-030.1760064559812521D-02 +-.2840382695217011D-03-.1288661285438230D-020.2079634633143654D-03 +0.9826448017572174D-03-.1585786882018380D-03-.7727812230408974D-03 +0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03 +-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03 +-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04 +0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03 +0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04 +-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03 +-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04 +0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03 +0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04 +-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04 +-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04 +0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04 +0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05 +-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04 +-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05 +0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04 +0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05 +-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04 +-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05 +0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05 +0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06 +0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05 +0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05 +-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04 +-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05 +0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04 +0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05 +-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04 +-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05 +0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04 +0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04 +-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04 +-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04 +0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03 +0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04 +-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03 +-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04 +0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03 +0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04 +-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03 +-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04 +0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03 +0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03 +-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02 +-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03 +0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02 +0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02 +-.6393452627818429D-010.1031771937313455D-01-.4083050198919414D+00 +-.1724569180949983D-01-.6393452627818429D-010.1031771937313455D-01 +0.1597157490519900D-01-.2577484145293042D-020.1382690415332871D-02 +0.1280923047700254D-030.1597157490519940D-01-.2577484145293108D-02 +-.7089509216132388D-020.1144101174176753D-020.3980741565709959D-02 +-.6424099272005126D-03-.2541776982554263D-020.4101905987537787D-03 +0.1760064559812521D-02-.2840382695217011D-03-.1288661285438230D-02 +0.2079634633143654D-030.9826448017572174D-03-.1585786882018380D-03 +-.7727812230408974D-030.1247110170406368D-030.6226054234809117D-03 +-.1004757274921672D-03-.5114288231755168D-030.8253410768850847D-04 +0.4268045368520104D-03-.6887748599651892D-04-.3608796739013979D-03 +0.5823856716450639D-040.3085010747980624D-03-.4978573708714430D-04 +-.2661733971656788D-030.4295491929665637D-040.2314578281220329D-03 +-.3735253948527681D-04-.2026106452901076D-030.3269719667613068D-04 +0.1783582025511267D-03-.2878335054540236D-04-.1577525118211425D-03 +0.2545801528732096D-040.1400760388418106D-03-.2260539561021587D-04 +-.1247774371157844D-030.2013651551366699D-040.1114272391272199D-03 +-.1798206776156415D-04-.9968672138364864D-040.1608738933935444D-04 +0.8928564729752786D-04-.1440886961226929D-04-.8000610566205314D-04 +0.1291134218726644D-040.7167060586276605D-04-.1156616372469904D-04 +-.6413319184916952D-040.1034977991584680D-040.5727272713271265D-04 +-.9242641819512053D-05-.5098776122625716D-040.8228377410789080D-05 +0.4519256146756725D-04-.7293151198878877D-05-.3981401266047105D-04 +0.6425163892851680D-050.3478916893609630D-04-.5614257322333374D-05 +-.3006329973746788D-040.4851599099553577D-050.2558831255668139D-04 +-.4129428081521270D-05-.2132146425429693D-040.3440846403443515D-05 +0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04 +0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05 +-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05 +-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06 +-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05 +-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05 +0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04 +0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05 +-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04 +-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05 +0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04 +0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05 +-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04 +-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04 +0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04 +0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04 +-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03 +-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04 +0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03 +0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04 +-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03 +-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04 +0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03 +0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03 +-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03 +-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03 +0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02 +0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03 +-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01 +-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01 +-.4083413935873786D+00-.1722412253413513D-01-.6393452627818429D-01 +0.1031771937313455D-010.1401962280695231D-020.1303026850247933D-03 +-.6393452627818492D-010.1031771937313466D-010.1597157490519940D-01 +-.2577484145293108D-02-.7089509216132388D-020.1144101174176753D-02 +0.3980741565709959D-02-.6424099272005126D-03-.2541776982554263D-02 +0.4101905987537787D-030.1760064559812521D-02-.2840382695217011D-03 +-.1288661285438230D-020.2079634633143654D-030.9826448017572174D-03 +-.1585786882018380D-03-.7727812230408974D-030.1247110170406368D-03 +0.6226054234809117D-03-.1004757274921672D-03-.5114288231755168D-03 +0.8253410768850847D-040.4268045368520104D-03-.6887748599651892D-04 +-.3608796739013979D-030.5823856716450639D-040.3085010747980624D-03 +-.4978573708714430D-04-.2661733971656788D-030.4295491929665637D-04 +0.2314578281220329D-03-.3735253948527681D-04-.2026106452901076D-03 +0.3269719667613068D-040.1783582025511267D-03-.2878335054540236D-04 +-.1577525118211425D-030.2545801528732096D-040.1400760388418106D-03 +-.2260539561021587D-04-.1247774371157844D-030.2013651551366699D-04 +0.1114272391272199D-03-.1798206776156415D-04-.9968672138364864D-04 +0.1608738933935444D-040.8928564729752786D-04-.1440886961226929D-04 +-.8000610566205314D-040.1291134218726644D-040.7167060586276605D-04 +-.1156616372469904D-04-.6413319184916952D-040.1034977991584680D-04 +0.5727272713271265D-04-.9242641819512053D-05-.5098776122625716D-04 +0.8228377410789080D-050.4519256146756725D-04-.7293151198878877D-05 +-.3981401266047105D-040.6425163892851680D-050.3478916893609630D-04 +-.5614257322333374D-05-.3006329973746788D-040.4851599099553577D-05 +0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04 +0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05 +-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05 +-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06 +0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05 +-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06 +0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04 +0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05 +-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04 +-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05 +0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04 +0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05 +-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04 +-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04 +0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04 +0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04 +-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03 +-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04 +0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03 +0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04 +-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03 +-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04 +0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03 +0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04 +-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03 +-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03 +0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02 +0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03 +-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02 +-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02 +0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01 +0.1031771937313455D-01-.4083743855043928D+00-.1720422819797903D-01 diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Demo/HB/west0067.rua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Demo/HB/west0067.rua Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,115 @@ +1U CAVETT PROBLEM WITH 5 COMPONENTS ( CHEM. ENG. FROM WESTERBERG ) WEST0067 + 111 7 30 74 0 +RUA 67 67 294 0 +(10I8) (10I8) (4E20.12) + 1 11 15 19 23 27 30 35 38 41 + 44 47 49 54 59 64 69 73 78 80 + 90 93 96 99 102 105 109 113 117 121 + 124 134 137 140 143 146 149 159 164 169 + 174 179 183 188 192 196 200 204 207 217 + 220 223 226 229 232 242 247 252 257 262 + 266 271 275 279 283 287 290 295 + 5 6 7 8 9 25 26 27 28 29 + 5 21 25 61 6 22 26 61 7 23 + 27 61 8 24 28 61 9 29 61 5 + 6 7 8 9 1 5 57 2 6 57 + 3 7 57 4 8 57 9 57 1 5 + 10 11 58 2 6 10 12 58 3 7 + 10 13 58 4 8 10 14 58 9 10 + 15 58 1 2 3 4 10 15 56 11 + 12 13 14 15 16 17 18 19 20 11 + 16 59 12 17 59 13 18 59 14 19 + 59 15 20 59 16 36 40 64 17 37 + 41 64 18 38 42 64 19 39 43 64 + 20 44 64 16 17 18 19 20 25 26 + 27 28 29 16 25 60 17 26 60 18 + 27 60 19 28 60 20 29 60 25 26 + 27 28 29 31 32 33 34 35 21 25 + 30 31 62 22 26 30 32 62 23 27 + 30 33 62 24 28 30 34 62 29 30 + 35 62 21 22 23 24 30 31 46 50 + 66 32 47 51 66 33 48 52 66 34 + 49 53 66 35 54 66 31 32 33 34 + 35 40 41 42 43 44 31 40 63 32 + 41 63 33 42 63 34 43 63 35 44 + 63 40 41 42 43 44 50 51 52 53 + 54 36 40 45 50 65 37 41 45 51 + 65 38 42 45 52 65 39 43 45 53 + 65 44 45 54 65 36 37 38 39 45 + 46 50 55 67 47 51 55 67 48 52 + 55 67 49 53 55 67 54 55 67 46 + 47 48 49 55 + -.278841600000E+00 -.268018600000E+00 -.232371700000E+00 -.157508200000E+00 + -.632597800000E-01 .139420800000E+00 .134009300000E+00 .116185900000E+00 + .787541100000E-01 .316298900000E-01 -.800000000000E+00 -.915953300000E+00 + .400000000000E+00 .100000000000E+01 -.800000000000E+00 -.915953300000E+00 + .400000000000E+00 .100000000000E+01 -.800000000000E+00 -.915953300000E+00 + .400000000000E+00 .100000000000E+01 -.800000000000E+00 -.915953300000E+00 + .400000000000E+00 .100000000000E+01 -.800000000000E+00 .400000000000E+00 + .100000000000E+01 .134462200000E+00 .117567900000E+00 .885926200000E-01 + .475943900000E-01 .117829100000E-01 -.834181800000E+00 .400000000000E+00 + .100000000000E+01 -.834181800000E+00 .400000000000E+00 .100000000000E+01 + -.834181800000E+00 .400000000000E+00 .100000000000E+01 -.834181800000E+00 + .400000000000E+00 .100000000000E+01 .400000000000E+00 .100000000000E+01 + .126582300000E+01 .400000000000E+00 -.126582300000E+01 .333333300000E+00 + .100000000000E+01 .101265800000E+01 .400000000000E+00 -.101265800000E+01 + .333333300000E+00 .100000000000E+01 .759493700000E+00 .400000000000E+00 + -.759493700000E+00 .333333300000E+00 .100000000000E+01 .506329100000E+00 + .400000000000E+00 -.506329100000E+00 .333333300000E+00 .100000000000E+01 + .400000000000E+00 -.253164600000E+00 .333333300000E+00 .100000000000E+01 + -.336155600000E+00 -.293919600000E+00 -.221481500000E+00 -.118986000000E+00 + .100000000000E+01 .666666700000E+00 .100000000000E+01 -.207175900000E+00 + -.214039200000E+00 -.214420600000E+00 -.198676800000E+00 -.165687400000E+00 + .124305500000E+00 .128423500000E+00 .128652400000E+00 .119206100000E+00 + .994124600000E-01 -.100000000000E+01 .600000000000E+00 .100000000000E+01 + -.100000000000E+01 .600000000000E+00 .100000000000E+01 -.100000000000E+01 + .600000000000E+00 .100000000000E+01 -.100000000000E+01 .600000000000E+00 + .100000000000E+01 -.100000000000E+01 .600000000000E+00 .100000000000E+01 + .450000000000E+00 -.958318700000E+00 .500000000000E+00 .100000000000E+01 + .450000000000E+00 -.958318700000E+00 .500000000000E+00 .100000000000E+01 + .450000000000E+00 -.958318700000E+00 .500000000000E+00 .100000000000E+01 + .450000000000E+00 -.958318700000E+00 .500000000000E+00 .100000000000E+01 + .450000000000E+00 .500000000000E+00 .100000000000E+01 -.207098600000E+00 + -.223299700000E+00 -.228626400000E+00 -.202452800000E+00 -.138522600000E+00 + -.207098600000E+00 -.223299700000E+00 -.228626400000E+00 -.202452800000E+00 + -.138522600000E+00 -.105000000000E+01 -.105000000000E+01 .100000000000E+01 + -.105000000000E+01 -.105000000000E+01 .100000000000E+01 -.105000000000E+01 + -.105000000000E+01 .100000000000E+01 -.105000000000E+01 -.105000000000E+01 + .100000000000E+01 -.105000000000E+01 -.105000000000E+01 .100000000000E+01 + .814744900000E-01 .978901500000E-01 .113160800000E+00 .115055500000E+00 + .924190900000E-01 .905272100000E-01 .108766800000E+00 .125734200000E+00 + .127839400000E+00 .102687900000E+00 .156739800000E+01 .650000000000E+00 + -.156739800000E+01 .722222200000E+00 .100000000000E+01 .125391800000E+01 + .650000000000E+00 -.125391800000E+01 .722222200000E+00 .100000000000E+01 + .940438900000E+00 .650000000000E+00 -.940438900000E+00 .722222200000E+00 + .100000000000E+01 .626959200000E+00 .650000000000E+00 -.626959200000E+00 + .722222200000E+00 .100000000000E+01 .650000000000E+00 -.313479600000E+00 + .722222200000E+00 .100000000000E+01 -.278841600000E+00 -.268018600000E+00 + -.232371700000E+00 -.157508200000E+00 .100000000000E+01 .250000000000E+00 + -.824224800000E+00 .500000000000E+00 .100000000000E+01 .250000000000E+00 + -.824224800000E+00 .500000000000E+00 .100000000000E+01 .250000000000E+00 + -.824224800000E+00 .500000000000E+00 .100000000000E+01 .250000000000E+00 + -.824224800000E+00 .500000000000E+00 .100000000000E+01 .250000000000E+00 + .500000000000E+00 .100000000000E+01 -.158162600000E+00 -.194771100000E+00 + -.230391700000E+00 -.236284500000E+00 -.180390000000E+00 -.158162600000E+00 + -.194771100000E+00 -.230391700000E+00 -.236284500000E+00 -.180390000000E+00 + -.972222200000E+00 -.972222200000E+00 .100000000000E+01 -.972222200000E+00 + -.972222200000E+00 .100000000000E+01 -.972222200000E+00 -.972222200000E+00 + .100000000000E+01 -.972222200000E+00 -.972222200000E+00 .100000000000E+01 + -.972222200000E+00 -.972222200000E+00 .100000000000E+01 .532286400000E-01 + .757454200000E-01 .106102800000E+00 .133387800000E+00 .131535300000E+00 + -.106457300000E+00 -.151490800000E+00 -.212205600000E+00 -.266775700000E+00 + -.263070600000E+00 .186335400000E+01 .472222200000E+00 -.186335400000E+01 + -.944444400000E+00 .100000000000E+01 .149068300000E+01 .472222200000E+00 + -.149068300000E+01 -.944444400000E+00 .100000000000E+01 .111801200000E+01 + .472222200000E+00 -.111801200000E+01 -.944444400000E+00 .100000000000E+01 + .745341600000E+00 .472222200000E+00 -.745341600000E+00 -.944444400000E+00 + .100000000000E+01 .472222200000E+00 -.372670800000E+00 -.944444400000E+00 + .100000000000E+01 -.206995400000E+00 -.235646900000E+00 -.247567500000E+00 + -.207487300000E+00 .100000000000E+01 .186335400000E+01 .444444400000E+00 + -.186335400000E+01 .100000000000E+01 .149068300000E+01 .444444400000E+00 + -.149068300000E+01 .100000000000E+01 .111801200000E+01 .444444400000E+00 + -.111801200000E+01 .100000000000E+01 .745341600000E+00 .444444400000E+00 + -.745341600000E+00 .100000000000E+01 .444444400000E+00 -.372670800000E+00 + .100000000000E+01 -.144335400000E+00 -.191855700000E+00 -.242149800000E+00 + -.254119300000E+00 .100000000000E+01 diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Demo/Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Demo/Makefile Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,165 @@ +#------------------------------------------------------------------------------- +# compile the UMFPACK demos (for GNU make and original make) +#------------------------------------------------------------------------------- + +# UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. +# All Rights Reserved. See ../Doc/License for License. + +all: umfpack_di_demo umfpack_zi_demo umfpack_dl_demo umfpack_zl_demo \ + umfpack_simple + +include ../Make/Make.include + +C = $(CC) $(CFLAGS) $(CONFIG) -I../Include -I../../AMD/Include + +INC = ../Include/umfpack.h ../../AMD/Include/amd.h + +../Lib/libumfpack.a: + ( cd ../Source ; make ) + +../../AMD/Lib/libamd.a: + ( cd ../../AMD/Source ; make ) + +UMFPACK = ../Lib/libumfpack.a ../../AMD/Lib/libamd.a + +#------------------------------------------------------------------------------- +# Create the demo programs, run them, and compare the output +#------------------------------------------------------------------------------- + +dist: umfpack_di_demo.c umfpack_dl_demo.c umfpack_zi_demo.c umfpack_zl_demo.c + +umfpack_simple: umfpack_simple.c $(INC) $(UMFPACK) + $(C) -o umfpack_simple umfpack_simple.c $(UMFPACK) $(LIB) + ./umfpack_simple + +# the GNU rules are simpler: +# umfpack_%_demo.c: umfpack_xx_demo.c umfpack_%_demo.sed +# - sed -f umfpack_$*_demo.sed < umfpack_xx_demo.c > umfpack_$*_demo.c +# +# umfpack_%_demo: umfpack_%_demo.c $(INC) $(UMFPACK) +# $(C) -o umfpack_$*_demo umfpack_$*_demo.c $(UMFPACK) $(LIB) +# ./umfpack_$*_demo > my_umfpack_$*_demo.out + +# but do this via brute-force, so we can use just a single Makefile: + +# double-precision, int verion: +umfpack_di_demo.c: umfpack_xx_demo.c umfpack_di_demo.sed + - sed -f umfpack_di_demo.sed < umfpack_xx_demo.c > umfpack_di_demo.c + +umfpack_di_demo: umfpack_di_demo.c $(INC) $(UMFPACK) + $(C) -o umfpack_di_demo umfpack_di_demo.c $(UMFPACK) $(LIB) + ./umfpack_di_demo > my_umfpack_di_demo.out + - diff umfpack_di_demo.out my_umfpack_di_demo.out + +# double-precision, long verion: +umfpack_dl_demo.c: umfpack_xx_demo.c umfpack_dl_demo.sed + - sed -f umfpack_dl_demo.sed < umfpack_xx_demo.c > umfpack_dl_demo.c + +umfpack_dl_demo: umfpack_dl_demo.c $(INC) $(UMFPACK) + $(C) -o umfpack_dl_demo umfpack_dl_demo.c $(UMFPACK) $(LIB) + ./umfpack_dl_demo > my_umfpack_dl_demo.out + - diff umfpack_dl_demo.out my_umfpack_dl_demo.out + +# complex, int verion: +umfpack_zi_demo.c: umfpack_xx_demo.c umfpack_zi_demo.sed + - sed -f umfpack_zi_demo.sed < umfpack_xx_demo.c > umfpack_zi_demo.c + +umfpack_zi_demo: umfpack_zi_demo.c $(INC) $(UMFPACK) + $(C) -o umfpack_zi_demo umfpack_zi_demo.c $(UMFPACK) $(LIB) + ./umfpack_zi_demo > my_umfpack_zi_demo.out + - diff umfpack_zi_demo.out my_umfpack_zi_demo.out + +# complex, long verion: +umfpack_zl_demo.c: umfpack_xx_demo.c umfpack_zl_demo.sed + - sed -f umfpack_zl_demo.sed < umfpack_xx_demo.c > umfpack_zl_demo.c + +umfpack_zl_demo: umfpack_zl_demo.c $(INC) $(UMFPACK) + $(C) -o umfpack_zl_demo umfpack_zl_demo.c $(UMFPACK) $(LIB) + ./umfpack_zl_demo > my_umfpack_zl_demo.out + - diff umfpack_zl_demo.out my_umfpack_zl_demo.out + +#------------------------------------------------------------------------------- +# create a demo program that reads in Harwell/Boeing matrices, and run it +#------------------------------------------------------------------------------- + +# the output of "make hb" is in the file umf4.out +hb: $(UMFPACK) umf4 readhb readhb_nozeros readhb_size + - ./readhb_nozeros < HB/can_24.psa > tmp/A + - ./readhb_size < HB/can_24.psa > tmp/Asize + - ./umf4 + - ./readhb_nozeros < HB/west0067.rua > tmp/A + - ./readhb_size < HB/west0067.rua > tmp/Asize + - ./umf4 + - ./readhb_nozeros < HB/fs_183_6.rua > tmp/A + - ./readhb_size < HB/fs_183_6.rua > tmp/Asize + - ./umf4 + - ./readhb < HB/fs_183_6.rua > tmp/A + - ./readhb_size < HB/fs_183_6.rua > tmp/Asize + - ./umf4 + - ./readhb < HB/arc130.rua > tmp/A + - ./readhb_size < HB/arc130.rua > tmp/Asize + - ./umf4 + - ./readhb_nozeros < HB/arc130.rua > tmp/A + - ./readhb_size < HB/arc130.rua > tmp/Asize + - ./umf4 + - ./readhb_nozeros < HB/arc130.rua > tmp/A + - ./readhb_size < HB/arc130.rua > tmp/Asize + - ./umf4 a 1e-6 + +umf4: umf4.c $(UMFPACK) + $(C) -o umf4 umf4.c $(UMFPACK) $(LIB) + +readhb: readhb.f + $(F77) $(F77FLAGS) -o readhb readhb.f $(F77LIB) + +readhb_size: readhb_size.f + $(F77) $(F77FLAGS) -o readhb_size readhb_size.f $(F77LIB) + +readhb_nozeros: readhb_nozeros.f + $(F77) $(F77FLAGS) -o readhb_nozeros readhb_nozeros.f $(F77LIB) + +#------------------------------------------------------------------------------- +# compile the FORTRAN interface and demo +#------------------------------------------------------------------------------- + +fortran: $(UMFPACK) umf4hb.f umf4_f77wrapper.o umf4zhb.f umf4_f77zwrapper.o $(UMFPACK) + $(F77) $(F77FLAGS) -o umf4hb umf4hb.f umf4_f77wrapper.o \ + $(UMFPACK) $(LIB) + - ./umf4hb < HB/west0067.rua > my_umf4hb.out + - diff my_umf4hb.out umf4hb.out + $(F77) $(F77FLAGS) -o umf4zhb umf4zhb.f umf4_f77zwrapper.o \ + $(UMFPACK) $(LIB) + - ./umf4zhb < HB/qc324.cua > my_umf4zhb.out + - diff my_umf4zhb.out umf4zhb.out + +fortran64: $(UMFPACK) umf4hb64.f umf4_f77wrapper64.o umf4_f77zwrapper64.o $(UMFPACK) + $(F77) $(F77FLAGS) -o umf4hb64 umf4hb64.f umf4_f77wrapper64.o \ + $(UMFPACK) $(LIB) + - ./umf4hb64 < HB/west0067.rua > my_umf4hb64.out + - diff my_umf4hb64.out umf4hb64.out + +umf4_f77wrapper.o: umf4_f77wrapper.c $(INC) + $(C) -c umf4_f77wrapper.c -o umf4_f77wrapper.o + +umf4_f77zwrapper.o: umf4_f77zwrapper.c $(INC) + $(C) -c umf4_f77zwrapper.c -o umf4_f77zwrapper.o + +umf4_f77wrapper64.o: umf4_f77wrapper.c $(INC) + $(C) -DDLONG -c umf4_f77wrapper.c -o umf4_f77wrapper64.o + +umf4_f77zwrapper64.o: umf4_f77zwrapper.c $(INC) + $(C) -DDLONG -c umf4_f77zwrapper.c -o umf4_f77zwrapper64.o + +#------------------------------------------------------------------------------- +# Remove all but the files in the original distribution +#------------------------------------------------------------------------------- + +purge: clean + - $(RM) umfpack_simple a.out + - $(RM) umfpack_di_demo my_umfpack_di_demo.out + - $(RM) umfpack_dl_demo my_umfpack_dl_demo.out + - $(RM) umfpack_zi_demo my_umfpack_zi_demo.out + - $(RM) umfpack_zl_demo my_umfpack_zl_demo.out + - $(RM) umf4hb umf4zhb *.umf my_umf4hb.out + - $(RM) umf4hb64 my_umf4hb64.out my_umf4zhb.out + - $(RM) umf4 readhb readhb_nozeros readhb_size tmp/* diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Demo/readhb.f --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Demo/readhb.f Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,115 @@ +c======================================================================= +c== readhb ============================================================= +c======================================================================= + +c----------------------------------------------------------------------- +c UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE +c Dept, Univ. of Florida. All Rights Reserved. See ../Doc/License for +c License. web: http://www.cise.ufl.edu/research/sparse/umfpack +c----------------------------------------------------------------------- + +c readhb: +c read a sparse matrix in the Harwell/Boeing format and +c output a matrix in triplet format. +c +c usage (for example): +c +c in a Unix shell: +c readhb < HB/arc130.rua > tmp/A +c +c Then, in MATLAB, you can do the following: +c >> load tmp/A +c >> A = spconvert (A) ; +c >> spy (A) + + integer nzmax, nmax + parameter (nzmax = 10000000, nmax = 250000) + integer Ptr (nmax), Index (nzmax), n, nz, totcrd, ptrcrd, + $ indcrd, valcrd, rhscrd, ncol, nrow, nrhs, row, col, p + character title*72, key*30, type*3, ptrfmt*16, + $ indfmt*16, valfmt*20, rhsfmt*20 + logical sym + double precision Value (nzmax), skew + character rhstyp*3 + integer nzrhs, nel + + integer ne, nnz + +c----------------------------------------------------------------------- + +c read header information from Harwell/Boeing matrix + + read (5, 10, err = 998) + $ title, key, + $ totcrd, ptrcrd, indcrd, valcrd, rhscrd, + $ type, nrow, ncol, nz, nel, + $ ptrfmt, indfmt, valfmt, rhsfmt + if (rhscrd .gt. 0) then +c new Harwell/Boeing format: + read (5, 20, err = 998) rhstyp,nrhs,nzrhs + endif +10 format (a72, a8 / 5i14 / a3, 11x, 4i14 / 2a16, 2a20) +20 format (a3, 11x, 2i14) + + skew = 0.0 + if (type (2:2) .eq. 'Z' .or. type (2:2) .eq. 'z') skew = -1.0 + if (type (2:2) .eq. 'S' .or. type (2:2) .eq. 's') skew = 1.0 + sym = skew .ne. 0.0 + + write (0, 31) key +31 format ('Matrix key: ', a8) + + n = max (nrow, ncol) + + if (n .ge. nmax .or. nz .gt. nzmax) then + write (0, *) 'Matrix too big!' + write (0, *) '(recompile readhb.f with larger nzmax, nmax)' + stop + endif + + read (5, ptrfmt, err = 998) (Ptr (p), p = 1, ncol+1) + read (5, indfmt, err = 998) (Index (p), p = 1, nz) + + do 55 col = ncol+2, n+1 + Ptr (col) = Ptr (ncol+1) +55 continue + +c read the values + if (valcrd .gt. 0) then + read (5, valfmt, err = 998) (Value (p), p = 1, nz) + else + do 50 p = 1, nz + Value (p) = 1 +50 continue + endif + +c create the triplet form of the input matrix + + ne = 0 + nnz = 0 + do 100 col = 1, n + do 90 p = Ptr (col), Ptr (col+1) - 1 + row = Index (p) + + ne = ne + 1 + nnz = nnz + 1 + write (6, 200) row, col, Value (p) + + if (sym .and. row .ne. col) then + ne = ne + 1 + if (Value (p) .ne. 0) then + nnz = nnz + 1 + write (6, 200) col, row, skew * Value (p) + endif + endif + +90 continue +100 continue +200 format (2i7, e30.18e3) + +c write (0,*) 'Number of entries: ',ne,' True nonzeros: ', nnz + stop + +998 write (0,*) 'Read error: Harwell/Boeing matrix' + stop + end diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Demo/readhb_nozeros.f --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Demo/readhb_nozeros.f Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,122 @@ +c======================================================================= +c== readhb_nozeros ===================================================== +c======================================================================= + +c----------------------------------------------------------------------- +c UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE +c Dept, Univ. of Florida. All Rights Reserved. See ../Doc/License for +c License. web: http://www.cise.ufl.edu/research/sparse/umfpack +c----------------------------------------------------------------------- + +c readhb_nozeros: +c read a sparse matrix in the Harwell/Boeing format and +c output a matrix in triplet format. +c Identical to readhb, except that this version removes explicit +c zero entries from the matrix. +c +c usage (for example): +c +c in a Unix shell: +c readhb_nozeros < HB/arc130.rua > tmp/A +c +c Then, in MATLAB, you can do the following: +c >> load tmp/A +c >> A = spconvert (A) ; +c >> spy (A) + + integer nzmax, nmax + parameter (nzmax = 10000000, nmax = 250000) + integer Ptr (nmax), Index (nzmax), n, nz, totcrd, ptrcrd, + $ indcrd, valcrd, rhscrd, ncol, nrow, nrhs, row, col, p + character title*72, key*30, type*3, ptrfmt*16, + $ indfmt*16, valfmt*20, rhsfmt*20 + logical sym + double precision Value (nzmax), skew + character rhstyp*3 + integer nzrhs, nel + + integer ne, nnz + +c----------------------------------------------------------------------- + +c read header information from Harwell/Boeing matrix + + read (5, 10, err = 998) + $ title, key, + $ totcrd, ptrcrd, indcrd, valcrd, rhscrd, + $ type, nrow, ncol, nz, nel, + $ ptrfmt, indfmt, valfmt, rhsfmt + if (rhscrd .gt. 0) then +c new Harwell/Boeing format: + read (5, 20, err = 998) rhstyp,nrhs,nzrhs + endif +10 format (a72, a8 / 5i14 / a3, 11x, 4i14 / 2a16, 2a20) +20 format (a3, 11x, 2i14) + + skew = 0.0 + if (type (2:2) .eq. 'Z' .or. type (2:2) .eq. 'z') skew = -1.0 + if (type (2:2) .eq. 'S' .or. type (2:2) .eq. 's') skew = 1.0 + sym = skew .ne. 0.0 + + write (0, 31) key +31 format ('Matrix key: ', a8) + + n = max (nrow, ncol) + + if (n .ge. nmax .or. nz .gt. nzmax) then + write (0, *) 'Matrix too big!' + write (0, *) '(recompile readhb_nozeros.f with larger', + $ ' nzmax, nmax)' + stop + endif + + read (5, ptrfmt, err = 998) (Ptr (p), p = 1, ncol+1) + read (5, indfmt, err = 998) (Index (p), p = 1, nz) + + do 55 col = ncol+2, n+1 + Ptr (col) = Ptr (ncol+1) +55 continue + +c read the values + if (valcrd .gt. 0) then + read (5, valfmt, err = 998) (Value (p), p = 1, nz) + else + do 50 p = 1, nz + Value (p) = 1 +50 continue + endif + +c create the triplet form of the input matrix + + ne = 0 + nnz = 0 + do 100 col = 1, n + do 90 p = Ptr (col), Ptr (col+1) - 1 + row = Index (p) + +c remove zeros, to compare fairly with LU in MATLAB +c (MATLAB always removes explicit zeros) + ne = ne + 1 + if (Value (p) .ne. 0) then + nnz = nnz + 1 + write (6, 200) row, col, Value (p) + endif + + if (sym .and. row .ne. col) then + ne = ne + 1 + if (Value (p) .ne. 0) then + nnz = nnz + 1 + write (6, 200) col, row, skew * Value (p) + endif + endif + +90 continue +100 continue +200 format (2i7, e30.18e3) + +c write (0,*) 'Number of entries: ',ne,' True nonzeros: ', nnz + stop + +998 write (0,*) 'Read error: Harwell/Boeing matrix' + stop + end diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Demo/readhb_size.f --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Demo/readhb_size.f Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,47 @@ +c======================================================================= +c== readhb_size ======================================================== +c======================================================================= + +c----------------------------------------------------------------------- +c UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE +c Dept, Univ. of Florida. All Rights Reserved. See ../Doc/License for +c License. web: http://www.cise.ufl.edu/research/sparse/umfpack +c----------------------------------------------------------------------- + +c readhb_size: +c read a sparse matrix in the Harwell/Boeing format and output the +c size of the matrix (# rows, # columns, and # of entries) +c +c usage (for example): +c +c readhb_size < HB/arc130.rua > tmp/Asize + + integer nz, totcrd, ptrcrd, + $ indcrd, valcrd, rhscrd, ncol, nrow, nrhs + character title*72, key*30, type*3, ptrfmt*16, + $ indfmt*16, valfmt*20, rhsfmt*20 + character rhstyp*3 + integer nzrhs, nel + +c----------------------------------------------------------------------- + +c read header information from Harwell/Boeing matrix + + read (5, 10, err = 998) + $ title, key, + $ totcrd, ptrcrd, indcrd, valcrd, rhscrd, + $ type, nrow, ncol, nz, nel, + $ ptrfmt, indfmt, valfmt, rhsfmt + if (rhscrd .gt. 0) then +c new Harwell/Boeing format: + read (5, 20, err = 998) rhstyp,nrhs,nzrhs + endif +10 format (a72, a8 / 5i14 / a3, 11x, 4i14 / 2a16, 2a20) +20 format (a3, 11x, 2i14) + + write (6, *) nrow, ncol, nz + stop +998 write (0, *) 'Read error' + stop + end + diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Demo/simple_compile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Demo/simple_compile Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,108 @@ +#!/bin/csh + +# This one-line command compiles all of UMFPACK and the double/int demo. +# It forms a useful prototype for Microsoft Visual Studio, which does not +# have the flexibility of Unix/Linux "make". The latter can be configured +# to compile one file multiple times (as required by UMFPACK). Here, +# that requirement is solved with a single file, umf_multicompile.c. +# +# No BLAS is used here. + +cc -DDINT -DNBLAS \ + -I../Include -I../Source -I../../AMD/Include -I../../AMD/Source \ + umfpack_di_demo.c \ + ../Source/umf_multicompile.c \ + ../Source/umf_ltsolve.c \ + ../Source/umf_utsolve.c \ + ../Source/umf_triplet.c \ + ../Source/umf_assemble.c \ + ../Source/umf_store_lu.c \ + ../Source/umfpack_solve.c \ + ../../AMD/Source/amd_1.c \ + ../../AMD/Source/amd_2.c \ + ../../AMD/Source/amd_aat.c \ + ../../AMD/Source/amd_control.c \ + ../../AMD/Source/amd_defaults.c \ + ../../AMD/Source/amd_dump.c \ + ../../AMD/Source/amd_info.c \ + ../../AMD/Source/amd_order.c \ + ../../AMD/Source/amd_post_tree.c \ + ../../AMD/Source/amd_postorder.c \ + ../../AMD/Source/amd_preprocess.c \ + ../../AMD/Source/amd_valid.c \ + ../Source/umf_2by2.c \ + ../Source/umf_analyze.c \ + ../Source/umf_apply_order.c \ + ../Source/umf_blas3_update.c \ + ../Source/umf_build_tuples.c \ + ../Source/umf_colamd.c \ + ../Source/umf_create_element.c \ + ../Source/umf_dump.c \ + ../Source/umf_extend_front.c \ + ../Source/umf_free.c \ + ../Source/umf_fsize.c \ + ../Source/umf_garbage_collection.c \ + ../Source/umf_get_memory.c \ + ../Source/umf_grow_front.c \ + ../Source/umf_init_front.c \ + ../Source/umf_is_permutation.c \ + ../Source/umf_kernel.c \ + ../Source/umf_kernel_init.c \ + ../Source/umf_kernel_wrapup.c \ + ../Source/umf_local_search.c \ + ../Source/umf_lsolve.c \ + ../Source/umf_malloc.c \ + ../Source/umf_mem_alloc_element.c \ + ../Source/umf_mem_alloc_head_block.c \ + ../Source/umf_mem_alloc_tail_block.c \ + ../Source/umf_mem_free_tail_block.c \ + ../Source/umf_mem_init_memoryspace.c \ + ../Source/umf_realloc.c \ + ../Source/umf_report_perm.c \ + ../Source/umf_report_vector.c \ + ../Source/umf_row_search.c \ + ../Source/umf_scale.c \ + ../Source/umf_scale_column.c \ + ../Source/umf_set_stats.c \ + ../Source/umf_singletons.c \ + ../Source/umf_solve.c \ + ../Source/umf_start_front.c \ + ../Source/umf_symbolic_usage.c \ + ../Source/umf_transpose.c \ + ../Source/umf_tuple_lengths.c \ + ../Source/umf_usolve.c \ + ../Source/umf_valid_numeric.c \ + ../Source/umf_valid_symbolic.c \ + ../Source/umfpack_col_to_triplet.c \ + ../Source/umfpack_defaults.c \ + ../Source/umfpack_free_numeric.c \ + ../Source/umfpack_free_symbolic.c \ + ../Source/umfpack_get_determinant.c \ + ../Source/umfpack_get_lunz.c \ + ../Source/umfpack_get_numeric.c \ + ../Source/umfpack_get_symbolic.c \ + ../Source/umfpack_load_numeric.c \ + ../Source/umfpack_load_symbolic.c \ + ../Source/umfpack_numeric.c \ + ../Source/umfpack_qsymbolic.c \ + ../Source/umfpack_report_control.c \ + ../Source/umfpack_report_info.c \ + ../Source/umfpack_report_matrix.c \ + ../Source/umfpack_report_numeric.c \ + ../Source/umfpack_report_perm.c \ + ../Source/umfpack_report_status.c \ + ../Source/umfpack_report_symbolic.c \ + ../Source/umfpack_report_triplet.c \ + ../Source/umfpack_report_vector.c \ + ../Source/umfpack_save_numeric.c \ + ../Source/umfpack_save_symbolic.c \ + ../Source/umfpack_scale.c \ + ../Source/umfpack_symbolic.c \ + ../Source/umfpack_tictoc.c \ + ../Source/umfpack_timer.c \ + ../Source/umfpack_transpose.c \ + ../Source/umfpack_triplet_to_col.c \ + -lm + +# now run the demo +./a.out diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Demo/umf4.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Demo/umf4.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,649 @@ +/* ========================================================================== */ +/* === umf4 ================================================================= */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* Demo program for UMFPACK. Reads in a triplet-form matrix in the + * directory tmp/A, whose size and # of nonzeros are in the file tmp/Asize. + * Then calls UMFPACK to analyze, factor, and solve the system. + * + * Syntax: + * + * umf4 default "auto" strategy, 1-norm row scaling + * umf4 a default "auto" strategy, 1-norm row scaling + * umf4 u unsymmetric strategy, 1-norm row scaling + * umf4 s symmetric strategy, 1-norm row scaling + * umf4 2 2-by-2 strategy, maxnorm row scaling + * umf4 A default "auto" strategy, maxnorm row scaling + * umf4 U unsymmetric strategy, maxnorm row scaling + * umf4 S symmetric strategy, maxnorm row scaling + * umf4 T 2-by-2 strategy , maxnorm row scaling + * + * To test a matrix in the Harwell/Boeing format, do the following: + * + * readhb < HB/arc130.rua > tmp/A + * readhb_size < HB/arc130.rua > tmp/Asize + * umf4 + * + * The above options do not drop any nonzero entry in L or U. To compute an + * incomplete factorization, you can add a second argument to give the drop + * tolerance. Entries less than or equal to the drop tolerance are then + * removed from L and U during factorization, unless dropping those entries + * does not save any memory space. For example: + * + * umf4 a 1e-6 default "auto" strategy, 1-norm row scaling, + * drop tolerance of 1e-6. + * + * Note that adding a drop tolerance can lead to an apparent (but not real) + * increase in peak memory usage. This is illustrated in the arc130.rua + * matrix. With a drop tolerance, garbage collection happens to be avoided + * for this matrix. During garbage collection, both internal and external + * fragmentation in the memory space is removed. Peak memory usage includes + * all internal memory fragmentation, even though this can be removed via + * garbage collection. + * + * Control parameters can also be set in the optional tmp/control.umf4 file. + * The right-hand-side can be provided in the optional tmp/b file. The solution + * is written to tmp/x, and the output statistics are written to tmp/info.umf4. + * + * After the matrix is factorized, solved, and the LU factors deallocated, + * this program then test the AMD ordering routine. This call to AMD is NOT + * part of the UMFPACK analysis, factorize, or solve steps. It is just a + * separate test of the AMD ordering routine. If the matrix is unsymmetric, + * AMD orders the pattern of A+A'. + */ + +#include +#include +#include +#include "umfpack.h" +#include "amd.h" + +#define SMAX 256 +#define ABS(x) ((x) >= 0 ? (x) : -(x)) +#define MAX(a,b) (((a) > (b)) ? (a) : (b)) + +#define XTRUE(i,n) (1.0 + ((double) i) / ((double) n)) + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef TRUE +#define TRUE 1 +#endif + +/* -------------------------------------------------------------------------- */ +/* err: compute the relative error, ||x-xtrue||/||xtrue|| */ +/* -------------------------------------------------------------------------- */ + +static double err +( + int n, + double x [ ] +) +{ + int i ; + double enorm, e, abse, absxtrue, xnorm ; + enorm = 0 ; + xnorm = 0 ; + + for (i = 0 ; i < n ; i++) + { + if (isnan (x [i])) + { + enorm = x [i] ; + break ; + } + e = x [i] - XTRUE (i,n) ; + abse = ABS (e) ; + enorm = MAX (enorm, abse) ; + } + + for (i = 0 ; i < n ; i++) + { + /* XTRUE is positive, but do this in case XTRUE is redefined */ + absxtrue = ABS (XTRUE (i,n)) ; + xnorm = MAX (xnorm, absxtrue) ; + } + + if (xnorm == 0) + { + xnorm = 1 ; + } + return (enorm / xnorm) ; +} + + +/* -------------------------------------------------------------------------- */ +/* resid: compute the relative residual, ||Ax-b||/||b|| or ||A'x-b||/||b|| */ +/* -------------------------------------------------------------------------- */ + +static double resid +( + int n, + int Ap [ ], + int Ai [ ], + double Ax [ ], + double x [ ], + double r [ ], + double b [ ], + int transpose +) +{ + int i, j, p ; + double rnorm, absr, absb, bnorm ; + for (i = 0 ; i < n ; i++) + { + r [i] = 0 ; + } + + if (transpose) + { + for (j = 0 ; j < n ; j++) + { + for (p = Ap [j] ; p < Ap [j+1] ; p++) + { + i = Ai [p] ; + r [j] += Ax [p] * x [i] ; + } + } + } + else + { + for (j = 0 ; j < n ; j++) + { + for (p = Ap [j] ; p < Ap [j+1] ; p++) + { + i = Ai [p] ; + r [i] += Ax [p] * x [j] ; + } + } + } + + for (i = 0 ; i < n ; i++) + { + r [i] -= b [i] ; + } + rnorm = 0. ; + bnorm = 0. ; + for (i = 0 ; i < n ; i++) + { + if (isnan (r [i])) + { + rnorm = r [i] ; + break ; + } + absr = ABS (r [i]) ; + rnorm = MAX (rnorm, absr) ; + } + for (i = 0 ; i < n ; i++) + { + if (isnan (b [i])) + { + bnorm = b [i] ; + break ; + } + absb = ABS (b [i]) ; + bnorm = MAX (bnorm, absb) ; + } + if (bnorm == 0) + { + bnorm = 1 ; + } + return (rnorm / bnorm) ; +} + + +/* -------------------------------------------------------------------------- */ +/* Atimesx: compute y = A*x or A'*x, where x (i) = 1 + i/n */ +/* -------------------------------------------------------------------------- */ + +static void Atimesx +( + int n, + int Ap [ ], + int Ai [ ], + double Ax [ ], + double y [ ], + int transpose +) +{ + int i, j, p ; + for (i = 0 ; i < n ; i++) + { + y [i] = 0 ; + } + if (transpose) + { + for (j = 0 ; j < n ; j++) + { + for (p = Ap [j] ; p < Ap [j+1] ; p++) + { + i = Ai [p] ; + y [j] += Ax [p] * XTRUE (i,n) ; + } + } + } + else + { + for (j = 0 ; j < n ; j++) + { + for (p = Ap [j] ; p < Ap [j+1] ; p++) + { + i = Ai [p] ; + y [i] += Ax [p] * XTRUE (j,n) ; + } + } + } +} + +/* -------------------------------------------------------------------------- */ +/* main program */ +/* -------------------------------------------------------------------------- */ + +int main (int argc, char **argv) +{ + int i, j, k, n, nz, *Ap, *Ai, *Ti, *Tj, status, *Pamd, nrow, ncol, rhs ; + double *Ax, *b, *x, Control [UMFPACK_CONTROL], Info [UMFPACK_INFO], aij, + *Tx, *r, amd_Control [AMD_CONTROL], amd_Info [AMD_INFO], tamd [2], + stats [2], droptol ; + void *Symbolic, *Numeric ; + FILE *f, *f2 ; + char s [SMAX] ; + + /* ---------------------------------------------------------------------- */ + /* set controls */ + /* ---------------------------------------------------------------------- */ + + printf ("\n===========================================================\n" + "=== UMFPACK v4.4 ==========================================\n" + "===========================================================\n") ; + + umfpack_di_defaults (Control) ; + Control [UMFPACK_PRL] = 3 ; + Control [UMFPACK_BLOCK_SIZE] = 32 ; + + f = fopen ("tmp/control.umf4", "r") ; + if (f != (FILE *) NULL) + { + printf ("Reading control file tmp/control.umf4\n") ; + for (i = 0 ; i < UMFPACK_CONTROL ; i++) + { + fscanf (f, "%lg\n", & Control [i]) ; + } + fclose (f) ; + } + + if (argc > 1) + { + char *s = argv [1] ; + + /* get the strategy */ + if (s [0] == 'u') + { + Control [UMFPACK_STRATEGY] = UMFPACK_STRATEGY_UNSYMMETRIC ; + } + else if (s [0] == 'a') + { + Control [UMFPACK_STRATEGY] = UMFPACK_STRATEGY_AUTO ; + } + else if (s [0] == 's') + { + Control [UMFPACK_STRATEGY] = UMFPACK_STRATEGY_SYMMETRIC ; + } + else if (s [0] == '2') + { + Control [UMFPACK_STRATEGY] = UMFPACK_STRATEGY_2BY2 ; + } + else if (s [0] == 'U') + { + Control [UMFPACK_STRATEGY] = UMFPACK_STRATEGY_UNSYMMETRIC ; + Control [UMFPACK_SCALE] = UMFPACK_SCALE_MAX ; + } + else if (s [0] == 'A') + { + Control [UMFPACK_STRATEGY] = UMFPACK_STRATEGY_AUTO ; + Control [UMFPACK_SCALE] = UMFPACK_SCALE_MAX ; + } + else if (s [0] == 'S') + { + Control [UMFPACK_STRATEGY] = UMFPACK_STRATEGY_SYMMETRIC ; + Control [UMFPACK_SCALE] = UMFPACK_SCALE_MAX ; + } + else if (s [0] == 'T') + { + Control [UMFPACK_STRATEGY] = UMFPACK_STRATEGY_2BY2 ; + Control [UMFPACK_SCALE] = UMFPACK_SCALE_MAX ; + } + else + { + printf ("unrecognized strategy: %s\n", argv [1]) ; + } + + if (s [1] == 'n') + { + /* no aggressive absorption */ + Control [UMFPACK_AGGRESSIVE] = FALSE ; + } + } + + if (argc > 2) + { + /* get the drop tolerance */ + sscanf (argv [2], "%lg", &droptol) ; + printf ("droptol %g\n", droptol) ; + Control [UMFPACK_DROPTOL] = droptol ; + } + + umfpack_di_report_control (Control) ; + + /* ---------------------------------------------------------------------- */ + /* open the matrix file (tmp/A) */ + /* ---------------------------------------------------------------------- */ + + printf ("File: tmp/A\n") ; + f = fopen ("tmp/A", "r") ; + if (!f) + { + printf ("Unable to open file\n") ; + exit (1) ; + } + + /* ---------------------------------------------------------------------- */ + /* get n and nz */ + /* ---------------------------------------------------------------------- */ + + printf ("File: tmp/Asize\n") ; + f2 = fopen ("tmp/Asize", "r") ; + if (f2) + { + fscanf (f2, "%d %d %d\n", &nrow, &ncol, &nz) ; + fclose (f2) ; + } + else + { + nrow = 1 ; + ncol = 1 ; + } + nz = 0 ; + while (fgets (s, SMAX, f) != (char *) NULL) + { + sscanf (s, "%d %d %lg", &i, &j, &aij) ; +#ifdef ZERO_BASED + /* matrix is zero based */ + i++ ; + j++ ; +#endif + nrow = MAX (nrow, i) ; + ncol = MAX (ncol, j) ; + nz++ ; + } + fclose (f) ; + n = MAX (nrow, ncol) ; + + printf ("n %d nrow %d ncol %d nz %d\n", n, nrow, ncol, nz) ; + + /* ---------------------------------------------------------------------- */ + /* allocate space for the input triplet form */ + /* ---------------------------------------------------------------------- */ + + Ti = (int *) malloc (nz * sizeof (int)) ; + Tj = (int *) malloc (nz * sizeof (int)) ; + Tx = (double *) malloc (nz * sizeof (double)) ; + if (!Ti || !Tj || !Tx) + { + printf ("out of memory for input matrix\n") ; + exit (1) ; + } + + /* ---------------------------------------------------------------------- */ + /* read in the triplet form */ + /* ---------------------------------------------------------------------- */ + + f2 = fopen ("tmp/A", "r") ; + if (!f2) + { + printf ("Unable to open file\n") ; + exit (1) ; + } + + k = 0 ; + while (fgets (s, SMAX, f2) != (char *) NULL) + { + sscanf (s, "%d %d %lg", &i, &j, &aij) ; +#ifndef ZERO_BASED + i-- ; /* convert to 0-based */ + j-- ; +#endif + if (k >= nz) + { + printf ("Error! Matrix size is wrong\n") ; + exit (1) ; + } + Ti [k] = i ; + Tj [k] = j ; + Tx [k] = aij ; + k++ ; + } + fclose (f2) ; + + (void) umfpack_di_report_triplet (nrow, ncol, nz, Ti, Tj, Tx, Control) ; + + /* ---------------------------------------------------------------------- */ + /* convert to column form */ + /* ---------------------------------------------------------------------- */ + + /* convert to column form */ + Ap = (int *) malloc ((n+1) * sizeof (int)) ; + Ai = (int *) malloc (nz * sizeof (int)) ; + Ax = (double *) malloc (nz * sizeof (double)) ; + b = (double *) malloc (n * sizeof (double)) ; + r = (double *) malloc (n * sizeof (double)) ; + x = (double *) malloc (n * sizeof (double)) ; + if (!Ap || !Ai || !Ax || !b || !r) + { + printf ("out of memory") ; + exit (1) ; + } + umfpack_tic (stats) ; + status = umfpack_di_triplet_to_col (nrow, ncol, nz, Ti, Tj, Tx, Ap, Ai, Ax, + (int *) NULL) ; + umfpack_toc (stats) ; + printf ("triplet-to-col time: wall %g cpu %g\n", stats [0], stats [1]) ; + if (status != UMFPACK_OK) + { + umfpack_di_report_status (Control, status) ; + printf ("umfpack_di_triplet_to_col failed") ; + exit (1) ; + } + + /* print the column-form of A */ + (void) umfpack_di_report_matrix (nrow, ncol, Ap, Ai, Ax, 1, Control) ; + + /* b = A * xtrue */ + rhs = FALSE ; + if (nrow == ncol) + { + f = fopen ("tmp/b", "r") ; + if (f != (FILE *) NULL) + { + printf ("Reading tmp/b\n") ; + rhs = TRUE ; + for (i = 0 ; i < n ; i++) + { + fscanf (f, "%lg\n", &b [i]) ; + } + fclose (f) ; + } + else + { + Atimesx (n, Ap, Ai, Ax, b, FALSE) ; + } + } + + /* ---------------------------------------------------------------------- */ + /* free the triplet form */ + /* ---------------------------------------------------------------------- */ + + free (Ti) ; + free (Tj) ; + free (Tx) ; + + /* ---------------------------------------------------------------------- */ + /* symbolic factorization */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_di_symbolic (nrow, ncol, Ap, Ai, Ax, &Symbolic, + Control, Info) ; + + umfpack_di_report_info (Control, Info) ; + if (status != UMFPACK_OK) + { + umfpack_di_report_status (Control, status) ; + printf ("umfpack_di_symbolic failed") ; + exit (1) ; + } + + /* print the symbolic factorization */ + (void) umfpack_di_report_symbolic (Symbolic, Control) ; + + /* ---------------------------------------------------------------------- */ + /* numeric factorization */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_di_numeric (Ap, Ai, Ax, Symbolic, &Numeric, Control, Info); + if (status < UMFPACK_OK) + { + umfpack_di_report_info (Control, Info) ; + umfpack_di_report_status (Control, status) ; + fprintf (stderr, "umfpack_di_numeric failed: %d\n", status) ; + printf ("umfpack_di_numeric failed\n") ; + exit (1) ; + } + + /* print the numeric factorization */ + (void) umfpack_di_report_numeric (Numeric, Control) ; + + /* ---------------------------------------------------------------------- */ + /* solve Ax=b */ + /* ---------------------------------------------------------------------- */ + + if (nrow == ncol && status == UMFPACK_OK) + { + status = umfpack_di_solve (UMFPACK_A, Ap, Ai, Ax, x, b, Numeric, + Control, Info) ; + + umfpack_di_report_info (Control, Info) ; + umfpack_di_report_status (Control, status) ; + if (status < UMFPACK_OK) + { + printf ("umfpack_di_solve failed\n") ; + exit (1) ; + } + (void) umfpack_di_report_vector (n, x, Control) ; + printf ("relative maxnorm of residual, ||Ax-b||/||b||: %g\n", + resid (n, Ap, Ai, Ax, x, r, b, FALSE)) ; + if (!rhs) + { + printf ("relative maxnorm of error, ||x-xtrue||/||xtrue||: %g\n\n", + err (n, x)) ; + } + + f = fopen ("tmp/x", "w") ; + if (f != (FILE *) NULL) + { + printf ("Writing tmp/x\n") ; + for (i = 0 ; i < n ; i++) + { + fprintf (f, "%30.20e\n", x [i]) ; + } + fclose (f) ; + } + else + { + printf ("Unable to write output x!\n") ; + exit (1) ; + } + + f = fopen ("tmp/info.umf4", "w") ; + if (f != (FILE *) NULL) + { + printf ("Writing tmp/info.umf4\n") ; + for (i = 0 ; i < UMFPACK_INFO ; i++) + { + fprintf (f, "%30.20e\n", Info [i]) ; + } + fclose (f) ; + } + else + { + printf ("Unable to write output info!\n") ; + exit (1) ; + } + } + else + { + /* don't solve, just report the results */ + umfpack_di_report_info (Control, Info) ; + umfpack_di_report_status (Control, status) ; + } + + /* ---------------------------------------------------------------------- */ + /* free the Symbolic and Numeric factorization */ + /* ---------------------------------------------------------------------- */ + + umfpack_di_free_symbolic (&Symbolic) ; + umfpack_di_free_numeric (&Numeric) ; + + printf ("umf4 done, strategy: %g\n", Control [UMFPACK_STRATEGY]) ; + + /* ---------------------------------------------------------------------- */ + /* test just AMD ordering (not part of UMFPACK, but a separate test) */ + /* ---------------------------------------------------------------------- */ + + /* first make the matrix square */ + if (ncol < n) + { + for (j = ncol+1 ; j <= n ; j++) + { + Ap [j] = Ap [ncol] ; + } + } + + printf ( + "\n\n===========================================================\n" + "=== AMD ===================================================\n" + "===========================================================\n") ; + printf ("\n\n------- Now trying the AMD ordering. This not part of\n" + "the UMFPACK analysis or factorization, above, but a separate\n" + "test of just the AMD ordering routine.\n") ; + Pamd = (int *) malloc (n * sizeof (int)) ; + if (!Pamd) + { + printf ("out of memory\n") ; + exit (1) ; + } + amd_defaults (amd_Control) ; + amd_control (amd_Control) ; + umfpack_tic (tamd) ; + status = amd_order (n, Ap, Ai, Pamd, amd_Control, amd_Info) ; + umfpack_toc (tamd) ; + printf ("AMD ordering time: cpu %10.2f wall %10.2f\n", + tamd [1], tamd [0]) ; + if (status != AMD_OK) + { + printf ("amd failed: %d\n", status) ; + exit (1) ; + } + amd_info (amd_Info) ; + free (Pamd) ; + printf ("AMD test done\n") ; + + return (0) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Demo/umf4.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Demo/umf4.out Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,1970 @@ +cc -O -DNBLAS -I../Include -I../../AMD/Include -o umf4 umf4.c ../Lib/libumfpack.a ../../AMD/Lib/libamd.a -lm +f77 -O -o readhb readhb.f +f77 -O -o readhb_nozeros readhb_nozeros.f +f77 -O -o readhb_size readhb_size.f +./readhb_nozeros < HB/can_24.psa > tmp/A +Matrix key: CAN 24 +./readhb_size < HB/can_24.psa > tmp/Asize +./umf4 + +=========================================================== +=== UMFPACK v4.4 ========================================== +=========================================================== + +UMFPACK V4.4 (Jan. 28, 2005), Control: + + Matrix entry defined as: double + Int (generic integer) defined as: int + + 0: print level: 3 + 1: dense row parameter: 0.2 + "dense" rows have > max (16, (0.2)*16*sqrt(n_col) entries) + 2: dense column parameter: 0.2 + "dense" columns have > max (16, (0.2)*16*sqrt(n_row) entries) + 3: pivot tolerance: 0.1 + 4: block size for dense matrix kernels: 32 + 5: strategy: 0 (auto) + 6: initial allocation ratio: 0.7 + 7: max iterative refinement steps: 2 + 12: 2-by-2 pivot tolerance: 0.01 + 13: Q fixed during numerical factorization: 0 (auto) + 14: AMD dense row/col parameter: 10 + "dense" rows/columns have > max (16, (10)*sqrt(n)) entries + Only used if the AMD ordering is used. + 15: diagonal pivot tolerance: 0.001 + Only used if diagonal pivoting is attempted. + 16: scaling: 1 (divide each row by sum of abs. values in each row) + 17: frontal matrix allocation ratio: 0.5 + 18: drop tolerance: 0 + 19: AMD and COLAMD aggressive absorption: 1 (yes) + + The following options can only be changed at compile-time: + 8: BLAS library used: none. UMFPACK will be slow. + 9: compiled for ANSI C (uses malloc, free, realloc, and printf) + 10: CPU timer is POSIX times ( ) routine. + 11: compiled for normal operation (debugging disabled) + computer/operating system: Linux + size of int: 4 long: 4 Int: 4 pointer: 4 double: 8 Entry: 8 (in bytes) + +File: tmp/A +File: tmp/Asize +n 24 nrow 24 ncol 24 nz 160 +triplet-form matrix, n_row = 24, n_col = 24 nz = 160. OK + +triplet-to-col time: wall 0 cpu 0 +column-form matrix, n_row 24 n_col 24, nz = 160. OK + + +UMFPACK V4.4 (Jan. 28, 2005), Info: + matrix entry defined as: double + Int (generic integer) defined as: int + BLAS library used: none. UMFPACK will be slow. + MATLAB: no. + CPU timer: POSIX times ( ) routine. + number of rows in matrix A: 24 + number of columns in matrix A: 24 + entries in matrix A: 160 + memory usage reported in: 8-byte Units + size of int: 4 bytes + size of long: 4 bytes + size of pointer: 4 bytes + size of numerical entry: 8 bytes + + strategy used: symmetric + ordering used: amd on A+A' + modify Q during factorization: no + prefer diagonal pivoting: yes + pivots with zero Markowitz cost: 0 + submatrix S after removing zero-cost pivots: + number of "dense" rows: 0 + number of "dense" columns: 0 + number of empty rows: 0 + number of empty columns 0 + submatrix S square and diagonal preserved + pattern of square submatrix S: + number rows and columns 24 + symmetry of nonzero pattern: 1.000000 + nz in S+S' (excl. diagonal): 136 + nz on diagonal of matrix S: 24 + fraction of nz on diagonal: 1.000000 + AMD statistics, for strict diagonal pivoting: + est. flops for LU factorization: 1.00300e+03 + est. nz in L+U (incl. diagonal): 218 + est. largest front (# entries): 64 + est. max nz in any column of L: 8 + number of "dense" rows/columns in S+S': 0 + symbolic factorization defragmentations: 0 + symbolic memory usage (Units): 718 + symbolic memory usage (MBytes): 0.0 + Symbolic size (Units): 124 + Symbolic size (MBytes): 0 + symbolic factorization CPU time (sec): 0.00 + symbolic factorization wallclock time(sec): 0.00 + + symbolic/numeric factorization: upper bound actual % + variable-sized part of Numeric object: + initial size (Units) 739 - - + peak size (Units) 3244 - - + final size (Units) 393 - - + Numeric final size (Units) 591 - - + Numeric final size (MBytes) 0.0 - - + peak memory usage (Units) 3826 - - + peak memory usage (MBytes) 0.0 - - + numeric factorization flops 2.37900e+03 - - + nz in L (incl diagonal) 149 - - + nz in U (incl diagonal) 208 - - + nz in L+U (incl diagonal) 333 - - + largest front (# entries) 182 - - + largest # rows in front 13 - - + largest # columns in front 14 - - + +Symbolic object: OK + +Numeric object: OK + + +UMFPACK V4.4 (Jan. 28, 2005), Info: + matrix entry defined as: double + Int (generic integer) defined as: int + BLAS library used: none. UMFPACK will be slow. + MATLAB: no. + CPU timer: POSIX times ( ) routine. + number of rows in matrix A: 24 + number of columns in matrix A: 24 + entries in matrix A: 160 + memory usage reported in: 8-byte Units + size of int: 4 bytes + size of long: 4 bytes + size of pointer: 4 bytes + size of numerical entry: 8 bytes + + strategy used: symmetric + ordering used: amd on A+A' + modify Q during factorization: no + prefer diagonal pivoting: yes + pivots with zero Markowitz cost: 0 + submatrix S after removing zero-cost pivots: + number of "dense" rows: 0 + number of "dense" columns: 0 + number of empty rows: 0 + number of empty columns 0 + submatrix S square and diagonal preserved + pattern of square submatrix S: + number rows and columns 24 + symmetry of nonzero pattern: 1.000000 + nz in S+S' (excl. diagonal): 136 + nz on diagonal of matrix S: 24 + fraction of nz on diagonal: 1.000000 + AMD statistics, for strict diagonal pivoting: + est. flops for LU factorization: 1.00300e+03 + est. nz in L+U (incl. diagonal): 218 + est. largest front (# entries): 64 + est. max nz in any column of L: 8 + number of "dense" rows/columns in S+S': 0 + symbolic factorization defragmentations: 0 + symbolic memory usage (Units): 718 + symbolic memory usage (MBytes): 0.0 + Symbolic size (Units): 124 + Symbolic size (MBytes): 0 + symbolic factorization CPU time (sec): 0.00 + symbolic factorization wallclock time(sec): 0.00 + + matrix scaled: yes (divided each row by sum of abs values in each row) + minimum sum (abs (rows of A)): 4.00000e+00 + maximum sum (abs (rows of A)): 9.00000e+00 + + symbolic/numeric factorization: upper bound actual % + variable-sized part of Numeric object: + initial size (Units) 739 712 96% + peak size (Units) 3244 2712 84% + final size (Units) 393 179 46% + Numeric final size (Units) 591 365 62% + Numeric final size (MBytes) 0.0 0.0 62% + peak memory usage (Units) 3826 3294 86% + peak memory usage (MBytes) 0.0 0.0 86% + numeric factorization flops 2.37900e+03 3.32000e+02 14% + nz in L (incl diagonal) 149 78 52% + nz in U (incl diagonal) 208 86 41% + nz in L+U (incl diagonal) 333 140 42% + largest front (# entries) 182 78 43% + largest # rows in front 13 7 54% + largest # columns in front 14 13 93% + + initial allocation ratio used: 1.2 + # of forced updates due to frontal growth: 0 + number of off-diagonal pivots: 10 + nz in L (incl diagonal), if none dropped 78 + nz in U (incl diagonal), if none dropped 86 + number of small entries dropped 0 + nonzeros on diagonal of U: 24 + min abs. value on diagonal of U: 1.11e-01 + max abs. value on diagonal of U: 2.50e-01 + estimate of reciprocal of condition number: 4.44e-01 + indices in compressed pattern: 92 + numerical values stored in Numeric object: 140 + numeric factorization defragmentations: 0 + numeric factorization reallocations: 0 + costly numeric factorization reallocations: 0 + numeric factorization CPU time (sec): 0.00 + numeric factorization wallclock time (sec): 0.00 + symbolic + numeric CPU time (sec): 0.00 + symbolic + numeric wall clock time (sec): 0.00 + + solve flops: 1.13600e+03 + iterative refinement steps taken: 0 + iterative refinement steps attempted: 0 + sparse backward error omega1: 1.22e-16 + sparse backward error omega2: 0.00e+00 + solve CPU time (sec): 0.00 + solve wall clock time (sec): 0.00 + + total symbolic + numeric + solve flops: 1.46800e+03 + total symbolic + numeric + solve CPU time: 0.00 + total symbolic+numeric+solve wall clock time: 0.00 + + +UMFPACK V4.4 (Jan. 28, 2005): OK + +dense vector, n = 24. OK + +relative maxnorm of residual, ||Ax-b||/||b||: 1.2919e-16 +relative maxnorm of error, ||x-xtrue||/||xtrue||: 1.1716e-15 + +Writing tmp/x +Writing tmp/info.umf4 +umf4 done, strategy: 0 + + +=========================================================== +=== AMD =================================================== +=========================================================== + + +------- Now trying the AMD ordering. This not part of +the UMFPACK analysis or factorization, above, but a separate +test of just the AMD ordering routine. + +amd: approximate minimum degree ordering, parameters: + dense row parameter: 10 + (rows with more than max (10 * sqrt (n), 16) entries are + considered "dense", and placed last in output permutation) + aggressive absorption: yes + +AMD ordering time: cpu 0.00 wall 0.00 + +amd: approximate minimum degree ordering, results: + status: OK + n, dimension of A: 24 + nz, number of nonzeros in A: 160 + symmetry of A: 1.0000 + number of nonzeros on diagonal: 24 + nonzeros in pattern of A+A' (excl. diagonal): 136 + # dense rows/columns of A+A': 0 + memory used, in bytes: 1516 + # of memory compactions: 0 + + The following approximate statistics are for a subsequent + factorization of A(P,P) + A(P,P)'. They are slight upper + bounds if there are no dense rows/columns in A+A', and become + looser if dense rows/columns exist. + + nonzeros in L (excluding diagonal): 97 + nonzeros in L (including diagonal): 121 + # divide operations for LDL' or LU: 97 + # multiply-subtract operations for LDL': 275 + # multiply-subtract operations for LU: 453 + max nz. in any column of L (incl. diagonal): 8 + + chol flop count for real A, sqrt counted as 1 flop: 671 + LDL' flop count for real A: 647 + LDL' flop count for complex A: 3073 + LU flop count for real A (with no pivoting): 1003 + LU flop count for complex A (with no pivoting): 4497 + +AMD test done +./readhb_nozeros < HB/west0067.rua > tmp/A +Matrix key: WEST0067 +./readhb_size < HB/west0067.rua > tmp/Asize +./umf4 + +=========================================================== +=== UMFPACK v4.4 ========================================== +=========================================================== + +UMFPACK V4.4 (Jan. 28, 2005), Control: + + Matrix entry defined as: double + Int (generic integer) defined as: int + + 0: print level: 3 + 1: dense row parameter: 0.2 + "dense" rows have > max (16, (0.2)*16*sqrt(n_col) entries) + 2: dense column parameter: 0.2 + "dense" columns have > max (16, (0.2)*16*sqrt(n_row) entries) + 3: pivot tolerance: 0.1 + 4: block size for dense matrix kernels: 32 + 5: strategy: 0 (auto) + 6: initial allocation ratio: 0.7 + 7: max iterative refinement steps: 2 + 12: 2-by-2 pivot tolerance: 0.01 + 13: Q fixed during numerical factorization: 0 (auto) + 14: AMD dense row/col parameter: 10 + "dense" rows/columns have > max (16, (10)*sqrt(n)) entries + Only used if the AMD ordering is used. + 15: diagonal pivot tolerance: 0.001 + Only used if diagonal pivoting is attempted. + 16: scaling: 1 (divide each row by sum of abs. values in each row) + 17: frontal matrix allocation ratio: 0.5 + 18: drop tolerance: 0 + 19: AMD and COLAMD aggressive absorption: 1 (yes) + + The following options can only be changed at compile-time: + 8: BLAS library used: none. UMFPACK will be slow. + 9: compiled for ANSI C (uses malloc, free, realloc, and printf) + 10: CPU timer is POSIX times ( ) routine. + 11: compiled for normal operation (debugging disabled) + computer/operating system: Linux + size of int: 4 long: 4 Int: 4 pointer: 4 double: 8 Entry: 8 (in bytes) + +File: tmp/A +File: tmp/Asize +n 67 nrow 67 ncol 67 nz 294 +triplet-form matrix, n_row = 67, n_col = 67 nz = 294. OK + +triplet-to-col time: wall 0 cpu 0 +column-form matrix, n_row 67 n_col 67, nz = 294. OK + + +UMFPACK V4.4 (Jan. 28, 2005), Info: + matrix entry defined as: double + Int (generic integer) defined as: int + BLAS library used: none. UMFPACK will be slow. + MATLAB: no. + CPU timer: POSIX times ( ) routine. + number of rows in matrix A: 67 + number of columns in matrix A: 67 + entries in matrix A: 294 + memory usage reported in: 8-byte Units + size of int: 4 bytes + size of long: 4 bytes + size of pointer: 4 bytes + size of numerical entry: 8 bytes + + strategy used: unsymmetric + ordering used: colamd on A + modify Q during factorization: yes + prefer diagonal pivoting: no + pivots with zero Markowitz cost: 1 + submatrix S after removing zero-cost pivots: + number of "dense" rows: 0 + number of "dense" columns: 0 + number of empty rows: 0 + number of empty columns 0 + submatrix S not square or diagonal not preserved + symbolic factorization defragmentations: 1 + symbolic memory usage (Units): 1632 + symbolic memory usage (MBytes): 0.0 + Symbolic size (Units): 245 + Symbolic size (MBytes): 0 + symbolic factorization CPU time (sec): 0.00 + symbolic factorization wallclock time(sec): 0.01 + + symbolic/numeric factorization: upper bound actual % + variable-sized part of Numeric object: + initial size (Units) 1643 - - + peak size (Units) 6115 - - + final size (Units) 1628 - - + Numeric final size (Units) 2101 - - + Numeric final size (MBytes) 0.0 - - + peak memory usage (Units) 7462 - - + peak memory usage (MBytes) 0.1 - - + numeric factorization flops 1.41920e+04 - - + nz in L (incl diagonal) 542 - - + nz in U (incl diagonal) 902 - - + nz in L+U (incl diagonal) 1377 - - + largest front (# entries) 483 - - + largest # rows in front 21 - - + largest # columns in front 23 - - + +Symbolic object: OK + +Numeric object: OK + + +UMFPACK V4.4 (Jan. 28, 2005), Info: + matrix entry defined as: double + Int (generic integer) defined as: int + BLAS library used: none. UMFPACK will be slow. + MATLAB: no. + CPU timer: POSIX times ( ) routine. + number of rows in matrix A: 67 + number of columns in matrix A: 67 + entries in matrix A: 294 + memory usage reported in: 8-byte Units + size of int: 4 bytes + size of long: 4 bytes + size of pointer: 4 bytes + size of numerical entry: 8 bytes + + strategy used: unsymmetric + ordering used: colamd on A + modify Q during factorization: yes + prefer diagonal pivoting: no + pivots with zero Markowitz cost: 1 + submatrix S after removing zero-cost pivots: + number of "dense" rows: 0 + number of "dense" columns: 0 + number of empty rows: 0 + number of empty columns 0 + submatrix S not square or diagonal not preserved + symbolic factorization defragmentations: 1 + symbolic memory usage (Units): 1632 + symbolic memory usage (MBytes): 0.0 + Symbolic size (Units): 245 + Symbolic size (MBytes): 0 + symbolic factorization CPU time (sec): 0.00 + symbolic factorization wallclock time(sec): 0.01 + + matrix scaled: yes (divided each row by sum of abs values in each row) + minimum sum (abs (rows of A)): 1.00000e+00 + maximum sum (abs (rows of A)): 6.59006e+00 + + symbolic/numeric factorization: upper bound actual % + variable-sized part of Numeric object: + initial size (Units) 1643 1574 96% + peak size (Units) 6115 3581 59% + final size (Units) 1628 685 42% + Numeric final size (Units) 2101 1125 54% + Numeric final size (MBytes) 0.0 0.0 54% + peak memory usage (Units) 7462 4928 66% + peak memory usage (MBytes) 0.1 0.0 66% + numeric factorization flops 1.41920e+04 2.58700e+03 18% + nz in L (incl diagonal) 542 329 61% + nz in U (incl diagonal) 902 340 38% + nz in L+U (incl diagonal) 1377 602 44% + largest front (# entries) 483 80 17% + largest # rows in front 21 10 48% + largest # columns in front 23 11 48% + + initial allocation ratio used: 0.7 + # of forced updates due to frontal growth: 0 + nz in L (incl diagonal), if none dropped 329 + nz in U (incl diagonal), if none dropped 340 + number of small entries dropped 0 + nonzeros on diagonal of U: 67 + min abs. value on diagonal of U: 2.74e-02 + max abs. value on diagonal of U: 2.28e+00 + estimate of reciprocal of condition number: 1.20e-02 + indices in compressed pattern: 256 + numerical values stored in Numeric object: 605 + numeric factorization defragmentations: 1 + numeric factorization reallocations: 1 + costly numeric factorization reallocations: 0 + numeric factorization CPU time (sec): 0.00 + numeric factorization wallclock time (sec): 0.00 + symbolic + numeric CPU time (sec): 0.00 + symbolic + numeric wall clock time (sec): 0.01 + symbolic + numeric mflops (wall clock): 0.26 + + solve flops: 6.19300e+03 + iterative refinement steps taken: 1 + iterative refinement steps attempted: 1 + sparse backward error omega1: 9.49e-17 + sparse backward error omega2: 0.00e+00 + solve CPU time (sec): 0.00 + solve wall clock time (sec): 0.00 + + total symbolic + numeric + solve flops: 8.78000e+03 + total symbolic + numeric + solve CPU time: 0.00 + total symbolic+numeric+solve wall clock time: 0.01 + total symbolic+numeric+solve mflops(wallclock) 0.88 + + +UMFPACK V4.4 (Jan. 28, 2005): OK + +dense vector, n = 67. OK + +relative maxnorm of residual, ||Ax-b||/||b||: 1.83101e-16 +relative maxnorm of error, ||x-xtrue||/||xtrue||: 2.47921e-15 + +Writing tmp/x +Writing tmp/info.umf4 +umf4 done, strategy: 0 + + +=========================================================== +=== AMD =================================================== +=========================================================== + + +------- Now trying the AMD ordering. This not part of +the UMFPACK analysis or factorization, above, but a separate +test of just the AMD ordering routine. + +amd: approximate minimum degree ordering, parameters: + dense row parameter: 10 + (rows with more than max (10 * sqrt (n), 16) entries are + considered "dense", and placed last in output permutation) + aggressive absorption: yes + +AMD ordering time: cpu 0.00 wall 0.00 + +amd: approximate minimum degree ordering, results: + status: OK + n, dimension of A: 67 + nz, number of nonzeros in A: 294 + symmetry of A: 0.0342 + number of nonzeros on diagonal: 2 + nonzeros in pattern of A+A' (excl. diagonal): 574 + # dense rows/columns of A+A': 0 + memory used, in bytes: 5164 + # of memory compactions: 1 + + The following approximate statistics are for a subsequent + factorization of A(P,P) + A(P,P)'. They are slight upper + bounds if there are no dense rows/columns in A+A', and become + looser if dense rows/columns exist. + + nonzeros in L (excluding diagonal): 930 + nonzeros in L (including diagonal): 997 + # divide operations for LDL' or LU: 930 + # multiply-subtract operations for LDL': 9170 + # multiply-subtract operations for LU: 17410 + max nz. in any column of L (incl. diagonal): 33 + + chol flop count for real A, sqrt counted as 1 flop: 19337 + LDL' flop count for real A: 19270 + LDL' flop count for complex A: 81730 + LU flop count for real A (with no pivoting): 35750 + LU flop count for complex A (with no pivoting): 147650 + +AMD test done +./readhb_nozeros < HB/fs_183_6.rua > tmp/A +Matrix key: FS 183 6 +./readhb_size < HB/fs_183_6.rua > tmp/Asize +./umf4 + +=========================================================== +=== UMFPACK v4.4 ========================================== +=========================================================== + +UMFPACK V4.4 (Jan. 28, 2005), Control: + + Matrix entry defined as: double + Int (generic integer) defined as: int + + 0: print level: 3 + 1: dense row parameter: 0.2 + "dense" rows have > max (16, (0.2)*16*sqrt(n_col) entries) + 2: dense column parameter: 0.2 + "dense" columns have > max (16, (0.2)*16*sqrt(n_row) entries) + 3: pivot tolerance: 0.1 + 4: block size for dense matrix kernels: 32 + 5: strategy: 0 (auto) + 6: initial allocation ratio: 0.7 + 7: max iterative refinement steps: 2 + 12: 2-by-2 pivot tolerance: 0.01 + 13: Q fixed during numerical factorization: 0 (auto) + 14: AMD dense row/col parameter: 10 + "dense" rows/columns have > max (16, (10)*sqrt(n)) entries + Only used if the AMD ordering is used. + 15: diagonal pivot tolerance: 0.001 + Only used if diagonal pivoting is attempted. + 16: scaling: 1 (divide each row by sum of abs. values in each row) + 17: frontal matrix allocation ratio: 0.5 + 18: drop tolerance: 0 + 19: AMD and COLAMD aggressive absorption: 1 (yes) + + The following options can only be changed at compile-time: + 8: BLAS library used: none. UMFPACK will be slow. + 9: compiled for ANSI C (uses malloc, free, realloc, and printf) + 10: CPU timer is POSIX times ( ) routine. + 11: compiled for normal operation (debugging disabled) + computer/operating system: Linux + size of int: 4 long: 4 Int: 4 pointer: 4 double: 8 Entry: 8 (in bytes) + +File: tmp/A +File: tmp/Asize +n 183 nrow 183 ncol 183 nz 1000 +triplet-form matrix, n_row = 183, n_col = 183 nz = 1000. OK + +triplet-to-col time: wall 0 cpu 0 +column-form matrix, n_row 183 n_col 183, nz = 1000. OK + + +UMFPACK V4.4 (Jan. 28, 2005), Info: + matrix entry defined as: double + Int (generic integer) defined as: int + BLAS library used: none. UMFPACK will be slow. + MATLAB: no. + CPU timer: POSIX times ( ) routine. + number of rows in matrix A: 183 + number of columns in matrix A: 183 + entries in matrix A: 1000 + memory usage reported in: 8-byte Units + size of int: 4 bytes + size of long: 4 bytes + size of pointer: 4 bytes + size of numerical entry: 8 bytes + + strategy used: symmetric 2-by-2 + ordering used: amd on A+A' + modify Q during factorization: no + prefer diagonal pivoting: yes + pivots with zero Markowitz cost: 36 + submatrix S after removing zero-cost pivots: + number of "dense" rows: 4 + number of "dense" columns: 0 + number of empty rows: 0 + number of empty columns 0 + submatrix S square and diagonal preserved + pattern of square submatrix S: + number rows and columns 147 + symmetry of nonzero pattern: 0.490515 + nz in S+S' (excl. diagonal): 1114 + nz on diagonal of matrix S: 147 + fraction of nz on diagonal: 1.000000 + 2-by-2 pivoting to place large entries on diagonal: + # of small diagonal entries of S: 7 + # unmatched: 7 + symmetry of P2*S: 0.490515 + nz in P2*S+(P2*S)' (excl. diag.): 1114 + nz on diagonal of P2*S: 147 + fraction of nz on diag of P2*S: 1.000000 + AMD statistics, for strict diagonal pivoting: + est. flops for LU factorization: 1.02930e+04 + est. nz in L+U (incl. diagonal): 1625 + est. largest front (# entries): 196 + est. max nz in any column of L: 14 + number of "dense" rows/columns in S+S': 0 + symbolic factorization defragmentations: 0 + symbolic memory usage (Units): 4839 + symbolic memory usage (MBytes): 0.0 + Symbolic size (Units): 756 + Symbolic size (MBytes): 0 + symbolic factorization CPU time (sec): 0.00 + symbolic factorization wallclock time(sec): 0.00 + + symbolic/numeric factorization: upper bound actual % + variable-sized part of Numeric object: + initial size (Units) 4274 - - + peak size (Units) 26277 - - + final size (Units) 15717 - - + Numeric final size (Units) 16944 - - + Numeric final size (MBytes) 0.1 - - + peak memory usage (Units) 29673 - - + peak memory usage (MBytes) 0.2 - - + numeric factorization flops 2.67903e+05 - - + nz in L (incl diagonal) 2122 - - + nz in U (incl diagonal) 9931 - - + nz in L+U (incl diagonal) 11870 - - + largest front (# entries) 2337 - - + largest # rows in front 21 - - + largest # columns in front 136 - - + +Symbolic object: OK + +Numeric object: OK + + +UMFPACK V4.4 (Jan. 28, 2005), Info: + matrix entry defined as: double + Int (generic integer) defined as: int + BLAS library used: none. UMFPACK will be slow. + MATLAB: no. + CPU timer: POSIX times ( ) routine. + number of rows in matrix A: 183 + number of columns in matrix A: 183 + entries in matrix A: 1000 + memory usage reported in: 8-byte Units + size of int: 4 bytes + size of long: 4 bytes + size of pointer: 4 bytes + size of numerical entry: 8 bytes + + strategy used: symmetric 2-by-2 + ordering used: amd on A+A' + modify Q during factorization: no + prefer diagonal pivoting: yes + pivots with zero Markowitz cost: 36 + submatrix S after removing zero-cost pivots: + number of "dense" rows: 4 + number of "dense" columns: 0 + number of empty rows: 0 + number of empty columns 0 + submatrix S square and diagonal preserved + pattern of square submatrix S: + number rows and columns 147 + symmetry of nonzero pattern: 0.490515 + nz in S+S' (excl. diagonal): 1114 + nz on diagonal of matrix S: 147 + fraction of nz on diagonal: 1.000000 + 2-by-2 pivoting to place large entries on diagonal: + # of small diagonal entries of S: 7 + # unmatched: 7 + symmetry of P2*S: 0.490515 + nz in P2*S+(P2*S)' (excl. diag.): 1114 + nz on diagonal of P2*S: 147 + fraction of nz on diag of P2*S: 1.000000 + AMD statistics, for strict diagonal pivoting: + est. flops for LU factorization: 1.02930e+04 + est. nz in L+U (incl. diagonal): 1625 + est. largest front (# entries): 196 + est. max nz in any column of L: 14 + number of "dense" rows/columns in S+S': 0 + symbolic factorization defragmentations: 0 + symbolic memory usage (Units): 4839 + symbolic memory usage (MBytes): 0.0 + Symbolic size (Units): 756 + Symbolic size (MBytes): 0 + symbolic factorization CPU time (sec): 0.00 + symbolic factorization wallclock time(sec): 0.00 + + matrix scaled: yes (divided each row by sum of abs values in each row) + minimum sum (abs (rows of A)): 1.84689e-01 + maximum sum (abs (rows of A)): 8.73139e+08 + + symbolic/numeric factorization: upper bound actual % + variable-sized part of Numeric object: + initial size (Units) 4274 4089 96% + peak size (Units) 26277 8291 32% + final size (Units) 15717 1658 11% + Numeric final size (Units) 16944 2794 16% + Numeric final size (MBytes) 0.1 0.0 16% + peak memory usage (Units) 29673 11687 39% + peak memory usage (MBytes) 0.2 0.1 39% + numeric factorization flops 2.67903e+05 7.82700e+03 3% + nz in L (incl diagonal) 2122 838 39% + nz in U (incl diagonal) 9931 804 8% + nz in L+U (incl diagonal) 11870 1459 12% + largest front (# entries) 2337 420 18% + largest # rows in front 21 14 67% + largest # columns in front 136 36 26% + + initial allocation ratio used: 0.265 + # of forced updates due to frontal growth: 0 + number of off-diagonal pivots: 3 + nz in L (incl diagonal), if none dropped 838 + nz in U (incl diagonal), if none dropped 804 + number of small entries dropped 0 + nonzeros on diagonal of U: 183 + min abs. value on diagonal of U: 2.30e-09 + max abs. value on diagonal of U: 1.00e+00 + estimate of reciprocal of condition number: 2.30e-09 + indices in compressed pattern: 550 + numerical values stored in Numeric object: 1396 + numeric factorization defragmentations: 1 + numeric factorization reallocations: 1 + costly numeric factorization reallocations: 0 + numeric factorization CPU time (sec): 0.00 + numeric factorization wallclock time (sec): 0.00 + symbolic + numeric CPU time (sec): 0.00 + symbolic + numeric wall clock time (sec): 0.00 + + solve flops: 1.79470e+04 + iterative refinement steps taken: 1 + iterative refinement steps attempted: 1 + sparse backward error omega1: 1.51e-16 + sparse backward error omega2: 0.00e+00 + solve CPU time (sec): 0.00 + solve wall clock time (sec): 0.00 + + total symbolic + numeric + solve flops: 2.57740e+04 + total symbolic + numeric + solve CPU time: 0.00 + total symbolic+numeric+solve wall clock time: 0.00 + + +UMFPACK V4.4 (Jan. 28, 2005): OK + +dense vector, n = 183. OK + +relative maxnorm of residual, ||Ax-b||/||b||: 1.55669e-16 +relative maxnorm of error, ||x-xtrue||/||xtrue||: 1.08984e-06 + +Writing tmp/x +Writing tmp/info.umf4 +umf4 done, strategy: 0 + + +=========================================================== +=== AMD =================================================== +=========================================================== + + +------- Now trying the AMD ordering. This not part of +the UMFPACK analysis or factorization, above, but a separate +test of just the AMD ordering routine. + +amd: approximate minimum degree ordering, parameters: + dense row parameter: 10 + (rows with more than max (10 * sqrt (n), 16) entries are + considered "dense", and placed last in output permutation) + aggressive absorption: yes + +AMD ordering time: cpu 0.00 wall 0.00 + +amd: approximate minimum degree ordering, results: + status: OK + n, dimension of A: 183 + nz, number of nonzeros in A: 1000 + symmetry of A: 0.4431 + number of nonzeros on diagonal: 183 + nonzeros in pattern of A+A' (excl. diagonal): 1272 + # dense rows/columns of A+A': 0 + memory used, in bytes: 12692 + # of memory compactions: 1 + + The following approximate statistics are for a subsequent + factorization of A(P,P) + A(P,P)'. They are slight upper + bounds if there are no dense rows/columns in A+A', and become + looser if dense rows/columns exist. + + nonzeros in L (excluding diagonal): 882 + nonzeros in L (including diagonal): 1065 + # divide operations for LDL' or LU: 882 + # multiply-subtract operations for LDL': 3378 + # multiply-subtract operations for LU: 5874 + max nz. in any column of L (incl. diagonal): 15 + + chol flop count for real A, sqrt counted as 1 flop: 7821 + LDL' flop count for real A: 7638 + LDL' flop count for complex A: 34962 + LU flop count for real A (with no pivoting): 12630 + LU flop count for complex A (with no pivoting): 54930 + +AMD test done +./readhb < HB/fs_183_6.rua > tmp/A +Matrix key: FS 183 6 +./readhb_size < HB/fs_183_6.rua > tmp/Asize +./umf4 + +=========================================================== +=== UMFPACK v4.4 ========================================== +=========================================================== + +UMFPACK V4.4 (Jan. 28, 2005), Control: + + Matrix entry defined as: double + Int (generic integer) defined as: int + + 0: print level: 3 + 1: dense row parameter: 0.2 + "dense" rows have > max (16, (0.2)*16*sqrt(n_col) entries) + 2: dense column parameter: 0.2 + "dense" columns have > max (16, (0.2)*16*sqrt(n_row) entries) + 3: pivot tolerance: 0.1 + 4: block size for dense matrix kernels: 32 + 5: strategy: 0 (auto) + 6: initial allocation ratio: 0.7 + 7: max iterative refinement steps: 2 + 12: 2-by-2 pivot tolerance: 0.01 + 13: Q fixed during numerical factorization: 0 (auto) + 14: AMD dense row/col parameter: 10 + "dense" rows/columns have > max (16, (10)*sqrt(n)) entries + Only used if the AMD ordering is used. + 15: diagonal pivot tolerance: 0.001 + Only used if diagonal pivoting is attempted. + 16: scaling: 1 (divide each row by sum of abs. values in each row) + 17: frontal matrix allocation ratio: 0.5 + 18: drop tolerance: 0 + 19: AMD and COLAMD aggressive absorption: 1 (yes) + + The following options can only be changed at compile-time: + 8: BLAS library used: none. UMFPACK will be slow. + 9: compiled for ANSI C (uses malloc, free, realloc, and printf) + 10: CPU timer is POSIX times ( ) routine. + 11: compiled for normal operation (debugging disabled) + computer/operating system: Linux + size of int: 4 long: 4 Int: 4 pointer: 4 double: 8 Entry: 8 (in bytes) + +File: tmp/A +File: tmp/Asize +n 183 nrow 183 ncol 183 nz 1069 +triplet-form matrix, n_row = 183, n_col = 183 nz = 1069. OK + +triplet-to-col time: wall 0 cpu 0 +column-form matrix, n_row 183 n_col 183, nz = 1069. OK + + +UMFPACK V4.4 (Jan. 28, 2005), Info: + matrix entry defined as: double + Int (generic integer) defined as: int + BLAS library used: none. UMFPACK will be slow. + MATLAB: no. + CPU timer: POSIX times ( ) routine. + number of rows in matrix A: 183 + number of columns in matrix A: 183 + entries in matrix A: 1069 + memory usage reported in: 8-byte Units + size of int: 4 bytes + size of long: 4 bytes + size of pointer: 4 bytes + size of numerical entry: 8 bytes + + strategy used: symmetric 2-by-2 + ordering used: amd on A+A' + modify Q during factorization: no + prefer diagonal pivoting: yes + pivots with zero Markowitz cost: 29 + submatrix S after removing zero-cost pivots: + number of "dense" rows: 4 + number of "dense" columns: 0 + number of empty rows: 0 + number of empty columns 0 + submatrix S square and diagonal preserved + pattern of square submatrix S: + number rows and columns 154 + symmetry of nonzero pattern: 0.446860 + nz in S+S' (excl. diagonal): 1286 + nz on diagonal of matrix S: 154 + fraction of nz on diagonal: 1.000000 + 2-by-2 pivoting to place large entries on diagonal: + # of small diagonal entries of S: 7 + # unmatched: 7 + symmetry of P2*S: 0.446860 + nz in P2*S+(P2*S)' (excl. diag.): 1286 + nz on diagonal of P2*S: 154 + fraction of nz on diag of P2*S: 1.000000 + AMD statistics, for strict diagonal pivoting: + est. flops for LU factorization: 1.78450e+04 + est. nz in L+U (incl. diagonal): 2080 + est. largest front (# entries): 400 + est. max nz in any column of L: 20 + number of "dense" rows/columns in S+S': 0 + symbolic factorization defragmentations: 0 + symbolic memory usage (Units): 4959 + symbolic memory usage (MBytes): 0.0 + Symbolic size (Units): 766 + Symbolic size (MBytes): 0 + symbolic factorization CPU time (sec): 0.00 + symbolic factorization wallclock time(sec): 0.00 + + symbolic/numeric factorization: upper bound actual % + variable-sized part of Numeric object: + initial size (Units) 4558 - - + peak size (Units) 26357 - - + final size (Units) 17822 - - + Numeric final size (Units) 19049 - - + Numeric final size (MBytes) 0.1 - - + peak memory usage (Units) 29795 - - + peak memory usage (MBytes) 0.2 - - + numeric factorization flops 3.51312e+05 - - + nz in L (incl diagonal) 2633 - - + nz in U (incl diagonal) 10968 - - + nz in L+U (incl diagonal) 13418 - - + largest front (# entries) 3220 - - + largest # rows in front 25 - - + largest # columns in front 140 - - + +Symbolic object: OK + +Numeric object: OK + + +UMFPACK V4.4 (Jan. 28, 2005), Info: + matrix entry defined as: double + Int (generic integer) defined as: int + BLAS library used: none. UMFPACK will be slow. + MATLAB: no. + CPU timer: POSIX times ( ) routine. + number of rows in matrix A: 183 + number of columns in matrix A: 183 + entries in matrix A: 1069 + memory usage reported in: 8-byte Units + size of int: 4 bytes + size of long: 4 bytes + size of pointer: 4 bytes + size of numerical entry: 8 bytes + + strategy used: symmetric 2-by-2 + ordering used: amd on A+A' + modify Q during factorization: no + prefer diagonal pivoting: yes + pivots with zero Markowitz cost: 29 + submatrix S after removing zero-cost pivots: + number of "dense" rows: 4 + number of "dense" columns: 0 + number of empty rows: 0 + number of empty columns 0 + submatrix S square and diagonal preserved + pattern of square submatrix S: + number rows and columns 154 + symmetry of nonzero pattern: 0.446860 + nz in S+S' (excl. diagonal): 1286 + nz on diagonal of matrix S: 154 + fraction of nz on diagonal: 1.000000 + 2-by-2 pivoting to place large entries on diagonal: + # of small diagonal entries of S: 7 + # unmatched: 7 + symmetry of P2*S: 0.446860 + nz in P2*S+(P2*S)' (excl. diag.): 1286 + nz on diagonal of P2*S: 154 + fraction of nz on diag of P2*S: 1.000000 + AMD statistics, for strict diagonal pivoting: + est. flops for LU factorization: 1.78450e+04 + est. nz in L+U (incl. diagonal): 2080 + est. largest front (# entries): 400 + est. max nz in any column of L: 20 + number of "dense" rows/columns in S+S': 0 + symbolic factorization defragmentations: 0 + symbolic memory usage (Units): 4959 + symbolic memory usage (MBytes): 0.0 + Symbolic size (Units): 766 + Symbolic size (MBytes): 0 + symbolic factorization CPU time (sec): 0.00 + symbolic factorization wallclock time(sec): 0.00 + + matrix scaled: yes (divided each row by sum of abs values in each row) + minimum sum (abs (rows of A)): 1.84689e-01 + maximum sum (abs (rows of A)): 8.73139e+08 + + symbolic/numeric factorization: upper bound actual % + variable-sized part of Numeric object: + initial size (Units) 4558 4376 96% + peak size (Units) 26357 11140 42% + final size (Units) 17822 2107 12% + Numeric final size (Units) 19049 3243 17% + Numeric final size (MBytes) 0.1 0.0 17% + peak memory usage (Units) 29795 14578 49% + peak memory usage (MBytes) 0.2 0.1 49% + numeric factorization flops 3.51312e+05 1.19670e+04 3% + nz in L (incl diagonal) 2633 1136 43% + nz in U (incl diagonal) 10968 870 8% + nz in L+U (incl diagonal) 13418 1823 14% + largest front (# entries) 3220 728 23% + largest # rows in front 25 20 80% + largest # columns in front 140 58 41% + + initial allocation ratio used: 0.282 + # of forced updates due to frontal growth: 2 + number of off-diagonal pivots: 3 + nz in L (incl diagonal), if none dropped 1136 + nz in U (incl diagonal), if none dropped 870 + number of small entries dropped 0 + nonzeros on diagonal of U: 183 + min abs. value on diagonal of U: 2.30e-09 + max abs. value on diagonal of U: 1.00e+00 + estimate of reciprocal of condition number: 2.30e-09 + indices in compressed pattern: 741 + numerical values stored in Numeric object: 1781 + numeric factorization defragmentations: 1 + numeric factorization reallocations: 1 + costly numeric factorization reallocations: 1 + numeric factorization CPU time (sec): 0.00 + numeric factorization wallclock time (sec): 0.00 + symbolic + numeric CPU time (sec): 0.00 + symbolic + numeric wall clock time (sec): 0.00 + + solve flops: 2.00240e+04 + iterative refinement steps taken: 1 + iterative refinement steps attempted: 1 + sparse backward error omega1: 2.21e-16 + sparse backward error omega2: 0.00e+00 + solve CPU time (sec): 0.00 + solve wall clock time (sec): 0.00 + + total symbolic + numeric + solve flops: 3.19910e+04 + total symbolic + numeric + solve CPU time: 0.00 + total symbolic+numeric+solve wall clock time: 0.00 + + +UMFPACK V4.4 (Jan. 28, 2005): OK + +dense vector, n = 183. OK + +relative maxnorm of residual, ||Ax-b||/||b||: 1.94586e-16 +relative maxnorm of error, ||x-xtrue||/||xtrue||: 1.22537e-06 + +Writing tmp/x +Writing tmp/info.umf4 +umf4 done, strategy: 0 + + +=========================================================== +=== AMD =================================================== +=========================================================== + + +------- Now trying the AMD ordering. This not part of +the UMFPACK analysis or factorization, above, but a separate +test of just the AMD ordering routine. + +amd: approximate minimum degree ordering, parameters: + dense row parameter: 10 + (rows with more than max (10 * sqrt (n), 16) entries are + considered "dense", and placed last in output permutation) + aggressive absorption: yes + +AMD ordering time: cpu 0.01 wall 0.00 + +amd: approximate minimum degree ordering, results: + status: OK + n, dimension of A: 183 + nz, number of nonzeros in A: 1069 + symmetry of A: 0.4176 + number of nonzeros on diagonal: 183 + nonzeros in pattern of A+A' (excl. diagonal): 1402 + # dense rows/columns of A+A': 0 + memory used, in bytes: 13316 + # of memory compactions: 1 + + The following approximate statistics are for a subsequent + factorization of A(P,P) + A(P,P)'. They are slight upper + bounds if there are no dense rows/columns in A+A', and become + looser if dense rows/columns exist. + + nonzeros in L (excluding diagonal): 1072 + nonzeros in L (including diagonal): 1255 + # divide operations for LDL' or LU: 1072 + # multiply-subtract operations for LDL': 5320 + # multiply-subtract operations for LU: 9568 + max nz. in any column of L (incl. diagonal): 21 + + chol flop count for real A, sqrt counted as 1 flop: 11895 + LDL' flop count for real A: 11712 + LDL' flop count for complex A: 52208 + LU flop count for real A (with no pivoting): 20208 + LU flop count for complex A (with no pivoting): 86192 + +AMD test done +./readhb < HB/arc130.rua > tmp/A +Matrix key: ARC130 +./readhb_size < HB/arc130.rua > tmp/Asize +./umf4 + +=========================================================== +=== UMFPACK v4.4 ========================================== +=========================================================== + +UMFPACK V4.4 (Jan. 28, 2005), Control: + + Matrix entry defined as: double + Int (generic integer) defined as: int + + 0: print level: 3 + 1: dense row parameter: 0.2 + "dense" rows have > max (16, (0.2)*16*sqrt(n_col) entries) + 2: dense column parameter: 0.2 + "dense" columns have > max (16, (0.2)*16*sqrt(n_row) entries) + 3: pivot tolerance: 0.1 + 4: block size for dense matrix kernels: 32 + 5: strategy: 0 (auto) + 6: initial allocation ratio: 0.7 + 7: max iterative refinement steps: 2 + 12: 2-by-2 pivot tolerance: 0.01 + 13: Q fixed during numerical factorization: 0 (auto) + 14: AMD dense row/col parameter: 10 + "dense" rows/columns have > max (16, (10)*sqrt(n)) entries + Only used if the AMD ordering is used. + 15: diagonal pivot tolerance: 0.001 + Only used if diagonal pivoting is attempted. + 16: scaling: 1 (divide each row by sum of abs. values in each row) + 17: frontal matrix allocation ratio: 0.5 + 18: drop tolerance: 0 + 19: AMD and COLAMD aggressive absorption: 1 (yes) + + The following options can only be changed at compile-time: + 8: BLAS library used: none. UMFPACK will be slow. + 9: compiled for ANSI C (uses malloc, free, realloc, and printf) + 10: CPU timer is POSIX times ( ) routine. + 11: compiled for normal operation (debugging disabled) + computer/operating system: Linux + size of int: 4 long: 4 Int: 4 pointer: 4 double: 8 Entry: 8 (in bytes) + +File: tmp/A +File: tmp/Asize +n 130 nrow 130 ncol 130 nz 1282 +triplet-form matrix, n_row = 130, n_col = 130 nz = 1282. OK + +triplet-to-col time: wall 0 cpu 0 +column-form matrix, n_row 130 n_col 130, nz = 1282. OK + + +UMFPACK V4.4 (Jan. 28, 2005), Info: + matrix entry defined as: double + Int (generic integer) defined as: int + BLAS library used: none. UMFPACK will be slow. + MATLAB: no. + CPU timer: POSIX times ( ) routine. + number of rows in matrix A: 130 + number of columns in matrix A: 130 + entries in matrix A: 1282 + memory usage reported in: 8-byte Units + size of int: 4 bytes + size of long: 4 bytes + size of pointer: 4 bytes + size of numerical entry: 8 bytes + + strategy used: symmetric + ordering used: amd on A+A' + modify Q during factorization: no + prefer diagonal pivoting: yes + pivots with zero Markowitz cost: 6 + submatrix S after removing zero-cost pivots: + number of "dense" rows: 7 + number of "dense" columns: 0 + number of empty rows: 0 + number of empty columns 0 + submatrix S square and diagonal preserved + pattern of square submatrix S: + number rows and columns 124 + symmetry of nonzero pattern: 0.841193 + nz in S+S' (excl. diagonal): 1204 + nz on diagonal of matrix S: 124 + fraction of nz on diagonal: 1.000000 + AMD statistics, for strict diagonal pivoting: + est. flops for LU factorization: 8.27000e+03 + est. nz in L+U (incl. diagonal): 1336 + est. largest front (# entries): 324 + est. max nz in any column of L: 18 + number of "dense" rows/columns in S+S': 2 + symbolic factorization defragmentations: 0 + symbolic memory usage (Units): 4759 + symbolic memory usage (MBytes): 0.0 + Symbolic size (Units): 637 + Symbolic size (MBytes): 0 + symbolic factorization CPU time (sec): 0.00 + symbolic factorization wallclock time(sec): 0.00 + + symbolic/numeric factorization: upper bound actual % + variable-sized part of Numeric object: + initial size (Units) 4599 - - + peak size (Units) 25036 - - + final size (Units) 12837 - - + Numeric final size (Units) 13724 - - + Numeric final size (MBytes) 0.1 - - + peak memory usage (Units) 27681 - - + peak memory usage (MBytes) 0.2 - - + numeric factorization flops 9.41610e+04 - - + nz in L (incl diagonal) 1009 - - + nz in U (incl diagonal) 7849 - - + nz in L+U (incl diagonal) 8728 - - + largest front (# entries) 2337 - - + largest # rows in front 19 - - + largest # columns in front 123 - - + +Symbolic object: OK + +Numeric object: OK + + +UMFPACK V4.4 (Jan. 28, 2005), Info: + matrix entry defined as: double + Int (generic integer) defined as: int + BLAS library used: none. UMFPACK will be slow. + MATLAB: no. + CPU timer: POSIX times ( ) routine. + number of rows in matrix A: 130 + number of columns in matrix A: 130 + entries in matrix A: 1282 + memory usage reported in: 8-byte Units + size of int: 4 bytes + size of long: 4 bytes + size of pointer: 4 bytes + size of numerical entry: 8 bytes + + strategy used: symmetric + ordering used: amd on A+A' + modify Q during factorization: no + prefer diagonal pivoting: yes + pivots with zero Markowitz cost: 6 + submatrix S after removing zero-cost pivots: + number of "dense" rows: 7 + number of "dense" columns: 0 + number of empty rows: 0 + number of empty columns 0 + submatrix S square and diagonal preserved + pattern of square submatrix S: + number rows and columns 124 + symmetry of nonzero pattern: 0.841193 + nz in S+S' (excl. diagonal): 1204 + nz on diagonal of matrix S: 124 + fraction of nz on diagonal: 1.000000 + AMD statistics, for strict diagonal pivoting: + est. flops for LU factorization: 8.27000e+03 + est. nz in L+U (incl. diagonal): 1336 + est. largest front (# entries): 324 + est. max nz in any column of L: 18 + number of "dense" rows/columns in S+S': 2 + symbolic factorization defragmentations: 0 + symbolic memory usage (Units): 4759 + symbolic memory usage (MBytes): 0.0 + Symbolic size (Units): 637 + Symbolic size (MBytes): 0 + symbolic factorization CPU time (sec): 0.00 + symbolic factorization wallclock time(sec): 0.00 + + matrix scaled: yes (divided each row by sum of abs values in each row) + minimum sum (abs (rows of A)): 7.94859e-01 + maximum sum (abs (rows of A)): 1.08460e+06 + + symbolic/numeric factorization: upper bound actual % + variable-sized part of Numeric object: + initial size (Units) 4599 4452 97% + peak size (Units) 25036 6478 26% + final size (Units) 12837 1054 8% + Numeric final size (Units) 13724 1876 14% + Numeric final size (MBytes) 0.1 0.0 14% + peak memory usage (Units) 27681 9123 33% + peak memory usage (MBytes) 0.2 0.1 33% + numeric factorization flops 9.41610e+04 4.20900e+03 4% + nz in L (incl diagonal) 1009 417 41% + nz in U (incl diagonal) 7849 787 10% + nz in L+U (incl diagonal) 8728 1074 12% + largest front (# entries) 2337 270 12% + largest # rows in front 19 18 95% + largest # columns in front 123 15 12% + + initial allocation ratio used: 0.36 + # of forced updates due to frontal growth: 0 + number of off-diagonal pivots: 0 + nz in L (incl diagonal), if none dropped 417 + nz in U (incl diagonal), if none dropped 796 + number of small entries dropped 9 + nonzeros on diagonal of U: 130 + min abs. value on diagonal of U: 9.22e-07 + max abs. value on diagonal of U: 1.00e+00 + estimate of reciprocal of condition number: 9.22e-07 + indices in compressed pattern: 79 + numerical values stored in Numeric object: 977 + numeric factorization defragmentations: 1 + numeric factorization reallocations: 1 + costly numeric factorization reallocations: 0 + numeric factorization CPU time (sec): 0.00 + numeric factorization wallclock time (sec): 0.00 + symbolic + numeric CPU time (sec): 0.00 + symbolic + numeric wall clock time (sec): 0.00 + + solve flops: 1.80440e+04 + iterative refinement steps taken: 1 + iterative refinement steps attempted: 1 + sparse backward error omega1: 8.47e-17 + sparse backward error omega2: 0.00e+00 + solve CPU time (sec): 0.00 + solve wall clock time (sec): 0.00 + + total symbolic + numeric + solve flops: 2.22530e+04 + total symbolic + numeric + solve CPU time: 0.00 + total symbolic+numeric+solve wall clock time: 0.00 + + +UMFPACK V4.4 (Jan. 28, 2005): OK + +dense vector, n = 130. OK + +relative maxnorm of residual, ||Ax-b||/||b||: 1.37368e-16 +relative maxnorm of error, ||x-xtrue||/||xtrue||: 1.74277e-10 + +Writing tmp/x +Writing tmp/info.umf4 +umf4 done, strategy: 0 + + +=========================================================== +=== AMD =================================================== +=========================================================== + + +------- Now trying the AMD ordering. This not part of +the UMFPACK analysis or factorization, above, but a separate +test of just the AMD ordering routine. + +amd: approximate minimum degree ordering, parameters: + dense row parameter: 10 + (rows with more than max (10 * sqrt (n), 16) entries are + considered "dense", and placed last in output permutation) + aggressive absorption: yes + +AMD ordering time: cpu 0.00 wall 0.00 + +amd: approximate minimum degree ordering, results: + status: OK + n, dimension of A: 130 + nz, number of nonzeros in A: 1282 + symmetry of A: 0.7587 + number of nonzeros on diagonal: 130 + nonzeros in pattern of A+A' (excl. diagonal): 1430 + # dense rows/columns of A+A': 2 + memory used, in bytes: 11544 + # of memory compactions: 0 + + The following approximate statistics are for a subsequent + factorization of A(P,P) + A(P,P)'. They are slight upper + bounds if there are no dense rows/columns in A+A', and become + looser if dense rows/columns exist. + + nonzeros in L (excluding diagonal): 756 + nonzeros in L (including diagonal): 886 + # divide operations for LDL' or LU: 756 + # multiply-subtract operations for LDL': 2959 + # multiply-subtract operations for LU: 5162 + max nz. in any column of L (incl. diagonal): 18 + + chol flop count for real A, sqrt counted as 1 flop: 6804 + LDL' flop count for real A: 6674 + LDL' flop count for complex A: 30476 + LU flop count for real A (with no pivoting): 11080 + LU flop count for complex A (with no pivoting): 48100 + +AMD test done +./readhb_nozeros < HB/arc130.rua > tmp/A +Matrix key: ARC130 +./readhb_size < HB/arc130.rua > tmp/Asize +./umf4 + +=========================================================== +=== UMFPACK v4.4 ========================================== +=========================================================== + +UMFPACK V4.4 (Jan. 28, 2005), Control: + + Matrix entry defined as: double + Int (generic integer) defined as: int + + 0: print level: 3 + 1: dense row parameter: 0.2 + "dense" rows have > max (16, (0.2)*16*sqrt(n_col) entries) + 2: dense column parameter: 0.2 + "dense" columns have > max (16, (0.2)*16*sqrt(n_row) entries) + 3: pivot tolerance: 0.1 + 4: block size for dense matrix kernels: 32 + 5: strategy: 0 (auto) + 6: initial allocation ratio: 0.7 + 7: max iterative refinement steps: 2 + 12: 2-by-2 pivot tolerance: 0.01 + 13: Q fixed during numerical factorization: 0 (auto) + 14: AMD dense row/col parameter: 10 + "dense" rows/columns have > max (16, (10)*sqrt(n)) entries + Only used if the AMD ordering is used. + 15: diagonal pivot tolerance: 0.001 + Only used if diagonal pivoting is attempted. + 16: scaling: 1 (divide each row by sum of abs. values in each row) + 17: frontal matrix allocation ratio: 0.5 + 18: drop tolerance: 0 + 19: AMD and COLAMD aggressive absorption: 1 (yes) + + The following options can only be changed at compile-time: + 8: BLAS library used: none. UMFPACK will be slow. + 9: compiled for ANSI C (uses malloc, free, realloc, and printf) + 10: CPU timer is POSIX times ( ) routine. + 11: compiled for normal operation (debugging disabled) + computer/operating system: Linux + size of int: 4 long: 4 Int: 4 pointer: 4 double: 8 Entry: 8 (in bytes) + +File: tmp/A +File: tmp/Asize +n 130 nrow 130 ncol 130 nz 1037 +triplet-form matrix, n_row = 130, n_col = 130 nz = 1037. OK + +triplet-to-col time: wall 0 cpu 0 +column-form matrix, n_row 130 n_col 130, nz = 1037. OK + + +UMFPACK V4.4 (Jan. 28, 2005), Info: + matrix entry defined as: double + Int (generic integer) defined as: int + BLAS library used: none. UMFPACK will be slow. + MATLAB: no. + CPU timer: POSIX times ( ) routine. + number of rows in matrix A: 130 + number of columns in matrix A: 130 + entries in matrix A: 1037 + memory usage reported in: 8-byte Units + size of int: 4 bytes + size of long: 4 bytes + size of pointer: 4 bytes + size of numerical entry: 8 bytes + + strategy used: symmetric + ordering used: amd on A+A' + modify Q during factorization: no + prefer diagonal pivoting: yes + pivots with zero Markowitz cost: 54 + submatrix S after removing zero-cost pivots: + number of "dense" rows: 5 + number of "dense" columns: 0 + number of empty rows: 0 + number of empty columns 0 + submatrix S square and diagonal preserved + pattern of square submatrix S: + number rows and columns 76 + symmetry of nonzero pattern: 0.733224 + nz in S+S' (excl. diagonal): 774 + nz on diagonal of matrix S: 76 + fraction of nz on diagonal: 1.000000 + AMD statistics, for strict diagonal pivoting: + est. flops for LU factorization: 5.81700e+03 + est. nz in L+U (incl. diagonal): 858 + est. largest front (# entries): 289 + est. max nz in any column of L: 17 + number of "dense" rows/columns in S+S': 0 + symbolic factorization defragmentations: 0 + symbolic memory usage (Units): 4111 + symbolic memory usage (MBytes): 0.0 + Symbolic size (Units): 527 + Symbolic size (MBytes): 0 + symbolic factorization CPU time (sec): 0.00 + symbolic factorization wallclock time(sec): 0.00 + + symbolic/numeric factorization: upper bound actual % + variable-sized part of Numeric object: + initial size (Units) 3196 - - + peak size (Units) 9801 - - + final size (Units) 4259 - - + Numeric final size (Units) 5146 - - + Numeric final size (MBytes) 0.0 - - + peak memory usage (Units) 12135 - - + peak memory usage (MBytes) 0.1 - - + numeric factorization flops 2.47640e+04 - - + nz in L (incl diagonal) 606 - - + nz in U (incl diagonal) 2537 - - + nz in L+U (incl diagonal) 3013 - - + largest front (# entries) 459 - - + largest # rows in front 17 - - + largest # columns in front 48 - - + +Symbolic object: OK + +Numeric object: OK + + +UMFPACK V4.4 (Jan. 28, 2005), Info: + matrix entry defined as: double + Int (generic integer) defined as: int + BLAS library used: none. UMFPACK will be slow. + MATLAB: no. + CPU timer: POSIX times ( ) routine. + number of rows in matrix A: 130 + number of columns in matrix A: 130 + entries in matrix A: 1037 + memory usage reported in: 8-byte Units + size of int: 4 bytes + size of long: 4 bytes + size of pointer: 4 bytes + size of numerical entry: 8 bytes + + strategy used: symmetric + ordering used: amd on A+A' + modify Q during factorization: no + prefer diagonal pivoting: yes + pivots with zero Markowitz cost: 54 + submatrix S after removing zero-cost pivots: + number of "dense" rows: 5 + number of "dense" columns: 0 + number of empty rows: 0 + number of empty columns 0 + submatrix S square and diagonal preserved + pattern of square submatrix S: + number rows and columns 76 + symmetry of nonzero pattern: 0.733224 + nz in S+S' (excl. diagonal): 774 + nz on diagonal of matrix S: 76 + fraction of nz on diagonal: 1.000000 + AMD statistics, for strict diagonal pivoting: + est. flops for LU factorization: 5.81700e+03 + est. nz in L+U (incl. diagonal): 858 + est. largest front (# entries): 289 + est. max nz in any column of L: 17 + number of "dense" rows/columns in S+S': 0 + symbolic factorization defragmentations: 0 + symbolic memory usage (Units): 4111 + symbolic memory usage (MBytes): 0.0 + Symbolic size (Units): 527 + Symbolic size (MBytes): 0 + symbolic factorization CPU time (sec): 0.00 + symbolic factorization wallclock time(sec): 0.00 + + matrix scaled: yes (divided each row by sum of abs values in each row) + minimum sum (abs (rows of A)): 7.94859e-01 + maximum sum (abs (rows of A)): 1.08460e+06 + + symbolic/numeric factorization: upper bound actual % + variable-sized part of Numeric object: + initial size (Units) 3196 3062 96% + peak size (Units) 9801 6376 65% + final size (Units) 4259 1141 27% + Numeric final size (Units) 5146 1963 38% + Numeric final size (MBytes) 0.0 0.0 38% + peak memory usage (Units) 12135 8710 72% + peak memory usage (MBytes) 0.1 0.1 72% + numeric factorization flops 2.47640e+04 4.10700e+03 17% + nz in L (incl diagonal) 606 409 67% + nz in U (incl diagonal) 2537 792 31% + nz in L+U (incl diagonal) 3013 1071 36% + largest front (# entries) 459 240 52% + largest # rows in front 17 16 94% + largest # columns in front 48 15 31% + + initial allocation ratio used: 0.755 + # of forced updates due to frontal growth: 0 + number of off-diagonal pivots: 0 + nz in L (incl diagonal), if none dropped 409 + nz in U (incl diagonal), if none dropped 792 + number of small entries dropped 0 + nonzeros on diagonal of U: 130 + min abs. value on diagonal of U: 9.22e-07 + max abs. value on diagonal of U: 1.00e+00 + estimate of reciprocal of condition number: 9.22e-07 + indices in compressed pattern: 70 + numerical values stored in Numeric object: 782 + numeric factorization defragmentations: 1 + numeric factorization reallocations: 1 + costly numeric factorization reallocations: 0 + numeric factorization CPU time (sec): 0.00 + numeric factorization wallclock time (sec): 0.00 + symbolic + numeric CPU time (sec): 0.00 + symbolic + numeric wall clock time (sec): 0.00 + + solve flops: 1.58270e+04 + iterative refinement steps taken: 1 + iterative refinement steps attempted: 1 + sparse backward error omega1: 7.18e-17 + sparse backward error omega2: 0.00e+00 + solve CPU time (sec): 0.00 + solve wall clock time (sec): 0.00 + + total symbolic + numeric + solve flops: 1.99340e+04 + total symbolic + numeric + solve CPU time: 0.00 + total symbolic+numeric+solve wall clock time: 0.00 + + +UMFPACK V4.4 (Jan. 28, 2005): OK + +dense vector, n = 130. OK + +relative maxnorm of residual, ||Ax-b||/||b||: 1.37368e-16 +relative maxnorm of error, ||x-xtrue||/||xtrue||: 1.74255e-10 + +Writing tmp/x +Writing tmp/info.umf4 +umf4 done, strategy: 0 + + +=========================================================== +=== AMD =================================================== +=========================================================== + + +------- Now trying the AMD ordering. This not part of +the UMFPACK analysis or factorization, above, but a separate +test of just the AMD ordering routine. + +amd: approximate minimum degree ordering, parameters: + dense row parameter: 10 + (rows with more than max (10 * sqrt (n), 16) entries are + considered "dense", and placed last in output permutation) + aggressive absorption: yes + +AMD ordering time: cpu 0.00 wall 0.00 + +amd: approximate minimum degree ordering, results: + status: OK + n, dimension of A: 130 + nz, number of nonzeros in A: 1037 + symmetry of A: 0.4939 + number of nonzeros on diagonal: 130 + nonzeros in pattern of A+A' (excl. diagonal): 1366 + # dense rows/columns of A+A': 2 + memory used, in bytes: 11236 + # of memory compactions: 0 + + The following approximate statistics are for a subsequent + factorization of A(P,P) + A(P,P)'. They are slight upper + bounds if there are no dense rows/columns in A+A', and become + looser if dense rows/columns exist. + + nonzeros in L (excluding diagonal): 725 + nonzeros in L (including diagonal): 855 + # divide operations for LDL' or LU: 725 + # multiply-subtract operations for LDL': 2742 + # multiply-subtract operations for LU: 4759 + max nz. in any column of L (incl. diagonal): 18 + + chol flop count for real A, sqrt counted as 1 flop: 6339 + LDL' flop count for real A: 6209 + LDL' flop count for complex A: 28461 + LU flop count for real A (with no pivoting): 10243 + LU flop count for complex A (with no pivoting): 44597 + +AMD test done +./readhb_nozeros < HB/arc130.rua > tmp/A +Matrix key: ARC130 +./readhb_size < HB/arc130.rua > tmp/Asize +./umf4 a 1e-6 + +=========================================================== +=== UMFPACK v4.4 ========================================== +=========================================================== +droptol 1e-06 + +UMFPACK V4.4 (Jan. 28, 2005), Control: + + Matrix entry defined as: double + Int (generic integer) defined as: int + + 0: print level: 3 + 1: dense row parameter: 0.2 + "dense" rows have > max (16, (0.2)*16*sqrt(n_col) entries) + 2: dense column parameter: 0.2 + "dense" columns have > max (16, (0.2)*16*sqrt(n_row) entries) + 3: pivot tolerance: 0.1 + 4: block size for dense matrix kernels: 32 + 5: strategy: 0 (auto) + 6: initial allocation ratio: 0.7 + 7: max iterative refinement steps: 2 + 12: 2-by-2 pivot tolerance: 0.01 + 13: Q fixed during numerical factorization: 0 (auto) + 14: AMD dense row/col parameter: 10 + "dense" rows/columns have > max (16, (10)*sqrt(n)) entries + Only used if the AMD ordering is used. + 15: diagonal pivot tolerance: 0.001 + Only used if diagonal pivoting is attempted. + 16: scaling: 1 (divide each row by sum of abs. values in each row) + 17: frontal matrix allocation ratio: 0.5 + 18: drop tolerance: 1e-06 + 19: AMD and COLAMD aggressive absorption: 1 (yes) + + The following options can only be changed at compile-time: + 8: BLAS library used: none. UMFPACK will be slow. + 9: compiled for ANSI C (uses malloc, free, realloc, and printf) + 10: CPU timer is POSIX times ( ) routine. + 11: compiled for normal operation (debugging disabled) + computer/operating system: Linux + size of int: 4 long: 4 Int: 4 pointer: 4 double: 8 Entry: 8 (in bytes) + +File: tmp/A +File: tmp/Asize +n 130 nrow 130 ncol 130 nz 1037 +triplet-form matrix, n_row = 130, n_col = 130 nz = 1037. OK + +triplet-to-col time: wall 0 cpu 0 +column-form matrix, n_row 130 n_col 130, nz = 1037. OK + + +UMFPACK V4.4 (Jan. 28, 2005), Info: + matrix entry defined as: double + Int (generic integer) defined as: int + BLAS library used: none. UMFPACK will be slow. + MATLAB: no. + CPU timer: POSIX times ( ) routine. + number of rows in matrix A: 130 + number of columns in matrix A: 130 + entries in matrix A: 1037 + memory usage reported in: 8-byte Units + size of int: 4 bytes + size of long: 4 bytes + size of pointer: 4 bytes + size of numerical entry: 8 bytes + + strategy used: symmetric + ordering used: amd on A+A' + modify Q during factorization: no + prefer diagonal pivoting: yes + pivots with zero Markowitz cost: 54 + submatrix S after removing zero-cost pivots: + number of "dense" rows: 5 + number of "dense" columns: 0 + number of empty rows: 0 + number of empty columns 0 + submatrix S square and diagonal preserved + pattern of square submatrix S: + number rows and columns 76 + symmetry of nonzero pattern: 0.733224 + nz in S+S' (excl. diagonal): 774 + nz on diagonal of matrix S: 76 + fraction of nz on diagonal: 1.000000 + AMD statistics, for strict diagonal pivoting: + est. flops for LU factorization: 5.81700e+03 + est. nz in L+U (incl. diagonal): 858 + est. largest front (# entries): 289 + est. max nz in any column of L: 17 + number of "dense" rows/columns in S+S': 0 + symbolic factorization defragmentations: 0 + symbolic memory usage (Units): 4111 + symbolic memory usage (MBytes): 0.0 + Symbolic size (Units): 527 + Symbolic size (MBytes): 0 + symbolic factorization CPU time (sec): 0.00 + symbolic factorization wallclock time(sec): 0.00 + + symbolic/numeric factorization: upper bound actual % + variable-sized part of Numeric object: + initial size (Units) 3196 - - + peak size (Units) 9801 - - + final size (Units) 4259 - - + Numeric final size (Units) 5146 - - + Numeric final size (MBytes) 0.0 - - + peak memory usage (Units) 12135 - - + peak memory usage (MBytes) 0.1 - - + numeric factorization flops 2.47640e+04 - - + nz in L (incl diagonal) 606 - - + nz in U (incl diagonal) 2537 - - + nz in L+U (incl diagonal) 3013 - - + largest front (# entries) 459 - - + largest # rows in front 17 - - + largest # columns in front 48 - - + +Symbolic object: OK + +Numeric object: OK + + +UMFPACK V4.4 (Jan. 28, 2005), Info: + matrix entry defined as: double + Int (generic integer) defined as: int + BLAS library used: none. UMFPACK will be slow. + MATLAB: no. + CPU timer: POSIX times ( ) routine. + number of rows in matrix A: 130 + number of columns in matrix A: 130 + entries in matrix A: 1037 + memory usage reported in: 8-byte Units + size of int: 4 bytes + size of long: 4 bytes + size of pointer: 4 bytes + size of numerical entry: 8 bytes + + strategy used: symmetric + ordering used: amd on A+A' + modify Q during factorization: no + prefer diagonal pivoting: yes + pivots with zero Markowitz cost: 54 + submatrix S after removing zero-cost pivots: + number of "dense" rows: 5 + number of "dense" columns: 0 + number of empty rows: 0 + number of empty columns 0 + submatrix S square and diagonal preserved + pattern of square submatrix S: + number rows and columns 76 + symmetry of nonzero pattern: 0.733224 + nz in S+S' (excl. diagonal): 774 + nz on diagonal of matrix S: 76 + fraction of nz on diagonal: 1.000000 + AMD statistics, for strict diagonal pivoting: + est. flops for LU factorization: 5.81700e+03 + est. nz in L+U (incl. diagonal): 858 + est. largest front (# entries): 289 + est. max nz in any column of L: 17 + number of "dense" rows/columns in S+S': 0 + symbolic factorization defragmentations: 0 + symbolic memory usage (Units): 4111 + symbolic memory usage (MBytes): 0.0 + Symbolic size (Units): 527 + Symbolic size (MBytes): 0 + symbolic factorization CPU time (sec): 0.00 + symbolic factorization wallclock time(sec): 0.00 + + matrix scaled: yes (divided each row by sum of abs values in each row) + minimum sum (abs (rows of A)): 7.94859e-01 + maximum sum (abs (rows of A)): 1.08460e+06 + + symbolic/numeric factorization: upper bound actual % + variable-sized part of Numeric object: + initial size (Units) 3196 2762 86% + peak size (Units) 9801 5323 54% + final size (Units) 4259 457 11% + Numeric final size (Units) 5146 1279 25% + Numeric final size (MBytes) 0.0 0.0 25% + peak memory usage (Units) 12135 7657 63% + peak memory usage (MBytes) 0.1 0.1 63% + numeric factorization flops 2.47640e+04 4.10700e+03 17% + nz in L (incl diagonal) 606 318 52% + nz in U (incl diagonal) 2537 285 11% + nz in L+U (incl diagonal) 3013 473 16% + largest front (# entries) 459 240 52% + largest # rows in front 17 16 94% + largest # columns in front 48 15 31% + + initial allocation ratio used: 0.755 + # of forced updates due to frontal growth: 0 + number of off-diagonal pivots: 0 + nz in L (incl diagonal), if none dropped 409 + nz in U (incl diagonal), if none dropped 792 + number of small entries dropped 598 + nonzeros on diagonal of U: 130 + min abs. value on diagonal of U: 9.22e-07 + max abs. value on diagonal of U: 1.00e+00 + estimate of reciprocal of condition number: 9.22e-07 + indices in compressed pattern: 82 + numerical values stored in Numeric object: 386 + numeric factorization defragmentations: 1 + numeric factorization reallocations: 1 + costly numeric factorization reallocations: 0 + numeric factorization CPU time (sec): 0.00 + numeric factorization wallclock time (sec): 0.00 + symbolic + numeric CPU time (sec): 0.00 + symbolic + numeric wall clock time (sec): 0.00 + + solve flops: 2.06060e+04 + iterative refinement steps taken: 2 + iterative refinement steps attempted: 2 + sparse backward error omega1: 1.30e-16 + sparse backward error omega2: 0.00e+00 + solve CPU time (sec): 0.00 + solve wall clock time (sec): 0.00 + + total symbolic + numeric + solve flops: 2.47130e+04 + total symbolic + numeric + solve CPU time: 0.00 + total symbolic+numeric+solve wall clock time: 0.00 + + +UMFPACK V4.4 (Jan. 28, 2005): OK + +dense vector, n = 130. OK + +relative maxnorm of residual, ||Ax-b||/||b||: 1.37368e-16 +relative maxnorm of error, ||x-xtrue||/||xtrue||: 1.94084e-10 + +Writing tmp/x +Writing tmp/info.umf4 +umf4 done, strategy: 0 + + +=========================================================== +=== AMD =================================================== +=========================================================== + + +------- Now trying the AMD ordering. This not part of +the UMFPACK analysis or factorization, above, but a separate +test of just the AMD ordering routine. + +amd: approximate minimum degree ordering, parameters: + dense row parameter: 10 + (rows with more than max (10 * sqrt (n), 16) entries are + considered "dense", and placed last in output permutation) + aggressive absorption: yes + +AMD ordering time: cpu 0.00 wall 0.00 + +amd: approximate minimum degree ordering, results: + status: OK + n, dimension of A: 130 + nz, number of nonzeros in A: 1037 + symmetry of A: 0.4939 + number of nonzeros on diagonal: 130 + nonzeros in pattern of A+A' (excl. diagonal): 1366 + # dense rows/columns of A+A': 2 + memory used, in bytes: 11236 + # of memory compactions: 0 + + The following approximate statistics are for a subsequent + factorization of A(P,P) + A(P,P)'. They are slight upper + bounds if there are no dense rows/columns in A+A', and become + looser if dense rows/columns exist. + + nonzeros in L (excluding diagonal): 725 + nonzeros in L (including diagonal): 855 + # divide operations for LDL' or LU: 725 + # multiply-subtract operations for LDL': 2742 + # multiply-subtract operations for LU: 4759 + max nz. in any column of L (incl. diagonal): 18 + + chol flop count for real A, sqrt counted as 1 flop: 6339 + LDL' flop count for real A: 6209 + LDL' flop count for complex A: 28461 + LU flop count for real A (with no pivoting): 10243 + LU flop count for complex A (with no pivoting): 44597 + +AMD test done diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Demo/umf4_f77wrapper.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Demo/umf4_f77wrapper.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,505 @@ +/* ========================================================================== */ +/* === umf4_f77wrapper ====================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* FORTRAN interface for the C-callable UMFPACK library (double / int version + * only and double / long versions only). This is HIGHLY non-portable. You + * will need to modify this depending on how your FORTRAN and C compilers + * behave. This has been tested in Linux, Sun Solaris, SGI IRIX, and IBM AIX, + * with various compilers. It has not been exhaustively tested on all possible + * combinations of C and FORTRAN compilers. The long version works on + * Solaris, SGI IRIX, and IBM AIX when the UMFPACK library is compiled in + * 64-bit mode. + * + * Only a subset of UMFPACK's capabilities are provided. Refer to the UMFPACK + * User Guide for details. + * + * For some C and FORTRAN compilers, the FORTRAN compiler appends a single + * underscore ("_") after each routine name. C doesn't do this, so the + * translation is made here. Other FORTRAN compilers treat underscores + * differently. For example, a FORTRAN call to a_b gets translated to a call + * to a_b__ by g77, and to a_b_ by most other FORTRAN compilers. Thus, the + * FORTRAN names here do not use underscores. The xlf compiler in IBM AIX + * doesn't add an underscore. + * + * The matrix A is passed to UMFPACK in compressed column form, with 0-based + * indices. In FORTRAN, for an m-by-n matrix A with nz entries, the row + * indices of the first column (column 1) are in Ai (Ap (1) + 1 ... Ap (2)), + * with values in Ax (Ap (1) + 1 ... Ap (2)). The last column (column n) is + * in Ai (Ap (n) + 1 ... Ap (n+1)) and Ax (Ap (n) + 1 ... Ap (n+1)). The row + * indices in Ai are in the range 0 to m-1. They must be sorted, with no + * duplicate entries allowed. Refer to umfpack_di_triplet_to_col for a more + * flexible format for the input matrix. The following defintions apply + * for each of the routines in this file: + * + * integer m, n, Ap (n+1), Ai (nz), symbolic, numeric, filenum, status + * double precision Ax (nz), control (20), info (90), x (n), b (n) + * + * UMFPACK's status is returned in either a status argument, or in info (1). + * It is zero if everything is OK, 1 if the matrix is singular (this is a + * warning, not an error), and negative if an error occurred. See umfpack.h + * for more details on the contents of the control and info arrays, and the + * value of the sys argument. + * + * For the Numeric and Symbolic handles, it's probably safe to assume that a + * FORTRAN integer is sufficient to store a C pointer. If that doesn't work, + * try defining numeric and symbolic as integer arrays of size 2, or as + * integer*8, in the FORTRAN routine that calls these wrapper routines. + * The latter is required on Solaris, SGI IRIX, and IBM AIX when UMFPACK is + * compiled in 64-bit mode. + * + * If you want to use 64-bit integers, try compiling this file with the -DDLONG + * compiler option (via "make fortran64"). First modify your Make/Make.include + * and Make/Make. files to compile UMFPACK in LP64 mode (see the User + * Guide for details). Your FORTRAN code should use integer*8. See umf4hb64.f + * for an example. + * + * Tested with the following compilers: + * * Solaris with cc and f77 from Sun WorkShop 6 update 1 + * (32-bit and 64-bit modes) + * * SGI Irix with MIPSpro cc and f77 compilers version 7.4 + * (32-bit and 64-bit modes) + * * Linux with GNU gcc and Intel's icc, and GNU g77 and Intel's + * ifc FORTRAN compiler. See the comments above about g77 and + * underscores. Only supports 32-bit mode. + * * IBM AIX xlc and xlf compilers. + * (32-bit and 64-bit modes) + */ + +#include "umfpack.h" +#include +#include +#ifdef NULL +#undef NULL +#endif +#define NULL 0 +#define LEN 200 + +/* -------------------------------------------------------------------------- */ +/* integer type: int or long */ +/* -------------------------------------------------------------------------- */ + +#if defined (DLONG) + +#define Int long +#define UMFPACK_defaults umfpack_dl_defaults +#define UMFPACK_free_numeric umfpack_dl_free_numeric +#define UMFPACK_free_symbolic umfpack_dl_free_symbolic +#define UMFPACK_numeric umfpack_dl_numeric +#define UMFPACK_report_control umfpack_dl_report_control +#define UMFPACK_report_info umfpack_dl_report_info +#define UMFPACK_save_numeric umfpack_dl_save_numeric +#define UMFPACK_save_symbolic umfpack_dl_save_symbolic +#define UMFPACK_load_numeric umfpack_dl_load_numeric +#define UMFPACK_load_symbolic umfpack_dl_load_symbolic +#define UMFPACK_scale umfpack_dl_scale +#define UMFPACK_solve umfpack_dl_solve +#define UMFPACK_symbolic umfpack_dl_symbolic + +#else + +#define Int int +#define UMFPACK_defaults umfpack_di_defaults +#define UMFPACK_free_numeric umfpack_di_free_numeric +#define UMFPACK_free_symbolic umfpack_di_free_symbolic +#define UMFPACK_numeric umfpack_di_numeric +#define UMFPACK_report_control umfpack_di_report_control +#define UMFPACK_report_info umfpack_di_report_info +#define UMFPACK_save_numeric umfpack_di_save_numeric +#define UMFPACK_save_symbolic umfpack_di_save_symbolic +#define UMFPACK_load_numeric umfpack_di_load_numeric +#define UMFPACK_load_symbolic umfpack_di_load_symbolic +#define UMFPACK_scale umfpack_di_scale +#define UMFPACK_solve umfpack_di_solve +#define UMFPACK_symbolic umfpack_di_symbolic + +#endif + +/* -------------------------------------------------------------------------- */ +/* construct a file name from a file number (not user-callable) */ +/* -------------------------------------------------------------------------- */ + +static void make_filename (Int filenum, char *prefix, char *filename) +{ + char *psrc, *pdst ; +#ifdef DLONG + sprintf (filename, "%s%ld.umf", prefix, filenum) ; +#else + sprintf (filename, "%s%d.umf", prefix, filenum) ; +#endif + /* remove any spaces in the filename */ + pdst = filename ; + for (psrc = filename ; *psrc ; psrc++) + { + if (!isspace (*psrc)) *pdst++ = *psrc ; + } + *pdst = '\0' ; +} + +/* ========================================================================== */ +/* === with underscore ====================================================== */ +/* ========================================================================== */ + +/* Solaris, Linux, and SGI IRIX. Probably Compaq Alpha as well. */ + +/* -------------------------------------------------------------------------- */ +/* umf4def: set default control parameters */ +/* -------------------------------------------------------------------------- */ + +/* call umf4def (control) */ + +void umf4def_ (double Control [UMFPACK_CONTROL]) +{ + UMFPACK_defaults (Control) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4pcon: print control parameters */ +/* -------------------------------------------------------------------------- */ + +/* call umf4pcon (control) */ + +void umf4pcon_ (double Control [UMFPACK_CONTROL]) +{ + fflush (stdout) ; + UMFPACK_report_control (Control) ; + fflush (stdout) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4sym: pre-ordering and symbolic factorization */ +/* -------------------------------------------------------------------------- */ + +/* call umf4sym (m, n, Ap, Ai, Ax, symbolic, control, info) */ + +void umf4sym_ (Int *m, Int *n, Int Ap [ ], Int Ai [ ], + double Ax [ ], void **Symbolic, + double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO]) +{ + (void) UMFPACK_symbolic (*m, *n, Ap, Ai, Ax, Symbolic, Control, Info) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4num: numeric factorization */ +/* -------------------------------------------------------------------------- */ + +/* call umf4num (Ap, Ai, Ax, symbolic, numeric, control, info) */ + +void umf4num_ (Int Ap [ ], Int Ai [ ], double Ax [ ], + void **Symbolic, void **Numeric, + double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO]) +{ + (void) UMFPACK_numeric (Ap, Ai, Ax, *Symbolic, Numeric, Control, Info); +} + +/* -------------------------------------------------------------------------- */ +/* umf4solr: solve a linear system with iterative refinement */ +/* -------------------------------------------------------------------------- */ + +/* call umf4solr (sys, Ap, Ai, Ax, x, b, numeric, control, info) */ + +void umf4solr_ (Int *sys, Int Ap [ ], Int Ai [ ], double Ax [ ], + double x [ ], double b [ ], void **Numeric, + double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO]) +{ + (void) UMFPACK_solve (*sys, Ap, Ai, Ax, x, b, *Numeric, Control, Info) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4sol: solve a linear system without iterative refinement */ +/* -------------------------------------------------------------------------- */ + +/* call umf4sol (sys, x, b, numeric, control, info) */ + +void umf4sol_ (Int *sys, double x [ ], double b [ ], void **Numeric, + double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO]) +{ + Control [UMFPACK_IRSTEP] = 0 ; + (void) UMFPACK_solve (*sys, (Int *) NULL, (Int *) NULL, (double *) NULL, + x, b, *Numeric, Control, Info) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4scal: scale a vector using UMFPACK's scale factors */ +/* -------------------------------------------------------------------------- */ + +/* call umf4scal (x, b, numeric, status) */ + +void umf4scal_ (double x [ ], double b [ ], void **Numeric, Int *status) +{ + *status = UMFPACK_scale (x, b, *Numeric) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4pinf: print info */ +/* -------------------------------------------------------------------------- */ + +/* call umf4pinf (control) */ + +void umf4pinf_ (double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO]) +{ + fflush (stdout) ; + UMFPACK_report_info (Control, Info) ; + fflush (stdout) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4fnum: free the Numeric object */ +/* -------------------------------------------------------------------------- */ + +/* call umf4fnum (numeric) */ + +void umf4fnum_ (void **Numeric) +{ + UMFPACK_free_numeric (Numeric) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4fsym: free the Symbolic object */ +/* -------------------------------------------------------------------------- */ + +/* call umf4fsym (symbolic) */ + +void umf4fsym_ (void **Symbolic) +{ + UMFPACK_free_symbolic (Symbolic) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4snum: save the Numeric object to a file */ +/* -------------------------------------------------------------------------- */ + +/* call umf4snum (numeric, filenum, status) */ + +void umf4snum_ (void **Numeric, Int *filenum, Int *status) +{ + char filename [LEN] ; + make_filename (*filenum, "n", filename) ; + *status = UMFPACK_save_numeric (*Numeric, filename) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4ssym: save the Symbolic object to a file */ +/* -------------------------------------------------------------------------- */ + +/* call umf4ssym (symbolic, filenum, status) */ + +void umf4ssym_ (void **Symbolic, Int *filenum, Int *status) +{ + char filename [LEN] ; + make_filename (*filenum, "s", filename) ; + *status = UMFPACK_save_symbolic (*Symbolic, filename) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4lnum: load the Numeric object from a file */ +/* -------------------------------------------------------------------------- */ + +/* call umf4lnum (numeric, filenum, status) */ + +void umf4lnum_ (void **Numeric, Int *filenum, Int *status) +{ + char filename [LEN] ; + make_filename (*filenum, "n", filename) ; + *status = UMFPACK_load_numeric (Numeric, filename) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4lsym: load the Symbolic object from a file */ +/* -------------------------------------------------------------------------- */ + +/* call umf4lsym (symbolic, filenum, status) */ + +void umf4lsym_ (void **Symbolic, Int *filenum, Int *status) +{ + char filename [LEN] ; + make_filename (*filenum, "s", filename) ; + *status = UMFPACK_load_symbolic (Symbolic, filename) ; +} + +/* ========================================================================== */ +/* === with no underscore =================================================== */ +/* ========================================================================== */ + +/* IBM AIX. Probably Microsoft Windows and HP Unix as well. */ + +/* -------------------------------------------------------------------------- */ +/* umf4def: set default control parameters */ +/* -------------------------------------------------------------------------- */ + +/* call umf4def (control) */ + +void umf4def (double Control [UMFPACK_CONTROL]) +{ + UMFPACK_defaults (Control) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4pcon: print control parameters */ +/* -------------------------------------------------------------------------- */ + +/* call umf4pcon (control) */ + +void umf4pcon (double Control [UMFPACK_CONTROL]) +{ + fflush (stdout) ; + UMFPACK_report_control (Control) ; + fflush (stdout) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4sym: pre-ordering and symbolic factorization */ +/* -------------------------------------------------------------------------- */ + +/* call umf4sym (m, n, Ap, Ai, Ax, symbolic, control, info) */ + +void umf4sym (Int *m, Int *n, Int Ap [ ], Int Ai [ ], + double Ax [ ], void **Symbolic, + double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO]) +{ + (void) UMFPACK_symbolic (*m, *n, Ap, Ai, Ax, Symbolic, Control, Info) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4num: numeric factorization */ +/* -------------------------------------------------------------------------- */ + +/* call umf4num (Ap, Ai, Ax, symbolic, numeric, control, info) */ + +void umf4num (Int Ap [ ], Int Ai [ ], double Ax [ ], + void **Symbolic, void **Numeric, + double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO]) +{ + (void) UMFPACK_numeric (Ap, Ai, Ax, *Symbolic, Numeric, Control, Info); +} + +/* -------------------------------------------------------------------------- */ +/* umf4solr: solve a linear system with iterative refinement */ +/* -------------------------------------------------------------------------- */ + +/* call umf4solr (sys, Ap, Ai, Ax, x, b, numeric, control, info) */ + +void umf4solr (Int *sys, Int Ap [ ], Int Ai [ ], double Ax [ ], + double x [ ], double b [ ], void **Numeric, + double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO]) +{ + (void) UMFPACK_solve (*sys, Ap, Ai, Ax, x, b, *Numeric, Control, Info) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4sol: solve a linear system without iterative refinement */ +/* -------------------------------------------------------------------------- */ + +/* call umf4sol (sys, x, b, numeric, control, info) */ + +void umf4sol (Int *sys, double x [ ], double b [ ], void **Numeric, + double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO]) +{ + Control [UMFPACK_IRSTEP] = 0 ; + (void) UMFPACK_solve (*sys, (Int *) NULL, (Int *) NULL, (double *) NULL, + x, b, *Numeric, Control, Info) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4scal: scale a vector using UMFPACK's scale factors */ +/* -------------------------------------------------------------------------- */ + +/* call umf4scal (x, b, numeric, status) */ + +void umf4scal (double x [ ], double b [ ], void **Numeric, Int *status) +{ + *status = UMFPACK_scale (x, b, *Numeric) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4pinf: print info */ +/* -------------------------------------------------------------------------- */ + +/* call umf4pinf (control) */ + +void umf4pinf (double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO]) +{ + fflush (stdout) ; + UMFPACK_report_info (Control, Info) ; + fflush (stdout) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4fnum: free the Numeric object */ +/* -------------------------------------------------------------------------- */ + +/* call umf4fnum (numeric) */ + +void umf4fnum (void **Numeric) +{ + UMFPACK_free_numeric (Numeric) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4fsym: free the Symbolic object */ +/* -------------------------------------------------------------------------- */ + +/* call umf4fsym (symbolic) */ + +void umf4fsym (void **Symbolic) +{ + UMFPACK_free_symbolic (Symbolic) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4snum: save the Numeric object to a file */ +/* -------------------------------------------------------------------------- */ + +/* call umf4snum (numeric, filenum, status) */ + +void umf4snum (void **Numeric, Int *filenum, Int *status) +{ + char filename [LEN] ; + make_filename (*filenum, "n", filename) ; + *status = UMFPACK_save_numeric (*Numeric, filename) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4ssym: save the Symbolic object to a file */ +/* -------------------------------------------------------------------------- */ + +/* call umf4ssym (symbolic, filenum, status) */ + +void umf4ssym (void **Symbolic, Int *filenum, Int *status) +{ + char filename [LEN] ; + make_filename (*filenum, "s", filename) ; + *status = UMFPACK_save_symbolic (*Symbolic, filename) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4lnum: load the Numeric object from a file */ +/* -------------------------------------------------------------------------- */ + +/* call umf4lnum (numeric, filenum, status) */ + +void umf4lnum (void **Numeric, Int *filenum, Int *status) +{ + char filename [LEN] ; + make_filename (*filenum, "n", filename) ; + *status = UMFPACK_load_numeric (Numeric, filename) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4lsym: load the Symbolic object from a file */ +/* -------------------------------------------------------------------------- */ + +/* call umf4lsym (symbolic, filenum, status) */ + +void umf4lsym (void **Symbolic, Int *filenum, Int *status) +{ + char filename [LEN] ; + make_filename (*filenum, "s", filename) ; + *status = UMFPACK_load_symbolic (Symbolic, filename) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Demo/umf4_f77zwrapper.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Demo/umf4_f77zwrapper.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,462 @@ +/* ========================================================================== */ +/* === umf4_f77zwrapper ===================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* FORTRAN interface for the C-callable UMFPACK library (complex / int version + * only and complex / long versions only). This is HIGHLY non-portable. You + * will need to modify this depending on how your FORTRAN and C compilers + * behave. + * + * See umf4z_f77wrapper.c for more information. + * + * The complex values are provided in two separate arrays. Ax contains the + * real part and Az contains the imaginary part. The solution vector is in + * x (the real part) and xz (the imaginary part. b is the real part of the + * right-hand-side and bz is the imaginary part. Does not support the + * packed complex type. + */ + +#include "umfpack.h" +#include +#include +#ifdef NULL +#undef NULL +#endif +#define NULL 0 +#define LEN 200 + +/* -------------------------------------------------------------------------- */ +/* integer type: int or long */ +/* -------------------------------------------------------------------------- */ + +#if defined (ZLONG) + +#define Int long +#define UMFPACK_defaults umfpack_zl_defaults +#define UMFPACK_free_numeric umfpack_zl_free_numeric +#define UMFPACK_free_symbolic umfpack_zl_free_symbolic +#define UMFPACK_numeric umfpack_zl_numeric +#define UMFPACK_report_control umfpack_zl_report_control +#define UMFPACK_report_info umfpack_zl_report_info +#define UMFPACK_save_numeric umfpack_zl_save_numeric +#define UMFPACK_save_symbolic umfpack_zl_save_symbolic +#define UMFPACK_load_numeric umfpack_zl_load_numeric +#define UMFPACK_load_symbolic umfpack_zl_load_symbolic +#define UMFPACK_scale umfpack_zl_scale +#define UMFPACK_solve umfpack_zl_solve +#define UMFPACK_symbolic umfpack_zl_symbolic + +#else + +#define Int int +#define UMFPACK_defaults umfpack_zi_defaults +#define UMFPACK_free_numeric umfpack_zi_free_numeric +#define UMFPACK_free_symbolic umfpack_zi_free_symbolic +#define UMFPACK_numeric umfpack_zi_numeric +#define UMFPACK_report_control umfpack_zi_report_control +#define UMFPACK_report_info umfpack_zi_report_info +#define UMFPACK_save_numeric umfpack_zi_save_numeric +#define UMFPACK_save_symbolic umfpack_zi_save_symbolic +#define UMFPACK_load_numeric umfpack_zi_load_numeric +#define UMFPACK_load_symbolic umfpack_zi_load_symbolic +#define UMFPACK_scale umfpack_zi_scale +#define UMFPACK_solve umfpack_zi_solve +#define UMFPACK_symbolic umfpack_zi_symbolic + +#endif + +/* -------------------------------------------------------------------------- */ +/* construct a file name from a file number (not user-callable) */ +/* -------------------------------------------------------------------------- */ + +static void make_filename (Int filenum, char *prefix, char *filename) +{ + char *psrc, *pdst ; +#ifdef ZLONG + sprintf (filename, "%s%ld.umf", prefix, filenum) ; +#else + sprintf (filename, "%s%d.umf", prefix, filenum) ; +#endif + /* remove any spaces in the filename */ + pdst = filename ; + for (psrc = filename ; *psrc ; psrc++) + { + if (!isspace (*psrc)) *pdst++ = *psrc ; + } + *pdst = '\0' ; +} + +/* ========================================================================== */ +/* === with underscore ====================================================== */ +/* ========================================================================== */ + +/* Solaris, Linux, and SGI IRIX. Probably Compaq Alpha as well. */ + +/* -------------------------------------------------------------------------- */ +/* umf4zdef: set default control parameters */ +/* -------------------------------------------------------------------------- */ + +/* call umf4zdef (control) */ + +void umf4zdef_ (double Control [UMFPACK_CONTROL]) +{ + UMFPACK_defaults (Control) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4zpcon: print control parameters */ +/* -------------------------------------------------------------------------- */ + +/* call umf4zpcon (control) */ + +void umf4zpcon_ (double Control [UMFPACK_CONTROL]) +{ + fflush (stdout) ; + UMFPACK_report_control (Control) ; + fflush (stdout) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4zsym: pre-ordering and symbolic factorization */ +/* -------------------------------------------------------------------------- */ + +/* call umf4zsym (m, n, Ap, Ai, Ax, Az, symbolic, control, info) */ + +void umf4zsym_ (Int *m, Int *n, Int Ap [ ], Int Ai [ ], + double Ax [ ], double Az [ ], void **Symbolic, + double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO]) +{ + (void) UMFPACK_symbolic (*m, *n, Ap, Ai, Ax, Az, Symbolic, Control, Info) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4znum: numeric factorization */ +/* -------------------------------------------------------------------------- */ + +/* call umf4znum (Ap, Ai, Ax, Az, symbolic, numeric, control, info) */ + +void umf4znum_ (Int Ap [ ], Int Ai [ ], double Ax [ ], double Az [ ], + void **Symbolic, void **Numeric, + double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO]) +{ + (void) UMFPACK_numeric (Ap, Ai, Ax, Az, *Symbolic, Numeric, Control, Info); +} + +/* -------------------------------------------------------------------------- */ +/* umf4zsolr: solve a linear system with iterative refinement */ +/* -------------------------------------------------------------------------- */ + +/* call umf4zsolr (sys, Ap, Ai, Ax, Az, x, xz, b, bz, numeric, control, info) */ + +void umf4zsolr_ (Int *sys, Int Ap [ ], Int Ai [ ], double Ax [ ], double Az [ ], + double x [ ], double xz [ ], double b [ ], double bz [ ], void **Numeric, + double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO]) +{ + (void) UMFPACK_solve (*sys, Ap, Ai, Ax, Az, x, xz, b, bz, + *Numeric, Control, Info) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4zsol: solve a linear system without iterative refinement */ +/* -------------------------------------------------------------------------- */ + +/* call umf4zsol (sys, x, xz, b, bz, numeric, control, info) */ + +void umf4zsol_ (Int *sys, double x [ ], double xz [ ], double b [ ], + double bz [ ], void **Numeric, + double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO]) +{ + Control [UMFPACK_IRSTEP] = 0 ; + (void) UMFPACK_solve (*sys, (Int *) NULL, (Int *) NULL, (double *) NULL, + (double *) NULL, x, xz, b, bz, *Numeric, Control, Info) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4zscal: scale a vector using UMFPACK's scale factors */ +/* -------------------------------------------------------------------------- */ + +/* call umf4zscal (x, xz, b, bz, numeric, status) */ + +void umf4zscal_ (double x [ ], double xz [ ], double b [ ], double bz [ ], + void **Numeric, Int *status) +{ + *status = UMFPACK_scale (x, xz, b, bz, *Numeric) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4zpinf: print info */ +/* -------------------------------------------------------------------------- */ + +/* call umf4zpinf (control) */ + +void umf4zpinf_ (double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO]) +{ + fflush (stdout) ; + UMFPACK_report_info (Control, Info) ; + fflush (stdout) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4zfnum: free the Numeric object */ +/* -------------------------------------------------------------------------- */ + +/* call umf4zfnum (numeric) */ + +void umf4zfnum_ (void **Numeric) +{ + UMFPACK_free_numeric (Numeric) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4zfsym: free the Symbolic object */ +/* -------------------------------------------------------------------------- */ + +/* call umf4zfsym (symbolic) */ + +void umf4zfsym_ (void **Symbolic) +{ + UMFPACK_free_symbolic (Symbolic) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4zsnum: save the Numeric object to a file */ +/* -------------------------------------------------------------------------- */ + +/* call umf4zsnum (numeric, filenum, status) */ + +void umf4zsnum_ (void **Numeric, Int *filenum, Int *status) +{ + char filename [LEN] ; + make_filename (*filenum, "n", filename) ; + *status = UMFPACK_save_numeric (*Numeric, filename) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4zssym: save the Symbolic object to a file */ +/* -------------------------------------------------------------------------- */ + +/* call umf4zssym (symbolic, filenum, status) */ + +void umf4zssym_ (void **Symbolic, Int *filenum, Int *status) +{ + char filename [LEN] ; + make_filename (*filenum, "s", filename) ; + *status = UMFPACK_save_symbolic (*Symbolic, filename) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4zlnum: load the Numeric object from a file */ +/* -------------------------------------------------------------------------- */ + +/* call umf4zlnum (numeric, filenum, status) */ + +void umf4zlnum_ (void **Numeric, Int *filenum, Int *status) +{ + char filename [LEN] ; + make_filename (*filenum, "n", filename) ; + *status = UMFPACK_load_numeric (Numeric, filename) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4zlsym: load the Symbolic object from a file */ +/* -------------------------------------------------------------------------- */ + +/* call umf4zlsym (symbolic, filenum, status) */ + +void umf4zlsym_ (void **Symbolic, Int *filenum, Int *status) +{ + char filename [LEN] ; + make_filename (*filenum, "s", filename) ; + *status = UMFPACK_load_symbolic (Symbolic, filename) ; +} + +/* ========================================================================== */ +/* === with no underscore =================================================== */ +/* ========================================================================== */ + +/* IBM AIX. Probably Microsoft Windows and HP Unix as well. */ + +/* -------------------------------------------------------------------------- */ +/* umf4zdef: set default control parameters */ +/* -------------------------------------------------------------------------- */ + +/* call umf4zdef (control) */ + +void umf4zdef (double Control [UMFPACK_CONTROL]) +{ + UMFPACK_defaults (Control) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4zpcon: print control parameters */ +/* -------------------------------------------------------------------------- */ + +/* call umf4zpcon (control) */ + +void umf4zpcon (double Control [UMFPACK_CONTROL]) +{ + fflush (stdout) ; + UMFPACK_report_control (Control) ; + fflush (stdout) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4zsym: pre-ordering and symbolic factorization */ +/* -------------------------------------------------------------------------- */ + +/* call umf4zsym (m, n, Ap, Ai, Ax, Az, symbolic, control, info) */ + +void umf4zsym (Int *m, Int *n, Int Ap [ ], Int Ai [ ], + double Ax [ ], double Az [ ], void **Symbolic, + double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO]) +{ + (void) UMFPACK_symbolic (*m, *n, Ap, Ai, Ax, Az, Symbolic, Control, Info) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4znum: numeric factorization */ +/* -------------------------------------------------------------------------- */ + +/* call umf4znum (Ap, Ai, Ax, Az, symbolic, numeric, control, info) */ + +void umf4znum (Int Ap [ ], Int Ai [ ], double Ax [ ], double Az [ ], + void **Symbolic, void **Numeric, + double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO]) +{ + (void) UMFPACK_numeric (Ap, Ai, Ax, Az, *Symbolic, Numeric, Control, Info); +} + +/* -------------------------------------------------------------------------- */ +/* umf4zsolr: solve a linear system with iterative refinement */ +/* -------------------------------------------------------------------------- */ + +/* call umf4zsolr (sys, Ap, Ai, Ax, Az, x, xz, b, bz, numeric, control, info) */ + +void umf4zsolr (Int *sys, Int Ap [ ], Int Ai [ ], double Ax [ ], double Az [ ], + double x [ ], double xz [ ], double b [ ], double bz [ ], void **Numeric, + double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO]) +{ + (void) UMFPACK_solve (*sys, Ap, Ai, Ax, Az, x, xz, b, bz, + *Numeric, Control, Info) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4zsol: solve a linear system without iterative refinement */ +/* -------------------------------------------------------------------------- */ + +/* call umf4zsol (sys, x, xz, b, bz, numeric, control, info) */ + +void umf4zsol (Int *sys, double x [ ], double xz [ ], double b [ ], + double bz [ ], void **Numeric, + double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO]) +{ + Control [UMFPACK_IRSTEP] = 0 ; + (void) UMFPACK_solve (*sys, (Int *) NULL, (Int *) NULL, (double *) NULL, + (double *) NULL, x, xz, b, bz, *Numeric, Control, Info) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4zscal: scale a vector using UMFPACK's scale factors */ +/* -------------------------------------------------------------------------- */ + +/* call umf4zscal (x, xz, b, bz, numeric, status) */ + +void umf4zscal (double x [ ], double xz [ ], double b [ ], double bz [ ], + void **Numeric, Int *status) +{ + *status = UMFPACK_scale (x, xz, b, bz, *Numeric) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4zpinf: print info */ +/* -------------------------------------------------------------------------- */ + +/* call umf4zpinf (control) */ + +void umf4zpinf (double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO]) +{ + fflush (stdout) ; + UMFPACK_report_info (Control, Info) ; + fflush (stdout) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4zfnum: free the Numeric object */ +/* -------------------------------------------------------------------------- */ + +/* call umf4zfnum (numeric) */ + +void umf4zfnum (void **Numeric) +{ + UMFPACK_free_numeric (Numeric) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4zfsym: free the Symbolic object */ +/* -------------------------------------------------------------------------- */ + +/* call umf4zfsym (symbolic) */ + +void umf4zfsym (void **Symbolic) +{ + UMFPACK_free_symbolic (Symbolic) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4zsnum: save the Numeric object to a file */ +/* -------------------------------------------------------------------------- */ + +/* call umf4zsnum (numeric, filenum, status) */ + +void umf4zsnum (void **Numeric, Int *filenum, Int *status) +{ + char filename [LEN] ; + make_filename (*filenum, "n", filename) ; + *status = UMFPACK_save_numeric (*Numeric, filename) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4zssym: save the Symbolic object to a file */ +/* -------------------------------------------------------------------------- */ + +/* call umf4zssym (symbolic, filenum, status) */ + +void umf4zssym (void **Symbolic, Int *filenum, Int *status) +{ + char filename [LEN] ; + make_filename (*filenum, "s", filename) ; + *status = UMFPACK_save_symbolic (*Symbolic, filename) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4zlnum: load the Numeric object from a file */ +/* -------------------------------------------------------------------------- */ + +/* call umf4zlnum (numeric, filenum, status) */ + +void umf4zlnum (void **Numeric, Int *filenum, Int *status) +{ + char filename [LEN] ; + make_filename (*filenum, "n", filename) ; + *status = UMFPACK_load_numeric (Numeric, filename) ; +} + +/* -------------------------------------------------------------------------- */ +/* umf4zlsym: load the Symbolic object from a file */ +/* -------------------------------------------------------------------------- */ + +/* call umf4zlsym (symbolic, filenum, status) */ + +void umf4zlsym (void **Symbolic, Int *filenum, Int *status) +{ + char filename [LEN] ; + make_filename (*filenum, "s", filename) ; + *status = UMFPACK_load_symbolic (Symbolic, filename) ; +} + diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Demo/umf4hb.f --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Demo/umf4hb.f Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,353 @@ +c======================================================================= +c== umf4hb ============================================================= +c======================================================================= + +c----------------------------------------------------------------------- +c UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE +c Dept, Univ. of Florida. All Rights Reserved. See ../Doc/License for +c License. web: http://www.cise.ufl.edu/research/sparse/umfpack +c----------------------------------------------------------------------- + +c umf4hb: +c read a sparse matrix in the Harwell/Boeing format, factorizes +c it, and solves Ax=b. Also saves and loads the factors to/from a +c file. Saving to a file is not required, it's just here to +c demonstrate how to use this feature of UMFPACK. This program +c only works on square RUA-type matrices. +c +c This is HIGHLY non-portable. It may not work with your C and +c FORTRAN compilers. See umf4_f77wrapper.c for more details. +c +c usage (for example): +c +c in a Unix shell: +c umf4hb < HB/arc130.rua + + integer + $ nzmax, nmax + parameter (nzmax = 5000000, nmax = 160000) + integer + $ Ap (nmax), Ai (nzmax), n, nz, totcrd, ptrcrd, i, j, p, + $ indcrd, valcrd, rhscrd, ncol, nrow, nrhs, nzrhs, nel, + $ numeric, symbolic, status, sys, filenum + + character title*72, key*30, type*3, ptrfmt*16, + $ indfmt*16, valfmt*20, rhsfmt*20 + double precision Ax (nzmax), x (nmax), b (nmax), aij, xj, + $ r (nmax), control (20), info (90) + character rhstyp*3 + +c ---------------------------------------------------------------- +c read the Harwell/Boeing matrix +c ---------------------------------------------------------------- + + read (5, 10, err = 998) + $ title, key, + $ totcrd, ptrcrd, indcrd, valcrd, rhscrd, + $ type, nrow, ncol, nz, nel, + $ ptrfmt, indfmt, valfmt, rhsfmt + if (rhscrd .gt. 0) then +c new Harwell/Boeing format: + read (5, 20, err = 998) rhstyp, nrhs, nzrhs + endif +10 format (a72, a8 / 5i14 / a3, 11x, 4i14 / 2a16, 2a20) +20 format (a3, 11x, 2i14) + + print *, 'Matrix key: ', key + + n = nrow + if (type .ne. 'RUA' .or. nrow .ne. ncol) then + print *, 'Error: can only handle square RUA matrices' + stop + endif + if (n .ge. nmax .or. nz .gt. nzmax) then + print *, ' Matrix too big!' + stop + endif + +c read the matrix (1-based) + read (5, ptrfmt, err = 998) (Ap (p), p = 1, ncol+1) + read (5, indfmt, err = 998) (Ai (p), p = 1, nz) + read (5, valfmt, err = 998) (Ax (p), p = 1, nz) + +c ---------------------------------------------------------------- +c create the right-hand-side, assume x (i) = 1 + i/n +c ---------------------------------------------------------------- + + do 30 i = 1,n + b (i) = 0 +30 continue +c b = A*x + do 50 j = 1,n + xj = j + xj = 1 + xj / n + do 40 p = Ap (j), Ap (j+1)-1 + i = Ai (p) + aij = Ax (p) + b (i) = b (i) + aij * xj +40 continue +50 continue + +c ---------------------------------------------------------------- +c convert from 1-based to 0-based +c ---------------------------------------------------------------- + + do 60 j = 1, n+1 + Ap (j) = Ap (j) - 1 +60 continue + do 70 p = 1, nz + Ai (p) = Ai (p) - 1 +70 continue + +c ---------------------------------------------------------------- +c factor the matrix and save to a file +c ---------------------------------------------------------------- + +c set default parameters + call umf4def (control) + +c print control parameters. set control (1) to 1 to print +c error messages only + control (1) = 2 + call umf4pcon (control) + +c pre-order and symbolic analysis + call umf4sym (n, n, Ap, Ai, Ax, symbolic, control, info) + +c print statistics computed so far +c call umf4pinf (control, info) could also be done. + print 80, info (1), info (16), + $ (info (21) * info (4)) / 2**20, + $ (info (22) * info (4)) / 2**20, + $ info (23), info (24), info (25) +80 format ('symbolic analysis:',/, + $ ' status: ', f5.0, /, + $ ' time: ', e10.2, ' (sec)'/, + $ ' estimates (upper bound) for numeric LU:', /, + $ ' size of LU: ', f10.2, ' (MB)', /, + $ ' memory needed: ', f10.2, ' (MB)', /, + $ ' flop count: ', e10.2, / + $ ' nnz (L): ', f10.0, / + $ ' nnz (U): ', f10.0) + +c check umf4sym error condition + if (info (1) .lt. 0) then + print *, 'Error occurred in umf4sym: ', info (1) + stop + endif + +c numeric factorization + call umf4num (Ap, Ai, Ax, symbolic, numeric, control, info) + +c print statistics for the numeric factorization +c call umf4pinf (control, info) could also be done. + print 90, info (1), info (66), + $ (info (41) * info (4)) / 2**20, + $ (info (42) * info (4)) / 2**20, + $ info (43), info (44), info (45) +90 format ('numeric factorization:',/, + $ ' status: ', f5.0, /, + $ ' time: ', e10.2, /, + $ ' actual numeric LU statistics:', /, + $ ' size of LU: ', f10.2, ' (MB)', /, + $ ' memory needed: ', f10.2, ' (MB)', /, + $ ' flop count: ', e10.2, / + $ ' nnz (L): ', f10.0, / + $ ' nnz (U): ', f10.0) + +c check umf4num error condition + if (info (1) .lt. 0) then + print *, 'Error occurred in umf4num: ', info (1) + stop + endif + +c save the symbolic analysis to the file s0.umf +c note that this is not needed until another matrix is +c factorized, below. + filenum = 0 + call umf4ssym (symbolic, filenum, status) + if (status .lt. 0) then + print *, 'Error occurred in umf4ssym: ', status + stop + endif + +c save the LU factors to the file n0.umf + call umf4snum (numeric, filenum, status) + if (status .lt. 0) then + print *, 'Error occurred in umf4snum: ', status + stop + endif + +c free the symbolic analysis + call umf4fsym (symbolic) + +c free the numeric factorization + call umf4fnum (numeric) + +c No LU factors (symbolic or numeric) are in memory at this point. + +c ---------------------------------------------------------------- +c load the LU factors back in, and solve the system +c ---------------------------------------------------------------- + +c At this point the program could terminate and load the LU +C factors (numeric) from the n0.umf file, and solve the +c system (see below). Note that the symbolic object is not +c required. + +c load the numeric factorization back in (filename: n0.umf) + call umf4lnum (numeric, filenum, status) + if (status .lt. 0) then + print *, 'Error occurred in umf4lnum: ', status + stop + endif + +c solve Ax=b, without iterative refinement + sys = 0 + call umf4sol (sys, x, b, numeric, control, info) + if (info (1) .lt. 0) then + print *, 'Error occurred in umf4sol: ', info (1) + stop + endif + +c free the numeric factorization + call umf4fnum (numeric) + +c No LU factors (symbolic or numeric) are in memory at this point. + +c print final statistics + call umf4pinf (control, info) + +c print the residual. x (i) should be 1 + i/n + call resid (n, nz, Ap, Ai, Ax, x, b, r) + +c ---------------------------------------------------------------- +c load the symbolic analysis back in, and factorize a new matrix +c ---------------------------------------------------------------- + +c Again, the program could terminate here, recreate the matrix, +c and refactorize. Note that umf4sym is not called. + +c load the symbolic factorization back in (filename: s0.umf) + call umf4lsym (symbolic, filenum, status) + if (status .lt. 0) then + print *, 'Error occurred in umf4lsym: ', status + stop + endif + +c arbitrarily change the values of the matrix but not the pattern + do 100 p = 1, nz + Ax (p) = Ax (p) + 3.14159 / 100.0 +100 continue + +c numeric factorization of the modified matrix + call umf4num (Ap, Ai, Ax, symbolic, numeric, control, info) + if (info (1) .lt. 0) then + print *, 'Error occurred in umf4num: ', info (1) + stop + endif + +c free the symbolic analysis + call umf4fsym (symbolic) + +c create a new right-hand-side, assume x (i) = 7 - i/n + do 110 i = 1,n + b (i) = 0 +110 continue +c b = A*x, with the modified matrix A (note that A is now 0-based) + do 130 j = 1,n + xj = j + xj = 7 - xj / n + do 120 p = Ap (j) + 1, Ap (j+1) + i = Ai (p) + 1 + aij = Ax (p) + b (i) = b (i) + aij * xj +120 continue +130 continue + +c ---------------------------------------------------------------- +c solve Ax=b, with iterative refinement +c ---------------------------------------------------------------- + + sys = 0 + call umf4solr (sys, Ap, Ai, Ax, x, b, numeric, control, info) + if (info (1) .lt. 0) then + print *, 'Error occurred in umf4solr: ', info (1) + stop + endif + +c print the residual. x (i) should be 7 - i/n + call resid (n, nz, Ap, Ai, Ax, x, b, r) + +c ---------------------------------------------------------------- +c solve Ax=b, without iterative refinement, broken into steps +c ---------------------------------------------------------------- + +c the factorization is PAQ=LU, PRAQ=LU, or P(R\A)Q=LU. + +c x = R*b (or x=R\b, or x=b, as appropriate) + call umf4scal (x, b, numeric, status) + if (status .lt. 0) then + print *, 'Error occurred in umf4scal: ', status + stop + endif + +c solve P'Lr=x for r (using r as workspace) + sys = 3 + call umf4sol (sys, r, x, numeric, control, info) + if (info (1) .lt. 0) then + print *, 'Error occurred in umf4sol: ', info (1) + stop + endif + +c solve UQ'x=r for x + sys = 9 + call umf4sol (sys, x, r, numeric, control, info) + if (info (1) .lt. 0) then + print *, 'Error occurred in umf4sol: ', info (1) + stop + endif + +c free the numeric factorization + call umf4fnum (numeric) + +c print the residual. x (i) should be 7 - i/n + call resid (n, nz, Ap, Ai, Ax, x, b, r) + + stop +998 print *, 'Read error: Harwell/Boeing matrix' + stop + end + +c======================================================================= +c== resid ============================================================== +c======================================================================= + +c Compute the residual, r = Ax-b, its max-norm, and print the max-norm +C Note that A is zero-based. + + subroutine resid (n, nz, Ap, Ai, Ax, x, b, r) + integer + $ n, nz, Ap (n+1), Ai (n), j, i, p + double precision Ax (nz), x (n), b (n), r (n), rmax, aij + + do 10 i = 1, n + r (i) = -b (i) +10 continue + + do 30 j = 1,n + do 20 p = Ap (j) + 1, Ap (j+1) + i = Ai (p) + 1 + aij = Ax (p) + r (i) = r (i) + aij * x (j) +20 continue +30 continue + + rmax = 0 + do 40 i = 1, n + rmax = max (rmax, r (i)) +40 continue + + print *, 'norm (A*x-b): ', rmax + return + end diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Demo/umf4hb.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Demo/umf4hb.out Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,143 @@ + Matrix key: WEST0067 + +UMFPACK V4.4 (Jan. 28, 2005), Control: + + Matrix entry defined as: double + Int (generic integer) defined as: int + + 0: print level: 2 + 1: dense row parameter: 0.2 + "dense" rows have > max (16, (0.2)*16*sqrt(n_col) entries) + 2: dense column parameter: 0.2 + "dense" columns have > max (16, (0.2)*16*sqrt(n_row) entries) + 3: pivot tolerance: 0.1 + 4: block size for dense matrix kernels: 32 + 5: strategy: 0 (auto) + 6: initial allocation ratio: 0.7 + 7: max iterative refinement steps: 2 + 12: 2-by-2 pivot tolerance: 0.01 + 13: Q fixed during numerical factorization: 0 (auto) + 14: AMD dense row/col parameter: 10 + "dense" rows/columns have > max (16, (10)*sqrt(n)) entries + Only used if the AMD ordering is used. + 15: diagonal pivot tolerance: 0.001 + Only used if diagonal pivoting is attempted. + 16: scaling: 1 (divide each row by sum of abs. values in each row) + 17: frontal matrix allocation ratio: 0.5 + 18: drop tolerance: 0 + 19: AMD and COLAMD aggressive absorption: 1 (yes) + + The following options can only be changed at compile-time: + 8: BLAS library used: none. UMFPACK will be slow. + 9: compiled for ANSI C (uses malloc, free, realloc, and printf) + 10: CPU timer is POSIX times ( ) routine. + 11: compiled for normal operation (debugging disabled) + computer/operating system: Linux + size of int: 4 long: 4 Int: 4 pointer: 4 double: 8 Entry: 8 (in bytes) + +symbolic analysis: + status: 0. + time: 0.00E+00 (sec) + estimates (upper bound) for numeric LU: + size of LU: 0.02 (MB) + memory needed: 0.06 (MB) + flop count: 0.14E+05 + nnz (L): 542. + nnz (U): 902. +numeric factorization: + status: 0. + time: 0.00E+00 + actual numeric LU statistics: + size of LU: 0.01 (MB) + memory needed: 0.04 (MB) + flop count: 0.26E+04 + nnz (L): 329. + nnz (U): 340. + +UMFPACK V4.4 (Jan. 28, 2005), Info: + matrix entry defined as: double + Int (generic integer) defined as: int + BLAS library used: none. UMFPACK will be slow. + MATLAB: no. + CPU timer: POSIX times ( ) routine. + number of rows in matrix A: 67 + number of columns in matrix A: 67 + entries in matrix A: 294 + memory usage reported in: 8-byte Units + size of int: 4 bytes + size of long: 4 bytes + size of pointer: 4 bytes + size of numerical entry: 8 bytes + + strategy used: unsymmetric + ordering used: colamd on A + modify Q during factorization: yes + prefer diagonal pivoting: no + pivots with zero Markowitz cost: 1 + submatrix S after removing zero-cost pivots: + number of "dense" rows: 0 + number of "dense" columns: 0 + number of empty rows: 0 + number of empty columns 0 + submatrix S not square or diagonal not preserved + symbolic factorization defragmentations: 1 + symbolic memory usage (Units): 1632 + symbolic memory usage (MBytes): 0.0 + Symbolic size (Units): 245 + Symbolic size (MBytes): 0 + symbolic factorization CPU time (sec): 0.00 + symbolic factorization wallclock time(sec): 0.00 + + matrix scaled: yes (divided each row by sum of abs values in each row) + minimum sum (abs (rows of A)): 1.00000e+00 + maximum sum (abs (rows of A)): 6.59006e+00 + + symbolic/numeric factorization: upper bound actual % + variable-sized part of Numeric object: + initial size (Units) 1643 1574 96% + peak size (Units) 6115 3581 59% + final size (Units) 1628 685 42% + Numeric final size (Units) 2101 1125 54% + Numeric final size (MBytes) 0.0 0.0 54% + peak memory usage (Units) 7462 4928 66% + peak memory usage (MBytes) 0.1 0.0 66% + numeric factorization flops 1.41920e+04 2.58700e+03 18% + nz in L (incl diagonal) 542 329 61% + nz in U (incl diagonal) 902 340 38% + nz in L+U (incl diagonal) 1377 602 44% + largest front (# entries) 483 80 17% + largest # rows in front 21 10 48% + largest # columns in front 23 11 48% + + initial allocation ratio used: 0.7 + # of forced updates due to frontal growth: 0 + nz in L (incl diagonal), if none dropped 329 + nz in U (incl diagonal), if none dropped 340 + number of small entries dropped 0 + nonzeros on diagonal of U: 67 + min abs. value on diagonal of U: 2.74e-02 + max abs. value on diagonal of U: 2.28e+00 + estimate of reciprocal of condition number: 1.20e-02 + indices in compressed pattern: 256 + numerical values stored in Numeric object: 605 + numeric factorization defragmentations: 1 + numeric factorization reallocations: 1 + costly numeric factorization reallocations: 0 + numeric factorization CPU time (sec): 0.00 + numeric factorization wallclock time (sec): 0.00 + symbolic + numeric CPU time (sec): 0.00 + symbolic + numeric wall clock time (sec): 0.00 + + solve flops: 1.20400e+03 + iterative refinement steps taken: 0 + iterative refinement steps attempted: 0 + solve CPU time (sec): 0.00 + solve wall clock time (sec): 0.00 + + total symbolic + numeric + solve flops: 3.79100e+03 + total symbolic + numeric + solve CPU time: 0.00 + total symbolic+numeric+solve wall clock time: 0.00 + + norm (A*x-b): 2.22044605E-15 + norm (A*x-b): 1.05076538E-14 + norm (A*x-b): 1.05076538E-14 diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Demo/umf4hb64.f --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Demo/umf4hb64.f Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,353 @@ +c======================================================================= +c== umf4hb ============================================================= +c======================================================================= + +c----------------------------------------------------------------------- +c UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE +c Dept, Univ. of Florida. All Rights Reserved. See ../Doc/License for +c License. web: http://www.cise.ufl.edu/research/sparse/umfpack +c----------------------------------------------------------------------- + +c umf4hb64: +c read a sparse matrix in the Harwell/Boeing format, factorizes +c it, and solves Ax=b. Also saves and loads the factors to/from a +c file. Saving to a file is not required, it's just here to +c demonstrate how to use this feature of UMFPACK. This program +c only works on square RUA-type matrices. +c +c This is HIGHLY non-portable. It may not work with your C and +c FORTRAN compilers. See umf4_f77wrapper.c for more details. +c +c usage (for example): +c +c in a Unix shell: +c umf4hb64 < HB/arc130.rua + + integer*8 + $ nzmax, nmax + parameter (nzmax = 5000000, nmax = 160000) + integer*8 + $ Ap (nmax), Ai (nzmax), n, nz, totcrd, ptrcrd, i, j, p, + $ indcrd, valcrd, rhscrd, ncol, nrow, nrhs, nzrhs, nel, + $ numeric, symbolic, status, sys, filenum + + character title*72, key*30, type*3, ptrfmt*16, + $ indfmt*16, valfmt*20, rhsfmt*20 + double precision Ax (nzmax), x (nmax), b (nmax), aij, xj, + $ r (nmax), control (20), info (90) + character rhstyp*3 + +c ---------------------------------------------------------------- +c read the Harwell/Boeing matrix +c ---------------------------------------------------------------- + + read (5, 10, err = 998) + $ title, key, + $ totcrd, ptrcrd, indcrd, valcrd, rhscrd, + $ type, nrow, ncol, nz, nel, + $ ptrfmt, indfmt, valfmt, rhsfmt + if (rhscrd .gt. 0) then +c new Harwell/Boeing format: + read (5, 20, err = 998) rhstyp, nrhs, nzrhs + endif +10 format (a72, a8 / 5i14 / a3, 11x, 4i14 / 2a16, 2a20) +20 format (a3, 11x, 2i14) + + print *, 'Matrix key: ', key + + n = nrow + if (type .ne. 'RUA' .or. nrow .ne. ncol) then + print *, 'Error: can only handle square RUA matrices' + stop + endif + if (n .ge. nmax .or. nz .gt. nzmax) then + print *, ' Matrix too big!' + stop + endif + +c read the matrix (1-based) + read (5, ptrfmt, err = 998) (Ap (p), p = 1, ncol+1) + read (5, indfmt, err = 998) (Ai (p), p = 1, nz) + read (5, valfmt, err = 998) (Ax (p), p = 1, nz) + +c ---------------------------------------------------------------- +c create the right-hand-side, assume x (i) = 1 + i/n +c ---------------------------------------------------------------- + + do 30 i = 1,n + b (i) = 0 +30 continue +c b = A*x + do 50 j = 1,n + xj = j + xj = 1 + xj / n + do 40 p = Ap (j), Ap (j+1)-1 + i = Ai (p) + aij = Ax (p) + b (i) = b (i) + aij * xj +40 continue +50 continue + +c ---------------------------------------------------------------- +c convert from 1-based to 0-based +c ---------------------------------------------------------------- + + do 60 j = 1, n+1 + Ap (j) = Ap (j) - 1 +60 continue + do 70 p = 1, nz + Ai (p) = Ai (p) - 1 +70 continue + +c ---------------------------------------------------------------- +c factor the matrix and save to a file +c ---------------------------------------------------------------- + +c set default parameters + call umf4def (control) + +c print control parameters. set control (1) to 1 to print +c error messages only + control (1) = 2 + call umf4pcon (control) + +c pre-order and symbolic analysis + call umf4sym (n, n, Ap, Ai, Ax, symbolic, control, info) + +c print statistics computed so far +c call umf4pinf (control, info) could also be done. + print 80, info (1), info (16), + $ (info (21) * info (4)) / 2**20, + $ (info (22) * info (4)) / 2**20, + $ info (23), info (24), info (25) +80 format ('symbolic analysis:',/, + $ ' status: ', f5.0, /, + $ ' time: ', e10.2, ' (sec)'/, + $ ' estimates (upper bound) for numeric LU:', /, + $ ' size of LU: ', f10.2, ' (MB)', /, + $ ' memory needed: ', f10.2, ' (MB)', /, + $ ' flop count: ', e10.2, / + $ ' nnz (L): ', f10.0, / + $ ' nnz (U): ', f10.0) + +c check umf4sym error condition + if (info (1) .lt. 0) then + print *, 'Error occurred in umf4sym: ', info (1) + stop + endif + +c numeric factorization + call umf4num (Ap, Ai, Ax, symbolic, numeric, control, info) + +c print statistics for the numeric factorization +c call umf4pinf (control, info) could also be done. + print 90, info (1), info (66), + $ (info (41) * info (4)) / 2**20, + $ (info (42) * info (4)) / 2**20, + $ info (43), info (44), info (45) +90 format ('numeric factorization:',/, + $ ' status: ', f5.0, /, + $ ' time: ', e10.2, /, + $ ' actual numeric LU statistics:', /, + $ ' size of LU: ', f10.2, ' (MB)', /, + $ ' memory needed: ', f10.2, ' (MB)', /, + $ ' flop count: ', e10.2, / + $ ' nnz (L): ', f10.0, / + $ ' nnz (U): ', f10.0) + +c check umf4num error condition + if (info (1) .lt. 0) then + print *, 'Error occurred in umf4num: ', info (1) + stop + endif + +c save the symbolic analysis to the file s0.umf +c note that this is not needed until another matrix is +c factorized, below. + filenum = 0 + call umf4ssym (symbolic, filenum, status) + if (status .lt. 0) then + print *, 'Error occurred in umf4ssym: ', status + stop + endif + +c save the LU factors to the file n0.umf + call umf4snum (numeric, filenum, status) + if (status .lt. 0) then + print *, 'Error occurred in umf4snum: ', status + stop + endif + +c free the symbolic analysis + call umf4fsym (symbolic) + +c free the numeric factorization + call umf4fnum (numeric) + +c No LU factors (symbolic or numeric) are in memory at this point. + +c ---------------------------------------------------------------- +c load the LU factors back in, and solve the system +c ---------------------------------------------------------------- + +c At this point the program could terminate and load the LU +C factors (numeric) from the n0.umf file, and solve the +c system (see below). Note that the symbolic object is not +c required. + +c load the numeric factorization back in (filename: n0.umf) + call umf4lnum (numeric, filenum, status) + if (status .lt. 0) then + print *, 'Error occurred in umf4lnum: ', status + stop + endif + +c solve Ax=b, without iterative refinement + sys = 0 + call umf4sol (sys, x, b, numeric, control, info) + if (info (1) .lt. 0) then + print *, 'Error occurred in umf4sol: ', info (1) + stop + endif + +c free the numeric factorization + call umf4fnum (numeric) + +c No LU factors (symbolic or numeric) are in memory at this point. + +c print final statistics + call umf4pinf (control, info) + +c print the residual. x (i) should be 1 + i/n + call resid (n, nz, Ap, Ai, Ax, x, b, r) + +c ---------------------------------------------------------------- +c load the symbolic analysis back in, and factorize a new matrix +c ---------------------------------------------------------------- + +c Again, the program could terminate here, recreate the matrix, +c and refactorize. Note that umf4sym is not called. + +c load the symbolic factorization back in (filename: s0.umf) + call umf4lsym (symbolic, filenum, status) + if (status .lt. 0) then + print *, 'Error occurred in umf4lsym: ', status + stop + endif + +c arbitrarily change the values of the matrix but not the pattern + do 100 p = 1, nz + Ax (p) = Ax (p) + 3.14159 / 100.0 +100 continue + +c numeric factorization of the modified matrix + call umf4num (Ap, Ai, Ax, symbolic, numeric, control, info) + if (info (1) .lt. 0) then + print *, 'Error occurred in umf4num: ', info (1) + stop + endif + +c free the symbolic analysis + call umf4fsym (symbolic) + +c create a new right-hand-side, assume x (i) = 7 - i/n + do 110 i = 1,n + b (i) = 0 +110 continue +c b = A*x, with the modified matrix A (note that A is now 0-based) + do 130 j = 1,n + xj = j + xj = 7 - xj / n + do 120 p = Ap (j) + 1, Ap (j+1) + i = Ai (p) + 1 + aij = Ax (p) + b (i) = b (i) + aij * xj +120 continue +130 continue + +c ---------------------------------------------------------------- +c solve Ax=b, with iterative refinement +c ---------------------------------------------------------------- + + sys = 0 + call umf4solr (sys, Ap, Ai, Ax, x, b, numeric, control, info) + if (info (1) .lt. 0) then + print *, 'Error occurred in umf4solr: ', info (1) + stop + endif + +c print the residual. x (i) should be 7 - i/n + call resid (n, nz, Ap, Ai, Ax, x, b, r) + +c ---------------------------------------------------------------- +c solve Ax=b, without iterative refinement, broken into steps +c ---------------------------------------------------------------- + +c the factorization is PAQ=LU, PRAQ=LU, or P(R\A)Q=LU. + +c x = R*b (or x=R\b, or x=b, as appropriate) + call umf4scal (x, b, numeric, status) + if (status .lt. 0) then + print *, 'Error occurred in umf4scal: ', status + stop + endif + +c solve P'Lr=x for r (using r as workspace) + sys = 3 + call umf4sol (sys, r, x, numeric, control, info) + if (info (1) .lt. 0) then + print *, 'Error occurred in umf4sol: ', info (1) + stop + endif + +c solve UQ'x=r for x + sys = 9 + call umf4sol (sys, x, r, numeric, control, info) + if (info (1) .lt. 0) then + print *, 'Error occurred in umf4sol: ', info (1) + stop + endif + +c free the numeric factorization + call umf4fnum (numeric) + +c print the residual. x (i) should be 7 - i/n + call resid (n, nz, Ap, Ai, Ax, x, b, r) + + stop +998 print *, 'Read error: Harwell/Boeing matrix' + stop + end + +c======================================================================= +c== resid ============================================================== +c======================================================================= + +c Compute the residual, r = Ax-b, its max-norm, and print the max-norm +C Note that A is zero-based. + + subroutine resid (n, nz, Ap, Ai, Ax, x, b, r) + integer*8 + $ n, nz, Ap (n+1), Ai (n), j, i, p + double precision Ax (nz), x (n), b (n), r (n), rmax, aij + + do 10 i = 1, n + r (i) = -b (i) +10 continue + + do 30 j = 1,n + do 20 p = Ap (j) + 1, Ap (j+1) + i = Ai (p) + 1 + aij = Ax (p) + r (i) = r (i) + aij * x (j) +20 continue +30 continue + + rmax = 0 + do 40 i = 1, n + rmax = max (rmax, r (i)) +40 continue + + print *, 'norm (A*x-b): ', rmax + return + end diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Demo/umf4zhb.f --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Demo/umf4zhb.f Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,279 @@ +c======================================================================= +c== umf4zhb ============================================================ +c======================================================================= + +c----------------------------------------------------------------------- +c UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE +c Dept, Univ. of Florida. All Rights Reserved. See ../Doc/License for +c License. web: http://www.cise.ufl.edu/research/sparse/umfpack +c----------------------------------------------------------------------- + +c umf4zhb: +c read a sparse matrix in the Harwell/Boeing format, factorizes +c it, and solves Ax=b. Also saves and loads the factors to/from a +c file. Saving to a file is not required, it's just here to +c demonstrate how to use this feature of UMFPACK. This program +c only works on square CUA-type matrices. +c +c This is HIGHLY non-portable. It may not work with your C and +c FORTRAN compilers. See umf4z_f77wrapper.c for more details. +c +c usage (for example): +c +c in a Unix shell: +c umf4zhb < HB/arc130.cua + + integer + $ nzmax, nmax + parameter (nzmax = 5000000, nmax = 160000) + integer + $ Ap (nmax), Ai (nzmax), n, nz, totcrd, ptrcrd, i, j, p, + $ indcrd, valcrd, rhscrd, ncol, nrow, nrhs, nzrhs, nel, + $ numeric, symbolic, status, sys, filenum + + character title*72, key*30, type*3, ptrfmt*16, + $ indfmt*16, valfmt*20, rhsfmt*20 + double precision Ax (nzmax), x (nmax), b (nmax), + $ control (20), info (90) + complex*16 AA (nzmax), XX (nmax), BB (nmax), r (nmax), aij, xj + double precision Az (nmax), xz (nmax), bz (nmax), xi, xr + character rhstyp*3 + +c ---------------------------------------------------------------- +c read the Harwell/Boeing matrix +c ---------------------------------------------------------------- + + read (5, 10, err = 998) + $ title, key, + $ totcrd, ptrcrd, indcrd, valcrd, rhscrd, + $ type, nrow, ncol, nz, nel, + $ ptrfmt, indfmt, valfmt, rhsfmt + if (rhscrd .gt. 0) then +c new Harwell/Boeing format: + read (5, 20, err = 998) rhstyp, nrhs, nzrhs + endif +10 format (a72, a8 / 5i14 / a3, 11x, 4i14 / 2a16, 2a20) +20 format (a3, 11x, 2i14) + + print *, 'Matrix key: ', key + + n = nrow + if (type .ne. 'CUA' .or. nrow .ne. ncol) then + print *, 'Error: can only handle square CUA matrices' + stop + endif + if (n .ge. nmax .or. nz .gt. nzmax) then + print *, ' Matrix too big!' + stop + endif + +c read the matrix (1-based) + read (5, ptrfmt, err = 998) (Ap (p), p = 1, ncol+1) + read (5, indfmt, err = 998) (Ai (p), p = 1, nz) + read (5, valfmt, err = 998) (AA (p), p = 1, nz) + + do 15 p = 1, nz + Ax (p) = dble (AA (p)) + Az (p) = imag (AA (p)) +15 continue + +c ---------------------------------------------------------------- +c create the right-hand-side, assume +c x (i) = (1 + i/n), (n + i/100) +c ---------------------------------------------------------------- + + do 30 i = 1,n + BB (i) = 0 +30 continue +c b = A*x + do 50 j = 1,n + xr = j + xi = n + xi = xi + xr/100 + xr = 1 + xr / n + xj = dcmplx (xr, xi) + do 40 p = Ap (j), Ap (j+1)-1 + i = Ai (p) + aij = AA (p) + BB (i) = BB (i) + aij * xj +40 continue +50 continue + do 32 i = 1,n + b (i) = dble (BB (i)) + bz (i) = imag (BB (i)) +32 continue + +c ---------------------------------------------------------------- +c convert from 1-based to 0-based +c ---------------------------------------------------------------- + + do 60 j = 1, n+1 + Ap (j) = Ap (j) - 1 +60 continue + do 70 p = 1, nz + Ai (p) = Ai (p) - 1 +70 continue + +c ---------------------------------------------------------------- +c factor the matrix and save to a file +c ---------------------------------------------------------------- + +c set default parameters + call umf4zdef (control) + +c print control parameters. set control (1) to 1 to print +c error messages only + control (1) = 2 + call umf4zpcon (control) + +c pre-order and symbolic analysis + call umf4zsym (n, n, Ap, Ai, Ax, Az, symbolic, control, info) + +c print statistics computed so far +c call umf4zpinf (control, info) could also be done. + print 80, info (1), info (16), + $ (info (21) * info (4)) / 2**20, + $ (info (22) * info (4)) / 2**20, + $ info (23), info (24), info (25) +80 format ('symbolic analysis:',/, + $ ' status: ', f5.0, /, + $ ' time: ', e10.2, ' (sec)'/, + $ ' estimates (upper bound) for numeric LU:', /, + $ ' size of LU: ', f10.2, ' (MB)', /, + $ ' memory needed: ', f10.2, ' (MB)', /, + $ ' flop count: ', e10.2, / + $ ' nnz (L): ', f10.0, / + $ ' nnz (U): ', f10.0) + +c check umf4zsym error condition + if (info (1) .lt. 0) then + print *, 'Error occurred in umf4zsym: ', info (1) + stop + endif + +c numeric factorization + call umf4znum (Ap, Ai, Ax, Az, symbolic, numeric, control, info) + +c print statistics for the numeric factorization +c call umf4zpinf (control, info) could also be done. + print 90, info (1), info (66), + $ (info (41) * info (4)) / 2**20, + $ (info (42) * info (4)) / 2**20, + $ info (43), info (44), info (45) +90 format ('numeric factorization:',/, + $ ' status: ', f5.0, /, + $ ' time: ', e10.2, /, + $ ' actual numeric LU statistics:', /, + $ ' size of LU: ', f10.2, ' (MB)', /, + $ ' memory needed: ', f10.2, ' (MB)', /, + $ ' flop count: ', e10.2, / + $ ' nnz (L): ', f10.0, / + $ ' nnz (U): ', f10.0) + +c check umf4znum error condition + if (info (1) .lt. 0) then + print *, 'Error occurred in umf4znum: ', info (1) + stop + endif + +c save the symbolic analysis to the file s42.umf +c note that this is not needed until another matrix is +c factorized, below. + filenum = 42 + call umf4zssym (symbolic, filenum, status) + if (status .lt. 0) then + print *, 'Error occurred in umf4zssym: ', status + stop + endif + +c save the LU factors to the file n0.umf + call umf4zsnum (numeric, filenum, status) + if (status .lt. 0) then + print *, 'Error occurred in umf4zsnum: ', status + stop + endif + +c free the symbolic analysis + call umf4zfsym (symbolic) + +c free the numeric factorization + call umf4zfnum (numeric) + +c No LU factors (symbolic or numeric) are in memory at this point. + +c ---------------------------------------------------------------- +c load the LU factors back in, and solve the system +c ---------------------------------------------------------------- + +c At this point the program could terminate and load the LU +C factors (numeric) from the n0.umf file, and solve the +c system (see below). Note that the symbolic object is not +c required. + +c load the numeric factorization back in (filename: n0.umf) + call umf4zlnum (numeric, filenum, status) + if (status .lt. 0) then + print *, 'Error occurred in umf4zlnum: ', status + stop + endif + +c solve Ax=b, without iterative refinement + sys = 0 + call umf4zsol (sys, x, xz, b, bz, numeric, control, info) + if (info (1) .lt. 0) then + print *, 'Error occurred in umf4zsol: ', info (1) + stop + endif + do 33 i = 1,n + XX (i) = dcmplx (x (i), xz (i)) +33 continue + +c free the numeric factorization + call umf4zfnum (numeric) + +c No LU factors (symbolic or numeric) are in memory at this point. + +c print final statistics + call umf4zpinf (control, info) + +c print the residual. x (i) should be 1 + i/n + call resid (n, nz, Ap, Ai, AA, XX, BB, r) + + stop +998 print *, 'Read error: Harwell/Boeing matrix' + stop + end + +c======================================================================= +c== resid ============================================================== +c======================================================================= + +c Compute the residual, r = Ax-b, its max-norm, and print the max-norm +C Note that A is zero-based. + + subroutine resid (n, nz, Ap, Ai, A, x, b, r) + integer + $ n, nz, Ap (n+1), Ai (n), j, i, p + complex*16 A (nz), x (n), b (n), r (n), aij + double precision rmax + + do 10 i = 1, n + r (i) = -b (i) +10 continue + + do 30 j = 1,n + do 20 p = Ap (j) + 1, Ap (j+1) + i = Ai (p) + 1 + aij = A (p) + r (i) = r (i) + aij * x (j) +20 continue +30 continue + + rmax = 0 + do 40 i = 1, n + rmax = max (rmax, abs (r (i))) +40 continue + + print *, 'norm (A*x-b): ', rmax + return + end diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Demo/umf4zhb.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Demo/umf4zhb.out Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,160 @@ + Matrix key: QC324 + +UMFPACK V4.4 (Jan. 28, 2005), Control: + + Matrix entry defined as: double complex + Int (generic integer) defined as: int + + 0: print level: 2 + 1: dense row parameter: 0.2 + "dense" rows have > max (16, (0.2)*16*sqrt(n_col) entries) + 2: dense column parameter: 0.2 + "dense" columns have > max (16, (0.2)*16*sqrt(n_row) entries) + 3: pivot tolerance: 0.1 + 4: block size for dense matrix kernels: 32 + 5: strategy: 0 (auto) + 6: initial allocation ratio: 0.7 + 7: max iterative refinement steps: 2 + 12: 2-by-2 pivot tolerance: 0.01 + 13: Q fixed during numerical factorization: 0 (auto) + 14: AMD dense row/col parameter: 10 + "dense" rows/columns have > max (16, (10)*sqrt(n)) entries + Only used if the AMD ordering is used. + 15: diagonal pivot tolerance: 0.001 + Only used if diagonal pivoting is attempted. + 16: scaling: 1 (divide each row by sum of abs. values in each row) + 17: frontal matrix allocation ratio: 0.5 + 18: drop tolerance: 0 + 19: AMD and COLAMD aggressive absorption: 1 (yes) + + The following options can only be changed at compile-time: + 8: BLAS library used: none. UMFPACK will be slow. + 9: compiled for ANSI C (uses malloc, free, realloc, and printf) + 10: CPU timer is POSIX times ( ) routine. + 11: compiled for normal operation (debugging disabled) + computer/operating system: Linux + size of int: 4 long: 4 Int: 4 pointer: 4 double: 8 Entry: 16 (in bytes) + +symbolic analysis: + status: 0. + time: 0.10E-01 (sec) + estimates (upper bound) for numeric LU: + size of LU: 1.17 (MB) + memory needed: 2.40 (MB) + flop count: 0.26E+08 + nnz (L): 24027. + nnz (U): 39609. +numeric factorization: + status: 0. + time: 0.10E-01 + actual numeric LU statistics: + size of LU: 0.72 (MB) + memory needed: 1.14 (MB) + flop count: 0.14E+08 + nnz (L): 23247. + nnz (U): 23247. + +UMFPACK V4.4 (Jan. 28, 2005), Info: + matrix entry defined as: double complex + Int (generic integer) defined as: int + BLAS library used: none. UMFPACK will be slow. + MATLAB: no. + CPU timer: POSIX times ( ) routine. + number of rows in matrix A: 324 + number of columns in matrix A: 324 + entries in matrix A: 26730 + memory usage reported in: 8-byte Units + size of int: 4 bytes + size of long: 4 bytes + size of pointer: 4 bytes + size of numerical entry: 16 bytes + + strategy used: symmetric + ordering used: amd on A+A' + modify Q during factorization: no + prefer diagonal pivoting: yes + pivots with zero Markowitz cost: 0 + submatrix S after removing zero-cost pivots: + number of "dense" rows: 324 + number of "dense" columns: 0 + number of empty rows: 0 + number of empty columns 0 + submatrix S square and diagonal preserved + pattern of square submatrix S: + number rows and columns 324 + symmetry of nonzero pattern: 1.000000 + nz in S+S' (excl. diagonal): 26406 + nz on diagonal of matrix S: 324 + fraction of nz on diagonal: 1.000000 + AMD statistics, for strict diagonal pivoting: + est. flops for LU factorization: 1.55342e+07 + est. nz in L+U (incl. diagonal): 47730 + est. largest front (# entries): 14641 + est. max nz in any column of L: 121 + number of "dense" rows/columns in S+S': 0 + symbolic factorization defragmentations: 0 + symbolic memory usage (Units): 63466 + symbolic memory usage (MBytes): 0.5 + Symbolic size (Units): 1418 + Symbolic size (MBytes): 0 + symbolic factorization CPU time (sec): 0.01 + symbolic factorization wallclock time(sec): 0.00 + + matrix scaled: yes (divided each row by sum of abs values in each row) + minimum sum (abs (rows of A)): 2.55982e-01 + maximum sum (abs (rows of A)): 1.82217e+00 + + symbolic/numeric factorization: upper bound actual % + variable-sized part of Numeric object: + initial size (Units) 98017 97692 100% + peak size (Units) 307744 142557 46% + final size (Units) 150384 92058 61% + Numeric final size (Units) 153181 94693 62% + Numeric final size (MBytes) 1.2 0.7 62% + peak memory usage (Units) 314850 149663 48% + peak memory usage (MBytes) 2.4 1.1 48% + numeric factorization flops 2.56313e+07 1.43519e+07 56% + nz in L (incl diagonal) 24027 23247 97% + nz in U (incl diagonal) 39609 23247 59% + nz in L+U (incl diagonal) 63312 46170 73% + largest front (# entries) 19723 6724 34% + largest # rows in front 121 82 68% + largest # columns in front 163 82 50% + + initial allocation ratio used: 1.2 + # of forced updates due to frontal growth: 0 + number of off-diagonal pivots: 0 + nz in L (incl diagonal), if none dropped 23247 + nz in U (incl diagonal), if none dropped 23247 + number of small entries dropped 0 + nonzeros on diagonal of U: 324 + min abs. value on diagonal of U: 5.47e-03 + max abs. value on diagonal of U: 8.25e-01 + estimate of reciprocal of condition number: 6.63e-03 + indices in compressed pattern: 485 + numerical values stored in Numeric object: 46170 + numeric factorization defragmentations: 0 + numeric factorization reallocations: 0 + costly numeric factorization reallocations: 0 + numeric factorization CPU time (sec): 0.01 + numeric factorization wallclock time (sec): 0.02 + numeric factorization mflops (CPU time): 1435.19 + numeric factorization mflops (wallclock): 717.60 + symbolic + numeric CPU time (sec): 0.02 + symbolic + numeric mflops (CPU time): 717.60 + symbolic + numeric wall clock time (sec): 0.02 + symbolic + numeric mflops (wall clock): 717.60 + + solve flops: 3.70332e+05 + iterative refinement steps taken: 0 + iterative refinement steps attempted: 0 + solve CPU time (sec): 0.00 + solve wall clock time (sec): 0.00 + + total symbolic + numeric + solve flops: 1.47223e+07 + total symbolic + numeric + solve CPU time: 0.02 + total symbolic + numeric + solve mflops (CPU): 736.11 + total symbolic+numeric+solve wall clock time: 0.02 + total symbolic+numeric+solve mflops(wallclock) 736.11 + + norm (A*x-b): 2.96487174E-13 diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Demo/umfpack_di_demo.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Demo/umfpack_di_demo.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,759 @@ +/* ========================================================================== */ +/* === umfpack_di_demo ====================================================== */ +/* ========================================================================== */ + + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + A demo of UMFPACK: umfpack_di_* version. + + First, factor and solve a 5-by-5 system, Ax=b, using default parameters. + Then solve A'x=b using the factors of A. Modify one entry (A (1,4) = 0, + where the row and column indices range from 0 to 4. The pattern of A + has not changed (it has explicitly zero entry), so a reanalysis with + umfpack_di_symbolic does not need to be done. Refactorize (with + umfpack_di_numeric), and solve Ax=b. Note that the pivot ordering has + changed. Next, change all of the entries in A, but not the pattern. + + Finally, compute C = A', and do the symbolic and numeric factorization of C. + Factorizing A' can sometimes be better than factorizing A itself (less work + and memory usage). Solve C'x=b twice; the solution is the same as the + solution to Ax=b. + + A note about zero-sized arrays: UMFPACK uses many user-provided arrays of + size n (order of the matrix), and of size nz (the number of nonzeros in a + matrix). n cannot be zero; UMFPACK does not handle zero-dimensioned arrays. + However, nz can be zero. If you attempt to malloc an array of size nz = 0, + however, malloc will return a null pointer which UMFPACK will report as a + "missing argument." Thus, nz1 in this code is set to MAX (nz,1), and + similarly for lnz and unz. Lnz can never be zero, however, since L is always + unit diagonal. +*/ + +/* -------------------------------------------------------------------------- */ +/* definitions */ +/* -------------------------------------------------------------------------- */ + +#include +#include +#include "umfpack.h" + +#define ABS(x) ((x) >= 0 ? (x) : -(x)) + +#define MAX(a,b) (((a) > (b)) ? (a) : (b)) +#ifndef TRUE +#define TRUE (1) +#endif +#ifndef FALSE +#define FALSE (0) +#endif + +/* -------------------------------------------------------------------------- */ +/* triplet form of the matrix. The triplets can be in any order. */ +/* -------------------------------------------------------------------------- */ + +static int n = 5, nz = 12 ; +static int Arow [ ] = { 0, 4, 1, 1, 2, 2, 0, 1, 2, 3, 4, 4} ; +static int Acol [ ] = { 0, 4, 0, 2, 1, 2, 1, 4, 3, 2, 1, 2} ; +static double Aval [ ] = {2., 1., 3., 4., -1., -3., 3., 6., 2., 1., 4., 2.} ; +static double b [ ] = {8., 45., -3., 3., 19.}, x [5], r [5] ; + + +/* -------------------------------------------------------------------------- */ +/* error: print a message and exit */ +/* -------------------------------------------------------------------------- */ + +static void error +( + char *message +) +{ + printf ("\n\n====== error: %s =====\n\n", message) ; + exit (1) ; +} + + +/* -------------------------------------------------------------------------- */ +/* resid: compute the residual, r = Ax-b or r = A'x=b and return maxnorm (r) */ +/* -------------------------------------------------------------------------- */ + +static double resid +( + int transpose, + int Ap [ ], + int Ai [ ], + double Ax [ ] +) +{ + int i, j, p ; + double norm ; + + for (i = 0 ; i < n ; i++) + { + r [i] = -b [i] ; + } + if (transpose) + { + for (j = 0 ; j < n ; j++) + { + for (p = Ap [j] ; p < Ap [j+1] ; p++) + { + i = Ai [p] ; + r [j] += Ax [p] * x [i] ; + } + } + } + else + { + for (j = 0 ; j < n ; j++) + { + for (p = Ap [j] ; p < Ap [j+1] ; p++) + { + i = Ai [p] ; + r [i] += Ax [p] * x [j] ; + } + } + } + norm = 0. ; + for (i = 0 ; i < n ; i++) + { + norm = MAX (ABS (r [i]), norm) ; + } + return (norm) ; +} + + +/* -------------------------------------------------------------------------- */ +/* main program */ +/* -------------------------------------------------------------------------- */ + +int main (int argc, char **argv) +{ + double Info [UMFPACK_INFO], Control [UMFPACK_CONTROL], *Ax, *Cx, *Lx, *Ux, + *W, t [2], *Dx, rnorm, *Rb, *y, *Rs ; + int *Ap, *Ai, *Cp, *Ci, row, col, p, lnz, unz, nr, nc, *Lp, *Li, *Ui, *Up, + *P, *Q, *Lj, i, j, k, anz, nfr, nchains, *Qinit, fnpiv, lnz1, unz1, nz1, + status, *Front_npivcol, *Front_parent, *Chain_start, *Wi, *Pinit, n1, + *Chain_maxrows, *Chain_maxcols, *Front_1strow, *Front_leftmostdesc, + nzud, do_recip ; + void *Symbolic, *Numeric ; + + /* ---------------------------------------------------------------------- */ + /* initializations */ + /* ---------------------------------------------------------------------- */ + + umfpack_tic (t) ; + + printf ("\n%s demo: _di_ version\n", UMFPACK_VERSION) ; + + /* get the default control parameters */ + umfpack_di_defaults (Control) ; + + /* change the default print level for this demo */ + /* (otherwise, nothing will print) */ + Control [UMFPACK_PRL] = 6 ; + + /* print the license agreement */ + umfpack_di_report_status (Control, UMFPACK_OK) ; + Control [UMFPACK_PRL] = 5 ; + + /* print the control parameters */ + umfpack_di_report_control (Control) ; + + /* ---------------------------------------------------------------------- */ + /* print A and b, and convert A to column-form */ + /* ---------------------------------------------------------------------- */ + + /* print the right-hand-side */ + printf ("\nb: ") ; + (void) umfpack_di_report_vector (n, b, Control) ; + + /* print the triplet form of the matrix */ + printf ("\nA: ") ; + (void) umfpack_di_report_triplet (n, n, nz, Arow, Acol, Aval, + Control) ; + + /* convert to column form */ + nz1 = MAX (nz,1) ; /* ensure arrays are not of size zero. */ + Ap = (int *) malloc ((n+1) * sizeof (int)) ; + Ai = (int *) malloc (nz1 * sizeof (int)) ; + Ax = (double *) malloc (nz1 * sizeof (double)) ; + if (!Ap || !Ai || !Ax) + { + error ("out of memory") ; + } + + status = umfpack_di_triplet_to_col (n, n, nz, Arow, Acol, Aval, + Ap, Ai, Ax, (int *) NULL) ; + + if (status < 0) + { + umfpack_di_report_status (Control, status) ; + error ("umfpack_di_triplet_to_col failed") ; + } + + /* print the column-form of A */ + printf ("\nA: ") ; + (void) umfpack_di_report_matrix (n, n, Ap, Ai, Ax, 1, Control) ; + + /* ---------------------------------------------------------------------- */ + /* symbolic factorization */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_di_symbolic (n, n, Ap, Ai, Ax, &Symbolic, + Control, Info) ; + if (status < 0) + { + umfpack_di_report_info (Control, Info) ; + umfpack_di_report_status (Control, status) ; + error ("umfpack_di_symbolic failed") ; + } + + /* print the symbolic factorization */ + + printf ("\nSymbolic factorization of A: ") ; + (void) umfpack_di_report_symbolic (Symbolic, Control) ; + + /* ---------------------------------------------------------------------- */ + /* numeric factorization */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_di_numeric (Ap, Ai, Ax, Symbolic, &Numeric, + Control, Info) ; + if (status < 0) + { + umfpack_di_report_info (Control, Info) ; + umfpack_di_report_status (Control, status) ; + error ("umfpack_di_numeric failed") ; + } + + /* print the numeric factorization */ + printf ("\nNumeric factorization of A: ") ; + (void) umfpack_di_report_numeric (Numeric, Control) ; + + /* ---------------------------------------------------------------------- */ + /* solve Ax=b */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_di_solve (UMFPACK_A, Ap, Ai, Ax, x, b, + Numeric, Control, Info) ; + umfpack_di_report_info (Control, Info) ; + umfpack_di_report_status (Control, status) ; + if (status < 0) + { + error ("umfpack_di_solve failed") ; + } + printf ("\nx (solution of Ax=b): ") ; + (void) umfpack_di_report_vector (n, x, Control) ; + rnorm = resid (FALSE, Ap, Ai, Ax) ; + printf ("maxnorm of residual: %g\n\n", rnorm) ; + + /* ---------------------------------------------------------------------- */ + /* compute the determinant */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_di_get_determinant (x, r, Numeric, Info) ; + umfpack_di_report_status (Control, status) ; + if (status < 0) + { + error ("umfpack_di_get_determinant failed") ; + } + printf ("determinant: (%g", x [0]) ; + printf (") * 10^(%g)\n", r [0]) ; + + /* ---------------------------------------------------------------------- */ + /* solve Ax=b, broken down into steps */ + /* ---------------------------------------------------------------------- */ + + /* Rb = R*b */ + Rb = (double *) malloc (n * sizeof (double)) ; + y = (double *) malloc (n * sizeof (double)) ; + if (!Rb || !y) error ("out of memory") ; + + status = umfpack_di_scale (Rb, b, Numeric) ; + if (status < 0) error ("umfpack_di_scale failed") ; + /* solve Ly = P*(Rb) */ + status = umfpack_di_solve (UMFPACK_Pt_L, Ap, Ai, Ax, y, Rb, + Numeric, Control, Info) ; + if (status < 0) error ("umfpack_di_solve failed") ; + /* solve UQ'x=y */ + status = umfpack_di_solve (UMFPACK_U_Qt, Ap, Ai, Ax, x, y, + Numeric, Control, Info) ; + if (status < 0) error ("umfpack_di_solve failed") ; + printf ("\nx (solution of Ax=b, solve is split into 3 steps): ") ; + (void) umfpack_di_report_vector (n, x, Control) ; + rnorm = resid (FALSE, Ap, Ai, Ax) ; + printf ("maxnorm of residual: %g\n\n", rnorm) ; + + free (Rb) ; + free (y) ; + + /* ---------------------------------------------------------------------- */ + /* solve A'x=b */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_di_solve (UMFPACK_At, Ap, Ai, Ax, x, b, + Numeric, Control, Info) ; + umfpack_di_report_info (Control, Info) ; + if (status < 0) + { + error ("umfpack_di_solve failed") ; + } + printf ("\nx (solution of A'x=b): ") ; + (void) umfpack_di_report_vector (n, x, Control) ; + rnorm = resid (TRUE, Ap, Ai, Ax) ; + printf ("maxnorm of residual: %g\n\n", rnorm) ; + + /* ---------------------------------------------------------------------- */ + /* modify one numerical value in the column-form of A */ + /* ---------------------------------------------------------------------- */ + + /* change A (1,4), look for row index 1 in column 4. */ + row = 1 ; + col = 4 ; + for (p = Ap [col] ; p < Ap [col+1] ; p++) + { + if (row == Ai [p]) + { + printf ("\nchanging A (%d,%d) to zero\n", row, col) ; + Ax [p] = 0.0 ; + break ; + } + } + printf ("\nmodified A: ") ; + (void) umfpack_di_report_matrix (n, n, Ap, Ai, Ax, 1, Control) ; + + /* ---------------------------------------------------------------------- */ + /* redo the numeric factorization */ + /* ---------------------------------------------------------------------- */ + + /* The pattern (Ap and Ai) hasn't changed, so the symbolic factorization */ + /* doesn't have to be redone, no matter how much we change Ax. */ + + /* We don't need the Numeric object any more, so free it. */ + umfpack_di_free_numeric (&Numeric) ; + + /* Note that a memory leak would have occurred if the old Numeric */ + /* had not been free'd with umfpack_di_free_numeric above. */ + status = umfpack_di_numeric (Ap, Ai, Ax, Symbolic, &Numeric, + Control, Info) ; + if (status < 0) + { + umfpack_di_report_info (Control, Info) ; + umfpack_di_report_status (Control, status) ; + error ("umfpack_di_numeric failed") ; + } + printf ("\nNumeric factorization of modified A: ") ; + (void) umfpack_di_report_numeric (Numeric, Control) ; + + /* ---------------------------------------------------------------------- */ + /* solve Ax=b, with the modified A */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_di_solve (UMFPACK_A, Ap, Ai, Ax, x, b, + Numeric, Control, Info) ; + umfpack_di_report_info (Control, Info) ; + if (status < 0) + { + umfpack_di_report_status (Control, status) ; + error ("umfpack_di_solve failed") ; + } + printf ("\nx (with modified A): ") ; + (void) umfpack_di_report_vector (n, x, Control) ; + rnorm = resid (FALSE, Ap, Ai, Ax) ; + printf ("maxnorm of residual: %g\n\n", rnorm) ; + + /* ---------------------------------------------------------------------- */ + /* modify all of the numerical values of A, but not the pattern */ + /* ---------------------------------------------------------------------- */ + + for (col = 0 ; col < n ; col++) + { + for (p = Ap [col] ; p < Ap [col+1] ; p++) + { + row = Ai [p] ; + printf ("changing ") ; + printf ("A (%d,%d) from %g", row, col, Ax [p]) ; + Ax [p] = Ax [p] + col*10 - row ; + printf (" to %g\n", Ax [p]) ; + } + } + printf ("\ncompletely modified A (same pattern): ") ; + (void) umfpack_di_report_matrix (n, n, Ap, Ai, Ax, 1, Control) ; + + /* ---------------------------------------------------------------------- */ + /* save the Symbolic object to file, free it, and load it back in */ + /* ---------------------------------------------------------------------- */ + + /* use the default filename, "symbolic.umf" */ + printf ("\nSaving symbolic object:\n") ; + status = umfpack_di_save_symbolic (Symbolic, (char *) NULL) ; + if (status < 0) + { + umfpack_di_report_status (Control, status) ; + error ("umfpack_di_save_symbolic failed") ; + } + printf ("\nFreeing symbolic object:\n") ; + umfpack_di_free_symbolic (&Symbolic) ; + printf ("\nLoading symbolic object:\n") ; + status = umfpack_di_load_symbolic (&Symbolic, (char *) NULL) ; + if (status < 0) + { + umfpack_di_report_status (Control, status) ; + error ("umfpack_di_load_symbolic failed") ; + } + printf ("\nDone loading symbolic object\n") ; + + /* ---------------------------------------------------------------------- */ + /* redo the numeric factorization */ + /* ---------------------------------------------------------------------- */ + + umfpack_di_free_numeric (&Numeric) ; + status = umfpack_di_numeric (Ap, Ai, Ax, Symbolic, &Numeric, + Control, Info) ; + if (status < 0) + { + umfpack_di_report_info (Control, Info) ; + umfpack_di_report_status (Control, status) ; + error ("umfpack_di_numeric failed") ; + } + printf ("\nNumeric factorization of completely modified A: ") ; + (void) umfpack_di_report_numeric (Numeric, Control) ; + + /* ---------------------------------------------------------------------- */ + /* solve Ax=b, with the modified A */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_di_solve (UMFPACK_A, Ap, Ai, Ax, x, b, + Numeric, Control, Info) ; + umfpack_di_report_info (Control, Info) ; + if (status < 0) + { + umfpack_di_report_status (Control, status) ; + error ("umfpack_di_solve failed") ; + } + printf ("\nx (with completely modified A): ") ; + (void) umfpack_di_report_vector (n, x, Control) ; + rnorm = resid (FALSE, Ap, Ai, Ax) ; + printf ("maxnorm of residual: %g\n\n", rnorm) ; + + /* ---------------------------------------------------------------------- */ + /* free the symbolic and numeric factorization */ + /* ---------------------------------------------------------------------- */ + + umfpack_di_free_symbolic (&Symbolic) ; + umfpack_di_free_numeric (&Numeric) ; + + /* ---------------------------------------------------------------------- */ + /* C = transpose of A */ + /* ---------------------------------------------------------------------- */ + + Cp = (int *) malloc ((n+1) * sizeof (int)) ; + Ci = (int *) malloc (nz1 * sizeof (int)) ; + Cx = (double *) malloc (nz1 * sizeof (double)) ; + if (!Cp || !Ci || !Cx) + { + error ("out of memory") ; + } + status = umfpack_di_transpose (n, n, Ap, Ai, Ax, + (int *) NULL, (int *) NULL, Cp, Ci, Cx) ; + if (status < 0) + { + umfpack_di_report_status (Control, status) ; + error ("umfpack_di_transpose failed: ") ; + } + printf ("\nC (transpose of A): ") ; + (void) umfpack_di_report_matrix (n, n, Cp, Ci, Cx, 1, Control) ; + + /* ---------------------------------------------------------------------- */ + /* symbolic factorization of C */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_di_symbolic (n, n, Cp, Ci, Cx, &Symbolic, + Control, Info) ; + if (status < 0) + { + umfpack_di_report_info (Control, Info) ; + umfpack_di_report_status (Control, status) ; + error ("umfpack_di_symbolic failed") ; + } + printf ("\nSymbolic factorization of C: ") ; + (void) umfpack_di_report_symbolic (Symbolic, Control) ; + + /* ---------------------------------------------------------------------- */ + /* copy the contents of Symbolic into user arrays print them */ + /* ---------------------------------------------------------------------- */ + + printf ("\nGet the contents of the Symbolic object for C:\n") ; + printf ("(compare with umfpack_di_report_symbolic output, above)\n") ; + Pinit = (int *) malloc ((n+1) * sizeof (int)) ; + Qinit = (int *) malloc ((n+1) * sizeof (int)) ; + Front_npivcol = (int *) malloc ((n+1) * sizeof (int)) ; + Front_1strow = (int *) malloc ((n+1) * sizeof (int)) ; + Front_leftmostdesc = (int *) malloc ((n+1) * sizeof (int)) ; + Front_parent = (int *) malloc ((n+1) * sizeof (int)) ; + Chain_start = (int *) malloc ((n+1) * sizeof (int)) ; + Chain_maxrows = (int *) malloc ((n+1) * sizeof (int)) ; + Chain_maxcols = (int *) malloc ((n+1) * sizeof (int)) ; + if (!Pinit || !Qinit || !Front_npivcol || !Front_parent || !Chain_start || + !Chain_maxrows || !Chain_maxcols || !Front_1strow || + !Front_leftmostdesc) + { + error ("out of memory") ; + } + + status = umfpack_di_get_symbolic (&nr, &nc, &n1, &anz, &nfr, &nchains, + Pinit, Qinit, Front_npivcol, Front_parent, Front_1strow, + Front_leftmostdesc, Chain_start, Chain_maxrows, Chain_maxcols, + Symbolic) ; + + if (status < 0) + { + error ("symbolic factorization invalid") ; + } + + printf ("From the Symbolic object, C is of dimension %d-by-%d\n", nr, nc); + printf (" with nz = %d, number of fronts = %d,\n", nz, nfr) ; + printf (" number of frontal matrix chains = %d\n", nchains) ; + + printf ("\nPivot columns in each front, and parent of each front:\n") ; + k = 0 ; + for (i = 0 ; i < nfr ; i++) + { + fnpiv = Front_npivcol [i] ; + printf (" Front %d: parent front: %d number of pivot cols: %d\n", + i, Front_parent [i], fnpiv) ; + for (j = 0 ; j < fnpiv ; j++) + { + col = Qinit [k] ; + printf ( + " %d-th pivot column is column %d in original matrix\n", + k, col) ; + k++ ; + } + } + + printf ("\nNote that the column ordering, above, will be refined\n") ; + printf ("in the numeric factorization below. The assignment of pivot\n") ; + printf ("columns to frontal matrices will always remain unchanged.\n") ; + + printf ("\nTotal number of pivot columns in frontal matrices: %d\n", k) ; + + printf ("\nFrontal matrix chains:\n") ; + for (j = 0 ; j < nchains ; j++) + { + printf (" Frontal matrices %d to %d are factorized in a single\n", + Chain_start [j], Chain_start [j+1] - 1) ; + printf (" working array of size %d-by-%d\n", + Chain_maxrows [j], Chain_maxcols [j]) ; + } + + /* ---------------------------------------------------------------------- */ + /* numeric factorization of C */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_di_numeric (Cp, Ci, Cx, Symbolic, &Numeric, + Control, Info) ; + if (status < 0) + { + error ("umfpack_di_numeric failed") ; + } + printf ("\nNumeric factorization of C: ") ; + (void) umfpack_di_report_numeric (Numeric, Control) ; + + /* ---------------------------------------------------------------------- */ + /* extract the LU factors of C and print them */ + /* ---------------------------------------------------------------------- */ + + if (umfpack_di_get_lunz (&lnz, &unz, &nr, &nc, &nzud, Numeric) < 0) + { + error ("umfpack_di_get_lunz failed") ; + } + /* ensure arrays are not of zero size */ + lnz1 = MAX (lnz,1) ; + unz1 = MAX (unz,1) ; + Lp = (int *) malloc ((n+1) * sizeof (int)) ; + Lj = (int *) malloc (lnz1 * sizeof (int)) ; + Lx = (double *) malloc (lnz1 * sizeof (double)) ; + Up = (int *) malloc ((n+1) * sizeof (int)) ; + Ui = (int *) malloc (unz1 * sizeof (int)) ; + Ux = (double *) malloc (unz1 * sizeof (double)) ; + P = (int *) malloc (n * sizeof (int)) ; + Q = (int *) malloc (n * sizeof (int)) ; + Dx = (double *) NULL ; /* D vector not requested */ + Rs = (double *) malloc (n * sizeof (double)) ; + if (!Lp || !Lj || !Lx || !Up || !Ui || !Ux || !P || !Q || !Rs) + { + error ("out of memory") ; + } + status = umfpack_di_get_numeric (Lp, Lj, Lx, Up, Ui, Ux, + P, Q, Dx, &do_recip, Rs, Numeric) ; + if (status < 0) + { + error ("umfpack_di_get_numeric failed") ; + } + + printf ("\nL (lower triangular factor of C): ") ; + (void) umfpack_di_report_matrix (n, n, Lp, Lj, Lx, 0, Control) ; + printf ("\nU (upper triangular factor of C): ") ; + (void) umfpack_di_report_matrix (n, n, Up, Ui, Ux, 1, Control) ; + printf ("\nP: ") ; + (void) umfpack_di_report_perm (n, P, Control) ; + printf ("\nQ: ") ; + (void) umfpack_di_report_perm (n, Q, Control) ; + printf ("\nScale factors: row i of A is to be ") ; + if (do_recip) + { + printf ("multiplied by the ith scale factor\n") ; + } + else + { + printf ("divided by the ith scale factor\n") ; + } + for (i = 0 ; i < n ; i++) printf ("%d: %g\n", i, Rs [i]) ; + + /* ---------------------------------------------------------------------- */ + /* convert L to triplet form and print it */ + /* ---------------------------------------------------------------------- */ + + /* Note that L is in row-form, so it is the row indices that are created */ + /* by umfpack_di_col_to_triplet. */ + + printf ("\nConverting L to triplet form, and printing it:\n") ; + Li = (int *) malloc (lnz1 * sizeof (int)) ; + if (!Li) + { + error ("out of memory") ; + } + if (umfpack_di_col_to_triplet (n, Lp, Li) < 0) + { + error ("umfpack_di_col_to_triplet failed") ; + } + printf ("\nL, in triplet form: ") ; + (void) umfpack_di_report_triplet (n, n, lnz, Li, Lj, Lx, Control) ; + + /* ---------------------------------------------------------------------- */ + /* save the Numeric object to file, free it, and load it back in */ + /* ---------------------------------------------------------------------- */ + + /* use the default filename, "numeric.umf" */ + printf ("\nSaving numeric object:\n") ; + status = umfpack_di_save_numeric (Numeric, (char *) NULL) ; + if (status < 0) + { + umfpack_di_report_status (Control, status) ; + error ("umfpack_di_save_numeric failed") ; + } + printf ("\nFreeing numeric object:\n") ; + umfpack_di_free_numeric (&Numeric) ; + printf ("\nLoading numeric object:\n") ; + status = umfpack_di_load_numeric (&Numeric, (char *) NULL) ; + if (status < 0) + { + umfpack_di_report_status (Control, status) ; + error ("umfpack_di_load_numeric failed") ; + } + printf ("\nDone loading numeric object\n") ; + + /* ---------------------------------------------------------------------- */ + /* solve C'x=b */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_di_solve (UMFPACK_At, Cp, Ci, Cx, x, b, + Numeric, Control, Info) ; + umfpack_di_report_info (Control, Info) ; + if (status < 0) + { + umfpack_di_report_status (Control, status) ; + error ("umfpack_di_solve failed") ; + } + printf ("\nx (solution of C'x=b): ") ; + (void) umfpack_di_report_vector (n, x, Control) ; + rnorm = resid (TRUE, Cp, Ci, Cx) ; + printf ("maxnorm of residual: %g\n\n", rnorm) ; + + /* ---------------------------------------------------------------------- */ + /* solve C'x=b again, using umfpack_di_wsolve instead */ + /* ---------------------------------------------------------------------- */ + + printf ("\nSolving C'x=b again, using umfpack_di_wsolve instead:\n") ; + Wi = (int *) malloc (n * sizeof (int)) ; + W = (double *) malloc (5*n * sizeof (double)) ; + if (!Wi || !W) + { + error ("out of memory") ; + } + + status = umfpack_di_wsolve (UMFPACK_At, Cp, Ci, Cx, x, b, + Numeric, Control, Info, Wi, W) ; + umfpack_di_report_info (Control, Info) ; + if (status < 0) + { + umfpack_di_report_status (Control, status) ; + error ("umfpack_di_wsolve failed") ; + } + printf ("\nx (solution of C'x=b): ") ; + (void) umfpack_di_report_vector (n, x, Control) ; + rnorm = resid (TRUE, Cp, Ci, Cx) ; + printf ("maxnorm of residual: %g\n\n", rnorm) ; + + /* ---------------------------------------------------------------------- */ + /* free everything */ + /* ---------------------------------------------------------------------- */ + + /* This is not strictly required since the process is exiting and the */ + /* system will reclaim the memory anyway. It's useful, though, just as */ + /* a list of what is currently malloc'ed by this program. Plus, it's */ + /* always a good habit to explicitly free whatever you malloc. */ + + free (Ap) ; + free (Ai) ; + free (Ax) ; + + free (Cp) ; + free (Ci) ; + free (Cx) ; + + free (Pinit) ; + free (Qinit) ; + free (Front_npivcol) ; + free (Front_1strow) ; + free (Front_leftmostdesc) ; + free (Front_parent) ; + free (Chain_start) ; + free (Chain_maxrows) ; + free (Chain_maxcols) ; + + free (Lp) ; + free (Lj) ; + free (Lx) ; + + free (Up) ; + free (Ui) ; + free (Ux) ; + + free (P) ; + free (Q) ; + + free (Li) ; + + free (Wi) ; + free (W) ; + + umfpack_di_free_symbolic (&Symbolic) ; + umfpack_di_free_numeric (&Numeric) ; + + /* ---------------------------------------------------------------------- */ + /* print the total time spent in this demo */ + /* ---------------------------------------------------------------------- */ + + umfpack_toc (t) ; + printf ("\numfpack_di_demo complete.\nTotal time: %5.2f seconds" + " (CPU time), %5.2f seconds (wallclock time)\n", t [1], t [0]) ; + return (0) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Demo/umfpack_di_demo.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Demo/umfpack_di_demo.out Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,1541 @@ + +UMFPACK V4.4 (Jan. 28, 2005) demo: _di_ version + +UMFPACK: Copyright (c) 2005 by Timothy A. Davis. All Rights Reserved. + + +UMFPACK License: + + Your use or distribution of UMFPACK or any modified version of + UMFPACK implies that you agree to this License. + + THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY + EXPRESSED OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + + Permission is hereby granted to use or copy this program, 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 UMFPACK or any modified version of UMFPACK 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. This + software was developed with support from the National Science Foundation, + and is provided to you free of charge. + +Availability: http://www.cise.ufl.edu/research/sparse/umfpack + +UMFPACK V4.4 (Jan. 28, 2005): OK + + +UMFPACK V4.4 (Jan. 28, 2005), Control: + + Matrix entry defined as: double + Int (generic integer) defined as: int + + 0: print level: 5 + 1: dense row parameter: 0.2 + "dense" rows have > max (16, (0.2)*16*sqrt(n_col) entries) + 2: dense column parameter: 0.2 + "dense" columns have > max (16, (0.2)*16*sqrt(n_row) entries) + 3: pivot tolerance: 0.1 + 4: block size for dense matrix kernels: 32 + 5: strategy: 0 (auto) + 6: initial allocation ratio: 0.7 + 7: max iterative refinement steps: 2 + 12: 2-by-2 pivot tolerance: 0.01 + 13: Q fixed during numerical factorization: 0 (auto) + 14: AMD dense row/col parameter: 10 + "dense" rows/columns have > max (16, (10)*sqrt(n)) entries + Only used if the AMD ordering is used. + 15: diagonal pivot tolerance: 0.001 + Only used if diagonal pivoting is attempted. + 16: scaling: 1 (divide each row by sum of abs. values in each row) + 17: frontal matrix allocation ratio: 0.5 + 18: drop tolerance: 0 + 19: AMD and COLAMD aggressive absorption: 1 (yes) + + The following options can only be changed at compile-time: + 8: BLAS library used: none. UMFPACK will be slow. + 9: compiled for ANSI C (uses malloc, free, realloc, and printf) + 10: CPU timer is POSIX times ( ) routine. + 11: compiled for normal operation (debugging disabled) + computer/operating system: Linux + size of int: 4 long: 4 Int: 4 pointer: 4 double: 8 Entry: 8 (in bytes) + + +b: dense vector, n = 5. + 0 : (8) + 1 : (45) + 2 : (-3) + 3 : (3) + 4 : (19) + dense vector OK + + +A: triplet-form matrix, n_row = 5, n_col = 5 nz = 12. + 0 : 0 0 (2) + 1 : 4 4 (1) + 2 : 1 0 (3) + 3 : 1 2 (4) + 4 : 2 1 (-1) + 5 : 2 2 (-3) + 6 : 0 1 (3) + 7 : 1 4 (6) + 8 : 2 3 (2) + 9 : 3 2 (1) + 10 : 4 1 (4) + 11 : 4 2 (2) + triplet-form matrix OK + + +A: column-form matrix, n_row 5 n_col 5, nz = 12. + + column 0: start: 0 end: 1 entries: 2 + row 0 : (2) + row 1 : (3) + + column 1: start: 2 end: 4 entries: 3 + row 0 : (3) + row 2 : (-1) + row 4 : (4) + + column 2: start: 5 end: 8 entries: 4 + row 1 : (4) + row 2 : (-3) + row 3 : (1) + row 4 : (2) + + column 3: start: 9 end: 9 entries: 1 + row 2 : (2) + + column 4: start: 10 end: 11 entries: 2 + row 1 : (6) + row 4 : (1) + column-form matrix OK + + +Symbolic factorization of A: Symbolic object: + matrix to be factorized: + n_row: 5 n_col: 5 + number of entries: 12 + block size used for dense matrix kernels: 32 + strategy used: unsymmetric + ordering used: colamd on A + + performn column etree postorder: yes + prefer diagonal pivoting (attempt P=Q): no + variable-size part of Numeric object: + minimum initial size (Units): 74 (MBytes): 0.0 + estimated peak size (Units): 1301 (MBytes): 0.0 + estimated final size (Units): 15 (MBytes): 0.0 + symbolic factorization memory usage (Units): 144 (MBytes): 0.0 + frontal matrices / supercolumns: + number of frontal chains: 1 + number of frontal matrices: 1 + largest frontal matrix row dimension: 3 + largest frontal matrix column dimension: 3 + + Frontal chain: 0. Frontal matrices 0 to 0 + Largest frontal matrix in Frontal chain: 3-by-3 + Front: 0 pivot cols: 3 (pivot columns 0 to 2) + pivot row candidates: 2 to 4 + leftmost descendant: 0 + 1st new candidate row : 2 + parent: (none) + +Initial column permutation, Q1: permutation vector, n = 5. + 0 : 3 + 1 : 2 + 2 : 0 + 3 : 4 + 4 : 1 + permutation vector OK + + +Initial row permutation, P1: permutation vector, n = 5. + 0 : 2 + 1 : 3 + 2 : 0 + 3 : 1 + 4 : 4 + permutation vector OK + + Symbolic object: OK + + +Numeric factorization of A: Numeric object: + n_row: 5 n_col: 5 + relative pivot tolerance used: 0.1 + relative symmetric pivot tolerance used: 0.001 + matrix scaled: yes (divided each row by sum abs value in each row) + minimum sum (abs (rows of A)): 1.00000e+00 + maximum sum (abs (rows of A)): 1.30000e+01 + initial allocation parameter used: 0.7 + frontal matrix allocation parameter used: 0.5 + final total size of Numeric object (Units): 80 + final total size of Numeric object (MBytes): 0.0 + peak size of variable-size part (Units): 1292 + peak size of variable-size part (MBytes): 0.0 + largest actual frontal matrix size: 4 + memory defragmentations: 1 + memory reallocations: 1 + costly memory reallocations: 0 + entries in compressed pattern (L and U): 2 + number of nonzeros in L (excl diag): 4 + number of entries stored in L (excl diag): 2 + number of nonzeros in U (excl diag): 4 + number of entries stored in U (excl diag): 2 + factorization floating-point operations: 6 + number of nonzeros on diagonal of U: 5 + min abs. value on diagonal of U: 1.42857e-01 + max abs. value on diagonal of U: 2.19231e+00 + reciprocal condition number estimate: 6.52e-02 + +Scale factors applied via multiplication +Scale factors, Rs: dense vector, n = 5. + 0 : (0.2) + 1 : (0.0769231) + 2 : (0.166667) + 3 : (1) + 4 : (0.142857) + dense vector OK + + +P: row permutation vector, n = 5. + 0 : 2 + 1 : 3 + 2 : 0 + 3 : 4 + 4 : 1 + permutation vector OK + + +Q: column permutation vector, n = 5. + 0 : 3 + 1 : 2 + 2 : 0 + 3 : 4 + 4 : 1 + permutation vector OK + + +L in Numeric object, in column-oriented compressed-pattern form: + Diagonal entries are all equal to 1.0 (not stored) + + column 0: length 0. + + column 1: length 2. + row 4 : (0.307692) + row 3 : (0.285714) + + column 2: add 1 entries. length 1. Start of Lchain. + row 4 : (0.576923) + + column 3: length 1. + row 4 : (3.23077) + + column 4: length 0. Start of Lchain. + + +U in Numeric object, in row-oriented compressed-pattern form: + Diagonal is stored separately. + + row 4: length 0. End of Uchain. + + row 3: length 1. End of Uchain. + col 4 : (0.571429) + + row 2: length 1. + col 4 : (0.6) + + row 1: length 0. End of Uchain. + + row 1: length 0. + + row 0: length 2. + col 1 : (-0.5) + col 4 : (-0.166667) + + +diagonal of U: dense vector, n = 5. + 0 : (0.333333) + 1 : (1) + 2 : (0.4) + 3 : (0.142857) + 4 : (-2.19231) + dense vector OK + + Numeric object: OK + + +UMFPACK V4.4 (Jan. 28, 2005), Info: + matrix entry defined as: double + Int (generic integer) defined as: int + BLAS library used: none. UMFPACK will be slow. + MATLAB: no. + CPU timer: POSIX times ( ) routine. + number of rows in matrix A: 5 + number of columns in matrix A: 5 + entries in matrix A: 12 + memory usage reported in: 8-byte Units + size of int: 4 bytes + size of long: 4 bytes + size of pointer: 4 bytes + size of numerical entry: 8 bytes + + strategy used: unsymmetric + ordering used: colamd on A + modify Q during factorization: yes + prefer diagonal pivoting: no + pivots with zero Markowitz cost: 2 + submatrix S after removing zero-cost pivots: + number of "dense" rows: 0 + number of "dense" columns: 0 + number of empty rows: 0 + number of empty columns 0 + submatrix S square and diagonal preserved + pattern of square submatrix S: + number rows and columns 3 + symmetry of nonzero pattern: 1.000000 + nz in S+S' (excl. diagonal): 4 + nz on diagonal of matrix S: 2 + fraction of nz on diagonal: 0.666667 + 2-by-2 pivoting to place large entries on diagonal: + # of small diagonal entries of S: 1 + # unmatched: 0 + symmetry of P2*S: 0.000000 + nz in P2*S+(P2*S)' (excl. diag.): 6 + nz on diagonal of P2*S: 3 + fraction of nz on diag of P2*S: 1.000000 + symbolic factorization defragmentations: 0 + symbolic memory usage (Units): 144 + symbolic memory usage (MBytes): 0.0 + Symbolic size (Units): 45 + Symbolic size (MBytes): 0 + symbolic factorization CPU time (sec): 0.00 + symbolic factorization wallclock time(sec): 0.00 + + matrix scaled: yes (divided each row by sum of abs values in each row) + minimum sum (abs (rows of A)): 1.00000e+00 + maximum sum (abs (rows of A)): 1.30000e+01 + + symbolic/numeric factorization: upper bound actual % + variable-sized part of Numeric object: + initial size (Units) 74 69 93% + peak size (Units) 1301 1292 99% + final size (Units) 15 13 87% + Numeric final size (Units) 85 81 95% + Numeric final size (MBytes) 0.0 0.0 95% + peak memory usage (Units) 1473 1464 99% + peak memory usage (MBytes) 0.0 0.0 99% + numeric factorization flops 1.30000e+01 6.00000e+00 46% + nz in L (incl diagonal) 10 9 90% + nz in U (incl diagonal) 10 9 90% + nz in L+U (incl diagonal) 15 13 87% + largest front (# entries) 9 4 44% + largest # rows in front 3 2 67% + largest # columns in front 3 2 67% + + initial allocation ratio used: 0.7 + # of forced updates due to frontal growth: 0 + nz in L (incl diagonal), if none dropped 9 + nz in U (incl diagonal), if none dropped 9 + number of small entries dropped 0 + nonzeros on diagonal of U: 5 + min abs. value on diagonal of U: 1.43e-01 + max abs. value on diagonal of U: 2.19e+00 + estimate of reciprocal of condition number: 6.52e-02 + indices in compressed pattern: 2 + numerical values stored in Numeric object: 9 + numeric factorization defragmentations: 1 + numeric factorization reallocations: 1 + costly numeric factorization reallocations: 0 + numeric factorization CPU time (sec): 0.00 + numeric factorization wallclock time (sec): 0.00 + symbolic + numeric CPU time (sec): 0.00 + symbolic + numeric wall clock time (sec): 0.00 + + solve flops: 1.19000e+02 + iterative refinement steps taken: 0 + iterative refinement steps attempted: 0 + sparse backward error omega1: 4.67e-17 + sparse backward error omega2: 0.00e+00 + solve CPU time (sec): 0.00 + solve wall clock time (sec): 0.00 + + total symbolic + numeric + solve flops: 1.25000e+02 + total symbolic + numeric + solve CPU time: 0.00 + total symbolic+numeric+solve wall clock time: 0.00 + + +UMFPACK: Copyright (c) 2005 by Timothy A. Davis. All Rights Reserved. + +UMFPACK V4.4 (Jan. 28, 2005): OK + + +x (solution of Ax=b): dense vector, n = 5. + 0 : (1) + 1 : (2) + 2 : (3) + 3 : (4) + 4 : (5) + dense vector OK + +maxnorm of residual: 1.77636e-15 + + +UMFPACK: Copyright (c) 2005 by Timothy A. Davis. All Rights Reserved. + +UMFPACK V4.4 (Jan. 28, 2005): OK + +determinant: (1.14) * 10^(2) + +x (solution of Ax=b, solve is split into 3 steps): dense vector, n = 5. + 0 : (1) + 1 : (2) + 2 : (3) + 3 : (4) + 4 : (5) + dense vector OK + +maxnorm of residual: 1.77636e-15 + + +UMFPACK V4.4 (Jan. 28, 2005), Info: + matrix entry defined as: double + Int (generic integer) defined as: int + BLAS library used: none. UMFPACK will be slow. + MATLAB: no. + CPU timer: POSIX times ( ) routine. + number of rows in matrix A: 5 + number of columns in matrix A: 5 + entries in matrix A: 12 + memory usage reported in: 8-byte Units + size of int: 4 bytes + size of long: 4 bytes + size of pointer: 4 bytes + size of numerical entry: 8 bytes + + strategy used: unsymmetric + ordering used: colamd on A + modify Q during factorization: yes + prefer diagonal pivoting: no + pivots with zero Markowitz cost: 2 + submatrix S after removing zero-cost pivots: + number of "dense" rows: 0 + number of "dense" columns: 0 + number of empty rows: 0 + number of empty columns 0 + submatrix S square and diagonal preserved + pattern of square submatrix S: + number rows and columns 3 + symmetry of nonzero pattern: 1.000000 + nz in S+S' (excl. diagonal): 4 + nz on diagonal of matrix S: 2 + fraction of nz on diagonal: 0.666667 + 2-by-2 pivoting to place large entries on diagonal: + # of small diagonal entries of S: 1 + # unmatched: 0 + symmetry of P2*S: 0.000000 + nz in P2*S+(P2*S)' (excl. diag.): 6 + nz on diagonal of P2*S: 3 + fraction of nz on diag of P2*S: 1.000000 + symbolic factorization defragmentations: 0 + symbolic memory usage (Units): 144 + symbolic memory usage (MBytes): 0.0 + Symbolic size (Units): 45 + Symbolic size (MBytes): 0 + symbolic factorization CPU time (sec): 0.00 + symbolic factorization wallclock time(sec): 0.00 + + matrix scaled: yes (divided each row by sum of abs values in each row) + minimum sum (abs (rows of A)): 1.00000e+00 + maximum sum (abs (rows of A)): 1.30000e+01 + + symbolic/numeric factorization: upper bound actual % + variable-sized part of Numeric object: + initial size (Units) 74 69 93% + peak size (Units) 1301 1292 99% + final size (Units) 15 13 87% + Numeric final size (Units) 85 81 95% + Numeric final size (MBytes) 0.0 0.0 95% + peak memory usage (Units) 1473 1464 99% + peak memory usage (MBytes) 0.0 0.0 99% + numeric factorization flops 1.30000e+01 6.00000e+00 46% + nz in L (incl diagonal) 10 9 90% + nz in U (incl diagonal) 10 9 90% + nz in L+U (incl diagonal) 15 13 87% + largest front (# entries) 9 4 44% + largest # rows in front 3 2 67% + largest # columns in front 3 2 67% + + initial allocation ratio used: 0.7 + # of forced updates due to frontal growth: 0 + nz in L (incl diagonal), if none dropped 9 + nz in U (incl diagonal), if none dropped 9 + number of small entries dropped 0 + nonzeros on diagonal of U: 5 + min abs. value on diagonal of U: 1.43e-01 + max abs. value on diagonal of U: 2.19e+00 + estimate of reciprocal of condition number: 6.52e-02 + indices in compressed pattern: 2 + numerical values stored in Numeric object: 9 + numeric factorization defragmentations: 1 + numeric factorization reallocations: 1 + costly numeric factorization reallocations: 0 + numeric factorization CPU time (sec): 0.00 + numeric factorization wallclock time (sec): 0.00 + symbolic + numeric CPU time (sec): 0.00 + symbolic + numeric wall clock time (sec): 0.00 + + solve flops: 1.11000e+02 + iterative refinement steps taken: 0 + iterative refinement steps attempted: 0 + sparse backward error omega1: 5.84e-17 + sparse backward error omega2: 0.00e+00 + solve CPU time (sec): 0.00 + solve wall clock time (sec): 0.00 + + total symbolic + numeric + solve flops: 1.17000e+02 + total symbolic + numeric + solve CPU time: 0.00 + total symbolic+numeric+solve wall clock time: 0.00 + + +x (solution of A'x=b): dense vector, n = 5. + 0 : (1.81579) + 1 : (1.45614) + 2 : (1.5) + 3 : (-24.8509) + 4 : (10.2632) + dense vector OK + +maxnorm of residual: 7.10543e-15 + + +changing A (1,4) to zero + +modified A: column-form matrix, n_row 5 n_col 5, nz = 12. + + column 0: start: 0 end: 1 entries: 2 + row 0 : (2) + row 1 : (3) + + column 1: start: 2 end: 4 entries: 3 + row 0 : (3) + row 2 : (-1) + row 4 : (4) + + column 2: start: 5 end: 8 entries: 4 + row 1 : (4) + row 2 : (-3) + row 3 : (1) + row 4 : (2) + + column 3: start: 9 end: 9 entries: 1 + row 2 : (2) + + column 4: start: 10 end: 11 entries: 2 + row 1 : (0) + row 4 : (1) + column-form matrix OK + + +Numeric factorization of modified A: Numeric object: + n_row: 5 n_col: 5 + relative pivot tolerance used: 0.1 + relative symmetric pivot tolerance used: 0.001 + matrix scaled: yes (divided each row by sum abs value in each row) + minimum sum (abs (rows of A)): 1.00000e+00 + maximum sum (abs (rows of A)): 7.00000e+00 + initial allocation parameter used: 0.7 + frontal matrix allocation parameter used: 0.5 + final total size of Numeric object (Units): 79 + final total size of Numeric object (MBytes): 0.0 + peak size of variable-size part (Units): 1292 + peak size of variable-size part (MBytes): 0.0 + largest actual frontal matrix size: 4 + memory defragmentations: 1 + memory reallocations: 1 + costly memory reallocations: 0 + entries in compressed pattern (L and U): 2 + number of nonzeros in L (excl diag): 4 + number of entries stored in L (excl diag): 2 + number of nonzeros in U (excl diag): 3 + number of entries stored in U (excl diag): 1 + factorization floating-point operations: 4 + number of nonzeros on diagonal of U: 5 + min abs. value on diagonal of U: 1.50000e-01 + max abs. value on diagonal of U: 1.00000e+00 + reciprocal condition number estimate: 1.50e-01 + +Scale factors applied via multiplication +Scale factors, Rs: dense vector, n = 5. + 0 : (0.2) + 1 : (0.142857) + 2 : (0.166667) + 3 : (1) + 4 : (0.142857) + dense vector OK + + +P: row permutation vector, n = 5. + 0 : 2 + 1 : 3 + 2 : 1 + 3 : 4 + 4 : 0 + permutation vector OK + + +Q: column permutation vector, n = 5. + 0 : 3 + 1 : 2 + 2 : 0 + 3 : 1 + 4 : 4 + permutation vector OK + + +L in Numeric object, in column-oriented compressed-pattern form: + Diagonal entries are all equal to 1.0 (not stored) + + column 0: length 0. + + column 1: length 2. + row 2 : (0.571429) + row 3 : (0.285714) + + column 2: add 1 entries. length 1. Start of Lchain. + row 4 : (0.933333) + + column 3: length 1. + row 4 : (1.05) + + column 4: length 0. Start of Lchain. + + +U in Numeric object, in row-oriented compressed-pattern form: + Diagonal is stored separately. + + row 4: length 0. End of Uchain. + + row 3: length 1. End of Uchain. + col 4 : (0.142857) + + row 2: length 0. End of Uchain. + + row 1: length 0. End of Uchain. + + row 1: length 0. + + row 0: length 2. + col 1 : (-0.5) + col 3 : (-0.166667) + + +diagonal of U: dense vector, n = 5. + 0 : (0.333333) + 1 : (1) + 2 : (0.428571) + 3 : (0.571429) + 4 : (-0.15) + dense vector OK + + Numeric object: OK + + +UMFPACK V4.4 (Jan. 28, 2005), Info: + matrix entry defined as: double + Int (generic integer) defined as: int + BLAS library used: none. UMFPACK will be slow. + MATLAB: no. + CPU timer: POSIX times ( ) routine. + number of rows in matrix A: 5 + number of columns in matrix A: 5 + entries in matrix A: 12 + memory usage reported in: 8-byte Units + size of int: 4 bytes + size of long: 4 bytes + size of pointer: 4 bytes + size of numerical entry: 8 bytes + + strategy used: unsymmetric + ordering used: colamd on A + modify Q during factorization: yes + prefer diagonal pivoting: no + pivots with zero Markowitz cost: 2 + submatrix S after removing zero-cost pivots: + number of "dense" rows: 0 + number of "dense" columns: 0 + number of empty rows: 0 + number of empty columns 0 + submatrix S square and diagonal preserved + pattern of square submatrix S: + number rows and columns 3 + symmetry of nonzero pattern: 1.000000 + nz in S+S' (excl. diagonal): 4 + nz on diagonal of matrix S: 2 + fraction of nz on diagonal: 0.666667 + 2-by-2 pivoting to place large entries on diagonal: + # of small diagonal entries of S: 1 + # unmatched: 0 + symmetry of P2*S: 0.000000 + nz in P2*S+(P2*S)' (excl. diag.): 6 + nz on diagonal of P2*S: 3 + fraction of nz on diag of P2*S: 1.000000 + symbolic factorization defragmentations: 0 + symbolic memory usage (Units): 144 + symbolic memory usage (MBytes): 0.0 + Symbolic size (Units): 45 + Symbolic size (MBytes): 0 + symbolic factorization CPU time (sec): 0.00 + symbolic factorization wallclock time(sec): 0.00 + + matrix scaled: yes (divided each row by sum of abs values in each row) + minimum sum (abs (rows of A)): 1.00000e+00 + maximum sum (abs (rows of A)): 7.00000e+00 + + symbolic/numeric factorization: upper bound actual % + variable-sized part of Numeric object: + initial size (Units) 74 69 93% + peak size (Units) 1301 1292 99% + final size (Units) 15 12 80% + Numeric final size (Units) 85 80 94% + Numeric final size (MBytes) 0.0 0.0 94% + peak memory usage (Units) 1473 1464 99% + peak memory usage (MBytes) 0.0 0.0 99% + numeric factorization flops 1.30000e+01 4.00000e+00 31% + nz in L (incl diagonal) 10 9 90% + nz in U (incl diagonal) 10 8 80% + nz in L+U (incl diagonal) 15 12 80% + largest front (# entries) 9 4 44% + largest # rows in front 3 2 67% + largest # columns in front 3 2 67% + + initial allocation ratio used: 0.7 + # of forced updates due to frontal growth: 0 + nz in L (incl diagonal), if none dropped 9 + nz in U (incl diagonal), if none dropped 8 + number of small entries dropped 0 + nonzeros on diagonal of U: 5 + min abs. value on diagonal of U: 1.50e-01 + max abs. value on diagonal of U: 1.00e+00 + estimate of reciprocal of condition number: 1.50e-01 + indices in compressed pattern: 2 + numerical values stored in Numeric object: 8 + numeric factorization defragmentations: 1 + numeric factorization reallocations: 1 + costly numeric factorization reallocations: 0 + numeric factorization CPU time (sec): 0.00 + numeric factorization wallclock time (sec): 0.00 + symbolic + numeric CPU time (sec): 0.00 + symbolic + numeric wall clock time (sec): 0.00 + + solve flops: 1.17000e+02 + iterative refinement steps taken: 0 + iterative refinement steps attempted: 0 + sparse backward error omega1: 5.92e-17 + sparse backward error omega2: 0.00e+00 + solve CPU time (sec): 0.00 + solve wall clock time (sec): 0.00 + + total symbolic + numeric + solve flops: 1.21000e+02 + total symbolic + numeric + solve CPU time: 0.00 + total symbolic+numeric+solve wall clock time: 0.00 + + +x (with modified A): dense vector, n = 5. + 0 : (11) + 1 : (-4.66667) + 2 : (3) + 3 : (0.666667) + 4 : (31.6667) + dense vector OK + +maxnorm of residual: 5.32907e-15 + +changing A (0,0) from 2 to 2 +changing A (1,0) from 3 to 2 +changing A (0,1) from 3 to 13 +changing A (2,1) from -1 to 7 +changing A (4,1) from 4 to 10 +changing A (1,2) from 4 to 23 +changing A (2,2) from -3 to 15 +changing A (3,2) from 1 to 18 +changing A (4,2) from 2 to 18 +changing A (2,3) from 2 to 30 +changing A (1,4) from 0 to 39 +changing A (4,4) from 1 to 37 + +completely modified A (same pattern): column-form matrix, n_row 5 n_col 5, nz = 12. + + column 0: start: 0 end: 1 entries: 2 + row 0 : (2) + row 1 : (2) + + column 1: start: 2 end: 4 entries: 3 + row 0 : (13) + row 2 : (7) + row 4 : (10) + + column 2: start: 5 end: 8 entries: 4 + row 1 : (23) + row 2 : (15) + row 3 : (18) + row 4 : (18) + + column 3: start: 9 end: 9 entries: 1 + row 2 : (30) + + column 4: start: 10 end: 11 entries: 2 + row 1 : (39) + row 4 : (37) + column-form matrix OK + + +Saving symbolic object: + +Freeing symbolic object: + +Loading symbolic object: + +Done loading symbolic object + +Numeric factorization of completely modified A: Numeric object: + n_row: 5 n_col: 5 + relative pivot tolerance used: 0.1 + relative symmetric pivot tolerance used: 0.001 + matrix scaled: yes (divided each row by sum abs value in each row) + minimum sum (abs (rows of A)): 1.50000e+01 + maximum sum (abs (rows of A)): 6.50000e+01 + initial allocation parameter used: 0.7 + frontal matrix allocation parameter used: 0.5 + final total size of Numeric object (Units): 80 + final total size of Numeric object (MBytes): 0.0 + peak size of variable-size part (Units): 1292 + peak size of variable-size part (MBytes): 0.0 + largest actual frontal matrix size: 4 + memory defragmentations: 1 + memory reallocations: 1 + costly memory reallocations: 0 + entries in compressed pattern (L and U): 2 + number of nonzeros in L (excl diag): 4 + number of entries stored in L (excl diag): 2 + number of nonzeros in U (excl diag): 4 + number of entries stored in U (excl diag): 2 + factorization floating-point operations: 6 + number of nonzeros on diagonal of U: 5 + min abs. value on diagonal of U: 1.33333e-01 + max abs. value on diagonal of U: 1.00000e+00 + reciprocal condition number estimate: 1.33e-01 + +Scale factors applied via multiplication +Scale factors, Rs: dense vector, n = 5. + 0 : (0.0666667) + 1 : (0.015625) + 2 : (0.0192308) + 3 : (0.0555556) + 4 : (0.0153846) + dense vector OK + + +P: row permutation vector, n = 5. + 0 : 2 + 1 : 3 + 2 : 0 + 3 : 4 + 4 : 1 + permutation vector OK + + +Q: column permutation vector, n = 5. + 0 : 3 + 1 : 2 + 2 : 0 + 3 : 4 + 4 : 1 + permutation vector OK + + +L in Numeric object, in column-oriented compressed-pattern form: + Diagonal entries are all equal to 1.0 (not stored) + + column 0: length 0. + + column 1: length 2. + row 4 : (0.359375) + row 3 : (0.276923) + + column 2: add 1 entries. length 1. Start of Lchain. + row 4 : (0.234375) + + column 3: length 1. + row 4 : (1.07052) + + column 4: length 0. Start of Lchain. + + +U in Numeric object, in row-oriented compressed-pattern form: + Diagonal is stored separately. + + row 4: length 0. End of Uchain. + + row 3: length 1. End of Uchain. + col 4 : (0.153846) + + row 2: length 1. + col 4 : (0.866667) + + row 1: length 0. End of Uchain. + + row 1: length 0. + + row 0: length 2. + col 1 : (0.288462) + col 4 : (0.134615) + + +diagonal of U: dense vector, n = 5. + 0 : (0.576923) + 1 : (1) + 2 : (0.133333) + 3 : (0.569231) + 4 : (-0.367821) + dense vector OK + + Numeric object: OK + + +UMFPACK V4.4 (Jan. 28, 2005), Info: + matrix entry defined as: double + Int (generic integer) defined as: int + BLAS library used: none. UMFPACK will be slow. + MATLAB: no. + CPU timer: POSIX times ( ) routine. + number of rows in matrix A: 5 + number of columns in matrix A: 5 + entries in matrix A: 12 + memory usage reported in: 8-byte Units + size of int: 4 bytes + size of long: 4 bytes + size of pointer: 4 bytes + size of numerical entry: 8 bytes + + strategy used: unsymmetric + ordering used: colamd on A + modify Q during factorization: yes + prefer diagonal pivoting: no + pivots with zero Markowitz cost: 2 + submatrix S after removing zero-cost pivots: + number of "dense" rows: 0 + number of "dense" columns: 0 + number of empty rows: 0 + number of empty columns 0 + submatrix S square and diagonal preserved + pattern of square submatrix S: + number rows and columns 3 + symmetry of nonzero pattern: 1.000000 + nz in S+S' (excl. diagonal): 4 + nz on diagonal of matrix S: 2 + fraction of nz on diagonal: 0.666667 + 2-by-2 pivoting to place large entries on diagonal: + # of small diagonal entries of S: 1 + # unmatched: 0 + symmetry of P2*S: 0.000000 + nz in P2*S+(P2*S)' (excl. diag.): 6 + nz on diagonal of P2*S: 3 + fraction of nz on diag of P2*S: 1.000000 + symbolic factorization defragmentations: 0 + symbolic memory usage (Units): 144 + symbolic memory usage (MBytes): 0.0 + Symbolic size (Units): 45 + Symbolic size (MBytes): 0 + symbolic factorization CPU time (sec): 0.00 + symbolic factorization wallclock time(sec): 0.00 + + matrix scaled: yes (divided each row by sum of abs values in each row) + minimum sum (abs (rows of A)): 1.50000e+01 + maximum sum (abs (rows of A)): 6.50000e+01 + + symbolic/numeric factorization: upper bound actual % + variable-sized part of Numeric object: + initial size (Units) 74 69 93% + peak size (Units) 1301 1292 99% + final size (Units) 15 13 87% + Numeric final size (Units) 85 81 95% + Numeric final size (MBytes) 0.0 0.0 95% + peak memory usage (Units) 1473 1464 99% + peak memory usage (MBytes) 0.0 0.0 99% + numeric factorization flops 1.30000e+01 6.00000e+00 46% + nz in L (incl diagonal) 10 9 90% + nz in U (incl diagonal) 10 9 90% + nz in L+U (incl diagonal) 15 13 87% + largest front (# entries) 9 4 44% + largest # rows in front 3 2 67% + largest # columns in front 3 2 67% + + initial allocation ratio used: 0.7 + # of forced updates due to frontal growth: 0 + nz in L (incl diagonal), if none dropped 9 + nz in U (incl diagonal), if none dropped 9 + number of small entries dropped 0 + nonzeros on diagonal of U: 5 + min abs. value on diagonal of U: 1.33e-01 + max abs. value on diagonal of U: 1.00e+00 + estimate of reciprocal of condition number: 1.33e-01 + indices in compressed pattern: 2 + numerical values stored in Numeric object: 9 + numeric factorization defragmentations: 1 + numeric factorization reallocations: 1 + costly numeric factorization reallocations: 0 + numeric factorization CPU time (sec): 0.00 + numeric factorization wallclock time (sec): 0.00 + symbolic + numeric CPU time (sec): 0.00 + symbolic + numeric wall clock time (sec): 0.00 + + solve flops: 1.19000e+02 + iterative refinement steps taken: 0 + iterative refinement steps attempted: 0 + sparse backward error omega1: 3.70e-17 + sparse backward error omega2: 0.00e+00 + solve CPU time (sec): 0.00 + solve wall clock time (sec): 0.00 + + total symbolic + numeric + solve flops: 1.25000e+02 + total symbolic + numeric + solve CPU time: 0.00 + total symbolic+numeric+solve wall clock time: 0.00 + + +x (with completely modified A): dense vector, n = 5. + 0 : (8.50124) + 1 : (-0.692499) + 2 : (0.166667) + 3 : (-0.0217502) + 4 : (0.619594) + dense vector OK + +maxnorm of residual: 3.33067e-15 + + +C (transpose of A): column-form matrix, n_row 5 n_col 5, nz = 12. + + column 0: start: 0 end: 1 entries: 2 + row 0 : (2) + row 1 : (13) + + column 1: start: 2 end: 4 entries: 3 + row 0 : (2) + row 2 : (23) + row 4 : (39) + + column 2: start: 5 end: 7 entries: 3 + row 1 : (7) + row 2 : (15) + row 3 : (30) + + column 3: start: 8 end: 8 entries: 1 + row 2 : (18) + + column 4: start: 9 end: 11 entries: 3 + row 1 : (10) + row 2 : (18) + row 4 : (37) + column-form matrix OK + + +Symbolic factorization of C: Symbolic object: + matrix to be factorized: + n_row: 5 n_col: 5 + number of entries: 12 + block size used for dense matrix kernels: 32 + strategy used: unsymmetric + ordering used: colamd on A + + performn column etree postorder: yes + prefer diagonal pivoting (attempt P=Q): no + variable-size part of Numeric object: + minimum initial size (Units): 75 (MBytes): 0.0 + estimated peak size (Units): 1302 (MBytes): 0.0 + estimated final size (Units): 16 (MBytes): 0.0 + symbolic factorization memory usage (Units): 144 (MBytes): 0.0 + frontal matrices / supercolumns: + number of frontal chains: 1 + number of frontal matrices: 1 + largest frontal matrix row dimension: 3 + largest frontal matrix column dimension: 3 + + Frontal chain: 0. Frontal matrices 0 to 0 + Largest frontal matrix in Frontal chain: 3-by-3 + Front: 0 pivot cols: 3 (pivot columns 0 to 2) + pivot row candidates: 2 to 4 + leftmost descendant: 0 + 1st new candidate row : 2 + parent: (none) + +Initial column permutation, Q1: permutation vector, n = 5. + 0 : 3 + 1 : 2 + 2 : 0 + 3 : 4 + 4 : 1 + permutation vector OK + + +Initial row permutation, P1: permutation vector, n = 5. + 0 : 2 + 1 : 3 + 2 : 0 + 3 : 1 + 4 : 4 + permutation vector OK + + Symbolic object: OK + + +Get the contents of the Symbolic object for C: +(compare with umfpack_di_report_symbolic output, above) +From the Symbolic object, C is of dimension 5-by-5 + with nz = 12, number of fronts = 1, + number of frontal matrix chains = 1 + +Pivot columns in each front, and parent of each front: + Front 0: parent front: -1 number of pivot cols: 3 + 0-th pivot column is column 3 in original matrix + 1-th pivot column is column 2 in original matrix + 2-th pivot column is column 0 in original matrix + +Note that the column ordering, above, will be refined +in the numeric factorization below. The assignment of pivot +columns to frontal matrices will always remain unchanged. + +Total number of pivot columns in frontal matrices: 3 + +Frontal matrix chains: + Frontal matrices 0 to 0 are factorized in a single + working array of size 3-by-3 + +Numeric factorization of C: Numeric object: + n_row: 5 n_col: 5 + relative pivot tolerance used: 0.1 + relative symmetric pivot tolerance used: 0.001 + matrix scaled: yes (divided each row by sum abs value in each row) + minimum sum (abs (rows of A)): 4.00000e+00 + maximum sum (abs (rows of A)): 7.60000e+01 + initial allocation parameter used: 0.7 + frontal matrix allocation parameter used: 0.5 + final total size of Numeric object (Units): 81 + final total size of Numeric object (MBytes): 0.0 + peak size of variable-size part (Units): 1293 + peak size of variable-size part (MBytes): 0.0 + largest actual frontal matrix size: 4 + memory defragmentations: 1 + memory reallocations: 1 + costly memory reallocations: 0 + entries in compressed pattern (L and U): 2 + number of nonzeros in L (excl diag): 3 + number of entries stored in L (excl diag): 2 + number of nonzeros in U (excl diag): 5 + number of entries stored in U (excl diag): 2 + factorization floating-point operations: 6 + number of nonzeros on diagonal of U: 5 + min abs. value on diagonal of U: 2.43243e-01 + max abs. value on diagonal of U: 1.00000e+00 + reciprocal condition number estimate: 2.43e-01 + +Scale factors applied via multiplication +Scale factors, Rs: dense vector, n = 5. + 0 : (0.25) + 1 : (0.0333333) + 2 : (0.0135135) + 3 : (0.0333333) + 4 : (0.0131579) + dense vector OK + + +P: row permutation vector, n = 5. + 0 : 2 + 1 : 3 + 2 : 0 + 3 : 4 + 4 : 1 + permutation vector OK + + +Q: column permutation vector, n = 5. + 0 : 3 + 1 : 2 + 2 : 0 + 3 : 4 + 4 : 1 + permutation vector OK + + +L in Numeric object, in column-oriented compressed-pattern form: + Diagonal entries are all equal to 1.0 (not stored) + + column 0: length 0. + + column 1: length 1. + row 4 : (0.233333) + + column 2: add 1 entries. length 1. Start of Lchain. + row 4 : (0.866667) + + column 3: length 1. + row 4 : (0.684685) + + column 4: length 0. Start of Lchain. + + +U in Numeric object, in row-oriented compressed-pattern form: + Diagonal is stored separately. + + row 4: length 0. End of Uchain. + + row 3: length 1. End of Uchain. + col 4 : (0.513158) + + row 2: length 1. + col 4 : (0.5) + + row 1: length 0. End of Uchain. + + row 1: length 0. + + row 0: length 3. + col 1 : (0.202703) + col 3 : (0.243243) + col 4 : (0.310811) + + +diagonal of U: dense vector, n = 5. + 0 : (0.243243) + 1 : (1) + 2 : (0.5) + 3 : (0.486842) + 4 : (-0.784685) + dense vector OK + + Numeric object: OK + + +L (lower triangular factor of C): row-form matrix, n_row 5 n_col 5, nz = 8. + + row 0: start: 0 end: 0 entries: 1 + column 0 : (1) + + row 1: start: 1 end: 1 entries: 1 + column 1 : (1) + + row 2: start: 2 end: 2 entries: 1 + column 2 : (1) + + row 3: start: 3 end: 3 entries: 1 + column 3 : (1) + + row 4: start: 4 end: 7 entries: 4 + column 1 : (0.233333) + column 2 : (0.866667) + column 3 : (0.684685) + column 4 : (1) + row-form matrix OK + + +U (upper triangular factor of C): column-form matrix, n_row 5 n_col 5, nz = 10. + + column 0: start: 0 end: 0 entries: 1 + row 0 : (0.243243) + + column 1: start: 1 end: 2 entries: 2 + row 0 : (0.202703) + row 1 : (1) + + column 2: start: 3 end: 3 entries: 1 + row 2 : (0.5) + + column 3: start: 4 end: 5 entries: 2 + row 0 : (0.243243) + row 3 : (0.486842) + + column 4: start: 6 end: 9 entries: 4 + row 0 : (0.310811) + row 2 : (0.5) + row 3 : (0.513158) + row 4 : (-0.784685) + column-form matrix OK + + +P: permutation vector, n = 5. + 0 : 2 + 1 : 3 + 2 : 0 + 3 : 4 + 4 : 1 + permutation vector OK + + +Q: permutation vector, n = 5. + 0 : 3 + 1 : 2 + 2 : 0 + 3 : 4 + 4 : 1 + permutation vector OK + + +Scale factors: row i of A is to be multiplied by the ith scale factor +0: 0.25 +1: 0.0333333 +2: 0.0135135 +3: 0.0333333 +4: 0.0131579 + +Converting L to triplet form, and printing it: + +L, in triplet form: triplet-form matrix, n_row = 5, n_col = 5 nz = 8. + 0 : 0 0 (1) + 1 : 1 1 (1) + 2 : 2 2 (1) + 3 : 3 3 (1) + 4 : 4 1 (0.233333) + 5 : 4 2 (0.866667) + 6 : 4 3 (0.684685) + 7 : 4 4 (1) + triplet-form matrix OK + + +Saving numeric object: + +Freeing numeric object: + +Loading numeric object: + +Done loading numeric object + +UMFPACK V4.4 (Jan. 28, 2005), Info: + matrix entry defined as: double + Int (generic integer) defined as: int + BLAS library used: none. UMFPACK will be slow. + MATLAB: no. + CPU timer: POSIX times ( ) routine. + number of rows in matrix A: 5 + number of columns in matrix A: 5 + entries in matrix A: 12 + memory usage reported in: 8-byte Units + size of int: 4 bytes + size of long: 4 bytes + size of pointer: 4 bytes + size of numerical entry: 8 bytes + + strategy used: unsymmetric + ordering used: colamd on A + modify Q during factorization: yes + prefer diagonal pivoting: no + pivots with zero Markowitz cost: 2 + submatrix S after removing zero-cost pivots: + number of "dense" rows: 0 + number of "dense" columns: 0 + number of empty rows: 0 + number of empty columns 0 + submatrix S square and diagonal preserved + pattern of square submatrix S: + number rows and columns 3 + symmetry of nonzero pattern: 1.000000 + nz in S+S' (excl. diagonal): 4 + nz on diagonal of matrix S: 2 + fraction of nz on diagonal: 0.666667 + 2-by-2 pivoting to place large entries on diagonal: + # of small diagonal entries of S: 1 + # unmatched: 0 + symmetry of P2*S: 0.000000 + nz in P2*S+(P2*S)' (excl. diag.): 6 + nz on diagonal of P2*S: 3 + fraction of nz on diag of P2*S: 1.000000 + symbolic factorization defragmentations: 0 + symbolic memory usage (Units): 144 + symbolic memory usage (MBytes): 0.0 + Symbolic size (Units): 45 + Symbolic size (MBytes): 0 + symbolic factorization CPU time (sec): 0.00 + symbolic factorization wallclock time(sec): 0.00 + + matrix scaled: yes (divided each row by sum of abs values in each row) + minimum sum (abs (rows of A)): 4.00000e+00 + maximum sum (abs (rows of A)): 7.60000e+01 + + symbolic/numeric factorization: upper bound actual % + variable-sized part of Numeric object: + initial size (Units) 75 70 93% + peak size (Units) 1302 1293 99% + final size (Units) 16 14 88% + Numeric final size (Units) 86 82 95% + Numeric final size (MBytes) 0.0 0.0 95% + peak memory usage (Units) 1474 1465 99% + peak memory usage (MBytes) 0.0 0.0 99% + numeric factorization flops 1.30000e+01 6.00000e+00 46% + nz in L (incl diagonal) 9 8 89% + nz in U (incl diagonal) 11 10 91% + nz in L+U (incl diagonal) 15 13 87% + largest front (# entries) 9 4 44% + largest # rows in front 3 2 67% + largest # columns in front 3 2 67% + + initial allocation ratio used: 0.7 + # of forced updates due to frontal growth: 0 + nz in L (incl diagonal), if none dropped 8 + nz in U (incl diagonal), if none dropped 10 + number of small entries dropped 0 + nonzeros on diagonal of U: 5 + min abs. value on diagonal of U: 2.43e-01 + max abs. value on diagonal of U: 1.00e+00 + estimate of reciprocal of condition number: 2.43e-01 + indices in compressed pattern: 2 + numerical values stored in Numeric object: 9 + numeric factorization defragmentations: 1 + numeric factorization reallocations: 1 + costly numeric factorization reallocations: 0 + numeric factorization CPU time (sec): 0.00 + numeric factorization wallclock time (sec): 0.00 + symbolic + numeric CPU time (sec): 0.00 + symbolic + numeric wall clock time (sec): 0.00 + + solve flops: 1.11000e+02 + iterative refinement steps taken: 0 + iterative refinement steps attempted: 0 + sparse backward error omega1: 7.60e-17 + sparse backward error omega2: 0.00e+00 + solve CPU time (sec): 0.00 + solve wall clock time (sec): 0.00 + + total symbolic + numeric + solve flops: 1.17000e+02 + total symbolic + numeric + solve CPU time: 0.00 + total symbolic+numeric+solve wall clock time: 0.00 + + +x (solution of C'x=b): dense vector, n = 5. + 0 : (8.50124) + 1 : (-0.692499) + 2 : (0.166667) + 3 : (-0.0217502) + 4 : (0.619594) + dense vector OK + +maxnorm of residual: 4.77396e-15 + + +Solving C'x=b again, using umfpack_di_wsolve instead: + +UMFPACK V4.4 (Jan. 28, 2005), Info: + matrix entry defined as: double + Int (generic integer) defined as: int + BLAS library used: none. UMFPACK will be slow. + MATLAB: no. + CPU timer: POSIX times ( ) routine. + number of rows in matrix A: 5 + number of columns in matrix A: 5 + entries in matrix A: 12 + memory usage reported in: 8-byte Units + size of int: 4 bytes + size of long: 4 bytes + size of pointer: 4 bytes + size of numerical entry: 8 bytes + + strategy used: unsymmetric + ordering used: colamd on A + modify Q during factorization: yes + prefer diagonal pivoting: no + pivots with zero Markowitz cost: 2 + submatrix S after removing zero-cost pivots: + number of "dense" rows: 0 + number of "dense" columns: 0 + number of empty rows: 0 + number of empty columns 0 + submatrix S square and diagonal preserved + pattern of square submatrix S: + number rows and columns 3 + symmetry of nonzero pattern: 1.000000 + nz in S+S' (excl. diagonal): 4 + nz on diagonal of matrix S: 2 + fraction of nz on diagonal: 0.666667 + 2-by-2 pivoting to place large entries on diagonal: + # of small diagonal entries of S: 1 + # unmatched: 0 + symmetry of P2*S: 0.000000 + nz in P2*S+(P2*S)' (excl. diag.): 6 + nz on diagonal of P2*S: 3 + fraction of nz on diag of P2*S: 1.000000 + symbolic factorization defragmentations: 0 + symbolic memory usage (Units): 144 + symbolic memory usage (MBytes): 0.0 + Symbolic size (Units): 45 + Symbolic size (MBytes): 0 + symbolic factorization CPU time (sec): 0.00 + symbolic factorization wallclock time(sec): 0.00 + + matrix scaled: yes (divided each row by sum of abs values in each row) + minimum sum (abs (rows of A)): 4.00000e+00 + maximum sum (abs (rows of A)): 7.60000e+01 + + symbolic/numeric factorization: upper bound actual % + variable-sized part of Numeric object: + initial size (Units) 75 70 93% + peak size (Units) 1302 1293 99% + final size (Units) 16 14 88% + Numeric final size (Units) 86 82 95% + Numeric final size (MBytes) 0.0 0.0 95% + peak memory usage (Units) 1474 1465 99% + peak memory usage (MBytes) 0.0 0.0 99% + numeric factorization flops 1.30000e+01 6.00000e+00 46% + nz in L (incl diagonal) 9 8 89% + nz in U (incl diagonal) 11 10 91% + nz in L+U (incl diagonal) 15 13 87% + largest front (# entries) 9 4 44% + largest # rows in front 3 2 67% + largest # columns in front 3 2 67% + + initial allocation ratio used: 0.7 + # of forced updates due to frontal growth: 0 + nz in L (incl diagonal), if none dropped 8 + nz in U (incl diagonal), if none dropped 10 + number of small entries dropped 0 + nonzeros on diagonal of U: 5 + min abs. value on diagonal of U: 2.43e-01 + max abs. value on diagonal of U: 1.00e+00 + estimate of reciprocal of condition number: 2.43e-01 + indices in compressed pattern: 2 + numerical values stored in Numeric object: 9 + numeric factorization defragmentations: 1 + numeric factorization reallocations: 1 + costly numeric factorization reallocations: 0 + numeric factorization CPU time (sec): 0.00 + numeric factorization wallclock time (sec): 0.00 + symbolic + numeric CPU time (sec): 0.00 + symbolic + numeric wall clock time (sec): 0.00 + + solve flops: 1.11000e+02 + iterative refinement steps taken: 0 + iterative refinement steps attempted: 0 + sparse backward error omega1: 7.60e-17 + sparse backward error omega2: 0.00e+00 + solve CPU time (sec): 0.00 + solve wall clock time (sec): 0.00 + + total symbolic + numeric + solve flops: 1.17000e+02 + total symbolic + numeric + solve CPU time: 0.00 + total symbolic+numeric+solve wall clock time: 0.00 + + +x (solution of C'x=b): dense vector, n = 5. + 0 : (8.50124) + 1 : (-0.692499) + 2 : (0.166667) + 3 : (-0.0217502) + 4 : (0.619594) + dense vector OK + +maxnorm of residual: 4.77396e-15 + + +umfpack_di_demo complete. +Total time: 0.00 seconds (CPU time), 0.00 seconds (wallclock time) diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Demo/umfpack_di_demo.sed --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Demo/umfpack_di_demo.sed Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,78 @@ +/::/d +1,$s/_xx_/_di_/g +1,$s/Int/int/g +1,$s/WSIZE/5/ +1,$s/%ld/%d/g +/define ABS/ { + s/ABS/ABS(x) ((x) >= 0 ? (x) : -(x))/ + } +/, rz \[i\]/ { + s/, rz \[i\]// + } +/, Avalz/ { + s/, Avalz// + } +/, rz/ { + s/, rz// + } +/, bz/ { + s/, bz// + } +/, xz/ { + s/, xz// + } + +/, Lz/ { + s/, Lz// + } +/, Uz/ { + s/, Uz// + } +/, Dz/ { + s/, Dz// + } +/, Az/ { + s/, Az// + } +/, Cz, TRUE/ { + s/, Cz, TRUE// + } +/, Cz/ { + s/, Cz// + } +/, Rbz/ { + s/, Rbz// + } +/, yz/ { + s/, yz// + } + +/ || !Lz/ { + s/ || !Lz// + } +/ || !Uz/ { + s/ || !Uz// + } +/ || !Dz/ { + s/ || !Dz// + } +/ || !Az/ { + s/ || !Az// + } +/ || !Cz/ { + s/ || !Cz// + } + +/rz/d +/Rbz/d +/yz/d +/Avalz/d +/Az/d +/Cz/d +/bz/d +/xz/d +/Lz/d +/Uz/d +/Dz/d +/complex/d + diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Demo/umfpack_dl_demo.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Demo/umfpack_dl_demo.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,759 @@ +/* ========================================================================== */ +/* === umfpack_dl_demo ====================================================== */ +/* ========================================================================== */ + + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + A demo of UMFPACK: umfpack_dl_* version. + + First, factor and solve a 5-by-5 system, Ax=b, using default parameters. + Then solve A'x=b using the factors of A. Modify one entry (A (1,4) = 0, + where the row and column indices range from 0 to 4. The pattern of A + has not changed (it has explicitly zero entry), so a reanalysis with + umfpack_dl_symbolic does not need to be done. Refactorize (with + umfpack_dl_numeric), and solve Ax=b. Note that the pivot ordering has + changed. Next, change all of the entries in A, but not the pattern. + + Finally, compute C = A', and do the symbolic and numeric factorization of C. + Factorizing A' can sometimes be better than factorizing A itself (less work + and memory usage). Solve C'x=b twice; the solution is the same as the + solution to Ax=b. + + A note about zero-sized arrays: UMFPACK uses many user-provided arrays of + size n (order of the matrix), and of size nz (the number of nonzeros in a + matrix). n cannot be zero; UMFPACK does not handle zero-dimensioned arrays. + However, nz can be zero. If you attempt to malloc an array of size nz = 0, + however, malloc will return a null pointer which UMFPACK will report as a + "missing argument." Thus, nz1 in this code is set to MAX (nz,1), and + similarly for lnz and unz. Lnz can never be zero, however, since L is always + unit diagonal. +*/ + +/* -------------------------------------------------------------------------- */ +/* definitions */ +/* -------------------------------------------------------------------------- */ + +#include +#include +#include "umfpack.h" + +#define ABS(x) ((x) >= 0 ? (x) : -(x)) + +#define MAX(a,b) (((a) > (b)) ? (a) : (b)) +#ifndef TRUE +#define TRUE (1) +#endif +#ifndef FALSE +#define FALSE (0) +#endif + +/* -------------------------------------------------------------------------- */ +/* triplet form of the matrix. The triplets can be in any order. */ +/* -------------------------------------------------------------------------- */ + +static long n = 5, nz = 12 ; +static long Arow [ ] = { 0, 4, 1, 1, 2, 2, 0, 1, 2, 3, 4, 4} ; +static long Acol [ ] = { 0, 4, 0, 2, 1, 2, 1, 4, 3, 2, 1, 2} ; +static double Aval [ ] = {2., 1., 3., 4., -1., -3., 3., 6., 2., 1., 4., 2.} ; +static double b [ ] = {8., 45., -3., 3., 19.}, x [5], r [5] ; + + +/* -------------------------------------------------------------------------- */ +/* error: print a message and exit */ +/* -------------------------------------------------------------------------- */ + +static void error +( + char *message +) +{ + printf ("\n\n====== error: %s =====\n\n", message) ; + exit (1) ; +} + + +/* -------------------------------------------------------------------------- */ +/* resid: compute the residual, r = Ax-b or r = A'x=b and return maxnorm (r) */ +/* -------------------------------------------------------------------------- */ + +static double resid +( + long transpose, + long Ap [ ], + long Ai [ ], + double Ax [ ] +) +{ + long i, j, p ; + double norm ; + + for (i = 0 ; i < n ; i++) + { + r [i] = -b [i] ; + } + if (transpose) + { + for (j = 0 ; j < n ; j++) + { + for (p = Ap [j] ; p < Ap [j+1] ; p++) + { + i = Ai [p] ; + r [j] += Ax [p] * x [i] ; + } + } + } + else + { + for (j = 0 ; j < n ; j++) + { + for (p = Ap [j] ; p < Ap [j+1] ; p++) + { + i = Ai [p] ; + r [i] += Ax [p] * x [j] ; + } + } + } + norm = 0. ; + for (i = 0 ; i < n ; i++) + { + norm = MAX (ABS (r [i]), norm) ; + } + return (norm) ; +} + + +/* -------------------------------------------------------------------------- */ +/* main program */ +/* -------------------------------------------------------------------------- */ + +int main (int argc, char **argv) +{ + double Info [UMFPACK_INFO], Control [UMFPACK_CONTROL], *Ax, *Cx, *Lx, *Ux, + *W, t [2], *Dx, rnorm, *Rb, *y, *Rs ; + long *Ap, *Ai, *Cp, *Ci, row, col, p, lnz, unz, nr, nc, *Lp, *Li, *Ui, *Up, + *P, *Q, *Lj, i, j, k, anz, nfr, nchains, *Qinit, fnpiv, lnz1, unz1, nz1, + status, *Front_npivcol, *Front_parent, *Chain_start, *Wi, *Pinit, n1, + *Chain_maxrows, *Chain_maxcols, *Front_1strow, *Front_leftmostdesc, + nzud, do_recip ; + void *Symbolic, *Numeric ; + + /* ---------------------------------------------------------------------- */ + /* initializations */ + /* ---------------------------------------------------------------------- */ + + umfpack_tic (t) ; + + printf ("\n%s demo: _dl_ version\n", UMFPACK_VERSION) ; + + /* get the default control parameters */ + umfpack_dl_defaults (Control) ; + + /* change the default print level for this demo */ + /* (otherwise, nothing will print) */ + Control [UMFPACK_PRL] = 6 ; + + /* print the license agreement */ + umfpack_dl_report_status (Control, UMFPACK_OK) ; + Control [UMFPACK_PRL] = 5 ; + + /* print the control parameters */ + umfpack_dl_report_control (Control) ; + + /* ---------------------------------------------------------------------- */ + /* print A and b, and convert A to column-form */ + /* ---------------------------------------------------------------------- */ + + /* print the right-hand-side */ + printf ("\nb: ") ; + (void) umfpack_dl_report_vector (n, b, Control) ; + + /* print the triplet form of the matrix */ + printf ("\nA: ") ; + (void) umfpack_dl_report_triplet (n, n, nz, Arow, Acol, Aval, + Control) ; + + /* convert to column form */ + nz1 = MAX (nz,1) ; /* ensure arrays are not of size zero. */ + Ap = (long *) malloc ((n+1) * sizeof (long)) ; + Ai = (long *) malloc (nz1 * sizeof (long)) ; + Ax = (double *) malloc (nz1 * sizeof (double)) ; + if (!Ap || !Ai || !Ax) + { + error ("out of memory") ; + } + + status = umfpack_dl_triplet_to_col (n, n, nz, Arow, Acol, Aval, + Ap, Ai, Ax, (long *) NULL) ; + + if (status < 0) + { + umfpack_dl_report_status (Control, status) ; + error ("umfpack_dl_triplet_to_col failed") ; + } + + /* print the column-form of A */ + printf ("\nA: ") ; + (void) umfpack_dl_report_matrix (n, n, Ap, Ai, Ax, 1, Control) ; + + /* ---------------------------------------------------------------------- */ + /* symbolic factorization */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_dl_symbolic (n, n, Ap, Ai, Ax, &Symbolic, + Control, Info) ; + if (status < 0) + { + umfpack_dl_report_info (Control, Info) ; + umfpack_dl_report_status (Control, status) ; + error ("umfpack_dl_symbolic failed") ; + } + + /* print the symbolic factorization */ + + printf ("\nSymbolic factorization of A: ") ; + (void) umfpack_dl_report_symbolic (Symbolic, Control) ; + + /* ---------------------------------------------------------------------- */ + /* numeric factorization */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_dl_numeric (Ap, Ai, Ax, Symbolic, &Numeric, + Control, Info) ; + if (status < 0) + { + umfpack_dl_report_info (Control, Info) ; + umfpack_dl_report_status (Control, status) ; + error ("umfpack_dl_numeric failed") ; + } + + /* print the numeric factorization */ + printf ("\nNumeric factorization of A: ") ; + (void) umfpack_dl_report_numeric (Numeric, Control) ; + + /* ---------------------------------------------------------------------- */ + /* solve Ax=b */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_dl_solve (UMFPACK_A, Ap, Ai, Ax, x, b, + Numeric, Control, Info) ; + umfpack_dl_report_info (Control, Info) ; + umfpack_dl_report_status (Control, status) ; + if (status < 0) + { + error ("umfpack_dl_solve failed") ; + } + printf ("\nx (solution of Ax=b): ") ; + (void) umfpack_dl_report_vector (n, x, Control) ; + rnorm = resid (FALSE, Ap, Ai, Ax) ; + printf ("maxnorm of residual: %g\n\n", rnorm) ; + + /* ---------------------------------------------------------------------- */ + /* compute the determinant */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_dl_get_determinant (x, r, Numeric, Info) ; + umfpack_dl_report_status (Control, status) ; + if (status < 0) + { + error ("umfpack_dl_get_determinant failed") ; + } + printf ("determinant: (%g", x [0]) ; + printf (") * 10^(%g)\n", r [0]) ; + + /* ---------------------------------------------------------------------- */ + /* solve Ax=b, broken down into steps */ + /* ---------------------------------------------------------------------- */ + + /* Rb = R*b */ + Rb = (double *) malloc (n * sizeof (double)) ; + y = (double *) malloc (n * sizeof (double)) ; + if (!Rb || !y) error ("out of memory") ; + + status = umfpack_dl_scale (Rb, b, Numeric) ; + if (status < 0) error ("umfpack_dl_scale failed") ; + /* solve Ly = P*(Rb) */ + status = umfpack_dl_solve (UMFPACK_Pt_L, Ap, Ai, Ax, y, Rb, + Numeric, Control, Info) ; + if (status < 0) error ("umfpack_dl_solve failed") ; + /* solve UQ'x=y */ + status = umfpack_dl_solve (UMFPACK_U_Qt, Ap, Ai, Ax, x, y, + Numeric, Control, Info) ; + if (status < 0) error ("umfpack_dl_solve failed") ; + printf ("\nx (solution of Ax=b, solve is split into 3 steps): ") ; + (void) umfpack_dl_report_vector (n, x, Control) ; + rnorm = resid (FALSE, Ap, Ai, Ax) ; + printf ("maxnorm of residual: %g\n\n", rnorm) ; + + free (Rb) ; + free (y) ; + + /* ---------------------------------------------------------------------- */ + /* solve A'x=b */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_dl_solve (UMFPACK_At, Ap, Ai, Ax, x, b, + Numeric, Control, Info) ; + umfpack_dl_report_info (Control, Info) ; + if (status < 0) + { + error ("umfpack_dl_solve failed") ; + } + printf ("\nx (solution of A'x=b): ") ; + (void) umfpack_dl_report_vector (n, x, Control) ; + rnorm = resid (TRUE, Ap, Ai, Ax) ; + printf ("maxnorm of residual: %g\n\n", rnorm) ; + + /* ---------------------------------------------------------------------- */ + /* modify one numerical value in the column-form of A */ + /* ---------------------------------------------------------------------- */ + + /* change A (1,4), look for row index 1 in column 4. */ + row = 1 ; + col = 4 ; + for (p = Ap [col] ; p < Ap [col+1] ; p++) + { + if (row == Ai [p]) + { + printf ("\nchanging A (%ld,%ld) to zero\n", row, col) ; + Ax [p] = 0.0 ; + break ; + } + } + printf ("\nmodified A: ") ; + (void) umfpack_dl_report_matrix (n, n, Ap, Ai, Ax, 1, Control) ; + + /* ---------------------------------------------------------------------- */ + /* redo the numeric factorization */ + /* ---------------------------------------------------------------------- */ + + /* The pattern (Ap and Ai) hasn't changed, so the symbolic factorization */ + /* doesn't have to be redone, no matter how much we change Ax. */ + + /* We don't need the Numeric object any more, so free it. */ + umfpack_dl_free_numeric (&Numeric) ; + + /* Note that a memory leak would have occurred if the old Numeric */ + /* had not been free'd with umfpack_dl_free_numeric above. */ + status = umfpack_dl_numeric (Ap, Ai, Ax, Symbolic, &Numeric, + Control, Info) ; + if (status < 0) + { + umfpack_dl_report_info (Control, Info) ; + umfpack_dl_report_status (Control, status) ; + error ("umfpack_dl_numeric failed") ; + } + printf ("\nNumeric factorization of modified A: ") ; + (void) umfpack_dl_report_numeric (Numeric, Control) ; + + /* ---------------------------------------------------------------------- */ + /* solve Ax=b, with the modified A */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_dl_solve (UMFPACK_A, Ap, Ai, Ax, x, b, + Numeric, Control, Info) ; + umfpack_dl_report_info (Control, Info) ; + if (status < 0) + { + umfpack_dl_report_status (Control, status) ; + error ("umfpack_dl_solve failed") ; + } + printf ("\nx (with modified A): ") ; + (void) umfpack_dl_report_vector (n, x, Control) ; + rnorm = resid (FALSE, Ap, Ai, Ax) ; + printf ("maxnorm of residual: %g\n\n", rnorm) ; + + /* ---------------------------------------------------------------------- */ + /* modify all of the numerical values of A, but not the pattern */ + /* ---------------------------------------------------------------------- */ + + for (col = 0 ; col < n ; col++) + { + for (p = Ap [col] ; p < Ap [col+1] ; p++) + { + row = Ai [p] ; + printf ("changing ") ; + printf ("A (%ld,%ld) from %g", row, col, Ax [p]) ; + Ax [p] = Ax [p] + col*10 - row ; + printf (" to %g\n", Ax [p]) ; + } + } + printf ("\ncompletely modified A (same pattern): ") ; + (void) umfpack_dl_report_matrix (n, n, Ap, Ai, Ax, 1, Control) ; + + /* ---------------------------------------------------------------------- */ + /* save the Symbolic object to file, free it, and load it back in */ + /* ---------------------------------------------------------------------- */ + + /* use the default filename, "symbolic.umf" */ + printf ("\nSaving symbolic object:\n") ; + status = umfpack_dl_save_symbolic (Symbolic, (char *) NULL) ; + if (status < 0) + { + umfpack_dl_report_status (Control, status) ; + error ("umfpack_dl_save_symbolic failed") ; + } + printf ("\nFreeing symbolic object:\n") ; + umfpack_dl_free_symbolic (&Symbolic) ; + printf ("\nLoading symbolic object:\n") ; + status = umfpack_dl_load_symbolic (&Symbolic, (char *) NULL) ; + if (status < 0) + { + umfpack_dl_report_status (Control, status) ; + error ("umfpack_dl_load_symbolic failed") ; + } + printf ("\nDone loading symbolic object\n") ; + + /* ---------------------------------------------------------------------- */ + /* redo the numeric factorization */ + /* ---------------------------------------------------------------------- */ + + umfpack_dl_free_numeric (&Numeric) ; + status = umfpack_dl_numeric (Ap, Ai, Ax, Symbolic, &Numeric, + Control, Info) ; + if (status < 0) + { + umfpack_dl_report_info (Control, Info) ; + umfpack_dl_report_status (Control, status) ; + error ("umfpack_dl_numeric failed") ; + } + printf ("\nNumeric factorization of completely modified A: ") ; + (void) umfpack_dl_report_numeric (Numeric, Control) ; + + /* ---------------------------------------------------------------------- */ + /* solve Ax=b, with the modified A */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_dl_solve (UMFPACK_A, Ap, Ai, Ax, x, b, + Numeric, Control, Info) ; + umfpack_dl_report_info (Control, Info) ; + if (status < 0) + { + umfpack_dl_report_status (Control, status) ; + error ("umfpack_dl_solve failed") ; + } + printf ("\nx (with completely modified A): ") ; + (void) umfpack_dl_report_vector (n, x, Control) ; + rnorm = resid (FALSE, Ap, Ai, Ax) ; + printf ("maxnorm of residual: %g\n\n", rnorm) ; + + /* ---------------------------------------------------------------------- */ + /* free the symbolic and numeric factorization */ + /* ---------------------------------------------------------------------- */ + + umfpack_dl_free_symbolic (&Symbolic) ; + umfpack_dl_free_numeric (&Numeric) ; + + /* ---------------------------------------------------------------------- */ + /* C = transpose of A */ + /* ---------------------------------------------------------------------- */ + + Cp = (long *) malloc ((n+1) * sizeof (long)) ; + Ci = (long *) malloc (nz1 * sizeof (long)) ; + Cx = (double *) malloc (nz1 * sizeof (double)) ; + if (!Cp || !Ci || !Cx) + { + error ("out of memory") ; + } + status = umfpack_dl_transpose (n, n, Ap, Ai, Ax, + (long *) NULL, (long *) NULL, Cp, Ci, Cx) ; + if (status < 0) + { + umfpack_dl_report_status (Control, status) ; + error ("umfpack_dl_transpose failed: ") ; + } + printf ("\nC (transpose of A): ") ; + (void) umfpack_dl_report_matrix (n, n, Cp, Ci, Cx, 1, Control) ; + + /* ---------------------------------------------------------------------- */ + /* symbolic factorization of C */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_dl_symbolic (n, n, Cp, Ci, Cx, &Symbolic, + Control, Info) ; + if (status < 0) + { + umfpack_dl_report_info (Control, Info) ; + umfpack_dl_report_status (Control, status) ; + error ("umfpack_dl_symbolic failed") ; + } + printf ("\nSymbolic factorization of C: ") ; + (void) umfpack_dl_report_symbolic (Symbolic, Control) ; + + /* ---------------------------------------------------------------------- */ + /* copy the contents of Symbolic into user arrays print them */ + /* ---------------------------------------------------------------------- */ + + printf ("\nGet the contents of the Symbolic object for C:\n") ; + printf ("(compare with umfpack_dl_report_symbolic output, above)\n") ; + Pinit = (long *) malloc ((n+1) * sizeof (long)) ; + Qinit = (long *) malloc ((n+1) * sizeof (long)) ; + Front_npivcol = (long *) malloc ((n+1) * sizeof (long)) ; + Front_1strow = (long *) malloc ((n+1) * sizeof (long)) ; + Front_leftmostdesc = (long *) malloc ((n+1) * sizeof (long)) ; + Front_parent = (long *) malloc ((n+1) * sizeof (long)) ; + Chain_start = (long *) malloc ((n+1) * sizeof (long)) ; + Chain_maxrows = (long *) malloc ((n+1) * sizeof (long)) ; + Chain_maxcols = (long *) malloc ((n+1) * sizeof (long)) ; + if (!Pinit || !Qinit || !Front_npivcol || !Front_parent || !Chain_start || + !Chain_maxrows || !Chain_maxcols || !Front_1strow || + !Front_leftmostdesc) + { + error ("out of memory") ; + } + + status = umfpack_dl_get_symbolic (&nr, &nc, &n1, &anz, &nfr, &nchains, + Pinit, Qinit, Front_npivcol, Front_parent, Front_1strow, + Front_leftmostdesc, Chain_start, Chain_maxrows, Chain_maxcols, + Symbolic) ; + + if (status < 0) + { + error ("symbolic factorization invalid") ; + } + + printf ("From the Symbolic object, C is of dimension %ld-by-%ld\n", nr, nc); + printf (" with nz = %ld, number of fronts = %ld,\n", nz, nfr) ; + printf (" number of frontal matrix chains = %ld\n", nchains) ; + + printf ("\nPivot columns in each front, and parent of each front:\n") ; + k = 0 ; + for (i = 0 ; i < nfr ; i++) + { + fnpiv = Front_npivcol [i] ; + printf (" Front %ld: parent front: %ld number of pivot cols: %ld\n", + i, Front_parent [i], fnpiv) ; + for (j = 0 ; j < fnpiv ; j++) + { + col = Qinit [k] ; + printf ( + " %ld-th pivot column is column %ld in original matrix\n", + k, col) ; + k++ ; + } + } + + printf ("\nNote that the column ordering, above, will be refined\n") ; + printf ("in the numeric factorization below. The assignment of pivot\n") ; + printf ("columns to frontal matrices will always remain unchanged.\n") ; + + printf ("\nTotal number of pivot columns in frontal matrices: %ld\n", k) ; + + printf ("\nFrontal matrix chains:\n") ; + for (j = 0 ; j < nchains ; j++) + { + printf (" Frontal matrices %ld to %ld are factorized in a single\n", + Chain_start [j], Chain_start [j+1] - 1) ; + printf (" working array of size %ld-by-%ld\n", + Chain_maxrows [j], Chain_maxcols [j]) ; + } + + /* ---------------------------------------------------------------------- */ + /* numeric factorization of C */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_dl_numeric (Cp, Ci, Cx, Symbolic, &Numeric, + Control, Info) ; + if (status < 0) + { + error ("umfpack_dl_numeric failed") ; + } + printf ("\nNumeric factorization of C: ") ; + (void) umfpack_dl_report_numeric (Numeric, Control) ; + + /* ---------------------------------------------------------------------- */ + /* extract the LU factors of C and print them */ + /* ---------------------------------------------------------------------- */ + + if (umfpack_dl_get_lunz (&lnz, &unz, &nr, &nc, &nzud, Numeric) < 0) + { + error ("umfpack_dl_get_lunz failed") ; + } + /* ensure arrays are not of zero size */ + lnz1 = MAX (lnz,1) ; + unz1 = MAX (unz,1) ; + Lp = (long *) malloc ((n+1) * sizeof (long)) ; + Lj = (long *) malloc (lnz1 * sizeof (long)) ; + Lx = (double *) malloc (lnz1 * sizeof (double)) ; + Up = (long *) malloc ((n+1) * sizeof (long)) ; + Ui = (long *) malloc (unz1 * sizeof (long)) ; + Ux = (double *) malloc (unz1 * sizeof (double)) ; + P = (long *) malloc (n * sizeof (long)) ; + Q = (long *) malloc (n * sizeof (long)) ; + Dx = (double *) NULL ; /* D vector not requested */ + Rs = (double *) malloc (n * sizeof (double)) ; + if (!Lp || !Lj || !Lx || !Up || !Ui || !Ux || !P || !Q || !Rs) + { + error ("out of memory") ; + } + status = umfpack_dl_get_numeric (Lp, Lj, Lx, Up, Ui, Ux, + P, Q, Dx, &do_recip, Rs, Numeric) ; + if (status < 0) + { + error ("umfpack_dl_get_numeric failed") ; + } + + printf ("\nL (lower triangular factor of C): ") ; + (void) umfpack_dl_report_matrix (n, n, Lp, Lj, Lx, 0, Control) ; + printf ("\nU (upper triangular factor of C): ") ; + (void) umfpack_dl_report_matrix (n, n, Up, Ui, Ux, 1, Control) ; + printf ("\nP: ") ; + (void) umfpack_dl_report_perm (n, P, Control) ; + printf ("\nQ: ") ; + (void) umfpack_dl_report_perm (n, Q, Control) ; + printf ("\nScale factors: row i of A is to be ") ; + if (do_recip) + { + printf ("multiplied by the ith scale factor\n") ; + } + else + { + printf ("divided by the ith scale factor\n") ; + } + for (i = 0 ; i < n ; i++) printf ("%ld: %g\n", i, Rs [i]) ; + + /* ---------------------------------------------------------------------- */ + /* convert L to triplet form and print it */ + /* ---------------------------------------------------------------------- */ + + /* Note that L is in row-form, so it is the row indices that are created */ + /* by umfpack_dl_col_to_triplet. */ + + printf ("\nConverting L to triplet form, and printing it:\n") ; + Li = (long *) malloc (lnz1 * sizeof (long)) ; + if (!Li) + { + error ("out of memory") ; + } + if (umfpack_dl_col_to_triplet (n, Lp, Li) < 0) + { + error ("umfpack_dl_col_to_triplet failed") ; + } + printf ("\nL, in triplet form: ") ; + (void) umfpack_dl_report_triplet (n, n, lnz, Li, Lj, Lx, Control) ; + + /* ---------------------------------------------------------------------- */ + /* save the Numeric object to file, free it, and load it back in */ + /* ---------------------------------------------------------------------- */ + + /* use the default filename, "numeric.umf" */ + printf ("\nSaving numeric object:\n") ; + status = umfpack_dl_save_numeric (Numeric, (char *) NULL) ; + if (status < 0) + { + umfpack_dl_report_status (Control, status) ; + error ("umfpack_dl_save_numeric failed") ; + } + printf ("\nFreeing numeric object:\n") ; + umfpack_dl_free_numeric (&Numeric) ; + printf ("\nLoading numeric object:\n") ; + status = umfpack_dl_load_numeric (&Numeric, (char *) NULL) ; + if (status < 0) + { + umfpack_dl_report_status (Control, status) ; + error ("umfpack_dl_load_numeric failed") ; + } + printf ("\nDone loading numeric object\n") ; + + /* ---------------------------------------------------------------------- */ + /* solve C'x=b */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_dl_solve (UMFPACK_At, Cp, Ci, Cx, x, b, + Numeric, Control, Info) ; + umfpack_dl_report_info (Control, Info) ; + if (status < 0) + { + umfpack_dl_report_status (Control, status) ; + error ("umfpack_dl_solve failed") ; + } + printf ("\nx (solution of C'x=b): ") ; + (void) umfpack_dl_report_vector (n, x, Control) ; + rnorm = resid (TRUE, Cp, Ci, Cx) ; + printf ("maxnorm of residual: %g\n\n", rnorm) ; + + /* ---------------------------------------------------------------------- */ + /* solve C'x=b again, using umfpack_dl_wsolve instead */ + /* ---------------------------------------------------------------------- */ + + printf ("\nSolving C'x=b again, using umfpack_dl_wsolve instead:\n") ; + Wi = (long *) malloc (n * sizeof (long)) ; + W = (double *) malloc (5*n * sizeof (double)) ; + if (!Wi || !W) + { + error ("out of memory") ; + } + + status = umfpack_dl_wsolve (UMFPACK_At, Cp, Ci, Cx, x, b, + Numeric, Control, Info, Wi, W) ; + umfpack_dl_report_info (Control, Info) ; + if (status < 0) + { + umfpack_dl_report_status (Control, status) ; + error ("umfpack_dl_wsolve failed") ; + } + printf ("\nx (solution of C'x=b): ") ; + (void) umfpack_dl_report_vector (n, x, Control) ; + rnorm = resid (TRUE, Cp, Ci, Cx) ; + printf ("maxnorm of residual: %g\n\n", rnorm) ; + + /* ---------------------------------------------------------------------- */ + /* free everything */ + /* ---------------------------------------------------------------------- */ + + /* This is not strictly required since the process is exiting and the */ + /* system will reclaim the memory anyway. It's useful, though, just as */ + /* a list of what is currently malloc'ed by this program. Plus, it's */ + /* always a good habit to explicitly free whatever you malloc. */ + + free (Ap) ; + free (Ai) ; + free (Ax) ; + + free (Cp) ; + free (Ci) ; + free (Cx) ; + + free (Pinit) ; + free (Qinit) ; + free (Front_npivcol) ; + free (Front_1strow) ; + free (Front_leftmostdesc) ; + free (Front_parent) ; + free (Chain_start) ; + free (Chain_maxrows) ; + free (Chain_maxcols) ; + + free (Lp) ; + free (Lj) ; + free (Lx) ; + + free (Up) ; + free (Ui) ; + free (Ux) ; + + free (P) ; + free (Q) ; + + free (Li) ; + + free (Wi) ; + free (W) ; + + umfpack_dl_free_symbolic (&Symbolic) ; + umfpack_dl_free_numeric (&Numeric) ; + + /* ---------------------------------------------------------------------- */ + /* print the total time spent in this demo */ + /* ---------------------------------------------------------------------- */ + + umfpack_toc (t) ; + printf ("\numfpack_dl_demo complete.\nTotal time: %5.2f seconds" + " (CPU time), %5.2f seconds (wallclock time)\n", t [1], t [0]) ; + return (0) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Demo/umfpack_dl_demo.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Demo/umfpack_dl_demo.out Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,1541 @@ + +UMFPACK V4.4 (Jan. 28, 2005) demo: _dl_ version + +UMFPACK: Copyright (c) 2005 by Timothy A. Davis. All Rights Reserved. + + +UMFPACK License: + + Your use or distribution of UMFPACK or any modified version of + UMFPACK implies that you agree to this License. + + THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY + EXPRESSED OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + + Permission is hereby granted to use or copy this program, 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 UMFPACK or any modified version of UMFPACK 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. This + software was developed with support from the National Science Foundation, + and is provided to you free of charge. + +Availability: http://www.cise.ufl.edu/research/sparse/umfpack + +UMFPACK V4.4 (Jan. 28, 2005): OK + + +UMFPACK V4.4 (Jan. 28, 2005), Control: + + Matrix entry defined as: double + Int (generic integer) defined as: long + + 0: print level: 5 + 1: dense row parameter: 0.2 + "dense" rows have > max (16, (0.2)*16*sqrt(n_col) entries) + 2: dense column parameter: 0.2 + "dense" columns have > max (16, (0.2)*16*sqrt(n_row) entries) + 3: pivot tolerance: 0.1 + 4: block size for dense matrix kernels: 32 + 5: strategy: 0 (auto) + 6: initial allocation ratio: 0.7 + 7: max iterative refinement steps: 2 + 12: 2-by-2 pivot tolerance: 0.01 + 13: Q fixed during numerical factorization: 0 (auto) + 14: AMD dense row/col parameter: 10 + "dense" rows/columns have > max (16, (10)*sqrt(n)) entries + Only used if the AMD ordering is used. + 15: diagonal pivot tolerance: 0.001 + Only used if diagonal pivoting is attempted. + 16: scaling: 1 (divide each row by sum of abs. values in each row) + 17: frontal matrix allocation ratio: 0.5 + 18: drop tolerance: 0 + 19: AMD and COLAMD aggressive absorption: 1 (yes) + + The following options can only be changed at compile-time: + 8: BLAS library used: none. UMFPACK will be slow. + 9: compiled for ANSI C (uses malloc, free, realloc, and printf) + 10: CPU timer is POSIX times ( ) routine. + 11: compiled for normal operation (debugging disabled) + computer/operating system: Linux + size of int: 4 long: 4 Int: 4 pointer: 4 double: 8 Entry: 8 (in bytes) + + +b: dense vector, n = 5. + 0 : (8) + 1 : (45) + 2 : (-3) + 3 : (3) + 4 : (19) + dense vector OK + + +A: triplet-form matrix, n_row = 5, n_col = 5 nz = 12. + 0 : 0 0 (2) + 1 : 4 4 (1) + 2 : 1 0 (3) + 3 : 1 2 (4) + 4 : 2 1 (-1) + 5 : 2 2 (-3) + 6 : 0 1 (3) + 7 : 1 4 (6) + 8 : 2 3 (2) + 9 : 3 2 (1) + 10 : 4 1 (4) + 11 : 4 2 (2) + triplet-form matrix OK + + +A: column-form matrix, n_row 5 n_col 5, nz = 12. + + column 0: start: 0 end: 1 entries: 2 + row 0 : (2) + row 1 : (3) + + column 1: start: 2 end: 4 entries: 3 + row 0 : (3) + row 2 : (-1) + row 4 : (4) + + column 2: start: 5 end: 8 entries: 4 + row 1 : (4) + row 2 : (-3) + row 3 : (1) + row 4 : (2) + + column 3: start: 9 end: 9 entries: 1 + row 2 : (2) + + column 4: start: 10 end: 11 entries: 2 + row 1 : (6) + row 4 : (1) + column-form matrix OK + + +Symbolic factorization of A: Symbolic object: + matrix to be factorized: + n_row: 5 n_col: 5 + number of entries: 12 + block size used for dense matrix kernels: 32 + strategy used: unsymmetric + ordering used: colamd on A + + performn column etree postorder: yes + prefer diagonal pivoting (attempt P=Q): no + variable-size part of Numeric object: + minimum initial size (Units): 74 (MBytes): 0.0 + estimated peak size (Units): 1301 (MBytes): 0.0 + estimated final size (Units): 15 (MBytes): 0.0 + symbolic factorization memory usage (Units): 144 (MBytes): 0.0 + frontal matrices / supercolumns: + number of frontal chains: 1 + number of frontal matrices: 1 + largest frontal matrix row dimension: 3 + largest frontal matrix column dimension: 3 + + Frontal chain: 0. Frontal matrices 0 to 0 + Largest frontal matrix in Frontal chain: 3-by-3 + Front: 0 pivot cols: 3 (pivot columns 0 to 2) + pivot row candidates: 2 to 4 + leftmost descendant: 0 + 1st new candidate row : 2 + parent: (none) + +Initial column permutation, Q1: permutation vector, n = 5. + 0 : 3 + 1 : 2 + 2 : 0 + 3 : 4 + 4 : 1 + permutation vector OK + + +Initial row permutation, P1: permutation vector, n = 5. + 0 : 2 + 1 : 3 + 2 : 0 + 3 : 1 + 4 : 4 + permutation vector OK + + Symbolic object: OK + + +Numeric factorization of A: Numeric object: + n_row: 5 n_col: 5 + relative pivot tolerance used: 0.1 + relative symmetric pivot tolerance used: 0.001 + matrix scaled: yes (divided each row by sum abs value in each row) + minimum sum (abs (rows of A)): 1.00000e+00 + maximum sum (abs (rows of A)): 1.30000e+01 + initial allocation parameter used: 0.7 + frontal matrix allocation parameter used: 0.5 + final total size of Numeric object (Units): 80 + final total size of Numeric object (MBytes): 0.0 + peak size of variable-size part (Units): 1292 + peak size of variable-size part (MBytes): 0.0 + largest actual frontal matrix size: 4 + memory defragmentations: 1 + memory reallocations: 1 + costly memory reallocations: 0 + entries in compressed pattern (L and U): 2 + number of nonzeros in L (excl diag): 4 + number of entries stored in L (excl diag): 2 + number of nonzeros in U (excl diag): 4 + number of entries stored in U (excl diag): 2 + factorization floating-point operations: 6 + number of nonzeros on diagonal of U: 5 + min abs. value on diagonal of U: 1.42857e-01 + max abs. value on diagonal of U: 2.19231e+00 + reciprocal condition number estimate: 6.52e-02 + +Scale factors applied via multiplication +Scale factors, Rs: dense vector, n = 5. + 0 : (0.2) + 1 : (0.0769231) + 2 : (0.166667) + 3 : (1) + 4 : (0.142857) + dense vector OK + + +P: row permutation vector, n = 5. + 0 : 2 + 1 : 3 + 2 : 0 + 3 : 4 + 4 : 1 + permutation vector OK + + +Q: column permutation vector, n = 5. + 0 : 3 + 1 : 2 + 2 : 0 + 3 : 4 + 4 : 1 + permutation vector OK + + +L in Numeric object, in column-oriented compressed-pattern form: + Diagonal entries are all equal to 1.0 (not stored) + + column 0: length 0. + + column 1: length 2. + row 4 : (0.307692) + row 3 : (0.285714) + + column 2: add 1 entries. length 1. Start of Lchain. + row 4 : (0.576923) + + column 3: length 1. + row 4 : (3.23077) + + column 4: length 0. Start of Lchain. + + +U in Numeric object, in row-oriented compressed-pattern form: + Diagonal is stored separately. + + row 4: length 0. End of Uchain. + + row 3: length 1. End of Uchain. + col 4 : (0.571429) + + row 2: length 1. + col 4 : (0.6) + + row 1: length 0. End of Uchain. + + row 1: length 0. + + row 0: length 2. + col 1 : (-0.5) + col 4 : (-0.166667) + + +diagonal of U: dense vector, n = 5. + 0 : (0.333333) + 1 : (1) + 2 : (0.4) + 3 : (0.142857) + 4 : (-2.19231) + dense vector OK + + Numeric object: OK + + +UMFPACK V4.4 (Jan. 28, 2005), Info: + matrix entry defined as: double + Int (generic integer) defined as: long + BLAS library used: none. UMFPACK will be slow. + MATLAB: no. + CPU timer: POSIX times ( ) routine. + number of rows in matrix A: 5 + number of columns in matrix A: 5 + entries in matrix A: 12 + memory usage reported in: 8-byte Units + size of int: 4 bytes + size of long: 4 bytes + size of pointer: 4 bytes + size of numerical entry: 8 bytes + + strategy used: unsymmetric + ordering used: colamd on A + modify Q during factorization: yes + prefer diagonal pivoting: no + pivots with zero Markowitz cost: 2 + submatrix S after removing zero-cost pivots: + number of "dense" rows: 0 + number of "dense" columns: 0 + number of empty rows: 0 + number of empty columns 0 + submatrix S square and diagonal preserved + pattern of square submatrix S: + number rows and columns 3 + symmetry of nonzero pattern: 1.000000 + nz in S+S' (excl. diagonal): 4 + nz on diagonal of matrix S: 2 + fraction of nz on diagonal: 0.666667 + 2-by-2 pivoting to place large entries on diagonal: + # of small diagonal entries of S: 1 + # unmatched: 0 + symmetry of P2*S: 0.000000 + nz in P2*S+(P2*S)' (excl. diag.): 6 + nz on diagonal of P2*S: 3 + fraction of nz on diag of P2*S: 1.000000 + symbolic factorization defragmentations: 0 + symbolic memory usage (Units): 144 + symbolic memory usage (MBytes): 0.0 + Symbolic size (Units): 45 + Symbolic size (MBytes): 0 + symbolic factorization CPU time (sec): 0.00 + symbolic factorization wallclock time(sec): 0.00 + + matrix scaled: yes (divided each row by sum of abs values in each row) + minimum sum (abs (rows of A)): 1.00000e+00 + maximum sum (abs (rows of A)): 1.30000e+01 + + symbolic/numeric factorization: upper bound actual % + variable-sized part of Numeric object: + initial size (Units) 74 69 93% + peak size (Units) 1301 1292 99% + final size (Units) 15 13 87% + Numeric final size (Units) 85 81 95% + Numeric final size (MBytes) 0.0 0.0 95% + peak memory usage (Units) 1473 1464 99% + peak memory usage (MBytes) 0.0 0.0 99% + numeric factorization flops 1.30000e+01 6.00000e+00 46% + nz in L (incl diagonal) 10 9 90% + nz in U (incl diagonal) 10 9 90% + nz in L+U (incl diagonal) 15 13 87% + largest front (# entries) 9 4 44% + largest # rows in front 3 2 67% + largest # columns in front 3 2 67% + + initial allocation ratio used: 0.7 + # of forced updates due to frontal growth: 0 + nz in L (incl diagonal), if none dropped 9 + nz in U (incl diagonal), if none dropped 9 + number of small entries dropped 0 + nonzeros on diagonal of U: 5 + min abs. value on diagonal of U: 1.43e-01 + max abs. value on diagonal of U: 2.19e+00 + estimate of reciprocal of condition number: 6.52e-02 + indices in compressed pattern: 2 + numerical values stored in Numeric object: 9 + numeric factorization defragmentations: 1 + numeric factorization reallocations: 1 + costly numeric factorization reallocations: 0 + numeric factorization CPU time (sec): 0.00 + numeric factorization wallclock time (sec): 0.00 + symbolic + numeric CPU time (sec): 0.00 + symbolic + numeric wall clock time (sec): 0.00 + + solve flops: 1.19000e+02 + iterative refinement steps taken: 0 + iterative refinement steps attempted: 0 + sparse backward error omega1: 4.67e-17 + sparse backward error omega2: 0.00e+00 + solve CPU time (sec): 0.00 + solve wall clock time (sec): 0.00 + + total symbolic + numeric + solve flops: 1.25000e+02 + total symbolic + numeric + solve CPU time: 0.00 + total symbolic+numeric+solve wall clock time: 0.00 + + +UMFPACK: Copyright (c) 2005 by Timothy A. Davis. All Rights Reserved. + +UMFPACK V4.4 (Jan. 28, 2005): OK + + +x (solution of Ax=b): dense vector, n = 5. + 0 : (1) + 1 : (2) + 2 : (3) + 3 : (4) + 4 : (5) + dense vector OK + +maxnorm of residual: 1.77636e-15 + + +UMFPACK: Copyright (c) 2005 by Timothy A. Davis. All Rights Reserved. + +UMFPACK V4.4 (Jan. 28, 2005): OK + +determinant: (1.14) * 10^(2) + +x (solution of Ax=b, solve is split into 3 steps): dense vector, n = 5. + 0 : (1) + 1 : (2) + 2 : (3) + 3 : (4) + 4 : (5) + dense vector OK + +maxnorm of residual: 1.77636e-15 + + +UMFPACK V4.4 (Jan. 28, 2005), Info: + matrix entry defined as: double + Int (generic integer) defined as: long + BLAS library used: none. UMFPACK will be slow. + MATLAB: no. + CPU timer: POSIX times ( ) routine. + number of rows in matrix A: 5 + number of columns in matrix A: 5 + entries in matrix A: 12 + memory usage reported in: 8-byte Units + size of int: 4 bytes + size of long: 4 bytes + size of pointer: 4 bytes + size of numerical entry: 8 bytes + + strategy used: unsymmetric + ordering used: colamd on A + modify Q during factorization: yes + prefer diagonal pivoting: no + pivots with zero Markowitz cost: 2 + submatrix S after removing zero-cost pivots: + number of "dense" rows: 0 + number of "dense" columns: 0 + number of empty rows: 0 + number of empty columns 0 + submatrix S square and diagonal preserved + pattern of square submatrix S: + number rows and columns 3 + symmetry of nonzero pattern: 1.000000 + nz in S+S' (excl. diagonal): 4 + nz on diagonal of matrix S: 2 + fraction of nz on diagonal: 0.666667 + 2-by-2 pivoting to place large entries on diagonal: + # of small diagonal entries of S: 1 + # unmatched: 0 + symmetry of P2*S: 0.000000 + nz in P2*S+(P2*S)' (excl. diag.): 6 + nz on diagonal of P2*S: 3 + fraction of nz on diag of P2*S: 1.000000 + symbolic factorization defragmentations: 0 + symbolic memory usage (Units): 144 + symbolic memory usage (MBytes): 0.0 + Symbolic size (Units): 45 + Symbolic size (MBytes): 0 + symbolic factorization CPU time (sec): 0.00 + symbolic factorization wallclock time(sec): 0.00 + + matrix scaled: yes (divided each row by sum of abs values in each row) + minimum sum (abs (rows of A)): 1.00000e+00 + maximum sum (abs (rows of A)): 1.30000e+01 + + symbolic/numeric factorization: upper bound actual % + variable-sized part of Numeric object: + initial size (Units) 74 69 93% + peak size (Units) 1301 1292 99% + final size (Units) 15 13 87% + Numeric final size (Units) 85 81 95% + Numeric final size (MBytes) 0.0 0.0 95% + peak memory usage (Units) 1473 1464 99% + peak memory usage (MBytes) 0.0 0.0 99% + numeric factorization flops 1.30000e+01 6.00000e+00 46% + nz in L (incl diagonal) 10 9 90% + nz in U (incl diagonal) 10 9 90% + nz in L+U (incl diagonal) 15 13 87% + largest front (# entries) 9 4 44% + largest # rows in front 3 2 67% + largest # columns in front 3 2 67% + + initial allocation ratio used: 0.7 + # of forced updates due to frontal growth: 0 + nz in L (incl diagonal), if none dropped 9 + nz in U (incl diagonal), if none dropped 9 + number of small entries dropped 0 + nonzeros on diagonal of U: 5 + min abs. value on diagonal of U: 1.43e-01 + max abs. value on diagonal of U: 2.19e+00 + estimate of reciprocal of condition number: 6.52e-02 + indices in compressed pattern: 2 + numerical values stored in Numeric object: 9 + numeric factorization defragmentations: 1 + numeric factorization reallocations: 1 + costly numeric factorization reallocations: 0 + numeric factorization CPU time (sec): 0.00 + numeric factorization wallclock time (sec): 0.00 + symbolic + numeric CPU time (sec): 0.00 + symbolic + numeric wall clock time (sec): 0.00 + + solve flops: 1.11000e+02 + iterative refinement steps taken: 0 + iterative refinement steps attempted: 0 + sparse backward error omega1: 5.84e-17 + sparse backward error omega2: 0.00e+00 + solve CPU time (sec): 0.00 + solve wall clock time (sec): 0.00 + + total symbolic + numeric + solve flops: 1.17000e+02 + total symbolic + numeric + solve CPU time: 0.00 + total symbolic+numeric+solve wall clock time: 0.00 + + +x (solution of A'x=b): dense vector, n = 5. + 0 : (1.81579) + 1 : (1.45614) + 2 : (1.5) + 3 : (-24.8509) + 4 : (10.2632) + dense vector OK + +maxnorm of residual: 7.10543e-15 + + +changing A (1,4) to zero + +modified A: column-form matrix, n_row 5 n_col 5, nz = 12. + + column 0: start: 0 end: 1 entries: 2 + row 0 : (2) + row 1 : (3) + + column 1: start: 2 end: 4 entries: 3 + row 0 : (3) + row 2 : (-1) + row 4 : (4) + + column 2: start: 5 end: 8 entries: 4 + row 1 : (4) + row 2 : (-3) + row 3 : (1) + row 4 : (2) + + column 3: start: 9 end: 9 entries: 1 + row 2 : (2) + + column 4: start: 10 end: 11 entries: 2 + row 1 : (0) + row 4 : (1) + column-form matrix OK + + +Numeric factorization of modified A: Numeric object: + n_row: 5 n_col: 5 + relative pivot tolerance used: 0.1 + relative symmetric pivot tolerance used: 0.001 + matrix scaled: yes (divided each row by sum abs value in each row) + minimum sum (abs (rows of A)): 1.00000e+00 + maximum sum (abs (rows of A)): 7.00000e+00 + initial allocation parameter used: 0.7 + frontal matrix allocation parameter used: 0.5 + final total size of Numeric object (Units): 79 + final total size of Numeric object (MBytes): 0.0 + peak size of variable-size part (Units): 1292 + peak size of variable-size part (MBytes): 0.0 + largest actual frontal matrix size: 4 + memory defragmentations: 1 + memory reallocations: 1 + costly memory reallocations: 0 + entries in compressed pattern (L and U): 2 + number of nonzeros in L (excl diag): 4 + number of entries stored in L (excl diag): 2 + number of nonzeros in U (excl diag): 3 + number of entries stored in U (excl diag): 1 + factorization floating-point operations: 4 + number of nonzeros on diagonal of U: 5 + min abs. value on diagonal of U: 1.50000e-01 + max abs. value on diagonal of U: 1.00000e+00 + reciprocal condition number estimate: 1.50e-01 + +Scale factors applied via multiplication +Scale factors, Rs: dense vector, n = 5. + 0 : (0.2) + 1 : (0.142857) + 2 : (0.166667) + 3 : (1) + 4 : (0.142857) + dense vector OK + + +P: row permutation vector, n = 5. + 0 : 2 + 1 : 3 + 2 : 1 + 3 : 4 + 4 : 0 + permutation vector OK + + +Q: column permutation vector, n = 5. + 0 : 3 + 1 : 2 + 2 : 0 + 3 : 1 + 4 : 4 + permutation vector OK + + +L in Numeric object, in column-oriented compressed-pattern form: + Diagonal entries are all equal to 1.0 (not stored) + + column 0: length 0. + + column 1: length 2. + row 2 : (0.571429) + row 3 : (0.285714) + + column 2: add 1 entries. length 1. Start of Lchain. + row 4 : (0.933333) + + column 3: length 1. + row 4 : (1.05) + + column 4: length 0. Start of Lchain. + + +U in Numeric object, in row-oriented compressed-pattern form: + Diagonal is stored separately. + + row 4: length 0. End of Uchain. + + row 3: length 1. End of Uchain. + col 4 : (0.142857) + + row 2: length 0. End of Uchain. + + row 1: length 0. End of Uchain. + + row 1: length 0. + + row 0: length 2. + col 1 : (-0.5) + col 3 : (-0.166667) + + +diagonal of U: dense vector, n = 5. + 0 : (0.333333) + 1 : (1) + 2 : (0.428571) + 3 : (0.571429) + 4 : (-0.15) + dense vector OK + + Numeric object: OK + + +UMFPACK V4.4 (Jan. 28, 2005), Info: + matrix entry defined as: double + Int (generic integer) defined as: long + BLAS library used: none. UMFPACK will be slow. + MATLAB: no. + CPU timer: POSIX times ( ) routine. + number of rows in matrix A: 5 + number of columns in matrix A: 5 + entries in matrix A: 12 + memory usage reported in: 8-byte Units + size of int: 4 bytes + size of long: 4 bytes + size of pointer: 4 bytes + size of numerical entry: 8 bytes + + strategy used: unsymmetric + ordering used: colamd on A + modify Q during factorization: yes + prefer diagonal pivoting: no + pivots with zero Markowitz cost: 2 + submatrix S after removing zero-cost pivots: + number of "dense" rows: 0 + number of "dense" columns: 0 + number of empty rows: 0 + number of empty columns 0 + submatrix S square and diagonal preserved + pattern of square submatrix S: + number rows and columns 3 + symmetry of nonzero pattern: 1.000000 + nz in S+S' (excl. diagonal): 4 + nz on diagonal of matrix S: 2 + fraction of nz on diagonal: 0.666667 + 2-by-2 pivoting to place large entries on diagonal: + # of small diagonal entries of S: 1 + # unmatched: 0 + symmetry of P2*S: 0.000000 + nz in P2*S+(P2*S)' (excl. diag.): 6 + nz on diagonal of P2*S: 3 + fraction of nz on diag of P2*S: 1.000000 + symbolic factorization defragmentations: 0 + symbolic memory usage (Units): 144 + symbolic memory usage (MBytes): 0.0 + Symbolic size (Units): 45 + Symbolic size (MBytes): 0 + symbolic factorization CPU time (sec): 0.00 + symbolic factorization wallclock time(sec): 0.00 + + matrix scaled: yes (divided each row by sum of abs values in each row) + minimum sum (abs (rows of A)): 1.00000e+00 + maximum sum (abs (rows of A)): 7.00000e+00 + + symbolic/numeric factorization: upper bound actual % + variable-sized part of Numeric object: + initial size (Units) 74 69 93% + peak size (Units) 1301 1292 99% + final size (Units) 15 12 80% + Numeric final size (Units) 85 80 94% + Numeric final size (MBytes) 0.0 0.0 94% + peak memory usage (Units) 1473 1464 99% + peak memory usage (MBytes) 0.0 0.0 99% + numeric factorization flops 1.30000e+01 4.00000e+00 31% + nz in L (incl diagonal) 10 9 90% + nz in U (incl diagonal) 10 8 80% + nz in L+U (incl diagonal) 15 12 80% + largest front (# entries) 9 4 44% + largest # rows in front 3 2 67% + largest # columns in front 3 2 67% + + initial allocation ratio used: 0.7 + # of forced updates due to frontal growth: 0 + nz in L (incl diagonal), if none dropped 9 + nz in U (incl diagonal), if none dropped 8 + number of small entries dropped 0 + nonzeros on diagonal of U: 5 + min abs. value on diagonal of U: 1.50e-01 + max abs. value on diagonal of U: 1.00e+00 + estimate of reciprocal of condition number: 1.50e-01 + indices in compressed pattern: 2 + numerical values stored in Numeric object: 8 + numeric factorization defragmentations: 1 + numeric factorization reallocations: 1 + costly numeric factorization reallocations: 0 + numeric factorization CPU time (sec): 0.00 + numeric factorization wallclock time (sec): 0.00 + symbolic + numeric CPU time (sec): 0.00 + symbolic + numeric wall clock time (sec): 0.00 + + solve flops: 1.17000e+02 + iterative refinement steps taken: 0 + iterative refinement steps attempted: 0 + sparse backward error omega1: 5.92e-17 + sparse backward error omega2: 0.00e+00 + solve CPU time (sec): 0.00 + solve wall clock time (sec): 0.00 + + total symbolic + numeric + solve flops: 1.21000e+02 + total symbolic + numeric + solve CPU time: 0.00 + total symbolic+numeric+solve wall clock time: 0.00 + + +x (with modified A): dense vector, n = 5. + 0 : (11) + 1 : (-4.66667) + 2 : (3) + 3 : (0.666667) + 4 : (31.6667) + dense vector OK + +maxnorm of residual: 5.32907e-15 + +changing A (0,0) from 2 to 2 +changing A (1,0) from 3 to 2 +changing A (0,1) from 3 to 13 +changing A (2,1) from -1 to 7 +changing A (4,1) from 4 to 10 +changing A (1,2) from 4 to 23 +changing A (2,2) from -3 to 15 +changing A (3,2) from 1 to 18 +changing A (4,2) from 2 to 18 +changing A (2,3) from 2 to 30 +changing A (1,4) from 0 to 39 +changing A (4,4) from 1 to 37 + +completely modified A (same pattern): column-form matrix, n_row 5 n_col 5, nz = 12. + + column 0: start: 0 end: 1 entries: 2 + row 0 : (2) + row 1 : (2) + + column 1: start: 2 end: 4 entries: 3 + row 0 : (13) + row 2 : (7) + row 4 : (10) + + column 2: start: 5 end: 8 entries: 4 + row 1 : (23) + row 2 : (15) + row 3 : (18) + row 4 : (18) + + column 3: start: 9 end: 9 entries: 1 + row 2 : (30) + + column 4: start: 10 end: 11 entries: 2 + row 1 : (39) + row 4 : (37) + column-form matrix OK + + +Saving symbolic object: + +Freeing symbolic object: + +Loading symbolic object: + +Done loading symbolic object + +Numeric factorization of completely modified A: Numeric object: + n_row: 5 n_col: 5 + relative pivot tolerance used: 0.1 + relative symmetric pivot tolerance used: 0.001 + matrix scaled: yes (divided each row by sum abs value in each row) + minimum sum (abs (rows of A)): 1.50000e+01 + maximum sum (abs (rows of A)): 6.50000e+01 + initial allocation parameter used: 0.7 + frontal matrix allocation parameter used: 0.5 + final total size of Numeric object (Units): 80 + final total size of Numeric object (MBytes): 0.0 + peak size of variable-size part (Units): 1292 + peak size of variable-size part (MBytes): 0.0 + largest actual frontal matrix size: 4 + memory defragmentations: 1 + memory reallocations: 1 + costly memory reallocations: 0 + entries in compressed pattern (L and U): 2 + number of nonzeros in L (excl diag): 4 + number of entries stored in L (excl diag): 2 + number of nonzeros in U (excl diag): 4 + number of entries stored in U (excl diag): 2 + factorization floating-point operations: 6 + number of nonzeros on diagonal of U: 5 + min abs. value on diagonal of U: 1.33333e-01 + max abs. value on diagonal of U: 1.00000e+00 + reciprocal condition number estimate: 1.33e-01 + +Scale factors applied via multiplication +Scale factors, Rs: dense vector, n = 5. + 0 : (0.0666667) + 1 : (0.015625) + 2 : (0.0192308) + 3 : (0.0555556) + 4 : (0.0153846) + dense vector OK + + +P: row permutation vector, n = 5. + 0 : 2 + 1 : 3 + 2 : 0 + 3 : 4 + 4 : 1 + permutation vector OK + + +Q: column permutation vector, n = 5. + 0 : 3 + 1 : 2 + 2 : 0 + 3 : 4 + 4 : 1 + permutation vector OK + + +L in Numeric object, in column-oriented compressed-pattern form: + Diagonal entries are all equal to 1.0 (not stored) + + column 0: length 0. + + column 1: length 2. + row 4 : (0.359375) + row 3 : (0.276923) + + column 2: add 1 entries. length 1. Start of Lchain. + row 4 : (0.234375) + + column 3: length 1. + row 4 : (1.07052) + + column 4: length 0. Start of Lchain. + + +U in Numeric object, in row-oriented compressed-pattern form: + Diagonal is stored separately. + + row 4: length 0. End of Uchain. + + row 3: length 1. End of Uchain. + col 4 : (0.153846) + + row 2: length 1. + col 4 : (0.866667) + + row 1: length 0. End of Uchain. + + row 1: length 0. + + row 0: length 2. + col 1 : (0.288462) + col 4 : (0.134615) + + +diagonal of U: dense vector, n = 5. + 0 : (0.576923) + 1 : (1) + 2 : (0.133333) + 3 : (0.569231) + 4 : (-0.367821) + dense vector OK + + Numeric object: OK + + +UMFPACK V4.4 (Jan. 28, 2005), Info: + matrix entry defined as: double + Int (generic integer) defined as: long + BLAS library used: none. UMFPACK will be slow. + MATLAB: no. + CPU timer: POSIX times ( ) routine. + number of rows in matrix A: 5 + number of columns in matrix A: 5 + entries in matrix A: 12 + memory usage reported in: 8-byte Units + size of int: 4 bytes + size of long: 4 bytes + size of pointer: 4 bytes + size of numerical entry: 8 bytes + + strategy used: unsymmetric + ordering used: colamd on A + modify Q during factorization: yes + prefer diagonal pivoting: no + pivots with zero Markowitz cost: 2 + submatrix S after removing zero-cost pivots: + number of "dense" rows: 0 + number of "dense" columns: 0 + number of empty rows: 0 + number of empty columns 0 + submatrix S square and diagonal preserved + pattern of square submatrix S: + number rows and columns 3 + symmetry of nonzero pattern: 1.000000 + nz in S+S' (excl. diagonal): 4 + nz on diagonal of matrix S: 2 + fraction of nz on diagonal: 0.666667 + 2-by-2 pivoting to place large entries on diagonal: + # of small diagonal entries of S: 1 + # unmatched: 0 + symmetry of P2*S: 0.000000 + nz in P2*S+(P2*S)' (excl. diag.): 6 + nz on diagonal of P2*S: 3 + fraction of nz on diag of P2*S: 1.000000 + symbolic factorization defragmentations: 0 + symbolic memory usage (Units): 144 + symbolic memory usage (MBytes): 0.0 + Symbolic size (Units): 45 + Symbolic size (MBytes): 0 + symbolic factorization CPU time (sec): 0.00 + symbolic factorization wallclock time(sec): 0.00 + + matrix scaled: yes (divided each row by sum of abs values in each row) + minimum sum (abs (rows of A)): 1.50000e+01 + maximum sum (abs (rows of A)): 6.50000e+01 + + symbolic/numeric factorization: upper bound actual % + variable-sized part of Numeric object: + initial size (Units) 74 69 93% + peak size (Units) 1301 1292 99% + final size (Units) 15 13 87% + Numeric final size (Units) 85 81 95% + Numeric final size (MBytes) 0.0 0.0 95% + peak memory usage (Units) 1473 1464 99% + peak memory usage (MBytes) 0.0 0.0 99% + numeric factorization flops 1.30000e+01 6.00000e+00 46% + nz in L (incl diagonal) 10 9 90% + nz in U (incl diagonal) 10 9 90% + nz in L+U (incl diagonal) 15 13 87% + largest front (# entries) 9 4 44% + largest # rows in front 3 2 67% + largest # columns in front 3 2 67% + + initial allocation ratio used: 0.7 + # of forced updates due to frontal growth: 0 + nz in L (incl diagonal), if none dropped 9 + nz in U (incl diagonal), if none dropped 9 + number of small entries dropped 0 + nonzeros on diagonal of U: 5 + min abs. value on diagonal of U: 1.33e-01 + max abs. value on diagonal of U: 1.00e+00 + estimate of reciprocal of condition number: 1.33e-01 + indices in compressed pattern: 2 + numerical values stored in Numeric object: 9 + numeric factorization defragmentations: 1 + numeric factorization reallocations: 1 + costly numeric factorization reallocations: 0 + numeric factorization CPU time (sec): 0.00 + numeric factorization wallclock time (sec): 0.00 + symbolic + numeric CPU time (sec): 0.00 + symbolic + numeric wall clock time (sec): 0.00 + + solve flops: 1.19000e+02 + iterative refinement steps taken: 0 + iterative refinement steps attempted: 0 + sparse backward error omega1: 3.70e-17 + sparse backward error omega2: 0.00e+00 + solve CPU time (sec): 0.00 + solve wall clock time (sec): 0.00 + + total symbolic + numeric + solve flops: 1.25000e+02 + total symbolic + numeric + solve CPU time: 0.00 + total symbolic+numeric+solve wall clock time: 0.00 + + +x (with completely modified A): dense vector, n = 5. + 0 : (8.50124) + 1 : (-0.692499) + 2 : (0.166667) + 3 : (-0.0217502) + 4 : (0.619594) + dense vector OK + +maxnorm of residual: 3.33067e-15 + + +C (transpose of A): column-form matrix, n_row 5 n_col 5, nz = 12. + + column 0: start: 0 end: 1 entries: 2 + row 0 : (2) + row 1 : (13) + + column 1: start: 2 end: 4 entries: 3 + row 0 : (2) + row 2 : (23) + row 4 : (39) + + column 2: start: 5 end: 7 entries: 3 + row 1 : (7) + row 2 : (15) + row 3 : (30) + + column 3: start: 8 end: 8 entries: 1 + row 2 : (18) + + column 4: start: 9 end: 11 entries: 3 + row 1 : (10) + row 2 : (18) + row 4 : (37) + column-form matrix OK + + +Symbolic factorization of C: Symbolic object: + matrix to be factorized: + n_row: 5 n_col: 5 + number of entries: 12 + block size used for dense matrix kernels: 32 + strategy used: unsymmetric + ordering used: colamd on A + + performn column etree postorder: yes + prefer diagonal pivoting (attempt P=Q): no + variable-size part of Numeric object: + minimum initial size (Units): 75 (MBytes): 0.0 + estimated peak size (Units): 1302 (MBytes): 0.0 + estimated final size (Units): 16 (MBytes): 0.0 + symbolic factorization memory usage (Units): 144 (MBytes): 0.0 + frontal matrices / supercolumns: + number of frontal chains: 1 + number of frontal matrices: 1 + largest frontal matrix row dimension: 3 + largest frontal matrix column dimension: 3 + + Frontal chain: 0. Frontal matrices 0 to 0 + Largest frontal matrix in Frontal chain: 3-by-3 + Front: 0 pivot cols: 3 (pivot columns 0 to 2) + pivot row candidates: 2 to 4 + leftmost descendant: 0 + 1st new candidate row : 2 + parent: (none) + +Initial column permutation, Q1: permutation vector, n = 5. + 0 : 3 + 1 : 2 + 2 : 0 + 3 : 4 + 4 : 1 + permutation vector OK + + +Initial row permutation, P1: permutation vector, n = 5. + 0 : 2 + 1 : 3 + 2 : 0 + 3 : 1 + 4 : 4 + permutation vector OK + + Symbolic object: OK + + +Get the contents of the Symbolic object for C: +(compare with umfpack_dl_report_symbolic output, above) +From the Symbolic object, C is of dimension 5-by-5 + with nz = 12, number of fronts = 1, + number of frontal matrix chains = 1 + +Pivot columns in each front, and parent of each front: + Front 0: parent front: -1 number of pivot cols: 3 + 0-th pivot column is column 3 in original matrix + 1-th pivot column is column 2 in original matrix + 2-th pivot column is column 0 in original matrix + +Note that the column ordering, above, will be refined +in the numeric factorization below. The assignment of pivot +columns to frontal matrices will always remain unchanged. + +Total number of pivot columns in frontal matrices: 3 + +Frontal matrix chains: + Frontal matrices 0 to 0 are factorized in a single + working array of size 3-by-3 + +Numeric factorization of C: Numeric object: + n_row: 5 n_col: 5 + relative pivot tolerance used: 0.1 + relative symmetric pivot tolerance used: 0.001 + matrix scaled: yes (divided each row by sum abs value in each row) + minimum sum (abs (rows of A)): 4.00000e+00 + maximum sum (abs (rows of A)): 7.60000e+01 + initial allocation parameter used: 0.7 + frontal matrix allocation parameter used: 0.5 + final total size of Numeric object (Units): 81 + final total size of Numeric object (MBytes): 0.0 + peak size of variable-size part (Units): 1293 + peak size of variable-size part (MBytes): 0.0 + largest actual frontal matrix size: 4 + memory defragmentations: 1 + memory reallocations: 1 + costly memory reallocations: 0 + entries in compressed pattern (L and U): 2 + number of nonzeros in L (excl diag): 3 + number of entries stored in L (excl diag): 2 + number of nonzeros in U (excl diag): 5 + number of entries stored in U (excl diag): 2 + factorization floating-point operations: 6 + number of nonzeros on diagonal of U: 5 + min abs. value on diagonal of U: 2.43243e-01 + max abs. value on diagonal of U: 1.00000e+00 + reciprocal condition number estimate: 2.43e-01 + +Scale factors applied via multiplication +Scale factors, Rs: dense vector, n = 5. + 0 : (0.25) + 1 : (0.0333333) + 2 : (0.0135135) + 3 : (0.0333333) + 4 : (0.0131579) + dense vector OK + + +P: row permutation vector, n = 5. + 0 : 2 + 1 : 3 + 2 : 0 + 3 : 4 + 4 : 1 + permutation vector OK + + +Q: column permutation vector, n = 5. + 0 : 3 + 1 : 2 + 2 : 0 + 3 : 4 + 4 : 1 + permutation vector OK + + +L in Numeric object, in column-oriented compressed-pattern form: + Diagonal entries are all equal to 1.0 (not stored) + + column 0: length 0. + + column 1: length 1. + row 4 : (0.233333) + + column 2: add 1 entries. length 1. Start of Lchain. + row 4 : (0.866667) + + column 3: length 1. + row 4 : (0.684685) + + column 4: length 0. Start of Lchain. + + +U in Numeric object, in row-oriented compressed-pattern form: + Diagonal is stored separately. + + row 4: length 0. End of Uchain. + + row 3: length 1. End of Uchain. + col 4 : (0.513158) + + row 2: length 1. + col 4 : (0.5) + + row 1: length 0. End of Uchain. + + row 1: length 0. + + row 0: length 3. + col 1 : (0.202703) + col 3 : (0.243243) + col 4 : (0.310811) + + +diagonal of U: dense vector, n = 5. + 0 : (0.243243) + 1 : (1) + 2 : (0.5) + 3 : (0.486842) + 4 : (-0.784685) + dense vector OK + + Numeric object: OK + + +L (lower triangular factor of C): row-form matrix, n_row 5 n_col 5, nz = 8. + + row 0: start: 0 end: 0 entries: 1 + column 0 : (1) + + row 1: start: 1 end: 1 entries: 1 + column 1 : (1) + + row 2: start: 2 end: 2 entries: 1 + column 2 : (1) + + row 3: start: 3 end: 3 entries: 1 + column 3 : (1) + + row 4: start: 4 end: 7 entries: 4 + column 1 : (0.233333) + column 2 : (0.866667) + column 3 : (0.684685) + column 4 : (1) + row-form matrix OK + + +U (upper triangular factor of C): column-form matrix, n_row 5 n_col 5, nz = 10. + + column 0: start: 0 end: 0 entries: 1 + row 0 : (0.243243) + + column 1: start: 1 end: 2 entries: 2 + row 0 : (0.202703) + row 1 : (1) + + column 2: start: 3 end: 3 entries: 1 + row 2 : (0.5) + + column 3: start: 4 end: 5 entries: 2 + row 0 : (0.243243) + row 3 : (0.486842) + + column 4: start: 6 end: 9 entries: 4 + row 0 : (0.310811) + row 2 : (0.5) + row 3 : (0.513158) + row 4 : (-0.784685) + column-form matrix OK + + +P: permutation vector, n = 5. + 0 : 2 + 1 : 3 + 2 : 0 + 3 : 4 + 4 : 1 + permutation vector OK + + +Q: permutation vector, n = 5. + 0 : 3 + 1 : 2 + 2 : 0 + 3 : 4 + 4 : 1 + permutation vector OK + + +Scale factors: row i of A is to be multiplied by the ith scale factor +0: 0.25 +1: 0.0333333 +2: 0.0135135 +3: 0.0333333 +4: 0.0131579 + +Converting L to triplet form, and printing it: + +L, in triplet form: triplet-form matrix, n_row = 5, n_col = 5 nz = 8. + 0 : 0 0 (1) + 1 : 1 1 (1) + 2 : 2 2 (1) + 3 : 3 3 (1) + 4 : 4 1 (0.233333) + 5 : 4 2 (0.866667) + 6 : 4 3 (0.684685) + 7 : 4 4 (1) + triplet-form matrix OK + + +Saving numeric object: + +Freeing numeric object: + +Loading numeric object: + +Done loading numeric object + +UMFPACK V4.4 (Jan. 28, 2005), Info: + matrix entry defined as: double + Int (generic integer) defined as: long + BLAS library used: none. UMFPACK will be slow. + MATLAB: no. + CPU timer: POSIX times ( ) routine. + number of rows in matrix A: 5 + number of columns in matrix A: 5 + entries in matrix A: 12 + memory usage reported in: 8-byte Units + size of int: 4 bytes + size of long: 4 bytes + size of pointer: 4 bytes + size of numerical entry: 8 bytes + + strategy used: unsymmetric + ordering used: colamd on A + modify Q during factorization: yes + prefer diagonal pivoting: no + pivots with zero Markowitz cost: 2 + submatrix S after removing zero-cost pivots: + number of "dense" rows: 0 + number of "dense" columns: 0 + number of empty rows: 0 + number of empty columns 0 + submatrix S square and diagonal preserved + pattern of square submatrix S: + number rows and columns 3 + symmetry of nonzero pattern: 1.000000 + nz in S+S' (excl. diagonal): 4 + nz on diagonal of matrix S: 2 + fraction of nz on diagonal: 0.666667 + 2-by-2 pivoting to place large entries on diagonal: + # of small diagonal entries of S: 1 + # unmatched: 0 + symmetry of P2*S: 0.000000 + nz in P2*S+(P2*S)' (excl. diag.): 6 + nz on diagonal of P2*S: 3 + fraction of nz on diag of P2*S: 1.000000 + symbolic factorization defragmentations: 0 + symbolic memory usage (Units): 144 + symbolic memory usage (MBytes): 0.0 + Symbolic size (Units): 45 + Symbolic size (MBytes): 0 + symbolic factorization CPU time (sec): 0.00 + symbolic factorization wallclock time(sec): 0.00 + + matrix scaled: yes (divided each row by sum of abs values in each row) + minimum sum (abs (rows of A)): 4.00000e+00 + maximum sum (abs (rows of A)): 7.60000e+01 + + symbolic/numeric factorization: upper bound actual % + variable-sized part of Numeric object: + initial size (Units) 75 70 93% + peak size (Units) 1302 1293 99% + final size (Units) 16 14 88% + Numeric final size (Units) 86 82 95% + Numeric final size (MBytes) 0.0 0.0 95% + peak memory usage (Units) 1474 1465 99% + peak memory usage (MBytes) 0.0 0.0 99% + numeric factorization flops 1.30000e+01 6.00000e+00 46% + nz in L (incl diagonal) 9 8 89% + nz in U (incl diagonal) 11 10 91% + nz in L+U (incl diagonal) 15 13 87% + largest front (# entries) 9 4 44% + largest # rows in front 3 2 67% + largest # columns in front 3 2 67% + + initial allocation ratio used: 0.7 + # of forced updates due to frontal growth: 0 + nz in L (incl diagonal), if none dropped 8 + nz in U (incl diagonal), if none dropped 10 + number of small entries dropped 0 + nonzeros on diagonal of U: 5 + min abs. value on diagonal of U: 2.43e-01 + max abs. value on diagonal of U: 1.00e+00 + estimate of reciprocal of condition number: 2.43e-01 + indices in compressed pattern: 2 + numerical values stored in Numeric object: 9 + numeric factorization defragmentations: 1 + numeric factorization reallocations: 1 + costly numeric factorization reallocations: 0 + numeric factorization CPU time (sec): 0.00 + numeric factorization wallclock time (sec): 0.00 + symbolic + numeric CPU time (sec): 0.00 + symbolic + numeric wall clock time (sec): 0.00 + + solve flops: 1.11000e+02 + iterative refinement steps taken: 0 + iterative refinement steps attempted: 0 + sparse backward error omega1: 7.60e-17 + sparse backward error omega2: 0.00e+00 + solve CPU time (sec): 0.00 + solve wall clock time (sec): 0.00 + + total symbolic + numeric + solve flops: 1.17000e+02 + total symbolic + numeric + solve CPU time: 0.00 + total symbolic+numeric+solve wall clock time: 0.00 + + +x (solution of C'x=b): dense vector, n = 5. + 0 : (8.50124) + 1 : (-0.692499) + 2 : (0.166667) + 3 : (-0.0217502) + 4 : (0.619594) + dense vector OK + +maxnorm of residual: 4.77396e-15 + + +Solving C'x=b again, using umfpack_dl_wsolve instead: + +UMFPACK V4.4 (Jan. 28, 2005), Info: + matrix entry defined as: double + Int (generic integer) defined as: long + BLAS library used: none. UMFPACK will be slow. + MATLAB: no. + CPU timer: POSIX times ( ) routine. + number of rows in matrix A: 5 + number of columns in matrix A: 5 + entries in matrix A: 12 + memory usage reported in: 8-byte Units + size of int: 4 bytes + size of long: 4 bytes + size of pointer: 4 bytes + size of numerical entry: 8 bytes + + strategy used: unsymmetric + ordering used: colamd on A + modify Q during factorization: yes + prefer diagonal pivoting: no + pivots with zero Markowitz cost: 2 + submatrix S after removing zero-cost pivots: + number of "dense" rows: 0 + number of "dense" columns: 0 + number of empty rows: 0 + number of empty columns 0 + submatrix S square and diagonal preserved + pattern of square submatrix S: + number rows and columns 3 + symmetry of nonzero pattern: 1.000000 + nz in S+S' (excl. diagonal): 4 + nz on diagonal of matrix S: 2 + fraction of nz on diagonal: 0.666667 + 2-by-2 pivoting to place large entries on diagonal: + # of small diagonal entries of S: 1 + # unmatched: 0 + symmetry of P2*S: 0.000000 + nz in P2*S+(P2*S)' (excl. diag.): 6 + nz on diagonal of P2*S: 3 + fraction of nz on diag of P2*S: 1.000000 + symbolic factorization defragmentations: 0 + symbolic memory usage (Units): 144 + symbolic memory usage (MBytes): 0.0 + Symbolic size (Units): 45 + Symbolic size (MBytes): 0 + symbolic factorization CPU time (sec): 0.00 + symbolic factorization wallclock time(sec): 0.00 + + matrix scaled: yes (divided each row by sum of abs values in each row) + minimum sum (abs (rows of A)): 4.00000e+00 + maximum sum (abs (rows of A)): 7.60000e+01 + + symbolic/numeric factorization: upper bound actual % + variable-sized part of Numeric object: + initial size (Units) 75 70 93% + peak size (Units) 1302 1293 99% + final size (Units) 16 14 88% + Numeric final size (Units) 86 82 95% + Numeric final size (MBytes) 0.0 0.0 95% + peak memory usage (Units) 1474 1465 99% + peak memory usage (MBytes) 0.0 0.0 99% + numeric factorization flops 1.30000e+01 6.00000e+00 46% + nz in L (incl diagonal) 9 8 89% + nz in U (incl diagonal) 11 10 91% + nz in L+U (incl diagonal) 15 13 87% + largest front (# entries) 9 4 44% + largest # rows in front 3 2 67% + largest # columns in front 3 2 67% + + initial allocation ratio used: 0.7 + # of forced updates due to frontal growth: 0 + nz in L (incl diagonal), if none dropped 8 + nz in U (incl diagonal), if none dropped 10 + number of small entries dropped 0 + nonzeros on diagonal of U: 5 + min abs. value on diagonal of U: 2.43e-01 + max abs. value on diagonal of U: 1.00e+00 + estimate of reciprocal of condition number: 2.43e-01 + indices in compressed pattern: 2 + numerical values stored in Numeric object: 9 + numeric factorization defragmentations: 1 + numeric factorization reallocations: 1 + costly numeric factorization reallocations: 0 + numeric factorization CPU time (sec): 0.00 + numeric factorization wallclock time (sec): 0.00 + symbolic + numeric CPU time (sec): 0.00 + symbolic + numeric wall clock time (sec): 0.00 + + solve flops: 1.11000e+02 + iterative refinement steps taken: 0 + iterative refinement steps attempted: 0 + sparse backward error omega1: 7.60e-17 + sparse backward error omega2: 0.00e+00 + solve CPU time (sec): 0.00 + solve wall clock time (sec): 0.00 + + total symbolic + numeric + solve flops: 1.17000e+02 + total symbolic + numeric + solve CPU time: 0.00 + total symbolic+numeric+solve wall clock time: 0.00 + + +x (solution of C'x=b): dense vector, n = 5. + 0 : (8.50124) + 1 : (-0.692499) + 2 : (0.166667) + 3 : (-0.0217502) + 4 : (0.619594) + dense vector OK + +maxnorm of residual: 4.77396e-15 + + +umfpack_dl_demo complete. +Total time: 0.00 seconds (CPU time), 0.00 seconds (wallclock time) diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Demo/umfpack_dl_demo.sed --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Demo/umfpack_dl_demo.sed Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,77 @@ +/::/d +1,$s/_xx_/_dl_/g +1,$s/Int/long/g +1,$s/WSIZE/5/ +/define ABS/ { + s/ABS/ABS(x) ((x) >= 0 ? (x) : -(x))/ + } +/, rz \[i\]/ { + s/, rz \[i\]// + } +/, Avalz/ { + s/, Avalz// + } +/, rz/ { + s/, rz// + } +/, bz/ { + s/, bz// + } +/, xz/ { + s/, xz// + } + +/, Lz/ { + s/, Lz// + } +/, Uz/ { + s/, Uz// + } +/, Dz/ { + s/, Dz// + } +/, Az/ { + s/, Az// + } +/, Cz, TRUE/ { + s/, Cz, TRUE// + } +/, Cz/ { + s/, Cz// + } +/, Rbz/ { + s/, Rbz// + } +/, yz/ { + s/, yz// + } + +/ || !Lz/ { + s/ || !Lz// + } +/ || !Uz/ { + s/ || !Uz// + } +/ || !Dz/ { + s/ || !Dz// + } +/ || !Az/ { + s/ || !Az// + } +/ || !Cz/ { + s/ || !Cz// + } + +/rz/d +/Rbz/d +/yz/d +/Avalz/d +/Az/d +/Cz/d +/bz/d +/xz/d +/Lz/d +/Uz/d +/Dz/d +/complex/d + diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Demo/umfpack_simple.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Demo/umfpack_simple.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,30 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +#include +#include "umfpack.h" + +int n = 5 ; +int Ap [ ] = {0, 2, 5, 9, 10, 12} ; +int Ai [ ] = { 0, 1, 0, 2, 4, 1, 2, 3, 4, 2, 1, 4} ; +double Ax [ ] = {2., 3., 3., -1., 4., 4., -3., 1., 2., 2., 6., 1.} ; +double b [ ] = {8., 45., -3., 3., 19.} ; +double x [5] ; + +int main (void) +{ + double *null = (double *) NULL ; + int i ; + void *Symbolic, *Numeric ; + (void) umfpack_di_symbolic (n, n, Ap, Ai, Ax, &Symbolic, null, null) ; + (void) umfpack_di_numeric (Ap, Ai, Ax, Symbolic, &Numeric, null, null) ; + umfpack_di_free_symbolic (&Symbolic) ; + (void) umfpack_di_solve (UMFPACK_A, Ap, Ai, Ax, x, b, Numeric, null, null) ; + umfpack_di_free_numeric (&Numeric) ; + for (i = 0 ; i < n ; i++) printf ("x [%d] = %g\n", i, x [i]) ; + return (0) ; +} + diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Demo/umfpack_xx_demo.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Demo/umfpack_xx_demo.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,810 @@ +/* ========================================================================== */ +/* === umfpack_xx_demo ====================================================== */ +/* ========================================================================== */ + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: Do not attempt to compile this file! It is processed via sed scripts into +:: four different C demo programs: +:: +:: umfpack_di_demo.c: double precision, int integers +:: umfpack_dl_demo.c: double precision, long integers +:: umfpack_zi_demo.c: complex double precision, int integers +:: umfpack_zl_demo.c: complex double precision, long integers +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + A demo of UMFPACK: umfpack_xx_* version. + + First, factor and solve a 5-by-5 system, Ax=b, using default parameters. + Then solve A'x=b using the factors of A. Modify one entry (A (1,4) = 0, + where the row and column indices range from 0 to 4. The pattern of A + has not changed (it has explicitly zero entry), so a reanalysis with + umfpack_xx_symbolic does not need to be done. Refactorize (with + umfpack_xx_numeric), and solve Ax=b. Note that the pivot ordering has + changed. Next, change all of the entries in A, but not the pattern. + + Finally, compute C = A', and do the symbolic and numeric factorization of C. + Factorizing A' can sometimes be better than factorizing A itself (less work + and memory usage). Solve C'x=b twice; the solution is the same as the + solution to Ax=b. + + A note about zero-sized arrays: UMFPACK uses many user-provided arrays of + size n (order of the matrix), and of size nz (the number of nonzeros in a + matrix). n cannot be zero; UMFPACK does not handle zero-dimensioned arrays. + However, nz can be zero. If you attempt to malloc an array of size nz = 0, + however, malloc will return a null pointer which UMFPACK will report as a + "missing argument." Thus, nz1 in this code is set to MAX (nz,1), and + similarly for lnz and unz. Lnz can never be zero, however, since L is always + unit diagonal. +*/ + +/* -------------------------------------------------------------------------- */ +/* definitions */ +/* -------------------------------------------------------------------------- */ + +#include +#include +#include "umfpack.h" + +/* use a cheap approximate absolute value for complex numbers: */ +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: ABS is |xreal|+|ximag| for the complex case, and |x| for the real case. +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +#define ABS + +#define MAX(a,b) (((a) > (b)) ? (a) : (b)) +#ifndef TRUE +#define TRUE (1) +#endif +#ifndef FALSE +#define FALSE (0) +#endif + +/* -------------------------------------------------------------------------- */ +/* triplet form of the matrix. The triplets can be in any order. */ +/* -------------------------------------------------------------------------- */ + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: Int is either int or long: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +static Int n = 5, nz = 12 ; +static Int Arow [ ] = { 0, 4, 1, 1, 2, 2, 0, 1, 2, 3, 4, 4} ; +static Int Acol [ ] = { 0, 4, 0, 2, 1, 2, 1, 4, 3, 2, 1, 2} ; +static double Aval [ ] = {2., 1., 3., 4., -1., -3., 3., 6., 2., 1., 4., 2.} ; +static double Avalz[ ] = {1., .4, .1, .2, -1., -.2, 0., 6., 3., 0., .3, .3} ; +static double b [ ] = {8., 45., -3., 3., 19.}, x [5], r [5] ; +static double bz[ ] = {1., -5., -2., 0., 2.2}, xz[5], rz[5] ; + +/* Avalz, bz: imaginary part of A and b */ + +/* -------------------------------------------------------------------------- */ +/* error: print a message and exit */ +/* -------------------------------------------------------------------------- */ + +static void error +( + char *message +) +{ + printf ("\n\n====== error: %s =====\n\n", message) ; + exit (1) ; +} + + +/* -------------------------------------------------------------------------- */ +/* resid: compute the residual, r = Ax-b or r = A'x=b and return maxnorm (r) */ +/* A' is the complex conjugate transpose, not the array transpose */ +/* -------------------------------------------------------------------------- */ + +static double resid +( + Int transpose, + Int Ap [ ], + Int Ai [ ], + double Ax [ ] + , double Az [ ] +) +{ + Int i, j, p ; + double norm ; + + for (i = 0 ; i < n ; i++) + { + r [i] = -b [i] ; + rz[i] = -bz[i] ; + } + if (transpose) + { + for (j = 0 ; j < n ; j++) + { + for (p = Ap [j] ; p < Ap [j+1] ; p++) + { + i = Ai [p] ; + /* complex: r(j) += conj (Aij) * x (i) */ + r [j] += Ax [p] * x [i] ; + r [j] += Az [p] * xz[i] ; + rz[j] -= Az [p] * x [i] ; + rz[j] += Ax [p] * xz[i] ; + } + } + } + else + { + for (j = 0 ; j < n ; j++) + { + for (p = Ap [j] ; p < Ap [j+1] ; p++) + { + i = Ai [p] ; + r [i] += Ax [p] * x [j] ; + r [i] -= Az [p] * xz[j] ; + rz[i] += Az [p] * x [j] ; + rz[i] += Ax [p] * xz[j] ; + } + } + } + norm = 0. ; + for (i = 0 ; i < n ; i++) + { + norm = MAX (ABS (r [i], rz [i]), norm) ; + } + return (norm) ; +} + + +/* -------------------------------------------------------------------------- */ +/* main program */ +/* -------------------------------------------------------------------------- */ + +int main (int argc, char **argv) +{ + double Info [UMFPACK_INFO], Control [UMFPACK_CONTROL], *Ax, *Cx, *Lx, *Ux, + *W, t [2], *Dx, rnorm, *Rb, *y, *Rs ; + double *Az, *Lz, *Uz, *Dz, *Cz, *Rbz, *yz ; + Int *Ap, *Ai, *Cp, *Ci, row, col, p, lnz, unz, nr, nc, *Lp, *Li, *Ui, *Up, + *P, *Q, *Lj, i, j, k, anz, nfr, nchains, *Qinit, fnpiv, lnz1, unz1, nz1, + status, *Front_npivcol, *Front_parent, *Chain_start, *Wi, *Pinit, n1, + *Chain_maxrows, *Chain_maxcols, *Front_1strow, *Front_leftmostdesc, + nzud, do_recip ; + void *Symbolic, *Numeric ; + + /* ---------------------------------------------------------------------- */ + /* initializations */ + /* ---------------------------------------------------------------------- */ + + umfpack_tic (t) ; + + printf ("\n%s demo: _xx_ version\n", UMFPACK_VERSION) ; + + /* get the default control parameters */ + umfpack_xx_defaults (Control) ; + + /* change the default print level for this demo */ + /* (otherwise, nothing will print) */ + Control [UMFPACK_PRL] = 6 ; + + /* print the license agreement */ + umfpack_xx_report_status (Control, UMFPACK_OK) ; + Control [UMFPACK_PRL] = 5 ; + + /* print the control parameters */ + umfpack_xx_report_control (Control) ; + + /* ---------------------------------------------------------------------- */ + /* print A and b, and convert A to column-form */ + /* ---------------------------------------------------------------------- */ + + /* print the right-hand-side */ + printf ("\nb: ") ; + (void) umfpack_xx_report_vector (n, b, bz, Control) ; + + /* print the triplet form of the matrix */ + printf ("\nA: ") ; + (void) umfpack_xx_report_triplet (n, n, nz, Arow, Acol, Aval, Avalz, + Control) ; + + /* convert to column form */ + nz1 = MAX (nz,1) ; /* ensure arrays are not of size zero. */ + Ap = (Int *) malloc ((n+1) * sizeof (Int)) ; + Ai = (Int *) malloc (nz1 * sizeof (Int)) ; + Ax = (double *) malloc (nz1 * sizeof (double)) ; + Az = (double *) malloc (nz1 * sizeof (double)) ; + if (!Ap || !Ai || !Ax || !Az) + { + error ("out of memory") ; + } + + status = umfpack_xx_triplet_to_col (n, n, nz, Arow, Acol, Aval, Avalz, + Ap, Ai, Ax, Az, (Int *) NULL) ; + + if (status < 0) + { + umfpack_xx_report_status (Control, status) ; + error ("umfpack_xx_triplet_to_col failed") ; + } + + /* print the column-form of A */ + printf ("\nA: ") ; + (void) umfpack_xx_report_matrix (n, n, Ap, Ai, Ax, Az, 1, Control) ; + + /* ---------------------------------------------------------------------- */ + /* symbolic factorization */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_xx_symbolic (n, n, Ap, Ai, Ax, Az, &Symbolic, + Control, Info) ; + if (status < 0) + { + umfpack_xx_report_info (Control, Info) ; + umfpack_xx_report_status (Control, status) ; + error ("umfpack_xx_symbolic failed") ; + } + + /* print the symbolic factorization */ + + printf ("\nSymbolic factorization of A: ") ; + (void) umfpack_xx_report_symbolic (Symbolic, Control) ; + + /* ---------------------------------------------------------------------- */ + /* numeric factorization */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_xx_numeric (Ap, Ai, Ax, Az, Symbolic, &Numeric, + Control, Info) ; + if (status < 0) + { + umfpack_xx_report_info (Control, Info) ; + umfpack_xx_report_status (Control, status) ; + error ("umfpack_xx_numeric failed") ; + } + + /* print the numeric factorization */ + printf ("\nNumeric factorization of A: ") ; + (void) umfpack_xx_report_numeric (Numeric, Control) ; + + /* ---------------------------------------------------------------------- */ + /* solve Ax=b */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_xx_solve (UMFPACK_A, Ap, Ai, Ax, Az, x, xz, b, bz, + Numeric, Control, Info) ; + umfpack_xx_report_info (Control, Info) ; + umfpack_xx_report_status (Control, status) ; + if (status < 0) + { + error ("umfpack_xx_solve failed") ; + } + printf ("\nx (solution of Ax=b): ") ; + (void) umfpack_xx_report_vector (n, x, xz, Control) ; + rnorm = resid (FALSE, Ap, Ai, Ax, Az) ; + printf ("maxnorm of residual: %g\n\n", rnorm) ; + + /* ---------------------------------------------------------------------- */ + /* compute the determinant */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_xx_get_determinant (x, xz, r, Numeric, Info) ; + umfpack_xx_report_status (Control, status) ; + if (status < 0) + { + error ("umfpack_xx_get_determinant failed") ; + } + printf ("determinant: (%g", x [0]) ; + printf ("+ (%g)i", xz [0]) ; /* complex */ + printf (") * 10^(%g)\n", r [0]) ; + + /* ---------------------------------------------------------------------- */ + /* solve Ax=b, broken down into steps */ + /* ---------------------------------------------------------------------- */ + + /* Rb = R*b */ + Rb = (double *) malloc (n * sizeof (double)) ; + Rbz = (double *) malloc (n * sizeof (double)) ; + y = (double *) malloc (n * sizeof (double)) ; + yz = (double *) malloc (n * sizeof (double)) ; + if (!Rb || !y) error ("out of memory") ; + if (!Rbz || !yz) error ("out of memory") ; + + status = umfpack_xx_scale (Rb, Rbz, b, bz, Numeric) ; + if (status < 0) error ("umfpack_xx_scale failed") ; + /* solve Ly = P*(Rb) */ + status = umfpack_xx_solve (UMFPACK_Pt_L, Ap, Ai, Ax, Az, y, yz, Rb, Rbz, + Numeric, Control, Info) ; + if (status < 0) error ("umfpack_xx_solve failed") ; + /* solve UQ'x=y */ + status = umfpack_xx_solve (UMFPACK_U_Qt, Ap, Ai, Ax, Az, x, xz, y, yz, + Numeric, Control, Info) ; + if (status < 0) error ("umfpack_xx_solve failed") ; + printf ("\nx (solution of Ax=b, solve is split into 3 steps): ") ; + (void) umfpack_xx_report_vector (n, x, xz, Control) ; + rnorm = resid (FALSE, Ap, Ai, Ax, Az) ; + printf ("maxnorm of residual: %g\n\n", rnorm) ; + + free (Rb) ; + free (Rbz) ; + free (y) ; + free (yz) ; + + /* ---------------------------------------------------------------------- */ + /* solve A'x=b */ + /* ---------------------------------------------------------------------- */ + + /* note that this is the complex conjugate transpose, A' */ + status = umfpack_xx_solve (UMFPACK_At, Ap, Ai, Ax, Az, x, xz, b, bz, + Numeric, Control, Info) ; + umfpack_xx_report_info (Control, Info) ; + if (status < 0) + { + error ("umfpack_xx_solve failed") ; + } + printf ("\nx (solution of A'x=b): ") ; + (void) umfpack_xx_report_vector (n, x, xz, Control) ; + rnorm = resid (TRUE, Ap, Ai, Ax, Az) ; + printf ("maxnorm of residual: %g\n\n", rnorm) ; + + /* ---------------------------------------------------------------------- */ + /* modify one numerical value in the column-form of A */ + /* ---------------------------------------------------------------------- */ + + /* change A (1,4), look for row index 1 in column 4. */ + row = 1 ; + col = 4 ; + for (p = Ap [col] ; p < Ap [col+1] ; p++) + { + if (row == Ai [p]) + { + printf ("\nchanging A (%ld,%ld) to zero\n", row, col) ; + Ax [p] = 0.0 ; + Az [p] = 0.0 ; + break ; + } + } + printf ("\nmodified A: ") ; + (void) umfpack_xx_report_matrix (n, n, Ap, Ai, Ax, Az, 1, Control) ; + + /* ---------------------------------------------------------------------- */ + /* redo the numeric factorization */ + /* ---------------------------------------------------------------------- */ + + /* The pattern (Ap and Ai) hasn't changed, so the symbolic factorization */ + /* doesn't have to be redone, no matter how much we change Ax. */ + + /* We don't need the Numeric object any more, so free it. */ + umfpack_xx_free_numeric (&Numeric) ; + + /* Note that a memory leak would have occurred if the old Numeric */ + /* had not been free'd with umfpack_xx_free_numeric above. */ + status = umfpack_xx_numeric (Ap, Ai, Ax, Az, Symbolic, &Numeric, + Control, Info) ; + if (status < 0) + { + umfpack_xx_report_info (Control, Info) ; + umfpack_xx_report_status (Control, status) ; + error ("umfpack_xx_numeric failed") ; + } + printf ("\nNumeric factorization of modified A: ") ; + (void) umfpack_xx_report_numeric (Numeric, Control) ; + + /* ---------------------------------------------------------------------- */ + /* solve Ax=b, with the modified A */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_xx_solve (UMFPACK_A, Ap, Ai, Ax, Az, x, xz, b, bz, + Numeric, Control, Info) ; + umfpack_xx_report_info (Control, Info) ; + if (status < 0) + { + umfpack_xx_report_status (Control, status) ; + error ("umfpack_xx_solve failed") ; + } + printf ("\nx (with modified A): ") ; + (void) umfpack_xx_report_vector (n, x, xz, Control) ; + rnorm = resid (FALSE, Ap, Ai, Ax, Az) ; + printf ("maxnorm of residual: %g\n\n", rnorm) ; + + /* ---------------------------------------------------------------------- */ + /* modify all of the numerical values of A, but not the pattern */ + /* ---------------------------------------------------------------------- */ + + for (col = 0 ; col < n ; col++) + { + for (p = Ap [col] ; p < Ap [col+1] ; p++) + { + row = Ai [p] ; + printf ("changing ") ; + /* complex: */ printf ("real part of ") ; + printf ("A (%ld,%ld) from %g", row, col, Ax [p]) ; + Ax [p] = Ax [p] + col*10 - row ; + printf (" to %g\n", Ax [p]) ; + } + } + printf ("\ncompletely modified A (same pattern): ") ; + (void) umfpack_xx_report_matrix (n, n, Ap, Ai, Ax, Az, 1, Control) ; + + /* ---------------------------------------------------------------------- */ + /* save the Symbolic object to file, free it, and load it back in */ + /* ---------------------------------------------------------------------- */ + + /* use the default filename, "symbolic.umf" */ + printf ("\nSaving symbolic object:\n") ; + status = umfpack_xx_save_symbolic (Symbolic, (char *) NULL) ; + if (status < 0) + { + umfpack_xx_report_status (Control, status) ; + error ("umfpack_xx_save_symbolic failed") ; + } + printf ("\nFreeing symbolic object:\n") ; + umfpack_xx_free_symbolic (&Symbolic) ; + printf ("\nLoading symbolic object:\n") ; + status = umfpack_xx_load_symbolic (&Symbolic, (char *) NULL) ; + if (status < 0) + { + umfpack_xx_report_status (Control, status) ; + error ("umfpack_xx_load_symbolic failed") ; + } + printf ("\nDone loading symbolic object\n") ; + + /* ---------------------------------------------------------------------- */ + /* redo the numeric factorization */ + /* ---------------------------------------------------------------------- */ + + umfpack_xx_free_numeric (&Numeric) ; + status = umfpack_xx_numeric (Ap, Ai, Ax, Az, Symbolic, &Numeric, + Control, Info) ; + if (status < 0) + { + umfpack_xx_report_info (Control, Info) ; + umfpack_xx_report_status (Control, status) ; + error ("umfpack_xx_numeric failed") ; + } + printf ("\nNumeric factorization of completely modified A: ") ; + (void) umfpack_xx_report_numeric (Numeric, Control) ; + + /* ---------------------------------------------------------------------- */ + /* solve Ax=b, with the modified A */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_xx_solve (UMFPACK_A, Ap, Ai, Ax, Az, x, xz, b, bz, + Numeric, Control, Info) ; + umfpack_xx_report_info (Control, Info) ; + if (status < 0) + { + umfpack_xx_report_status (Control, status) ; + error ("umfpack_xx_solve failed") ; + } + printf ("\nx (with completely modified A): ") ; + (void) umfpack_xx_report_vector (n, x, xz, Control) ; + rnorm = resid (FALSE, Ap, Ai, Ax, Az) ; + printf ("maxnorm of residual: %g\n\n", rnorm) ; + + /* ---------------------------------------------------------------------- */ + /* free the symbolic and numeric factorization */ + /* ---------------------------------------------------------------------- */ + + umfpack_xx_free_symbolic (&Symbolic) ; + umfpack_xx_free_numeric (&Numeric) ; + + /* ---------------------------------------------------------------------- */ + /* C = transpose of A */ + /* ---------------------------------------------------------------------- */ + + Cp = (Int *) malloc ((n+1) * sizeof (Int)) ; + Ci = (Int *) malloc (nz1 * sizeof (Int)) ; + Cx = (double *) malloc (nz1 * sizeof (double)) ; + Cz = (double *) malloc (nz1 * sizeof (double)) ; + if (!Cp || !Ci || !Cx || !Cz) + { + error ("out of memory") ; + } + status = umfpack_xx_transpose (n, n, Ap, Ai, Ax, Az, + (Int *) NULL, (Int *) NULL, Cp, Ci, Cx, Cz, TRUE) ; + if (status < 0) + { + umfpack_xx_report_status (Control, status) ; + error ("umfpack_xx_transpose failed: ") ; + } + printf ("\nC (transpose of A): ") ; + (void) umfpack_xx_report_matrix (n, n, Cp, Ci, Cx, Cz, 1, Control) ; + + /* ---------------------------------------------------------------------- */ + /* symbolic factorization of C */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_xx_symbolic (n, n, Cp, Ci, Cx, Cz, &Symbolic, + Control, Info) ; + if (status < 0) + { + umfpack_xx_report_info (Control, Info) ; + umfpack_xx_report_status (Control, status) ; + error ("umfpack_xx_symbolic failed") ; + } + printf ("\nSymbolic factorization of C: ") ; + (void) umfpack_xx_report_symbolic (Symbolic, Control) ; + + /* ---------------------------------------------------------------------- */ + /* copy the contents of Symbolic into user arrays print them */ + /* ---------------------------------------------------------------------- */ + + printf ("\nGet the contents of the Symbolic object for C:\n") ; + printf ("(compare with umfpack_xx_report_symbolic output, above)\n") ; + Pinit = (Int *) malloc ((n+1) * sizeof (Int)) ; + Qinit = (Int *) malloc ((n+1) * sizeof (Int)) ; + Front_npivcol = (Int *) malloc ((n+1) * sizeof (Int)) ; + Front_1strow = (Int *) malloc ((n+1) * sizeof (Int)) ; + Front_leftmostdesc = (Int *) malloc ((n+1) * sizeof (Int)) ; + Front_parent = (Int *) malloc ((n+1) * sizeof (Int)) ; + Chain_start = (Int *) malloc ((n+1) * sizeof (Int)) ; + Chain_maxrows = (Int *) malloc ((n+1) * sizeof (Int)) ; + Chain_maxcols = (Int *) malloc ((n+1) * sizeof (Int)) ; + if (!Pinit || !Qinit || !Front_npivcol || !Front_parent || !Chain_start || + !Chain_maxrows || !Chain_maxcols || !Front_1strow || + !Front_leftmostdesc) + { + error ("out of memory") ; + } + + status = umfpack_xx_get_symbolic (&nr, &nc, &n1, &anz, &nfr, &nchains, + Pinit, Qinit, Front_npivcol, Front_parent, Front_1strow, + Front_leftmostdesc, Chain_start, Chain_maxrows, Chain_maxcols, + Symbolic) ; + + if (status < 0) + { + error ("symbolic factorization invalid") ; + } + + printf ("From the Symbolic object, C is of dimension %ld-by-%ld\n", nr, nc); + printf (" with nz = %ld, number of fronts = %ld,\n", nz, nfr) ; + printf (" number of frontal matrix chains = %ld\n", nchains) ; + + printf ("\nPivot columns in each front, and parent of each front:\n") ; + k = 0 ; + for (i = 0 ; i < nfr ; i++) + { + fnpiv = Front_npivcol [i] ; + printf (" Front %ld: parent front: %ld number of pivot cols: %ld\n", + i, Front_parent [i], fnpiv) ; + for (j = 0 ; j < fnpiv ; j++) + { + col = Qinit [k] ; + printf ( + " %ld-th pivot column is column %ld in original matrix\n", + k, col) ; + k++ ; + } + } + + printf ("\nNote that the column ordering, above, will be refined\n") ; + printf ("in the numeric factorization below. The assignment of pivot\n") ; + printf ("columns to frontal matrices will always remain unchanged.\n") ; + + printf ("\nTotal number of pivot columns in frontal matrices: %ld\n", k) ; + + printf ("\nFrontal matrix chains:\n") ; + for (j = 0 ; j < nchains ; j++) + { + printf (" Frontal matrices %ld to %ld are factorized in a single\n", + Chain_start [j], Chain_start [j+1] - 1) ; + printf (" working array of size %ld-by-%ld\n", + Chain_maxrows [j], Chain_maxcols [j]) ; + } + + /* ---------------------------------------------------------------------- */ + /* numeric factorization of C */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_xx_numeric (Cp, Ci, Cx, Cz, Symbolic, &Numeric, + Control, Info) ; + if (status < 0) + { + error ("umfpack_xx_numeric failed") ; + } + printf ("\nNumeric factorization of C: ") ; + (void) umfpack_xx_report_numeric (Numeric, Control) ; + + /* ---------------------------------------------------------------------- */ + /* extract the LU factors of C and print them */ + /* ---------------------------------------------------------------------- */ + + if (umfpack_xx_get_lunz (&lnz, &unz, &nr, &nc, &nzud, Numeric) < 0) + { + error ("umfpack_xx_get_lunz failed") ; + } + /* ensure arrays are not of zero size */ + lnz1 = MAX (lnz,1) ; + unz1 = MAX (unz,1) ; + Lp = (Int *) malloc ((n+1) * sizeof (Int)) ; + Lj = (Int *) malloc (lnz1 * sizeof (Int)) ; + Lx = (double *) malloc (lnz1 * sizeof (double)) ; + Lz = (double *) malloc (lnz1 * sizeof (double)) ; + Up = (Int *) malloc ((n+1) * sizeof (Int)) ; + Ui = (Int *) malloc (unz1 * sizeof (Int)) ; + Ux = (double *) malloc (unz1 * sizeof (double)) ; + Uz = (double *) malloc (unz1 * sizeof (double)) ; + P = (Int *) malloc (n * sizeof (Int)) ; + Q = (Int *) malloc (n * sizeof (Int)) ; + Dx = (double *) NULL ; /* D vector not requested */ + Dz = (double *) NULL ; + Rs = (double *) malloc (n * sizeof (double)) ; + if (!Lp || !Lj || !Lx || !Lz || !Up || !Ui || !Ux || !Uz || !P || !Q || !Rs) + { + error ("out of memory") ; + } + status = umfpack_xx_get_numeric (Lp, Lj, Lx, Lz, Up, Ui, Ux, Uz, + P, Q, Dx, Dz, &do_recip, Rs, Numeric) ; + if (status < 0) + { + error ("umfpack_xx_get_numeric failed") ; + } + + printf ("\nL (lower triangular factor of C): ") ; + (void) umfpack_xx_report_matrix (n, n, Lp, Lj, Lx, Lz, 0, Control) ; + printf ("\nU (upper triangular factor of C): ") ; + (void) umfpack_xx_report_matrix (n, n, Up, Ui, Ux, Uz, 1, Control) ; + printf ("\nP: ") ; + (void) umfpack_xx_report_perm (n, P, Control) ; + printf ("\nQ: ") ; + (void) umfpack_xx_report_perm (n, Q, Control) ; + printf ("\nScale factors: row i of A is to be ") ; + if (do_recip) + { + printf ("multiplied by the ith scale factor\n") ; + } + else + { + printf ("divided by the ith scale factor\n") ; + } + for (i = 0 ; i < n ; i++) printf ("%ld: %g\n", i, Rs [i]) ; + + /* ---------------------------------------------------------------------- */ + /* convert L to triplet form and print it */ + /* ---------------------------------------------------------------------- */ + + /* Note that L is in row-form, so it is the row indices that are created */ + /* by umfpack_xx_col_to_triplet. */ + + printf ("\nConverting L to triplet form, and printing it:\n") ; + Li = (Int *) malloc (lnz1 * sizeof (Int)) ; + if (!Li) + { + error ("out of memory") ; + } + if (umfpack_xx_col_to_triplet (n, Lp, Li) < 0) + { + error ("umfpack_xx_col_to_triplet failed") ; + } + printf ("\nL, in triplet form: ") ; + (void) umfpack_xx_report_triplet (n, n, lnz, Li, Lj, Lx, Lz, Control) ; + + /* ---------------------------------------------------------------------- */ + /* save the Numeric object to file, free it, and load it back in */ + /* ---------------------------------------------------------------------- */ + + /* use the default filename, "numeric.umf" */ + printf ("\nSaving numeric object:\n") ; + status = umfpack_xx_save_numeric (Numeric, (char *) NULL) ; + if (status < 0) + { + umfpack_xx_report_status (Control, status) ; + error ("umfpack_xx_save_numeric failed") ; + } + printf ("\nFreeing numeric object:\n") ; + umfpack_xx_free_numeric (&Numeric) ; + printf ("\nLoading numeric object:\n") ; + status = umfpack_xx_load_numeric (&Numeric, (char *) NULL) ; + if (status < 0) + { + umfpack_xx_report_status (Control, status) ; + error ("umfpack_xx_load_numeric failed") ; + } + printf ("\nDone loading numeric object\n") ; + + /* ---------------------------------------------------------------------- */ + /* solve C'x=b */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_xx_solve (UMFPACK_At, Cp, Ci, Cx, Cz, x, xz, b, bz, + Numeric, Control, Info) ; + umfpack_xx_report_info (Control, Info) ; + if (status < 0) + { + umfpack_xx_report_status (Control, status) ; + error ("umfpack_xx_solve failed") ; + } + printf ("\nx (solution of C'x=b): ") ; + (void) umfpack_xx_report_vector (n, x, xz, Control) ; + rnorm = resid (TRUE, Cp, Ci, Cx, Cz) ; + printf ("maxnorm of residual: %g\n\n", rnorm) ; + + /* ---------------------------------------------------------------------- */ + /* solve C'x=b again, using umfpack_xx_wsolve instead */ + /* ---------------------------------------------------------------------- */ + + printf ("\nSolving C'x=b again, using umfpack_xx_wsolve instead:\n") ; + Wi = (Int *) malloc (n * sizeof (Int)) ; + :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + :: WSIZE is 5 for the real case, 10 for complex. + :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + W = (double *) malloc (WSIZE*n * sizeof (double)) ; + if (!Wi || !W) + { + error ("out of memory") ; + } + + status = umfpack_xx_wsolve (UMFPACK_At, Cp, Ci, Cx, Cz, x, xz, b, bz, + Numeric, Control, Info, Wi, W) ; + umfpack_xx_report_info (Control, Info) ; + if (status < 0) + { + umfpack_xx_report_status (Control, status) ; + error ("umfpack_xx_wsolve failed") ; + } + printf ("\nx (solution of C'x=b): ") ; + (void) umfpack_xx_report_vector (n, x, xz, Control) ; + rnorm = resid (TRUE, Cp, Ci, Cx, Cz) ; + printf ("maxnorm of residual: %g\n\n", rnorm) ; + + /* ---------------------------------------------------------------------- */ + /* free everything */ + /* ---------------------------------------------------------------------- */ + + /* This is not strictly required since the process is exiting and the */ + /* system will reclaim the memory anyway. It's useful, though, just as */ + /* a list of what is currently malloc'ed by this program. Plus, it's */ + /* always a good habit to explicitly free whatever you malloc. */ + + free (Ap) ; + free (Ai) ; + free (Ax) ; + free (Az) ; + + free (Cp) ; + free (Ci) ; + free (Cx) ; + free (Cz) ; + + free (Pinit) ; + free (Qinit) ; + free (Front_npivcol) ; + free (Front_1strow) ; + free (Front_leftmostdesc) ; + free (Front_parent) ; + free (Chain_start) ; + free (Chain_maxrows) ; + free (Chain_maxcols) ; + + free (Lp) ; + free (Lj) ; + free (Lx) ; + free (Lz) ; + + free (Up) ; + free (Ui) ; + free (Ux) ; + free (Uz) ; + + free (P) ; + free (Q) ; + + free (Li) ; + + free (Wi) ; + free (W) ; + + umfpack_xx_free_symbolic (&Symbolic) ; + umfpack_xx_free_numeric (&Numeric) ; + + /* ---------------------------------------------------------------------- */ + /* print the total time spent in this demo */ + /* ---------------------------------------------------------------------- */ + + umfpack_toc (t) ; + printf ("\numfpack_xx_demo complete.\nTotal time: %5.2f seconds" + " (CPU time), %5.2f seconds (wallclock time)\n", t [1], t [0]) ; + return (0) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Demo/umfpack_zi_demo.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Demo/umfpack_zi_demo.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,791 @@ +/* ========================================================================== */ +/* === umfpack_zi_demo ====================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + A demo of UMFPACK: umfpack_zi_* version. + + First, factor and solve a 5-by-5 system, Ax=b, using default parameters. + Then solve A'x=b using the factors of A. Modify one entry (A (1,4) = 0, + where the row and column indices range from 0 to 4. The pattern of A + has not changed (it has explicitly zero entry), so a reanalysis with + umfpack_zi_symbolic does not need to be done. Refactorize (with + umfpack_zi_numeric), and solve Ax=b. Note that the pivot ordering has + changed. Next, change all of the entries in A, but not the pattern. + + Finally, compute C = A', and do the symbolic and numeric factorization of C. + Factorizing A' can sometimes be better than factorizing A itself (less work + and memory usage). Solve C'x=b twice; the solution is the same as the + solution to Ax=b. + + A note about zero-sized arrays: UMFPACK uses many user-provided arrays of + size n (order of the matrix), and of size nz (the number of nonzeros in a + matrix). n cannot be zero; UMFPACK does not handle zero-dimensioned arrays. + However, nz can be zero. If you attempt to malloc an array of size nz = 0, + however, malloc will return a null pointer which UMFPACK will report as a + "missing argument." Thus, nz1 in this code is set to MAX (nz,1), and + similarly for lnz and unz. Lnz can never be zero, however, since L is always + unit diagonal. +*/ + +/* -------------------------------------------------------------------------- */ +/* definitions */ +/* -------------------------------------------------------------------------- */ + +#include +#include +#include "umfpack.h" + +/* use a cheap approximate absolute value for complex numbers: */ +#define ABS(x,z) ((x) >= 0 ? (x) : -(x)) + ((z) >= 0 ? (z) : -(z)) + +#define MAX(a,b) (((a) > (b)) ? (a) : (b)) +#ifndef TRUE +#define TRUE (1) +#endif +#ifndef FALSE +#define FALSE (0) +#endif + +/* -------------------------------------------------------------------------- */ +/* triplet form of the matrix. The triplets can be in any order. */ +/* -------------------------------------------------------------------------- */ + +static int n = 5, nz = 12 ; +static int Arow [ ] = { 0, 4, 1, 1, 2, 2, 0, 1, 2, 3, 4, 4} ; +static int Acol [ ] = { 0, 4, 0, 2, 1, 2, 1, 4, 3, 2, 1, 2} ; +static double Aval [ ] = {2., 1., 3., 4., -1., -3., 3., 6., 2., 1., 4., 2.} ; +static double Avalz[ ] = {1., .4, .1, .2, -1., -.2, 0., 6., 3., 0., .3, .3} ; +static double b [ ] = {8., 45., -3., 3., 19.}, x [5], r [5] ; +static double bz[ ] = {1., -5., -2., 0., 2.2}, xz[5], rz[5] ; + +/* Avalz, bz: imaginary part of A and b */ + +/* -------------------------------------------------------------------------- */ +/* error: print a message and exit */ +/* -------------------------------------------------------------------------- */ + +static void error +( + char *message +) +{ + printf ("\n\n====== error: %s =====\n\n", message) ; + exit (1) ; +} + + +/* -------------------------------------------------------------------------- */ +/* resid: compute the residual, r = Ax-b or r = A'x=b and return maxnorm (r) */ +/* A' is the complex conjugate transpose, not the array transpose */ +/* -------------------------------------------------------------------------- */ + +static double resid +( + int transpose, + int Ap [ ], + int Ai [ ], + double Ax [ ] + , double Az [ ] +) +{ + int i, j, p ; + double norm ; + + for (i = 0 ; i < n ; i++) + { + r [i] = -b [i] ; + rz[i] = -bz[i] ; + } + if (transpose) + { + for (j = 0 ; j < n ; j++) + { + for (p = Ap [j] ; p < Ap [j+1] ; p++) + { + i = Ai [p] ; + /* complex: r(j) += conj (Aij) * x (i) */ + r [j] += Ax [p] * x [i] ; + r [j] += Az [p] * xz[i] ; + rz[j] -= Az [p] * x [i] ; + rz[j] += Ax [p] * xz[i] ; + } + } + } + else + { + for (j = 0 ; j < n ; j++) + { + for (p = Ap [j] ; p < Ap [j+1] ; p++) + { + i = Ai [p] ; + r [i] += Ax [p] * x [j] ; + r [i] -= Az [p] * xz[j] ; + rz[i] += Az [p] * x [j] ; + rz[i] += Ax [p] * xz[j] ; + } + } + } + norm = 0. ; + for (i = 0 ; i < n ; i++) + { + norm = MAX (ABS (r [i], rz [i]), norm) ; + } + return (norm) ; +} + + +/* -------------------------------------------------------------------------- */ +/* main program */ +/* -------------------------------------------------------------------------- */ + +int main (int argc, char **argv) +{ + double Info [UMFPACK_INFO], Control [UMFPACK_CONTROL], *Ax, *Cx, *Lx, *Ux, + *W, t [2], *Dx, rnorm, *Rb, *y, *Rs ; + double *Az, *Lz, *Uz, *Dz, *Cz, *Rbz, *yz ; + int *Ap, *Ai, *Cp, *Ci, row, col, p, lnz, unz, nr, nc, *Lp, *Li, *Ui, *Up, + *P, *Q, *Lj, i, j, k, anz, nfr, nchains, *Qinit, fnpiv, lnz1, unz1, nz1, + status, *Front_npivcol, *Front_parent, *Chain_start, *Wi, *Pinit, n1, + *Chain_maxrows, *Chain_maxcols, *Front_1strow, *Front_leftmostdesc, + nzud, do_recip ; + void *Symbolic, *Numeric ; + + /* ---------------------------------------------------------------------- */ + /* initializations */ + /* ---------------------------------------------------------------------- */ + + umfpack_tic (t) ; + + printf ("\n%s demo: _zi_ version\n", UMFPACK_VERSION) ; + + /* get the default control parameters */ + umfpack_zi_defaults (Control) ; + + /* change the default print level for this demo */ + /* (otherwise, nothing will print) */ + Control [UMFPACK_PRL] = 6 ; + + /* print the license agreement */ + umfpack_zi_report_status (Control, UMFPACK_OK) ; + Control [UMFPACK_PRL] = 5 ; + + /* print the control parameters */ + umfpack_zi_report_control (Control) ; + + /* ---------------------------------------------------------------------- */ + /* print A and b, and convert A to column-form */ + /* ---------------------------------------------------------------------- */ + + /* print the right-hand-side */ + printf ("\nb: ") ; + (void) umfpack_zi_report_vector (n, b, bz, Control) ; + + /* print the triplet form of the matrix */ + printf ("\nA: ") ; + (void) umfpack_zi_report_triplet (n, n, nz, Arow, Acol, Aval, Avalz, + Control) ; + + /* convert to column form */ + nz1 = MAX (nz,1) ; /* ensure arrays are not of size zero. */ + Ap = (int *) malloc ((n+1) * sizeof (int)) ; + Ai = (int *) malloc (nz1 * sizeof (int)) ; + Ax = (double *) malloc (nz1 * sizeof (double)) ; + Az = (double *) malloc (nz1 * sizeof (double)) ; + if (!Ap || !Ai || !Ax || !Az) + { + error ("out of memory") ; + } + + status = umfpack_zi_triplet_to_col (n, n, nz, Arow, Acol, Aval, Avalz, + Ap, Ai, Ax, Az, (int *) NULL) ; + + if (status < 0) + { + umfpack_zi_report_status (Control, status) ; + error ("umfpack_zi_triplet_to_col failed") ; + } + + /* print the column-form of A */ + printf ("\nA: ") ; + (void) umfpack_zi_report_matrix (n, n, Ap, Ai, Ax, Az, 1, Control) ; + + /* ---------------------------------------------------------------------- */ + /* symbolic factorization */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_zi_symbolic (n, n, Ap, Ai, Ax, Az, &Symbolic, + Control, Info) ; + if (status < 0) + { + umfpack_zi_report_info (Control, Info) ; + umfpack_zi_report_status (Control, status) ; + error ("umfpack_zi_symbolic failed") ; + } + + /* print the symbolic factorization */ + + printf ("\nSymbolic factorization of A: ") ; + (void) umfpack_zi_report_symbolic (Symbolic, Control) ; + + /* ---------------------------------------------------------------------- */ + /* numeric factorization */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_zi_numeric (Ap, Ai, Ax, Az, Symbolic, &Numeric, + Control, Info) ; + if (status < 0) + { + umfpack_zi_report_info (Control, Info) ; + umfpack_zi_report_status (Control, status) ; + error ("umfpack_zi_numeric failed") ; + } + + /* print the numeric factorization */ + printf ("\nNumeric factorization of A: ") ; + (void) umfpack_zi_report_numeric (Numeric, Control) ; + + /* ---------------------------------------------------------------------- */ + /* solve Ax=b */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_zi_solve (UMFPACK_A, Ap, Ai, Ax, Az, x, xz, b, bz, + Numeric, Control, Info) ; + umfpack_zi_report_info (Control, Info) ; + umfpack_zi_report_status (Control, status) ; + if (status < 0) + { + error ("umfpack_zi_solve failed") ; + } + printf ("\nx (solution of Ax=b): ") ; + (void) umfpack_zi_report_vector (n, x, xz, Control) ; + rnorm = resid (FALSE, Ap, Ai, Ax, Az) ; + printf ("maxnorm of residual: %g\n\n", rnorm) ; + + /* ---------------------------------------------------------------------- */ + /* compute the determinant */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_zi_get_determinant (x, xz, r, Numeric, Info) ; + umfpack_zi_report_status (Control, status) ; + if (status < 0) + { + error ("umfpack_zi_get_determinant failed") ; + } + printf ("determinant: (%g", x [0]) ; + printf ("+ (%g)i", xz [0]) ; /* complex */ + printf (") * 10^(%g)\n", r [0]) ; + + /* ---------------------------------------------------------------------- */ + /* solve Ax=b, broken down into steps */ + /* ---------------------------------------------------------------------- */ + + /* Rb = R*b */ + Rb = (double *) malloc (n * sizeof (double)) ; + Rbz = (double *) malloc (n * sizeof (double)) ; + y = (double *) malloc (n * sizeof (double)) ; + yz = (double *) malloc (n * sizeof (double)) ; + if (!Rb || !y) error ("out of memory") ; + if (!Rbz || !yz) error ("out of memory") ; + + status = umfpack_zi_scale (Rb, Rbz, b, bz, Numeric) ; + if (status < 0) error ("umfpack_zi_scale failed") ; + /* solve Ly = P*(Rb) */ + status = umfpack_zi_solve (UMFPACK_Pt_L, Ap, Ai, Ax, Az, y, yz, Rb, Rbz, + Numeric, Control, Info) ; + if (status < 0) error ("umfpack_zi_solve failed") ; + /* solve UQ'x=y */ + status = umfpack_zi_solve (UMFPACK_U_Qt, Ap, Ai, Ax, Az, x, xz, y, yz, + Numeric, Control, Info) ; + if (status < 0) error ("umfpack_zi_solve failed") ; + printf ("\nx (solution of Ax=b, solve is split into 3 steps): ") ; + (void) umfpack_zi_report_vector (n, x, xz, Control) ; + rnorm = resid (FALSE, Ap, Ai, Ax, Az) ; + printf ("maxnorm of residual: %g\n\n", rnorm) ; + + free (Rb) ; + free (Rbz) ; + free (y) ; + free (yz) ; + + /* ---------------------------------------------------------------------- */ + /* solve A'x=b */ + /* ---------------------------------------------------------------------- */ + + /* note that this is the complex conjugate transpose, A' */ + status = umfpack_zi_solve (UMFPACK_At, Ap, Ai, Ax, Az, x, xz, b, bz, + Numeric, Control, Info) ; + umfpack_zi_report_info (Control, Info) ; + if (status < 0) + { + error ("umfpack_zi_solve failed") ; + } + printf ("\nx (solution of A'x=b): ") ; + (void) umfpack_zi_report_vector (n, x, xz, Control) ; + rnorm = resid (TRUE, Ap, Ai, Ax, Az) ; + printf ("maxnorm of residual: %g\n\n", rnorm) ; + + /* ---------------------------------------------------------------------- */ + /* modify one numerical value in the column-form of A */ + /* ---------------------------------------------------------------------- */ + + /* change A (1,4), look for row index 1 in column 4. */ + row = 1 ; + col = 4 ; + for (p = Ap [col] ; p < Ap [col+1] ; p++) + { + if (row == Ai [p]) + { + printf ("\nchanging A (%d,%d) to zero\n", row, col) ; + Ax [p] = 0.0 ; + Az [p] = 0.0 ; + break ; + } + } + printf ("\nmodified A: ") ; + (void) umfpack_zi_report_matrix (n, n, Ap, Ai, Ax, Az, 1, Control) ; + + /* ---------------------------------------------------------------------- */ + /* redo the numeric factorization */ + /* ---------------------------------------------------------------------- */ + + /* The pattern (Ap and Ai) hasn't changed, so the symbolic factorization */ + /* doesn't have to be redone, no matter how much we change Ax. */ + + /* We don't need the Numeric object any more, so free it. */ + umfpack_zi_free_numeric (&Numeric) ; + + /* Note that a memory leak would have occurred if the old Numeric */ + /* had not been free'd with umfpack_zi_free_numeric above. */ + status = umfpack_zi_numeric (Ap, Ai, Ax, Az, Symbolic, &Numeric, + Control, Info) ; + if (status < 0) + { + umfpack_zi_report_info (Control, Info) ; + umfpack_zi_report_status (Control, status) ; + error ("umfpack_zi_numeric failed") ; + } + printf ("\nNumeric factorization of modified A: ") ; + (void) umfpack_zi_report_numeric (Numeric, Control) ; + + /* ---------------------------------------------------------------------- */ + /* solve Ax=b, with the modified A */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_zi_solve (UMFPACK_A, Ap, Ai, Ax, Az, x, xz, b, bz, + Numeric, Control, Info) ; + umfpack_zi_report_info (Control, Info) ; + if (status < 0) + { + umfpack_zi_report_status (Control, status) ; + error ("umfpack_zi_solve failed") ; + } + printf ("\nx (with modified A): ") ; + (void) umfpack_zi_report_vector (n, x, xz, Control) ; + rnorm = resid (FALSE, Ap, Ai, Ax, Az) ; + printf ("maxnorm of residual: %g\n\n", rnorm) ; + + /* ---------------------------------------------------------------------- */ + /* modify all of the numerical values of A, but not the pattern */ + /* ---------------------------------------------------------------------- */ + + for (col = 0 ; col < n ; col++) + { + for (p = Ap [col] ; p < Ap [col+1] ; p++) + { + row = Ai [p] ; + printf ("changing ") ; + /* complex: */ printf ("real part of ") ; + printf ("A (%d,%d) from %g", row, col, Ax [p]) ; + Ax [p] = Ax [p] + col*10 - row ; + printf (" to %g\n", Ax [p]) ; + } + } + printf ("\ncompletely modified A (same pattern): ") ; + (void) umfpack_zi_report_matrix (n, n, Ap, Ai, Ax, Az, 1, Control) ; + + /* ---------------------------------------------------------------------- */ + /* save the Symbolic object to file, free it, and load it back in */ + /* ---------------------------------------------------------------------- */ + + /* use the default filename, "symbolic.umf" */ + printf ("\nSaving symbolic object:\n") ; + status = umfpack_zi_save_symbolic (Symbolic, (char *) NULL) ; + if (status < 0) + { + umfpack_zi_report_status (Control, status) ; + error ("umfpack_zi_save_symbolic failed") ; + } + printf ("\nFreeing symbolic object:\n") ; + umfpack_zi_free_symbolic (&Symbolic) ; + printf ("\nLoading symbolic object:\n") ; + status = umfpack_zi_load_symbolic (&Symbolic, (char *) NULL) ; + if (status < 0) + { + umfpack_zi_report_status (Control, status) ; + error ("umfpack_zi_load_symbolic failed") ; + } + printf ("\nDone loading symbolic object\n") ; + + /* ---------------------------------------------------------------------- */ + /* redo the numeric factorization */ + /* ---------------------------------------------------------------------- */ + + umfpack_zi_free_numeric (&Numeric) ; + status = umfpack_zi_numeric (Ap, Ai, Ax, Az, Symbolic, &Numeric, + Control, Info) ; + if (status < 0) + { + umfpack_zi_report_info (Control, Info) ; + umfpack_zi_report_status (Control, status) ; + error ("umfpack_zi_numeric failed") ; + } + printf ("\nNumeric factorization of completely modified A: ") ; + (void) umfpack_zi_report_numeric (Numeric, Control) ; + + /* ---------------------------------------------------------------------- */ + /* solve Ax=b, with the modified A */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_zi_solve (UMFPACK_A, Ap, Ai, Ax, Az, x, xz, b, bz, + Numeric, Control, Info) ; + umfpack_zi_report_info (Control, Info) ; + if (status < 0) + { + umfpack_zi_report_status (Control, status) ; + error ("umfpack_zi_solve failed") ; + } + printf ("\nx (with completely modified A): ") ; + (void) umfpack_zi_report_vector (n, x, xz, Control) ; + rnorm = resid (FALSE, Ap, Ai, Ax, Az) ; + printf ("maxnorm of residual: %g\n\n", rnorm) ; + + /* ---------------------------------------------------------------------- */ + /* free the symbolic and numeric factorization */ + /* ---------------------------------------------------------------------- */ + + umfpack_zi_free_symbolic (&Symbolic) ; + umfpack_zi_free_numeric (&Numeric) ; + + /* ---------------------------------------------------------------------- */ + /* C = transpose of A */ + /* ---------------------------------------------------------------------- */ + + Cp = (int *) malloc ((n+1) * sizeof (int)) ; + Ci = (int *) malloc (nz1 * sizeof (int)) ; + Cx = (double *) malloc (nz1 * sizeof (double)) ; + Cz = (double *) malloc (nz1 * sizeof (double)) ; + if (!Cp || !Ci || !Cx || !Cz) + { + error ("out of memory") ; + } + status = umfpack_zi_transpose (n, n, Ap, Ai, Ax, Az, + (int *) NULL, (int *) NULL, Cp, Ci, Cx, Cz, TRUE) ; + if (status < 0) + { + umfpack_zi_report_status (Control, status) ; + error ("umfpack_zi_transpose failed: ") ; + } + printf ("\nC (transpose of A): ") ; + (void) umfpack_zi_report_matrix (n, n, Cp, Ci, Cx, Cz, 1, Control) ; + + /* ---------------------------------------------------------------------- */ + /* symbolic factorization of C */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_zi_symbolic (n, n, Cp, Ci, Cx, Cz, &Symbolic, + Control, Info) ; + if (status < 0) + { + umfpack_zi_report_info (Control, Info) ; + umfpack_zi_report_status (Control, status) ; + error ("umfpack_zi_symbolic failed") ; + } + printf ("\nSymbolic factorization of C: ") ; + (void) umfpack_zi_report_symbolic (Symbolic, Control) ; + + /* ---------------------------------------------------------------------- */ + /* copy the contents of Symbolic into user arrays print them */ + /* ---------------------------------------------------------------------- */ + + printf ("\nGet the contents of the Symbolic object for C:\n") ; + printf ("(compare with umfpack_zi_report_symbolic output, above)\n") ; + Pinit = (int *) malloc ((n+1) * sizeof (int)) ; + Qinit = (int *) malloc ((n+1) * sizeof (int)) ; + Front_npivcol = (int *) malloc ((n+1) * sizeof (int)) ; + Front_1strow = (int *) malloc ((n+1) * sizeof (int)) ; + Front_leftmostdesc = (int *) malloc ((n+1) * sizeof (int)) ; + Front_parent = (int *) malloc ((n+1) * sizeof (int)) ; + Chain_start = (int *) malloc ((n+1) * sizeof (int)) ; + Chain_maxrows = (int *) malloc ((n+1) * sizeof (int)) ; + Chain_maxcols = (int *) malloc ((n+1) * sizeof (int)) ; + if (!Pinit || !Qinit || !Front_npivcol || !Front_parent || !Chain_start || + !Chain_maxrows || !Chain_maxcols || !Front_1strow || + !Front_leftmostdesc) + { + error ("out of memory") ; + } + + status = umfpack_zi_get_symbolic (&nr, &nc, &n1, &anz, &nfr, &nchains, + Pinit, Qinit, Front_npivcol, Front_parent, Front_1strow, + Front_leftmostdesc, Chain_start, Chain_maxrows, Chain_maxcols, + Symbolic) ; + + if (status < 0) + { + error ("symbolic factorization invalid") ; + } + + printf ("From the Symbolic object, C is of dimension %d-by-%d\n", nr, nc); + printf (" with nz = %d, number of fronts = %d,\n", nz, nfr) ; + printf (" number of frontal matrix chains = %d\n", nchains) ; + + printf ("\nPivot columns in each front, and parent of each front:\n") ; + k = 0 ; + for (i = 0 ; i < nfr ; i++) + { + fnpiv = Front_npivcol [i] ; + printf (" Front %d: parent front: %d number of pivot cols: %d\n", + i, Front_parent [i], fnpiv) ; + for (j = 0 ; j < fnpiv ; j++) + { + col = Qinit [k] ; + printf ( + " %d-th pivot column is column %d in original matrix\n", + k, col) ; + k++ ; + } + } + + printf ("\nNote that the column ordering, above, will be refined\n") ; + printf ("in the numeric factorization below. The assignment of pivot\n") ; + printf ("columns to frontal matrices will always remain unchanged.\n") ; + + printf ("\nTotal number of pivot columns in frontal matrices: %d\n", k) ; + + printf ("\nFrontal matrix chains:\n") ; + for (j = 0 ; j < nchains ; j++) + { + printf (" Frontal matrices %d to %d are factorized in a single\n", + Chain_start [j], Chain_start [j+1] - 1) ; + printf (" working array of size %d-by-%d\n", + Chain_maxrows [j], Chain_maxcols [j]) ; + } + + /* ---------------------------------------------------------------------- */ + /* numeric factorization of C */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_zi_numeric (Cp, Ci, Cx, Cz, Symbolic, &Numeric, + Control, Info) ; + if (status < 0) + { + error ("umfpack_zi_numeric failed") ; + } + printf ("\nNumeric factorization of C: ") ; + (void) umfpack_zi_report_numeric (Numeric, Control) ; + + /* ---------------------------------------------------------------------- */ + /* extract the LU factors of C and print them */ + /* ---------------------------------------------------------------------- */ + + if (umfpack_zi_get_lunz (&lnz, &unz, &nr, &nc, &nzud, Numeric) < 0) + { + error ("umfpack_zi_get_lunz failed") ; + } + /* ensure arrays are not of zero size */ + lnz1 = MAX (lnz,1) ; + unz1 = MAX (unz,1) ; + Lp = (int *) malloc ((n+1) * sizeof (int)) ; + Lj = (int *) malloc (lnz1 * sizeof (int)) ; + Lx = (double *) malloc (lnz1 * sizeof (double)) ; + Lz = (double *) malloc (lnz1 * sizeof (double)) ; + Up = (int *) malloc ((n+1) * sizeof (int)) ; + Ui = (int *) malloc (unz1 * sizeof (int)) ; + Ux = (double *) malloc (unz1 * sizeof (double)) ; + Uz = (double *) malloc (unz1 * sizeof (double)) ; + P = (int *) malloc (n * sizeof (int)) ; + Q = (int *) malloc (n * sizeof (int)) ; + Dx = (double *) NULL ; /* D vector not requested */ + Dz = (double *) NULL ; + Rs = (double *) malloc (n * sizeof (double)) ; + if (!Lp || !Lj || !Lx || !Lz || !Up || !Ui || !Ux || !Uz || !P || !Q || !Rs) + { + error ("out of memory") ; + } + status = umfpack_zi_get_numeric (Lp, Lj, Lx, Lz, Up, Ui, Ux, Uz, + P, Q, Dx, Dz, &do_recip, Rs, Numeric) ; + if (status < 0) + { + error ("umfpack_zi_get_numeric failed") ; + } + + printf ("\nL (lower triangular factor of C): ") ; + (void) umfpack_zi_report_matrix (n, n, Lp, Lj, Lx, Lz, 0, Control) ; + printf ("\nU (upper triangular factor of C): ") ; + (void) umfpack_zi_report_matrix (n, n, Up, Ui, Ux, Uz, 1, Control) ; + printf ("\nP: ") ; + (void) umfpack_zi_report_perm (n, P, Control) ; + printf ("\nQ: ") ; + (void) umfpack_zi_report_perm (n, Q, Control) ; + printf ("\nScale factors: row i of A is to be ") ; + if (do_recip) + { + printf ("multiplied by the ith scale factor\n") ; + } + else + { + printf ("divided by the ith scale factor\n") ; + } + for (i = 0 ; i < n ; i++) printf ("%d: %g\n", i, Rs [i]) ; + + /* ---------------------------------------------------------------------- */ + /* convert L to triplet form and print it */ + /* ---------------------------------------------------------------------- */ + + /* Note that L is in row-form, so it is the row indices that are created */ + /* by umfpack_zi_col_to_triplet. */ + + printf ("\nConverting L to triplet form, and printing it:\n") ; + Li = (int *) malloc (lnz1 * sizeof (int)) ; + if (!Li) + { + error ("out of memory") ; + } + if (umfpack_zi_col_to_triplet (n, Lp, Li) < 0) + { + error ("umfpack_zi_col_to_triplet failed") ; + } + printf ("\nL, in triplet form: ") ; + (void) umfpack_zi_report_triplet (n, n, lnz, Li, Lj, Lx, Lz, Control) ; + + /* ---------------------------------------------------------------------- */ + /* save the Numeric object to file, free it, and load it back in */ + /* ---------------------------------------------------------------------- */ + + /* use the default filename, "numeric.umf" */ + printf ("\nSaving numeric object:\n") ; + status = umfpack_zi_save_numeric (Numeric, (char *) NULL) ; + if (status < 0) + { + umfpack_zi_report_status (Control, status) ; + error ("umfpack_zi_save_numeric failed") ; + } + printf ("\nFreeing numeric object:\n") ; + umfpack_zi_free_numeric (&Numeric) ; + printf ("\nLoading numeric object:\n") ; + status = umfpack_zi_load_numeric (&Numeric, (char *) NULL) ; + if (status < 0) + { + umfpack_zi_report_status (Control, status) ; + error ("umfpack_zi_load_numeric failed") ; + } + printf ("\nDone loading numeric object\n") ; + + /* ---------------------------------------------------------------------- */ + /* solve C'x=b */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_zi_solve (UMFPACK_At, Cp, Ci, Cx, Cz, x, xz, b, bz, + Numeric, Control, Info) ; + umfpack_zi_report_info (Control, Info) ; + if (status < 0) + { + umfpack_zi_report_status (Control, status) ; + error ("umfpack_zi_solve failed") ; + } + printf ("\nx (solution of C'x=b): ") ; + (void) umfpack_zi_report_vector (n, x, xz, Control) ; + rnorm = resid (TRUE, Cp, Ci, Cx, Cz) ; + printf ("maxnorm of residual: %g\n\n", rnorm) ; + + /* ---------------------------------------------------------------------- */ + /* solve C'x=b again, using umfpack_zi_wsolve instead */ + /* ---------------------------------------------------------------------- */ + + printf ("\nSolving C'x=b again, using umfpack_zi_wsolve instead:\n") ; + Wi = (int *) malloc (n * sizeof (int)) ; + W = (double *) malloc (10*n * sizeof (double)) ; + if (!Wi || !W) + { + error ("out of memory") ; + } + + status = umfpack_zi_wsolve (UMFPACK_At, Cp, Ci, Cx, Cz, x, xz, b, bz, + Numeric, Control, Info, Wi, W) ; + umfpack_zi_report_info (Control, Info) ; + if (status < 0) + { + umfpack_zi_report_status (Control, status) ; + error ("umfpack_zi_wsolve failed") ; + } + printf ("\nx (solution of C'x=b): ") ; + (void) umfpack_zi_report_vector (n, x, xz, Control) ; + rnorm = resid (TRUE, Cp, Ci, Cx, Cz) ; + printf ("maxnorm of residual: %g\n\n", rnorm) ; + + /* ---------------------------------------------------------------------- */ + /* free everything */ + /* ---------------------------------------------------------------------- */ + + /* This is not strictly required since the process is exiting and the */ + /* system will reclaim the memory anyway. It's useful, though, just as */ + /* a list of what is currently malloc'ed by this program. Plus, it's */ + /* always a good habit to explicitly free whatever you malloc. */ + + free (Ap) ; + free (Ai) ; + free (Ax) ; + free (Az) ; + + free (Cp) ; + free (Ci) ; + free (Cx) ; + free (Cz) ; + + free (Pinit) ; + free (Qinit) ; + free (Front_npivcol) ; + free (Front_1strow) ; + free (Front_leftmostdesc) ; + free (Front_parent) ; + free (Chain_start) ; + free (Chain_maxrows) ; + free (Chain_maxcols) ; + + free (Lp) ; + free (Lj) ; + free (Lx) ; + free (Lz) ; + + free (Up) ; + free (Ui) ; + free (Ux) ; + free (Uz) ; + + free (P) ; + free (Q) ; + + free (Li) ; + + free (Wi) ; + free (W) ; + + umfpack_zi_free_symbolic (&Symbolic) ; + umfpack_zi_free_numeric (&Numeric) ; + + /* ---------------------------------------------------------------------- */ + /* print the total time spent in this demo */ + /* ---------------------------------------------------------------------- */ + + umfpack_toc (t) ; + printf ("\numfpack_zi_demo complete.\nTotal time: %5.2f seconds" + " (CPU time), %5.2f seconds (wallclock time)\n", t [1], t [0]) ; + return (0) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Demo/umfpack_zi_demo.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Demo/umfpack_zi_demo.out Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,1542 @@ + +UMFPACK V4.4 (Jan. 28, 2005) demo: _zi_ version + +UMFPACK: Copyright (c) 2005 by Timothy A. Davis. All Rights Reserved. + + +UMFPACK License: + + Your use or distribution of UMFPACK or any modified version of + UMFPACK implies that you agree to this License. + + THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY + EXPRESSED OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + + Permission is hereby granted to use or copy this program, 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 UMFPACK or any modified version of UMFPACK 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. This + software was developed with support from the National Science Foundation, + and is provided to you free of charge. + +Availability: http://www.cise.ufl.edu/research/sparse/umfpack + +UMFPACK V4.4 (Jan. 28, 2005): OK + + +UMFPACK V4.4 (Jan. 28, 2005), Control: + + Matrix entry defined as: double complex + Int (generic integer) defined as: int + + 0: print level: 5 + 1: dense row parameter: 0.2 + "dense" rows have > max (16, (0.2)*16*sqrt(n_col) entries) + 2: dense column parameter: 0.2 + "dense" columns have > max (16, (0.2)*16*sqrt(n_row) entries) + 3: pivot tolerance: 0.1 + 4: block size for dense matrix kernels: 32 + 5: strategy: 0 (auto) + 6: initial allocation ratio: 0.7 + 7: max iterative refinement steps: 2 + 12: 2-by-2 pivot tolerance: 0.01 + 13: Q fixed during numerical factorization: 0 (auto) + 14: AMD dense row/col parameter: 10 + "dense" rows/columns have > max (16, (10)*sqrt(n)) entries + Only used if the AMD ordering is used. + 15: diagonal pivot tolerance: 0.001 + Only used if diagonal pivoting is attempted. + 16: scaling: 1 (divide each row by sum of abs. values in each row) + 17: frontal matrix allocation ratio: 0.5 + 18: drop tolerance: 0 + 19: AMD and COLAMD aggressive absorption: 1 (yes) + + The following options can only be changed at compile-time: + 8: BLAS library used: none. UMFPACK will be slow. + 9: compiled for ANSI C (uses malloc, free, realloc, and printf) + 10: CPU timer is POSIX times ( ) routine. + 11: compiled for normal operation (debugging disabled) + computer/operating system: Linux + size of int: 4 long: 4 Int: 4 pointer: 4 double: 8 Entry: 16 (in bytes) + + +b: dense vector, n = 5. + 0 : (8 + 1i) + 1 : (45 - 5i) + 2 : (-3 - 2i) + 3 : (3 + 0i) + 4 : (19 + 2.2i) + dense vector OK + + +A: triplet-form matrix, n_row = 5, n_col = 5 nz = 12. + 0 : 0 0 (2 + 1i) + 1 : 4 4 (1 + 0.4i) + 2 : 1 0 (3 + 0.1i) + 3 : 1 2 (4 + 0.2i) + 4 : 2 1 (-1 - 1i) + 5 : 2 2 (-3 - 0.2i) + 6 : 0 1 (3 + 0i) + 7 : 1 4 (6 + 6i) + 8 : 2 3 (2 + 3i) + 9 : 3 2 (1 + 0i) + 10 : 4 1 (4 + 0.3i) + 11 : 4 2 (2 + 0.3i) + triplet-form matrix OK + + +A: column-form matrix, n_row 5 n_col 5, nz = 12. + + column 0: start: 0 end: 1 entries: 2 + row 0 : (2 + 1i) + row 1 : (3 + 0.1i) + + column 1: start: 2 end: 4 entries: 3 + row 0 : (3 + 0i) + row 2 : (-1 - 1i) + row 4 : (4 + 0.3i) + + column 2: start: 5 end: 8 entries: 4 + row 1 : (4 + 0.2i) + row 2 : (-3 - 0.2i) + row 3 : (1 + 0i) + row 4 : (2 + 0.3i) + + column 3: start: 9 end: 9 entries: 1 + row 2 : (2 + 3i) + + column 4: start: 10 end: 11 entries: 2 + row 1 : (6 + 6i) + row 4 : (1 + 0.4i) + column-form matrix OK + + +Symbolic factorization of A: Symbolic object: + matrix to be factorized: + n_row: 5 n_col: 5 + number of entries: 12 + block size used for dense matrix kernels: 32 + strategy used: unsymmetric + ordering used: colamd on A + + performn column etree postorder: yes + prefer diagonal pivoting (attempt P=Q): no + variable-size part of Numeric object: + minimum initial size (Units): 84 (MBytes): 0.0 + estimated peak size (Units): 2542 (MBytes): 0.0 + estimated final size (Units): 25 (MBytes): 0.0 + symbolic factorization memory usage (Units): 144 (MBytes): 0.0 + frontal matrices / supercolumns: + number of frontal chains: 1 + number of frontal matrices: 1 + largest frontal matrix row dimension: 3 + largest frontal matrix column dimension: 3 + + Frontal chain: 0. Frontal matrices 0 to 0 + Largest frontal matrix in Frontal chain: 3-by-3 + Front: 0 pivot cols: 3 (pivot columns 0 to 2) + pivot row candidates: 2 to 4 + leftmost descendant: 0 + 1st new candidate row : 2 + parent: (none) + +Initial column permutation, Q1: permutation vector, n = 5. + 0 : 3 + 1 : 2 + 2 : 0 + 3 : 4 + 4 : 1 + permutation vector OK + + +Initial row permutation, P1: permutation vector, n = 5. + 0 : 2 + 1 : 3 + 2 : 0 + 3 : 1 + 4 : 4 + permutation vector OK + + Symbolic object: OK + + +Numeric factorization of A: Numeric object: + n_row: 5 n_col: 5 + relative pivot tolerance used: 0.1 + relative symmetric pivot tolerance used: 0.001 + matrix scaled: yes (divided each row by sum abs value in each row) + minimum sum (abs (rows of A)): 1.00000e+00 + maximum sum (abs (rows of A)): 1.93000e+01 + initial allocation parameter used: 0.7 + frontal matrix allocation parameter used: 0.5 + final total size of Numeric object (Units): 99 + final total size of Numeric object (MBytes): 0.0 + peak size of variable-size part (Units): 2527 + peak size of variable-size part (MBytes): 0.0 + largest actual frontal matrix size: 4 + memory defragmentations: 1 + memory reallocations: 1 + costly memory reallocations: 0 + entries in compressed pattern (L and U): 2 + number of nonzeros in L (excl diag): 4 + number of entries stored in L (excl diag): 2 + number of nonzeros in U (excl diag): 4 + number of entries stored in U (excl diag): 2 + factorization floating-point operations: 34 + number of nonzeros on diagonal of U: 5 + min abs. value on diagonal of U: 1.34629e-01 + max abs. value on diagonal of U: 1.77313e+00 + reciprocal condition number estimate: 7.59e-02 + +Scale factors applied via multiplication +Scale factors, Rs: dense vector, n = 5. + 0 : (0.166667) + 1 : (0.0518135) + 2 : (0.0980392) + 3 : (1) + 4 : (0.125) + dense vector OK + + +P: row permutation vector, n = 5. + 0 : 2 + 1 : 3 + 2 : 0 + 3 : 4 + 4 : 1 + permutation vector OK + + +Q: column permutation vector, n = 5. + 0 : 3 + 1 : 2 + 2 : 0 + 3 : 4 + 4 : 1 + permutation vector OK + + +L in Numeric object, in column-oriented compressed-pattern form: + Diagonal entries are all equal to 1.0 (not stored) + + column 0: length 0. + + column 1: length 2. + row 4 : (0.207254 + 0.0103627i) + row 3 : (0.25 + 0.0375i) + + column 2: add 1 entries. length 1. Start of Lchain. + row 4 : (0.379275 - 0.174093i) + + column 3: length 1. + row 4 : (3.00161 + 1.2864i) + + column 4: length 0. Start of Lchain. + + +U in Numeric object, in row-oriented compressed-pattern form: + Diagonal is stored separately. + + row 4: length 0. End of Uchain. + + row 3: length 1. End of Uchain. + col 4 : (0.5 + 0.0375i) + + row 2: length 1. + col 4 : (0.5 + 0i) + + row 1: length 0. End of Uchain. + + row 1: length 0. + + row 0: length 2. + col 1 : (-0.294118 - 0.0196078i) + col 4 : (-0.0980392 - 0.0980392i) + + +diagonal of U: dense vector, n = 5. + 0 : (0.196078 + 0.294118i) + 1 : (1 + 0i) + 2 : (0.333333 + 0.166667i) + 3 : (0.125 + 0.05i) + 4 : (-1.6422 - 0.668715i) + dense vector OK + + Numeric object: OK + + +UMFPACK V4.4 (Jan. 28, 2005), Info: + matrix entry defined as: double complex + Int (generic integer) defined as: int + BLAS library used: none. UMFPACK will be slow. + MATLAB: no. + CPU timer: POSIX times ( ) routine. + number of rows in matrix A: 5 + number of columns in matrix A: 5 + entries in matrix A: 12 + memory usage reported in: 8-byte Units + size of int: 4 bytes + size of long: 4 bytes + size of pointer: 4 bytes + size of numerical entry: 16 bytes + + strategy used: unsymmetric + ordering used: colamd on A + modify Q during factorization: yes + prefer diagonal pivoting: no + pivots with zero Markowitz cost: 2 + submatrix S after removing zero-cost pivots: + number of "dense" rows: 0 + number of "dense" columns: 0 + number of empty rows: 0 + number of empty columns 0 + submatrix S square and diagonal preserved + pattern of square submatrix S: + number rows and columns 3 + symmetry of nonzero pattern: 1.000000 + nz in S+S' (excl. diagonal): 4 + nz on diagonal of matrix S: 2 + fraction of nz on diagonal: 0.666667 + 2-by-2 pivoting to place large entries on diagonal: + # of small diagonal entries of S: 1 + # unmatched: 0 + symmetry of P2*S: 0.000000 + nz in P2*S+(P2*S)' (excl. diag.): 6 + nz on diagonal of P2*S: 3 + fraction of nz on diag of P2*S: 1.000000 + symbolic factorization defragmentations: 0 + symbolic memory usage (Units): 144 + symbolic memory usage (MBytes): 0.0 + Symbolic size (Units): 45 + Symbolic size (MBytes): 0 + symbolic factorization CPU time (sec): 0.00 + symbolic factorization wallclock time(sec): 0.00 + + matrix scaled: yes (divided each row by sum of abs values in each row) + minimum sum (abs (rows of A)): 1.00000e+00 + maximum sum (abs (rows of A)): 1.93000e+01 + + symbolic/numeric factorization: upper bound actual % + variable-sized part of Numeric object: + initial size (Units) 84 79 94% + peak size (Units) 2542 2527 99% + final size (Units) 25 21 84% + Numeric final size (Units) 106 100 94% + Numeric final size (MBytes) 0.0 0.0 94% + peak memory usage (Units) 2737 2722 99% + peak memory usage (MBytes) 0.0 0.0 99% + numeric factorization flops 6.70000e+01 3.40000e+01 51% + nz in L (incl diagonal) 10 9 90% + nz in U (incl diagonal) 10 9 90% + nz in L+U (incl diagonal) 15 13 87% + largest front (# entries) 9 4 44% + largest # rows in front 3 2 67% + largest # columns in front 3 2 67% + + initial allocation ratio used: 0.7 + # of forced updates due to frontal growth: 0 + nz in L (incl diagonal), if none dropped 9 + nz in U (incl diagonal), if none dropped 9 + number of small entries dropped 0 + nonzeros on diagonal of U: 5 + min abs. value on diagonal of U: 1.35e-01 + max abs. value on diagonal of U: 1.77e+00 + estimate of reciprocal of condition number: 7.59e-02 + indices in compressed pattern: 2 + numerical values stored in Numeric object: 9 + numeric factorization defragmentations: 1 + numeric factorization reallocations: 1 + costly numeric factorization reallocations: 0 + numeric factorization CPU time (sec): 0.00 + numeric factorization wallclock time (sec): 0.00 + symbolic + numeric CPU time (sec): 0.00 + symbolic + numeric wall clock time (sec): 0.00 + + solve flops: 5.23000e+02 + iterative refinement steps taken: 0 + iterative refinement steps attempted: 0 + sparse backward error omega1: 7.87e-17 + sparse backward error omega2: 0.00e+00 + solve CPU time (sec): 0.00 + solve wall clock time (sec): 0.00 + + total symbolic + numeric + solve flops: 5.57000e+02 + total symbolic + numeric + solve CPU time: 0.00 + total symbolic+numeric+solve wall clock time: 0.00 + + +UMFPACK: Copyright (c) 2005 by Timothy A. Davis. All Rights Reserved. + +UMFPACK V4.4 (Jan. 28, 2005): OK + + +x (solution of Ax=b): dense vector, n = 5. + 0 : (0.121188 - 0.561001i) + 1 : (2.39887 + 0.666938i) + 2 : (3 + 0i) + 3 : (1.57395 - 1.52801i) + 4 : (2.3876 - 3.04245i) + dense vector OK + +maxnorm of residual: 6.21725e-15 + + +UMFPACK: Copyright (c) 2005 by Timothy A. Davis. All Rights Reserved. + +UMFPACK V4.4 (Jan. 28, 2005): OK + +determinant: (-1.7814+ (2.3784)i) * 10^(2) + +x (solution of Ax=b, solve is split into 3 steps): dense vector, n = 5. + 0 : (0.121188 - 0.561001i) + 1 : (2.39887 + 0.666938i) + 2 : (3 + 0i) + 3 : (1.57395 - 1.52801i) + 4 : (2.3876 - 3.04245i) + dense vector OK + +maxnorm of residual: 6.21725e-15 + + +UMFPACK V4.4 (Jan. 28, 2005), Info: + matrix entry defined as: double complex + Int (generic integer) defined as: int + BLAS library used: none. UMFPACK will be slow. + MATLAB: no. + CPU timer: POSIX times ( ) routine. + number of rows in matrix A: 5 + number of columns in matrix A: 5 + entries in matrix A: 12 + memory usage reported in: 8-byte Units + size of int: 4 bytes + size of long: 4 bytes + size of pointer: 4 bytes + size of numerical entry: 16 bytes + + strategy used: unsymmetric + ordering used: colamd on A + modify Q during factorization: yes + prefer diagonal pivoting: no + pivots with zero Markowitz cost: 2 + submatrix S after removing zero-cost pivots: + number of "dense" rows: 0 + number of "dense" columns: 0 + number of empty rows: 0 + number of empty columns 0 + submatrix S square and diagonal preserved + pattern of square submatrix S: + number rows and columns 3 + symmetry of nonzero pattern: 1.000000 + nz in S+S' (excl. diagonal): 4 + nz on diagonal of matrix S: 2 + fraction of nz on diagonal: 0.666667 + 2-by-2 pivoting to place large entries on diagonal: + # of small diagonal entries of S: 1 + # unmatched: 0 + symmetry of P2*S: 0.000000 + nz in P2*S+(P2*S)' (excl. diag.): 6 + nz on diagonal of P2*S: 3 + fraction of nz on diag of P2*S: 1.000000 + symbolic factorization defragmentations: 0 + symbolic memory usage (Units): 144 + symbolic memory usage (MBytes): 0.0 + Symbolic size (Units): 45 + Symbolic size (MBytes): 0 + symbolic factorization CPU time (sec): 0.00 + symbolic factorization wallclock time(sec): 0.00 + + matrix scaled: yes (divided each row by sum of abs values in each row) + minimum sum (abs (rows of A)): 1.00000e+00 + maximum sum (abs (rows of A)): 1.93000e+01 + + symbolic/numeric factorization: upper bound actual % + variable-sized part of Numeric object: + initial size (Units) 84 79 94% + peak size (Units) 2542 2527 99% + final size (Units) 25 21 84% + Numeric final size (Units) 106 100 94% + Numeric final size (MBytes) 0.0 0.0 94% + peak memory usage (Units) 2737 2722 99% + peak memory usage (MBytes) 0.0 0.0 99% + numeric factorization flops 6.70000e+01 3.40000e+01 51% + nz in L (incl diagonal) 10 9 90% + nz in U (incl diagonal) 10 9 90% + nz in L+U (incl diagonal) 15 13 87% + largest front (# entries) 9 4 44% + largest # rows in front 3 2 67% + largest # columns in front 3 2 67% + + initial allocation ratio used: 0.7 + # of forced updates due to frontal growth: 0 + nz in L (incl diagonal), if none dropped 9 + nz in U (incl diagonal), if none dropped 9 + number of small entries dropped 0 + nonzeros on diagonal of U: 5 + min abs. value on diagonal of U: 1.35e-01 + max abs. value on diagonal of U: 1.77e+00 + estimate of reciprocal of condition number: 7.59e-02 + indices in compressed pattern: 2 + numerical values stored in Numeric object: 9 + numeric factorization defragmentations: 1 + numeric factorization reallocations: 1 + costly numeric factorization reallocations: 0 + numeric factorization CPU time (sec): 0.00 + numeric factorization wallclock time (sec): 0.00 + symbolic + numeric CPU time (sec): 0.00 + symbolic + numeric wall clock time (sec): 0.00 + + solve flops: 4.80000e+02 + iterative refinement steps taken: 0 + iterative refinement steps attempted: 0 + sparse backward error omega1: 6.06e-17 + sparse backward error omega2: 0.00e+00 + solve CPU time (sec): 0.00 + solve wall clock time (sec): 0.00 + + total symbolic + numeric + solve flops: 5.14000e+02 + total symbolic + numeric + solve CPU time: 0.00 + total symbolic+numeric+solve wall clock time: 0.00 + + +x (solution of A'x=b): dense vector, n = 5. + 0 : (3.39246 + 0.13257i) + 1 : (0.31463 + 1.38626i) + 2 : (0.461538 + 0.692308i) + 3 : (-20.9089 - 1.55801i) + 4 : (9.04015 - 0.613724i) + dense vector OK + +maxnorm of residual: 7.68703e-15 + + +changing A (1,4) to zero + +modified A: column-form matrix, n_row 5 n_col 5, nz = 12. + + column 0: start: 0 end: 1 entries: 2 + row 0 : (2 + 1i) + row 1 : (3 + 0.1i) + + column 1: start: 2 end: 4 entries: 3 + row 0 : (3 + 0i) + row 2 : (-1 - 1i) + row 4 : (4 + 0.3i) + + column 2: start: 5 end: 8 entries: 4 + row 1 : (4 + 0.2i) + row 2 : (-3 - 0.2i) + row 3 : (1 + 0i) + row 4 : (2 + 0.3i) + + column 3: start: 9 end: 9 entries: 1 + row 2 : (2 + 3i) + + column 4: start: 10 end: 11 entries: 2 + row 1 : (0 + 0i) + row 4 : (1 + 0.4i) + column-form matrix OK + + +Numeric factorization of modified A: Numeric object: + n_row: 5 n_col: 5 + relative pivot tolerance used: 0.1 + relative symmetric pivot tolerance used: 0.001 + matrix scaled: yes (divided each row by sum abs value in each row) + minimum sum (abs (rows of A)): 1.00000e+00 + maximum sum (abs (rows of A)): 1.02000e+01 + initial allocation parameter used: 0.7 + frontal matrix allocation parameter used: 0.5 + final total size of Numeric object (Units): 97 + final total size of Numeric object (MBytes): 0.0 + peak size of variable-size part (Units): 2527 + peak size of variable-size part (MBytes): 0.0 + largest actual frontal matrix size: 4 + memory defragmentations: 1 + memory reallocations: 1 + costly memory reallocations: 0 + entries in compressed pattern (L and U): 2 + number of nonzeros in L (excl diag): 3 + number of entries stored in L (excl diag): 1 + number of nonzeros in U (excl diag): 4 + number of entries stored in U (excl diag): 2 + factorization floating-point operations: 17 + number of nonzeros on diagonal of U: 5 + min abs. value on diagonal of U: 1.34629e-01 + max abs. value on diagonal of U: 1.00000e+00 + reciprocal condition number estimate: 1.35e-01 + +Scale factors applied via multiplication +Scale factors, Rs: dense vector, n = 5. + 0 : (0.166667) + 1 : (0.136986) + 2 : (0.0980392) + 3 : (1) + 4 : (0.125) + dense vector OK + + +P: row permutation vector, n = 5. + 0 : 2 + 1 : 3 + 2 : 0 + 3 : 4 + 4 : 1 + permutation vector OK + + +Q: column permutation vector, n = 5. + 0 : 3 + 1 : 2 + 2 : 0 + 3 : 4 + 4 : 1 + permutation vector OK + + +L in Numeric object, in column-oriented compressed-pattern form: + Diagonal entries are all equal to 1.0 (not stored) + + column 0: length 0. + + column 1: length 2. + row 4 : (0.547945 + 0.0273973i) + row 3 : (0.25 + 0.0375i) + + column 2: add 1 entries. length 1. Start of Lchain. + row 4 : (1.00274 - 0.460274i) + + column 3: length 0. Start of Lchain. + + column 4: length 0. Start of Lchain. + + +U in Numeric object, in row-oriented compressed-pattern form: + Diagonal is stored separately. + + row 4: length 0. End of Uchain. + + row 3: length 1. End of Uchain. + col 4 : (0.5 + 0.0375i) + + row 2: length 1. + col 4 : (0.5 + 0i) + + row 1: length 0. End of Uchain. + + row 1: length 0. + + row 0: length 2. + col 1 : (-0.294118 - 0.0196078i) + col 4 : (-0.0980392 - 0.0980392i) + + +diagonal of U: dense vector, n = 5. + 0 : (0.196078 + 0.294118i) + 1 : (1 + 0i) + 2 : (0.333333 + 0.166667i) + 3 : (0.125 + 0.05i) + 4 : (-0.50137 + 0.230137i) + dense vector OK + + Numeric object: OK + + +UMFPACK V4.4 (Jan. 28, 2005), Info: + matrix entry defined as: double complex + Int (generic integer) defined as: int + BLAS library used: none. UMFPACK will be slow. + MATLAB: no. + CPU timer: POSIX times ( ) routine. + number of rows in matrix A: 5 + number of columns in matrix A: 5 + entries in matrix A: 12 + memory usage reported in: 8-byte Units + size of int: 4 bytes + size of long: 4 bytes + size of pointer: 4 bytes + size of numerical entry: 16 bytes + + strategy used: unsymmetric + ordering used: colamd on A + modify Q during factorization: yes + prefer diagonal pivoting: no + pivots with zero Markowitz cost: 2 + submatrix S after removing zero-cost pivots: + number of "dense" rows: 0 + number of "dense" columns: 0 + number of empty rows: 0 + number of empty columns 0 + submatrix S square and diagonal preserved + pattern of square submatrix S: + number rows and columns 3 + symmetry of nonzero pattern: 1.000000 + nz in S+S' (excl. diagonal): 4 + nz on diagonal of matrix S: 2 + fraction of nz on diagonal: 0.666667 + 2-by-2 pivoting to place large entries on diagonal: + # of small diagonal entries of S: 1 + # unmatched: 0 + symmetry of P2*S: 0.000000 + nz in P2*S+(P2*S)' (excl. diag.): 6 + nz on diagonal of P2*S: 3 + fraction of nz on diag of P2*S: 1.000000 + symbolic factorization defragmentations: 0 + symbolic memory usage (Units): 144 + symbolic memory usage (MBytes): 0.0 + Symbolic size (Units): 45 + Symbolic size (MBytes): 0 + symbolic factorization CPU time (sec): 0.00 + symbolic factorization wallclock time(sec): 0.00 + + matrix scaled: yes (divided each row by sum of abs values in each row) + minimum sum (abs (rows of A)): 1.00000e+00 + maximum sum (abs (rows of A)): 1.02000e+01 + + symbolic/numeric factorization: upper bound actual % + variable-sized part of Numeric object: + initial size (Units) 84 79 94% + peak size (Units) 2542 2527 99% + final size (Units) 25 19 76% + Numeric final size (Units) 106 98 92% + Numeric final size (MBytes) 0.0 0.0 92% + peak memory usage (Units) 2737 2722 99% + peak memory usage (MBytes) 0.0 0.0 99% + numeric factorization flops 6.70000e+01 1.70000e+01 25% + nz in L (incl diagonal) 10 8 80% + nz in U (incl diagonal) 10 9 90% + nz in L+U (incl diagonal) 15 12 80% + largest front (# entries) 9 4 44% + largest # rows in front 3 2 67% + largest # columns in front 3 2 67% + + initial allocation ratio used: 0.7 + # of forced updates due to frontal growth: 0 + nz in L (incl diagonal), if none dropped 8 + nz in U (incl diagonal), if none dropped 9 + number of small entries dropped 0 + nonzeros on diagonal of U: 5 + min abs. value on diagonal of U: 1.35e-01 + max abs. value on diagonal of U: 1.00e+00 + estimate of reciprocal of condition number: 1.35e-01 + indices in compressed pattern: 2 + numerical values stored in Numeric object: 8 + numeric factorization defragmentations: 1 + numeric factorization reallocations: 1 + costly numeric factorization reallocations: 0 + numeric factorization CPU time (sec): 0.00 + numeric factorization wallclock time (sec): 0.00 + symbolic + numeric CPU time (sec): 0.00 + symbolic + numeric wall clock time (sec): 0.00 + + solve flops: 5.15000e+02 + iterative refinement steps taken: 0 + iterative refinement steps attempted: 0 + sparse backward error omega1: 7.33e-17 + sparse backward error omega2: 0.00e+00 + solve CPU time (sec): 0.00 + solve wall clock time (sec): 0.01 + solve mflops (wall clock time): 0.05 + + total symbolic + numeric + solve flops: 5.32000e+02 + total symbolic + numeric + solve CPU time: 0.00 + total symbolic+numeric+solve wall clock time: 0.00 + + +x (with modified A): dense vector, n = 5. + 0 : (10.9256 - 2.23085i) + 1 : (-5.36071 - 1.82131i) + 2 : (3 + 0i) + 3 : (-1.60191 - 1.88814i) + 4 : (32.7361 - 2.90097i) + dense vector OK + +maxnorm of residual: 3.9968e-15 + +changing real part of A (0,0) from 2 to 2 +changing real part of A (1,0) from 3 to 2 +changing real part of A (0,1) from 3 to 13 +changing real part of A (2,1) from -1 to 7 +changing real part of A (4,1) from 4 to 10 +changing real part of A (1,2) from 4 to 23 +changing real part of A (2,2) from -3 to 15 +changing real part of A (3,2) from 1 to 18 +changing real part of A (4,2) from 2 to 18 +changing real part of A (2,3) from 2 to 30 +changing real part of A (1,4) from 0 to 39 +changing real part of A (4,4) from 1 to 37 + +completely modified A (same pattern): column-form matrix, n_row 5 n_col 5, nz = 12. + + column 0: start: 0 end: 1 entries: 2 + row 0 : (2 + 1i) + row 1 : (2 + 0.1i) + + column 1: start: 2 end: 4 entries: 3 + row 0 : (13 + 0i) + row 2 : (7 - 1i) + row 4 : (10 + 0.3i) + + column 2: start: 5 end: 8 entries: 4 + row 1 : (23 + 0.2i) + row 2 : (15 - 0.2i) + row 3 : (18 + 0i) + row 4 : (18 + 0.3i) + + column 3: start: 9 end: 9 entries: 1 + row 2 : (30 + 3i) + + column 4: start: 10 end: 11 entries: 2 + row 1 : (39 + 0i) + row 4 : (37 + 0.4i) + column-form matrix OK + + +Saving symbolic object: + +Freeing symbolic object: + +Loading symbolic object: + +Done loading symbolic object + +Numeric factorization of completely modified A: Numeric object: + n_row: 5 n_col: 5 + relative pivot tolerance used: 0.1 + relative symmetric pivot tolerance used: 0.001 + matrix scaled: yes (divided each row by sum abs value in each row) + minimum sum (abs (rows of A)): 1.60000e+01 + maximum sum (abs (rows of A)): 6.60000e+01 + initial allocation parameter used: 0.7 + frontal matrix allocation parameter used: 0.5 + final total size of Numeric object (Units): 99 + final total size of Numeric object (MBytes): 0.0 + peak size of variable-size part (Units): 2527 + peak size of variable-size part (MBytes): 0.0 + largest actual frontal matrix size: 4 + memory defragmentations: 1 + memory reallocations: 1 + costly memory reallocations: 0 + entries in compressed pattern (L and U): 2 + number of nonzeros in L (excl diag): 4 + number of entries stored in L (excl diag): 2 + number of nonzeros in U (excl diag): 4 + number of entries stored in U (excl diag): 2 + factorization floating-point operations: 34 + number of nonzeros on diagonal of U: 5 + min abs. value on diagonal of U: 1.39754e-01 + max abs. value on diagonal of U: 1.00000e+00 + reciprocal condition number estimate: 1.40e-01 + +Scale factors applied via multiplication +Scale factors, Rs: dense vector, n = 5. + 0 : (0.0625) + 1 : (0.0155521) + 2 : (0.0177936) + 3 : (0.0555556) + 4 : (0.0151515) + dense vector OK + + +P: row permutation vector, n = 5. + 0 : 2 + 1 : 3 + 2 : 0 + 3 : 4 + 4 : 1 + permutation vector OK + + +Q: column permutation vector, n = 5. + 0 : 3 + 1 : 2 + 2 : 0 + 3 : 4 + 4 : 1 + permutation vector OK + + +L in Numeric object, in column-oriented compressed-pattern form: + Diagonal entries are all equal to 1.0 (not stored) + + column 0: length 0. + + column 1: length 2. + row 4 : (0.357698 + 0.00311042i) + row 3 : (0.272727 + 0.00454545i) + + column 2: add 1 entries. length 1. Start of Lchain. + row 4 : (0.204044 - 0.0895801i) + + column 3: length 1. + row 4 : (1.0818 - 0.0116951i) + + column 4: length 0. Start of Lchain. + + +U in Numeric object, in row-oriented compressed-pattern form: + Diagonal is stored separately. + + row 4: length 0. End of Uchain. + + row 3: length 1. End of Uchain. + col 4 : (0.151515 + 0.00454545i) + + row 2: length 1. + col 4 : (0.8125 + 0i) + + row 1: length 0. End of Uchain. + + row 1: length 0. + + row 0: length 2. + col 1 : (0.266904 - 0.00355872i) + col 4 : (0.124555 - 0.0177936i) + + +diagonal of U: dense vector, n = 5. + 0 : (0.533808 + 0.0533808i) + 1 : (1 + 0i) + 2 : (0.125 + 0.0625i) + 3 : (0.560606 + 0.00606061i) + 4 : (-0.329747 + 0.0696386i) + dense vector OK + + Numeric object: OK + + +UMFPACK V4.4 (Jan. 28, 2005), Info: + matrix entry defined as: double complex + Int (generic integer) defined as: int + BLAS library used: none. UMFPACK will be slow. + MATLAB: no. + CPU timer: POSIX times ( ) routine. + number of rows in matrix A: 5 + number of columns in matrix A: 5 + entries in matrix A: 12 + memory usage reported in: 8-byte Units + size of int: 4 bytes + size of long: 4 bytes + size of pointer: 4 bytes + size of numerical entry: 16 bytes + + strategy used: unsymmetric + ordering used: colamd on A + modify Q during factorization: yes + prefer diagonal pivoting: no + pivots with zero Markowitz cost: 2 + submatrix S after removing zero-cost pivots: + number of "dense" rows: 0 + number of "dense" columns: 0 + number of empty rows: 0 + number of empty columns 0 + submatrix S square and diagonal preserved + pattern of square submatrix S: + number rows and columns 3 + symmetry of nonzero pattern: 1.000000 + nz in S+S' (excl. diagonal): 4 + nz on diagonal of matrix S: 2 + fraction of nz on diagonal: 0.666667 + 2-by-2 pivoting to place large entries on diagonal: + # of small diagonal entries of S: 1 + # unmatched: 0 + symmetry of P2*S: 0.000000 + nz in P2*S+(P2*S)' (excl. diag.): 6 + nz on diagonal of P2*S: 3 + fraction of nz on diag of P2*S: 1.000000 + symbolic factorization defragmentations: 0 + symbolic memory usage (Units): 144 + symbolic memory usage (MBytes): 0.0 + Symbolic size (Units): 45 + Symbolic size (MBytes): 0 + symbolic factorization CPU time (sec): 0.00 + symbolic factorization wallclock time(sec): 0.00 + + matrix scaled: yes (divided each row by sum of abs values in each row) + minimum sum (abs (rows of A)): 1.60000e+01 + maximum sum (abs (rows of A)): 6.60000e+01 + + symbolic/numeric factorization: upper bound actual % + variable-sized part of Numeric object: + initial size (Units) 84 79 94% + peak size (Units) 2542 2527 99% + final size (Units) 25 21 84% + Numeric final size (Units) 106 100 94% + Numeric final size (MBytes) 0.0 0.0 94% + peak memory usage (Units) 2737 2722 99% + peak memory usage (MBytes) 0.0 0.0 99% + numeric factorization flops 6.70000e+01 3.40000e+01 51% + nz in L (incl diagonal) 10 9 90% + nz in U (incl diagonal) 10 9 90% + nz in L+U (incl diagonal) 15 13 87% + largest front (# entries) 9 4 44% + largest # rows in front 3 2 67% + largest # columns in front 3 2 67% + + initial allocation ratio used: 0.7 + # of forced updates due to frontal growth: 0 + nz in L (incl diagonal), if none dropped 9 + nz in U (incl diagonal), if none dropped 9 + number of small entries dropped 0 + nonzeros on diagonal of U: 5 + min abs. value on diagonal of U: 1.40e-01 + max abs. value on diagonal of U: 1.00e+00 + estimate of reciprocal of condition number: 1.40e-01 + indices in compressed pattern: 2 + numerical values stored in Numeric object: 9 + numeric factorization defragmentations: 1 + numeric factorization reallocations: 1 + costly numeric factorization reallocations: 0 + numeric factorization CPU time (sec): 0.00 + numeric factorization wallclock time (sec): 0.00 + symbolic + numeric CPU time (sec): 0.00 + symbolic + numeric wall clock time (sec): 0.00 + + solve flops: 5.23000e+02 + iterative refinement steps taken: 0 + iterative refinement steps attempted: 0 + sparse backward error omega1: 4.75e-17 + sparse backward error omega2: 0.00e+00 + solve CPU time (sec): 0.00 + solve wall clock time (sec): 0.00 + + total symbolic + numeric + solve flops: 5.57000e+02 + total symbolic + numeric + solve CPU time: 0.00 + total symbolic+numeric+solve wall clock time: 0.00 + + +x (with completely modified A): dense vector, n = 5. + 0 : (7.56307 - 3.68974i) + 1 : (-0.831991 + 0.0627998i) + 2 : (0.166667 + 0i) + 3 : (-0.00206892 - 0.107735i) + 4 : (0.658245 + 0.0407649i) + dense vector OK + +maxnorm of residual: 5.92582e-15 + + +C (transpose of A): column-form matrix, n_row 5 n_col 5, nz = 12. + + column 0: start: 0 end: 1 entries: 2 + row 0 : (2 - 1i) + row 1 : (13 + 0i) + + column 1: start: 2 end: 4 entries: 3 + row 0 : (2 - 0.1i) + row 2 : (23 - 0.2i) + row 4 : (39 + 0i) + + column 2: start: 5 end: 7 entries: 3 + row 1 : (7 + 1i) + row 2 : (15 + 0.2i) + row 3 : (30 - 3i) + + column 3: start: 8 end: 8 entries: 1 + row 2 : (18 + 0i) + + column 4: start: 9 end: 11 entries: 3 + row 1 : (10 - 0.3i) + row 2 : (18 - 0.3i) + row 4 : (37 - 0.4i) + column-form matrix OK + + +Symbolic factorization of C: Symbolic object: + matrix to be factorized: + n_row: 5 n_col: 5 + number of entries: 12 + block size used for dense matrix kernels: 32 + strategy used: unsymmetric + ordering used: colamd on A + + performn column etree postorder: yes + prefer diagonal pivoting (attempt P=Q): no + variable-size part of Numeric object: + minimum initial size (Units): 85 (MBytes): 0.0 + estimated peak size (Units): 2543 (MBytes): 0.0 + estimated final size (Units): 26 (MBytes): 0.0 + symbolic factorization memory usage (Units): 144 (MBytes): 0.0 + frontal matrices / supercolumns: + number of frontal chains: 1 + number of frontal matrices: 1 + largest frontal matrix row dimension: 3 + largest frontal matrix column dimension: 3 + + Frontal chain: 0. Frontal matrices 0 to 0 + Largest frontal matrix in Frontal chain: 3-by-3 + Front: 0 pivot cols: 3 (pivot columns 0 to 2) + pivot row candidates: 2 to 4 + leftmost descendant: 0 + 1st new candidate row : 2 + parent: (none) + +Initial column permutation, Q1: permutation vector, n = 5. + 0 : 3 + 1 : 2 + 2 : 0 + 3 : 4 + 4 : 1 + permutation vector OK + + +Initial row permutation, P1: permutation vector, n = 5. + 0 : 2 + 1 : 3 + 2 : 0 + 3 : 1 + 4 : 4 + permutation vector OK + + Symbolic object: OK + + +Get the contents of the Symbolic object for C: +(compare with umfpack_zi_report_symbolic output, above) +From the Symbolic object, C is of dimension 5-by-5 + with nz = 12, number of fronts = 1, + number of frontal matrix chains = 1 + +Pivot columns in each front, and parent of each front: + Front 0: parent front: -1 number of pivot cols: 3 + 0-th pivot column is column 3 in original matrix + 1-th pivot column is column 2 in original matrix + 2-th pivot column is column 0 in original matrix + +Note that the column ordering, above, will be refined +in the numeric factorization below. The assignment of pivot +columns to frontal matrices will always remain unchanged. + +Total number of pivot columns in frontal matrices: 3 + +Frontal matrix chains: + Frontal matrices 0 to 0 are factorized in a single + working array of size 3-by-3 + +Numeric factorization of C: Numeric object: + n_row: 5 n_col: 5 + relative pivot tolerance used: 0.1 + relative symmetric pivot tolerance used: 0.001 + matrix scaled: yes (divided each row by sum abs value in each row) + minimum sum (abs (rows of A)): 5.10000e+00 + maximum sum (abs (rows of A)): 7.64000e+01 + initial allocation parameter used: 0.7 + frontal matrix allocation parameter used: 0.5 + final total size of Numeric object (Units): 100 + final total size of Numeric object (MBytes): 0.0 + peak size of variable-size part (Units): 2528 + peak size of variable-size part (MBytes): 0.0 + largest actual frontal matrix size: 4 + memory defragmentations: 1 + memory reallocations: 1 + costly memory reallocations: 0 + entries in compressed pattern (L and U): 2 + number of nonzeros in L (excl diag): 3 + number of entries stored in L (excl diag): 2 + number of nonzeros in U (excl diag): 5 + number of entries stored in U (excl diag): 2 + factorization floating-point operations: 34 + number of nonzeros on diagonal of U: 5 + min abs. value on diagonal of U: 2.40964e-01 + max abs. value on diagonal of U: 9.13625e-01 + reciprocal condition number estimate: 2.64e-01 + +Scale factors applied via multiplication +Scale factors, Rs: dense vector, n = 5. + 0 : (0.196078) + 1 : (0.0319489) + 2 : (0.0133869) + 3 : (0.030303) + 4 : (0.013089) + dense vector OK + + +P: row permutation vector, n = 5. + 0 : 2 + 1 : 3 + 2 : 0 + 3 : 4 + 4 : 1 + permutation vector OK + + +Q: column permutation vector, n = 5. + 0 : 3 + 1 : 2 + 2 : 0 + 3 : 4 + 4 : 1 + permutation vector OK + + +L in Numeric object, in column-oriented compressed-pattern form: + Diagonal entries are all equal to 1.0 (not stored) + + column 0: length 0. + + column 1: length 1. + row 4 : (0.240091 + 0.0591529i) + + column 2: add 1 entries. length 1. Start of Lchain. + row 4 : (0.847284 + 0.423642i) + + column 3: length 1. + row 4 : (0.659838 - 0.0126577i) + + column 4: length 0. Start of Lchain. + + +U in Numeric object, in row-oriented compressed-pattern form: + Diagonal is stored separately. + + row 4: length 0. End of Uchain. + + row 3: length 1. End of Uchain. + col 4 : (0.510471 + 0i) + + row 2: length 1. + col 4 : (0.392157 - 0.0196078i) + + row 1: length 0. End of Uchain. + + row 1: length 0. + + row 0: length 3. + col 1 : (0.200803 + 0.00267738i) + col 3 : (0.240964 - 0.00401606i) + col 4 : (0.307898 - 0.00267738i) + + +diagonal of U: dense vector, n = 5. + 0 : (0.240964 + 0i) + 1 : (0.909091 - 0.0909091i) + 2 : (0.392157 - 0.196078i) + 3 : (0.484293 - 0.0052356i) + 4 : (-0.677403 - 0.143059i) + dense vector OK + + Numeric object: OK + + +L (lower triangular factor of C): row-form matrix, n_row 5 n_col 5, nz = 8. + + row 0: start: 0 end: 0 entries: 1 + column 0 : (1 + 0i) + + row 1: start: 1 end: 1 entries: 1 + column 1 : (1 + 0i) + + row 2: start: 2 end: 2 entries: 1 + column 2 : (1 + 0i) + + row 3: start: 3 end: 3 entries: 1 + column 3 : (1 + 0i) + + row 4: start: 4 end: 7 entries: 4 + column 1 : (0.240091 + 0.0591529i) + column 2 : (0.847284 + 0.423642i) + column 3 : (0.659838 - 0.0126577i) + column 4 : (1 + 0i) + row-form matrix OK + + +U (upper triangular factor of C): column-form matrix, n_row 5 n_col 5, nz = 10. + + column 0: start: 0 end: 0 entries: 1 + row 0 : (0.240964 + 0i) + + column 1: start: 1 end: 2 entries: 2 + row 0 : (0.200803 + 0.00267738i) + row 1 : (0.909091 - 0.0909091i) + + column 2: start: 3 end: 3 entries: 1 + row 2 : (0.392157 - 0.196078i) + + column 3: start: 4 end: 5 entries: 2 + row 0 : (0.240964 - 0.00401606i) + row 3 : (0.484293 - 0.0052356i) + + column 4: start: 6 end: 9 entries: 4 + row 0 : (0.307898 - 0.00267738i) + row 2 : (0.392157 - 0.0196078i) + row 3 : (0.510471 + 0i) + row 4 : (-0.677403 - 0.143059i) + column-form matrix OK + + +P: permutation vector, n = 5. + 0 : 2 + 1 : 3 + 2 : 0 + 3 : 4 + 4 : 1 + permutation vector OK + + +Q: permutation vector, n = 5. + 0 : 3 + 1 : 2 + 2 : 0 + 3 : 4 + 4 : 1 + permutation vector OK + + +Scale factors: row i of A is to be multiplied by the ith scale factor +0: 0.196078 +1: 0.0319489 +2: 0.0133869 +3: 0.030303 +4: 0.013089 + +Converting L to triplet form, and printing it: + +L, in triplet form: triplet-form matrix, n_row = 5, n_col = 5 nz = 8. + 0 : 0 0 (1 + 0i) + 1 : 1 1 (1 + 0i) + 2 : 2 2 (1 + 0i) + 3 : 3 3 (1 + 0i) + 4 : 4 1 (0.240091 + 0.0591529i) + 5 : 4 2 (0.847284 + 0.423642i) + 6 : 4 3 (0.659838 - 0.0126577i) + 7 : 4 4 (1 + 0i) + triplet-form matrix OK + + +Saving numeric object: + +Freeing numeric object: + +Loading numeric object: + +Done loading numeric object + +UMFPACK V4.4 (Jan. 28, 2005), Info: + matrix entry defined as: double complex + Int (generic integer) defined as: int + BLAS library used: none. UMFPACK will be slow. + MATLAB: no. + CPU timer: POSIX times ( ) routine. + number of rows in matrix A: 5 + number of columns in matrix A: 5 + entries in matrix A: 12 + memory usage reported in: 8-byte Units + size of int: 4 bytes + size of long: 4 bytes + size of pointer: 4 bytes + size of numerical entry: 16 bytes + + strategy used: unsymmetric + ordering used: colamd on A + modify Q during factorization: yes + prefer diagonal pivoting: no + pivots with zero Markowitz cost: 2 + submatrix S after removing zero-cost pivots: + number of "dense" rows: 0 + number of "dense" columns: 0 + number of empty rows: 0 + number of empty columns 0 + submatrix S square and diagonal preserved + pattern of square submatrix S: + number rows and columns 3 + symmetry of nonzero pattern: 1.000000 + nz in S+S' (excl. diagonal): 4 + nz on diagonal of matrix S: 2 + fraction of nz on diagonal: 0.666667 + 2-by-2 pivoting to place large entries on diagonal: + # of small diagonal entries of S: 1 + # unmatched: 0 + symmetry of P2*S: 0.000000 + nz in P2*S+(P2*S)' (excl. diag.): 6 + nz on diagonal of P2*S: 3 + fraction of nz on diag of P2*S: 1.000000 + symbolic factorization defragmentations: 0 + symbolic memory usage (Units): 144 + symbolic memory usage (MBytes): 0.0 + Symbolic size (Units): 45 + Symbolic size (MBytes): 0 + symbolic factorization CPU time (sec): 0.00 + symbolic factorization wallclock time(sec): 0.00 + + matrix scaled: yes (divided each row by sum of abs values in each row) + minimum sum (abs (rows of A)): 5.10000e+00 + maximum sum (abs (rows of A)): 7.64000e+01 + + symbolic/numeric factorization: upper bound actual % + variable-sized part of Numeric object: + initial size (Units) 85 80 94% + peak size (Units) 2543 2528 99% + final size (Units) 26 22 85% + Numeric final size (Units) 107 101 94% + Numeric final size (MBytes) 0.0 0.0 94% + peak memory usage (Units) 2738 2723 99% + peak memory usage (MBytes) 0.0 0.0 99% + numeric factorization flops 6.70000e+01 3.40000e+01 51% + nz in L (incl diagonal) 9 8 89% + nz in U (incl diagonal) 11 10 91% + nz in L+U (incl diagonal) 15 13 87% + largest front (# entries) 9 4 44% + largest # rows in front 3 2 67% + largest # columns in front 3 2 67% + + initial allocation ratio used: 0.7 + # of forced updates due to frontal growth: 0 + nz in L (incl diagonal), if none dropped 8 + nz in U (incl diagonal), if none dropped 10 + number of small entries dropped 0 + nonzeros on diagonal of U: 5 + min abs. value on diagonal of U: 2.41e-01 + max abs. value on diagonal of U: 9.14e-01 + estimate of reciprocal of condition number: 2.64e-01 + indices in compressed pattern: 2 + numerical values stored in Numeric object: 9 + numeric factorization defragmentations: 1 + numeric factorization reallocations: 1 + costly numeric factorization reallocations: 0 + numeric factorization CPU time (sec): 0.00 + numeric factorization wallclock time (sec): 0.00 + symbolic + numeric CPU time (sec): 0.00 + symbolic + numeric wall clock time (sec): 0.00 + + solve flops: 4.80000e+02 + iterative refinement steps taken: 0 + iterative refinement steps attempted: 0 + sparse backward error omega1: 8.89e-17 + sparse backward error omega2: 0.00e+00 + solve CPU time (sec): 0.00 + solve wall clock time (sec): 0.00 + + total symbolic + numeric + solve flops: 5.14000e+02 + total symbolic + numeric + solve CPU time: 0.00 + total symbolic+numeric+solve wall clock time: 0.00 + + +x (solution of C'x=b): dense vector, n = 5. + 0 : (7.56307 - 3.68974i) + 1 : (-0.831991 + 0.0627998i) + 2 : (0.166667 + 0i) + 3 : (-0.00206892 - 0.107735i) + 4 : (0.658245 + 0.0407649i) + dense vector OK + +maxnorm of residual: 5.6552e-15 + + +Solving C'x=b again, using umfpack_zi_wsolve instead: + +UMFPACK V4.4 (Jan. 28, 2005), Info: + matrix entry defined as: double complex + Int (generic integer) defined as: int + BLAS library used: none. UMFPACK will be slow. + MATLAB: no. + CPU timer: POSIX times ( ) routine. + number of rows in matrix A: 5 + number of columns in matrix A: 5 + entries in matrix A: 12 + memory usage reported in: 8-byte Units + size of int: 4 bytes + size of long: 4 bytes + size of pointer: 4 bytes + size of numerical entry: 16 bytes + + strategy used: unsymmetric + ordering used: colamd on A + modify Q during factorization: yes + prefer diagonal pivoting: no + pivots with zero Markowitz cost: 2 + submatrix S after removing zero-cost pivots: + number of "dense" rows: 0 + number of "dense" columns: 0 + number of empty rows: 0 + number of empty columns 0 + submatrix S square and diagonal preserved + pattern of square submatrix S: + number rows and columns 3 + symmetry of nonzero pattern: 1.000000 + nz in S+S' (excl. diagonal): 4 + nz on diagonal of matrix S: 2 + fraction of nz on diagonal: 0.666667 + 2-by-2 pivoting to place large entries on diagonal: + # of small diagonal entries of S: 1 + # unmatched: 0 + symmetry of P2*S: 0.000000 + nz in P2*S+(P2*S)' (excl. diag.): 6 + nz on diagonal of P2*S: 3 + fraction of nz on diag of P2*S: 1.000000 + symbolic factorization defragmentations: 0 + symbolic memory usage (Units): 144 + symbolic memory usage (MBytes): 0.0 + Symbolic size (Units): 45 + Symbolic size (MBytes): 0 + symbolic factorization CPU time (sec): 0.00 + symbolic factorization wallclock time(sec): 0.00 + + matrix scaled: yes (divided each row by sum of abs values in each row) + minimum sum (abs (rows of A)): 5.10000e+00 + maximum sum (abs (rows of A)): 7.64000e+01 + + symbolic/numeric factorization: upper bound actual % + variable-sized part of Numeric object: + initial size (Units) 85 80 94% + peak size (Units) 2543 2528 99% + final size (Units) 26 22 85% + Numeric final size (Units) 107 101 94% + Numeric final size (MBytes) 0.0 0.0 94% + peak memory usage (Units) 2738 2723 99% + peak memory usage (MBytes) 0.0 0.0 99% + numeric factorization flops 6.70000e+01 3.40000e+01 51% + nz in L (incl diagonal) 9 8 89% + nz in U (incl diagonal) 11 10 91% + nz in L+U (incl diagonal) 15 13 87% + largest front (# entries) 9 4 44% + largest # rows in front 3 2 67% + largest # columns in front 3 2 67% + + initial allocation ratio used: 0.7 + # of forced updates due to frontal growth: 0 + nz in L (incl diagonal), if none dropped 8 + nz in U (incl diagonal), if none dropped 10 + number of small entries dropped 0 + nonzeros on diagonal of U: 5 + min abs. value on diagonal of U: 2.41e-01 + max abs. value on diagonal of U: 9.14e-01 + estimate of reciprocal of condition number: 2.64e-01 + indices in compressed pattern: 2 + numerical values stored in Numeric object: 9 + numeric factorization defragmentations: 1 + numeric factorization reallocations: 1 + costly numeric factorization reallocations: 0 + numeric factorization CPU time (sec): 0.00 + numeric factorization wallclock time (sec): 0.00 + symbolic + numeric CPU time (sec): 0.00 + symbolic + numeric wall clock time (sec): 0.00 + + solve flops: 4.80000e+02 + iterative refinement steps taken: 0 + iterative refinement steps attempted: 0 + sparse backward error omega1: 8.89e-17 + sparse backward error omega2: 0.00e+00 + solve CPU time (sec): 0.00 + solve wall clock time (sec): 0.00 + + total symbolic + numeric + solve flops: 5.14000e+02 + total symbolic + numeric + solve CPU time: 0.00 + total symbolic+numeric+solve wall clock time: 0.00 + + +x (solution of C'x=b): dense vector, n = 5. + 0 : (7.56307 - 3.68974i) + 1 : (-0.831991 + 0.0627998i) + 2 : (0.166667 + 0i) + 3 : (-0.00206892 - 0.107735i) + 4 : (0.658245 + 0.0407649i) + dense vector OK + +maxnorm of residual: 5.6552e-15 + + +umfpack_zi_demo complete. +Total time: 0.00 seconds (CPU time), 0.01 seconds (wallclock time) diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Demo/umfpack_zi_demo.sed --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Demo/umfpack_zi_demo.sed Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,8 @@ +/::/d +1,$s/_xx_/_zi_/g +1,$s/Int/int/g +1,$s/WSIZE/10/ +1,$s/%ld/%d/g +/define ABS/ { + s/ABS/ABS(x,z) ((x) >= 0 ? (x) : -(x)) + ((z) >= 0 ? (z) : -(z))/ + } diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Demo/umfpack_zl_demo.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Demo/umfpack_zl_demo.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,791 @@ +/* ========================================================================== */ +/* === umfpack_zl_demo ====================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + A demo of UMFPACK: umfpack_zl_* version. + + First, factor and solve a 5-by-5 system, Ax=b, using default parameters. + Then solve A'x=b using the factors of A. Modify one entry (A (1,4) = 0, + where the row and column indices range from 0 to 4. The pattern of A + has not changed (it has explicitly zero entry), so a reanalysis with + umfpack_zl_symbolic does not need to be done. Refactorize (with + umfpack_zl_numeric), and solve Ax=b. Note that the pivot ordering has + changed. Next, change all of the entries in A, but not the pattern. + + Finally, compute C = A', and do the symbolic and numeric factorization of C. + Factorizing A' can sometimes be better than factorizing A itself (less work + and memory usage). Solve C'x=b twice; the solution is the same as the + solution to Ax=b. + + A note about zero-sized arrays: UMFPACK uses many user-provided arrays of + size n (order of the matrix), and of size nz (the number of nonzeros in a + matrix). n cannot be zero; UMFPACK does not handle zero-dimensioned arrays. + However, nz can be zero. If you attempt to malloc an array of size nz = 0, + however, malloc will return a null pointer which UMFPACK will report as a + "missing argument." Thus, nz1 in this code is set to MAX (nz,1), and + similarly for lnz and unz. Lnz can never be zero, however, since L is always + unit diagonal. +*/ + +/* -------------------------------------------------------------------------- */ +/* definitions */ +/* -------------------------------------------------------------------------- */ + +#include +#include +#include "umfpack.h" + +/* use a cheap approximate absolute value for complex numbers: */ +#define ABS(x,z) ((x) >= 0 ? (x) : -(x)) + ((z) >= 0 ? (z) : -(z)) + +#define MAX(a,b) (((a) > (b)) ? (a) : (b)) +#ifndef TRUE +#define TRUE (1) +#endif +#ifndef FALSE +#define FALSE (0) +#endif + +/* -------------------------------------------------------------------------- */ +/* triplet form of the matrix. The triplets can be in any order. */ +/* -------------------------------------------------------------------------- */ + +static long n = 5, nz = 12 ; +static long Arow [ ] = { 0, 4, 1, 1, 2, 2, 0, 1, 2, 3, 4, 4} ; +static long Acol [ ] = { 0, 4, 0, 2, 1, 2, 1, 4, 3, 2, 1, 2} ; +static double Aval [ ] = {2., 1., 3., 4., -1., -3., 3., 6., 2., 1., 4., 2.} ; +static double Avalz[ ] = {1., .4, .1, .2, -1., -.2, 0., 6., 3., 0., .3, .3} ; +static double b [ ] = {8., 45., -3., 3., 19.}, x [5], r [5] ; +static double bz[ ] = {1., -5., -2., 0., 2.2}, xz[5], rz[5] ; + +/* Avalz, bz: imaginary part of A and b */ + +/* -------------------------------------------------------------------------- */ +/* error: print a message and exit */ +/* -------------------------------------------------------------------------- */ + +static void error +( + char *message +) +{ + printf ("\n\n====== error: %s =====\n\n", message) ; + exit (1) ; +} + + +/* -------------------------------------------------------------------------- */ +/* resid: compute the residual, r = Ax-b or r = A'x=b and return maxnorm (r) */ +/* A' is the complex conjugate transpose, not the array transpose */ +/* -------------------------------------------------------------------------- */ + +static double resid +( + long transpose, + long Ap [ ], + long Ai [ ], + double Ax [ ] + , double Az [ ] +) +{ + long i, j, p ; + double norm ; + + for (i = 0 ; i < n ; i++) + { + r [i] = -b [i] ; + rz[i] = -bz[i] ; + } + if (transpose) + { + for (j = 0 ; j < n ; j++) + { + for (p = Ap [j] ; p < Ap [j+1] ; p++) + { + i = Ai [p] ; + /* complex: r(j) += conj (Aij) * x (i) */ + r [j] += Ax [p] * x [i] ; + r [j] += Az [p] * xz[i] ; + rz[j] -= Az [p] * x [i] ; + rz[j] += Ax [p] * xz[i] ; + } + } + } + else + { + for (j = 0 ; j < n ; j++) + { + for (p = Ap [j] ; p < Ap [j+1] ; p++) + { + i = Ai [p] ; + r [i] += Ax [p] * x [j] ; + r [i] -= Az [p] * xz[j] ; + rz[i] += Az [p] * x [j] ; + rz[i] += Ax [p] * xz[j] ; + } + } + } + norm = 0. ; + for (i = 0 ; i < n ; i++) + { + norm = MAX (ABS (r [i], rz [i]), norm) ; + } + return (norm) ; +} + + +/* -------------------------------------------------------------------------- */ +/* main program */ +/* -------------------------------------------------------------------------- */ + +int main (int argc, char **argv) +{ + double Info [UMFPACK_INFO], Control [UMFPACK_CONTROL], *Ax, *Cx, *Lx, *Ux, + *W, t [2], *Dx, rnorm, *Rb, *y, *Rs ; + double *Az, *Lz, *Uz, *Dz, *Cz, *Rbz, *yz ; + long *Ap, *Ai, *Cp, *Ci, row, col, p, lnz, unz, nr, nc, *Lp, *Li, *Ui, *Up, + *P, *Q, *Lj, i, j, k, anz, nfr, nchains, *Qinit, fnpiv, lnz1, unz1, nz1, + status, *Front_npivcol, *Front_parent, *Chain_start, *Wi, *Pinit, n1, + *Chain_maxrows, *Chain_maxcols, *Front_1strow, *Front_leftmostdesc, + nzud, do_recip ; + void *Symbolic, *Numeric ; + + /* ---------------------------------------------------------------------- */ + /* initializations */ + /* ---------------------------------------------------------------------- */ + + umfpack_tic (t) ; + + printf ("\n%s demo: _zl_ version\n", UMFPACK_VERSION) ; + + /* get the default control parameters */ + umfpack_zl_defaults (Control) ; + + /* change the default print level for this demo */ + /* (otherwise, nothing will print) */ + Control [UMFPACK_PRL] = 6 ; + + /* print the license agreement */ + umfpack_zl_report_status (Control, UMFPACK_OK) ; + Control [UMFPACK_PRL] = 5 ; + + /* print the control parameters */ + umfpack_zl_report_control (Control) ; + + /* ---------------------------------------------------------------------- */ + /* print A and b, and convert A to column-form */ + /* ---------------------------------------------------------------------- */ + + /* print the right-hand-side */ + printf ("\nb: ") ; + (void) umfpack_zl_report_vector (n, b, bz, Control) ; + + /* print the triplet form of the matrix */ + printf ("\nA: ") ; + (void) umfpack_zl_report_triplet (n, n, nz, Arow, Acol, Aval, Avalz, + Control) ; + + /* convert to column form */ + nz1 = MAX (nz,1) ; /* ensure arrays are not of size zero. */ + Ap = (long *) malloc ((n+1) * sizeof (long)) ; + Ai = (long *) malloc (nz1 * sizeof (long)) ; + Ax = (double *) malloc (nz1 * sizeof (double)) ; + Az = (double *) malloc (nz1 * sizeof (double)) ; + if (!Ap || !Ai || !Ax || !Az) + { + error ("out of memory") ; + } + + status = umfpack_zl_triplet_to_col (n, n, nz, Arow, Acol, Aval, Avalz, + Ap, Ai, Ax, Az, (long *) NULL) ; + + if (status < 0) + { + umfpack_zl_report_status (Control, status) ; + error ("umfpack_zl_triplet_to_col failed") ; + } + + /* print the column-form of A */ + printf ("\nA: ") ; + (void) umfpack_zl_report_matrix (n, n, Ap, Ai, Ax, Az, 1, Control) ; + + /* ---------------------------------------------------------------------- */ + /* symbolic factorization */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_zl_symbolic (n, n, Ap, Ai, Ax, Az, &Symbolic, + Control, Info) ; + if (status < 0) + { + umfpack_zl_report_info (Control, Info) ; + umfpack_zl_report_status (Control, status) ; + error ("umfpack_zl_symbolic failed") ; + } + + /* print the symbolic factorization */ + + printf ("\nSymbolic factorization of A: ") ; + (void) umfpack_zl_report_symbolic (Symbolic, Control) ; + + /* ---------------------------------------------------------------------- */ + /* numeric factorization */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_zl_numeric (Ap, Ai, Ax, Az, Symbolic, &Numeric, + Control, Info) ; + if (status < 0) + { + umfpack_zl_report_info (Control, Info) ; + umfpack_zl_report_status (Control, status) ; + error ("umfpack_zl_numeric failed") ; + } + + /* print the numeric factorization */ + printf ("\nNumeric factorization of A: ") ; + (void) umfpack_zl_report_numeric (Numeric, Control) ; + + /* ---------------------------------------------------------------------- */ + /* solve Ax=b */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_zl_solve (UMFPACK_A, Ap, Ai, Ax, Az, x, xz, b, bz, + Numeric, Control, Info) ; + umfpack_zl_report_info (Control, Info) ; + umfpack_zl_report_status (Control, status) ; + if (status < 0) + { + error ("umfpack_zl_solve failed") ; + } + printf ("\nx (solution of Ax=b): ") ; + (void) umfpack_zl_report_vector (n, x, xz, Control) ; + rnorm = resid (FALSE, Ap, Ai, Ax, Az) ; + printf ("maxnorm of residual: %g\n\n", rnorm) ; + + /* ---------------------------------------------------------------------- */ + /* compute the determinant */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_zl_get_determinant (x, xz, r, Numeric, Info) ; + umfpack_zl_report_status (Control, status) ; + if (status < 0) + { + error ("umfpack_zl_get_determinant failed") ; + } + printf ("determinant: (%g", x [0]) ; + printf ("+ (%g)i", xz [0]) ; /* complex */ + printf (") * 10^(%g)\n", r [0]) ; + + /* ---------------------------------------------------------------------- */ + /* solve Ax=b, broken down into steps */ + /* ---------------------------------------------------------------------- */ + + /* Rb = R*b */ + Rb = (double *) malloc (n * sizeof (double)) ; + Rbz = (double *) malloc (n * sizeof (double)) ; + y = (double *) malloc (n * sizeof (double)) ; + yz = (double *) malloc (n * sizeof (double)) ; + if (!Rb || !y) error ("out of memory") ; + if (!Rbz || !yz) error ("out of memory") ; + + status = umfpack_zl_scale (Rb, Rbz, b, bz, Numeric) ; + if (status < 0) error ("umfpack_zl_scale failed") ; + /* solve Ly = P*(Rb) */ + status = umfpack_zl_solve (UMFPACK_Pt_L, Ap, Ai, Ax, Az, y, yz, Rb, Rbz, + Numeric, Control, Info) ; + if (status < 0) error ("umfpack_zl_solve failed") ; + /* solve UQ'x=y */ + status = umfpack_zl_solve (UMFPACK_U_Qt, Ap, Ai, Ax, Az, x, xz, y, yz, + Numeric, Control, Info) ; + if (status < 0) error ("umfpack_zl_solve failed") ; + printf ("\nx (solution of Ax=b, solve is split into 3 steps): ") ; + (void) umfpack_zl_report_vector (n, x, xz, Control) ; + rnorm = resid (FALSE, Ap, Ai, Ax, Az) ; + printf ("maxnorm of residual: %g\n\n", rnorm) ; + + free (Rb) ; + free (Rbz) ; + free (y) ; + free (yz) ; + + /* ---------------------------------------------------------------------- */ + /* solve A'x=b */ + /* ---------------------------------------------------------------------- */ + + /* note that this is the complex conjugate transpose, A' */ + status = umfpack_zl_solve (UMFPACK_At, Ap, Ai, Ax, Az, x, xz, b, bz, + Numeric, Control, Info) ; + umfpack_zl_report_info (Control, Info) ; + if (status < 0) + { + error ("umfpack_zl_solve failed") ; + } + printf ("\nx (solution of A'x=b): ") ; + (void) umfpack_zl_report_vector (n, x, xz, Control) ; + rnorm = resid (TRUE, Ap, Ai, Ax, Az) ; + printf ("maxnorm of residual: %g\n\n", rnorm) ; + + /* ---------------------------------------------------------------------- */ + /* modify one numerical value in the column-form of A */ + /* ---------------------------------------------------------------------- */ + + /* change A (1,4), look for row index 1 in column 4. */ + row = 1 ; + col = 4 ; + for (p = Ap [col] ; p < Ap [col+1] ; p++) + { + if (row == Ai [p]) + { + printf ("\nchanging A (%ld,%ld) to zero\n", row, col) ; + Ax [p] = 0.0 ; + Az [p] = 0.0 ; + break ; + } + } + printf ("\nmodified A: ") ; + (void) umfpack_zl_report_matrix (n, n, Ap, Ai, Ax, Az, 1, Control) ; + + /* ---------------------------------------------------------------------- */ + /* redo the numeric factorization */ + /* ---------------------------------------------------------------------- */ + + /* The pattern (Ap and Ai) hasn't changed, so the symbolic factorization */ + /* doesn't have to be redone, no matter how much we change Ax. */ + + /* We don't need the Numeric object any more, so free it. */ + umfpack_zl_free_numeric (&Numeric) ; + + /* Note that a memory leak would have occurred if the old Numeric */ + /* had not been free'd with umfpack_zl_free_numeric above. */ + status = umfpack_zl_numeric (Ap, Ai, Ax, Az, Symbolic, &Numeric, + Control, Info) ; + if (status < 0) + { + umfpack_zl_report_info (Control, Info) ; + umfpack_zl_report_status (Control, status) ; + error ("umfpack_zl_numeric failed") ; + } + printf ("\nNumeric factorization of modified A: ") ; + (void) umfpack_zl_report_numeric (Numeric, Control) ; + + /* ---------------------------------------------------------------------- */ + /* solve Ax=b, with the modified A */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_zl_solve (UMFPACK_A, Ap, Ai, Ax, Az, x, xz, b, bz, + Numeric, Control, Info) ; + umfpack_zl_report_info (Control, Info) ; + if (status < 0) + { + umfpack_zl_report_status (Control, status) ; + error ("umfpack_zl_solve failed") ; + } + printf ("\nx (with modified A): ") ; + (void) umfpack_zl_report_vector (n, x, xz, Control) ; + rnorm = resid (FALSE, Ap, Ai, Ax, Az) ; + printf ("maxnorm of residual: %g\n\n", rnorm) ; + + /* ---------------------------------------------------------------------- */ + /* modify all of the numerical values of A, but not the pattern */ + /* ---------------------------------------------------------------------- */ + + for (col = 0 ; col < n ; col++) + { + for (p = Ap [col] ; p < Ap [col+1] ; p++) + { + row = Ai [p] ; + printf ("changing ") ; + /* complex: */ printf ("real part of ") ; + printf ("A (%ld,%ld) from %g", row, col, Ax [p]) ; + Ax [p] = Ax [p] + col*10 - row ; + printf (" to %g\n", Ax [p]) ; + } + } + printf ("\ncompletely modified A (same pattern): ") ; + (void) umfpack_zl_report_matrix (n, n, Ap, Ai, Ax, Az, 1, Control) ; + + /* ---------------------------------------------------------------------- */ + /* save the Symbolic object to file, free it, and load it back in */ + /* ---------------------------------------------------------------------- */ + + /* use the default filename, "symbolic.umf" */ + printf ("\nSaving symbolic object:\n") ; + status = umfpack_zl_save_symbolic (Symbolic, (char *) NULL) ; + if (status < 0) + { + umfpack_zl_report_status (Control, status) ; + error ("umfpack_zl_save_symbolic failed") ; + } + printf ("\nFreeing symbolic object:\n") ; + umfpack_zl_free_symbolic (&Symbolic) ; + printf ("\nLoading symbolic object:\n") ; + status = umfpack_zl_load_symbolic (&Symbolic, (char *) NULL) ; + if (status < 0) + { + umfpack_zl_report_status (Control, status) ; + error ("umfpack_zl_load_symbolic failed") ; + } + printf ("\nDone loading symbolic object\n") ; + + /* ---------------------------------------------------------------------- */ + /* redo the numeric factorization */ + /* ---------------------------------------------------------------------- */ + + umfpack_zl_free_numeric (&Numeric) ; + status = umfpack_zl_numeric (Ap, Ai, Ax, Az, Symbolic, &Numeric, + Control, Info) ; + if (status < 0) + { + umfpack_zl_report_info (Control, Info) ; + umfpack_zl_report_status (Control, status) ; + error ("umfpack_zl_numeric failed") ; + } + printf ("\nNumeric factorization of completely modified A: ") ; + (void) umfpack_zl_report_numeric (Numeric, Control) ; + + /* ---------------------------------------------------------------------- */ + /* solve Ax=b, with the modified A */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_zl_solve (UMFPACK_A, Ap, Ai, Ax, Az, x, xz, b, bz, + Numeric, Control, Info) ; + umfpack_zl_report_info (Control, Info) ; + if (status < 0) + { + umfpack_zl_report_status (Control, status) ; + error ("umfpack_zl_solve failed") ; + } + printf ("\nx (with completely modified A): ") ; + (void) umfpack_zl_report_vector (n, x, xz, Control) ; + rnorm = resid (FALSE, Ap, Ai, Ax, Az) ; + printf ("maxnorm of residual: %g\n\n", rnorm) ; + + /* ---------------------------------------------------------------------- */ + /* free the symbolic and numeric factorization */ + /* ---------------------------------------------------------------------- */ + + umfpack_zl_free_symbolic (&Symbolic) ; + umfpack_zl_free_numeric (&Numeric) ; + + /* ---------------------------------------------------------------------- */ + /* C = transpose of A */ + /* ---------------------------------------------------------------------- */ + + Cp = (long *) malloc ((n+1) * sizeof (long)) ; + Ci = (long *) malloc (nz1 * sizeof (long)) ; + Cx = (double *) malloc (nz1 * sizeof (double)) ; + Cz = (double *) malloc (nz1 * sizeof (double)) ; + if (!Cp || !Ci || !Cx || !Cz) + { + error ("out of memory") ; + } + status = umfpack_zl_transpose (n, n, Ap, Ai, Ax, Az, + (long *) NULL, (long *) NULL, Cp, Ci, Cx, Cz, TRUE) ; + if (status < 0) + { + umfpack_zl_report_status (Control, status) ; + error ("umfpack_zl_transpose failed: ") ; + } + printf ("\nC (transpose of A): ") ; + (void) umfpack_zl_report_matrix (n, n, Cp, Ci, Cx, Cz, 1, Control) ; + + /* ---------------------------------------------------------------------- */ + /* symbolic factorization of C */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_zl_symbolic (n, n, Cp, Ci, Cx, Cz, &Symbolic, + Control, Info) ; + if (status < 0) + { + umfpack_zl_report_info (Control, Info) ; + umfpack_zl_report_status (Control, status) ; + error ("umfpack_zl_symbolic failed") ; + } + printf ("\nSymbolic factorization of C: ") ; + (void) umfpack_zl_report_symbolic (Symbolic, Control) ; + + /* ---------------------------------------------------------------------- */ + /* copy the contents of Symbolic into user arrays print them */ + /* ---------------------------------------------------------------------- */ + + printf ("\nGet the contents of the Symbolic object for C:\n") ; + printf ("(compare with umfpack_zl_report_symbolic output, above)\n") ; + Pinit = (long *) malloc ((n+1) * sizeof (long)) ; + Qinit = (long *) malloc ((n+1) * sizeof (long)) ; + Front_npivcol = (long *) malloc ((n+1) * sizeof (long)) ; + Front_1strow = (long *) malloc ((n+1) * sizeof (long)) ; + Front_leftmostdesc = (long *) malloc ((n+1) * sizeof (long)) ; + Front_parent = (long *) malloc ((n+1) * sizeof (long)) ; + Chain_start = (long *) malloc ((n+1) * sizeof (long)) ; + Chain_maxrows = (long *) malloc ((n+1) * sizeof (long)) ; + Chain_maxcols = (long *) malloc ((n+1) * sizeof (long)) ; + if (!Pinit || !Qinit || !Front_npivcol || !Front_parent || !Chain_start || + !Chain_maxrows || !Chain_maxcols || !Front_1strow || + !Front_leftmostdesc) + { + error ("out of memory") ; + } + + status = umfpack_zl_get_symbolic (&nr, &nc, &n1, &anz, &nfr, &nchains, + Pinit, Qinit, Front_npivcol, Front_parent, Front_1strow, + Front_leftmostdesc, Chain_start, Chain_maxrows, Chain_maxcols, + Symbolic) ; + + if (status < 0) + { + error ("symbolic factorization invalid") ; + } + + printf ("From the Symbolic object, C is of dimension %ld-by-%ld\n", nr, nc); + printf (" with nz = %ld, number of fronts = %ld,\n", nz, nfr) ; + printf (" number of frontal matrix chains = %ld\n", nchains) ; + + printf ("\nPivot columns in each front, and parent of each front:\n") ; + k = 0 ; + for (i = 0 ; i < nfr ; i++) + { + fnpiv = Front_npivcol [i] ; + printf (" Front %ld: parent front: %ld number of pivot cols: %ld\n", + i, Front_parent [i], fnpiv) ; + for (j = 0 ; j < fnpiv ; j++) + { + col = Qinit [k] ; + printf ( + " %ld-th pivot column is column %ld in original matrix\n", + k, col) ; + k++ ; + } + } + + printf ("\nNote that the column ordering, above, will be refined\n") ; + printf ("in the numeric factorization below. The assignment of pivot\n") ; + printf ("columns to frontal matrices will always remain unchanged.\n") ; + + printf ("\nTotal number of pivot columns in frontal matrices: %ld\n", k) ; + + printf ("\nFrontal matrix chains:\n") ; + for (j = 0 ; j < nchains ; j++) + { + printf (" Frontal matrices %ld to %ld are factorized in a single\n", + Chain_start [j], Chain_start [j+1] - 1) ; + printf (" working array of size %ld-by-%ld\n", + Chain_maxrows [j], Chain_maxcols [j]) ; + } + + /* ---------------------------------------------------------------------- */ + /* numeric factorization of C */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_zl_numeric (Cp, Ci, Cx, Cz, Symbolic, &Numeric, + Control, Info) ; + if (status < 0) + { + error ("umfpack_zl_numeric failed") ; + } + printf ("\nNumeric factorization of C: ") ; + (void) umfpack_zl_report_numeric (Numeric, Control) ; + + /* ---------------------------------------------------------------------- */ + /* extract the LU factors of C and print them */ + /* ---------------------------------------------------------------------- */ + + if (umfpack_zl_get_lunz (&lnz, &unz, &nr, &nc, &nzud, Numeric) < 0) + { + error ("umfpack_zl_get_lunz failed") ; + } + /* ensure arrays are not of zero size */ + lnz1 = MAX (lnz,1) ; + unz1 = MAX (unz,1) ; + Lp = (long *) malloc ((n+1) * sizeof (long)) ; + Lj = (long *) malloc (lnz1 * sizeof (long)) ; + Lx = (double *) malloc (lnz1 * sizeof (double)) ; + Lz = (double *) malloc (lnz1 * sizeof (double)) ; + Up = (long *) malloc ((n+1) * sizeof (long)) ; + Ui = (long *) malloc (unz1 * sizeof (long)) ; + Ux = (double *) malloc (unz1 * sizeof (double)) ; + Uz = (double *) malloc (unz1 * sizeof (double)) ; + P = (long *) malloc (n * sizeof (long)) ; + Q = (long *) malloc (n * sizeof (long)) ; + Dx = (double *) NULL ; /* D vector not requested */ + Dz = (double *) NULL ; + Rs = (double *) malloc (n * sizeof (double)) ; + if (!Lp || !Lj || !Lx || !Lz || !Up || !Ui || !Ux || !Uz || !P || !Q || !Rs) + { + error ("out of memory") ; + } + status = umfpack_zl_get_numeric (Lp, Lj, Lx, Lz, Up, Ui, Ux, Uz, + P, Q, Dx, Dz, &do_recip, Rs, Numeric) ; + if (status < 0) + { + error ("umfpack_zl_get_numeric failed") ; + } + + printf ("\nL (lower triangular factor of C): ") ; + (void) umfpack_zl_report_matrix (n, n, Lp, Lj, Lx, Lz, 0, Control) ; + printf ("\nU (upper triangular factor of C): ") ; + (void) umfpack_zl_report_matrix (n, n, Up, Ui, Ux, Uz, 1, Control) ; + printf ("\nP: ") ; + (void) umfpack_zl_report_perm (n, P, Control) ; + printf ("\nQ: ") ; + (void) umfpack_zl_report_perm (n, Q, Control) ; + printf ("\nScale factors: row i of A is to be ") ; + if (do_recip) + { + printf ("multiplied by the ith scale factor\n") ; + } + else + { + printf ("divided by the ith scale factor\n") ; + } + for (i = 0 ; i < n ; i++) printf ("%ld: %g\n", i, Rs [i]) ; + + /* ---------------------------------------------------------------------- */ + /* convert L to triplet form and print it */ + /* ---------------------------------------------------------------------- */ + + /* Note that L is in row-form, so it is the row indices that are created */ + /* by umfpack_zl_col_to_triplet. */ + + printf ("\nConverting L to triplet form, and printing it:\n") ; + Li = (long *) malloc (lnz1 * sizeof (long)) ; + if (!Li) + { + error ("out of memory") ; + } + if (umfpack_zl_col_to_triplet (n, Lp, Li) < 0) + { + error ("umfpack_zl_col_to_triplet failed") ; + } + printf ("\nL, in triplet form: ") ; + (void) umfpack_zl_report_triplet (n, n, lnz, Li, Lj, Lx, Lz, Control) ; + + /* ---------------------------------------------------------------------- */ + /* save the Numeric object to file, free it, and load it back in */ + /* ---------------------------------------------------------------------- */ + + /* use the default filename, "numeric.umf" */ + printf ("\nSaving numeric object:\n") ; + status = umfpack_zl_save_numeric (Numeric, (char *) NULL) ; + if (status < 0) + { + umfpack_zl_report_status (Control, status) ; + error ("umfpack_zl_save_numeric failed") ; + } + printf ("\nFreeing numeric object:\n") ; + umfpack_zl_free_numeric (&Numeric) ; + printf ("\nLoading numeric object:\n") ; + status = umfpack_zl_load_numeric (&Numeric, (char *) NULL) ; + if (status < 0) + { + umfpack_zl_report_status (Control, status) ; + error ("umfpack_zl_load_numeric failed") ; + } + printf ("\nDone loading numeric object\n") ; + + /* ---------------------------------------------------------------------- */ + /* solve C'x=b */ + /* ---------------------------------------------------------------------- */ + + status = umfpack_zl_solve (UMFPACK_At, Cp, Ci, Cx, Cz, x, xz, b, bz, + Numeric, Control, Info) ; + umfpack_zl_report_info (Control, Info) ; + if (status < 0) + { + umfpack_zl_report_status (Control, status) ; + error ("umfpack_zl_solve failed") ; + } + printf ("\nx (solution of C'x=b): ") ; + (void) umfpack_zl_report_vector (n, x, xz, Control) ; + rnorm = resid (TRUE, Cp, Ci, Cx, Cz) ; + printf ("maxnorm of residual: %g\n\n", rnorm) ; + + /* ---------------------------------------------------------------------- */ + /* solve C'x=b again, using umfpack_zl_wsolve instead */ + /* ---------------------------------------------------------------------- */ + + printf ("\nSolving C'x=b again, using umfpack_zl_wsolve instead:\n") ; + Wi = (long *) malloc (n * sizeof (long)) ; + W = (double *) malloc (10*n * sizeof (double)) ; + if (!Wi || !W) + { + error ("out of memory") ; + } + + status = umfpack_zl_wsolve (UMFPACK_At, Cp, Ci, Cx, Cz, x, xz, b, bz, + Numeric, Control, Info, Wi, W) ; + umfpack_zl_report_info (Control, Info) ; + if (status < 0) + { + umfpack_zl_report_status (Control, status) ; + error ("umfpack_zl_wsolve failed") ; + } + printf ("\nx (solution of C'x=b): ") ; + (void) umfpack_zl_report_vector (n, x, xz, Control) ; + rnorm = resid (TRUE, Cp, Ci, Cx, Cz) ; + printf ("maxnorm of residual: %g\n\n", rnorm) ; + + /* ---------------------------------------------------------------------- */ + /* free everything */ + /* ---------------------------------------------------------------------- */ + + /* This is not strictly required since the process is exiting and the */ + /* system will reclaim the memory anyway. It's useful, though, just as */ + /* a list of what is currently malloc'ed by this program. Plus, it's */ + /* always a good habit to explicitly free whatever you malloc. */ + + free (Ap) ; + free (Ai) ; + free (Ax) ; + free (Az) ; + + free (Cp) ; + free (Ci) ; + free (Cx) ; + free (Cz) ; + + free (Pinit) ; + free (Qinit) ; + free (Front_npivcol) ; + free (Front_1strow) ; + free (Front_leftmostdesc) ; + free (Front_parent) ; + free (Chain_start) ; + free (Chain_maxrows) ; + free (Chain_maxcols) ; + + free (Lp) ; + free (Lj) ; + free (Lx) ; + free (Lz) ; + + free (Up) ; + free (Ui) ; + free (Ux) ; + free (Uz) ; + + free (P) ; + free (Q) ; + + free (Li) ; + + free (Wi) ; + free (W) ; + + umfpack_zl_free_symbolic (&Symbolic) ; + umfpack_zl_free_numeric (&Numeric) ; + + /* ---------------------------------------------------------------------- */ + /* print the total time spent in this demo */ + /* ---------------------------------------------------------------------- */ + + umfpack_toc (t) ; + printf ("\numfpack_zl_demo complete.\nTotal time: %5.2f seconds" + " (CPU time), %5.2f seconds (wallclock time)\n", t [1], t [0]) ; + return (0) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Demo/umfpack_zl_demo.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Demo/umfpack_zl_demo.out Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,1541 @@ + +UMFPACK V4.4 (Jan. 28, 2005) demo: _zl_ version + +UMFPACK: Copyright (c) 2005 by Timothy A. Davis. All Rights Reserved. + + +UMFPACK License: + + Your use or distribution of UMFPACK or any modified version of + UMFPACK implies that you agree to this License. + + THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY + EXPRESSED OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + + Permission is hereby granted to use or copy this program, 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 UMFPACK or any modified version of UMFPACK 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. This + software was developed with support from the National Science Foundation, + and is provided to you free of charge. + +Availability: http://www.cise.ufl.edu/research/sparse/umfpack + +UMFPACK V4.4 (Jan. 28, 2005): OK + + +UMFPACK V4.4 (Jan. 28, 2005), Control: + + Matrix entry defined as: double complex + Int (generic integer) defined as: long + + 0: print level: 5 + 1: dense row parameter: 0.2 + "dense" rows have > max (16, (0.2)*16*sqrt(n_col) entries) + 2: dense column parameter: 0.2 + "dense" columns have > max (16, (0.2)*16*sqrt(n_row) entries) + 3: pivot tolerance: 0.1 + 4: block size for dense matrix kernels: 32 + 5: strategy: 0 (auto) + 6: initial allocation ratio: 0.7 + 7: max iterative refinement steps: 2 + 12: 2-by-2 pivot tolerance: 0.01 + 13: Q fixed during numerical factorization: 0 (auto) + 14: AMD dense row/col parameter: 10 + "dense" rows/columns have > max (16, (10)*sqrt(n)) entries + Only used if the AMD ordering is used. + 15: diagonal pivot tolerance: 0.001 + Only used if diagonal pivoting is attempted. + 16: scaling: 1 (divide each row by sum of abs. values in each row) + 17: frontal matrix allocation ratio: 0.5 + 18: drop tolerance: 0 + 19: AMD and COLAMD aggressive absorption: 1 (yes) + + The following options can only be changed at compile-time: + 8: BLAS library used: none. UMFPACK will be slow. + 9: compiled for ANSI C (uses malloc, free, realloc, and printf) + 10: CPU timer is POSIX times ( ) routine. + 11: compiled for normal operation (debugging disabled) + computer/operating system: Linux + size of int: 4 long: 4 Int: 4 pointer: 4 double: 8 Entry: 16 (in bytes) + + +b: dense vector, n = 5. + 0 : (8 + 1i) + 1 : (45 - 5i) + 2 : (-3 - 2i) + 3 : (3 + 0i) + 4 : (19 + 2.2i) + dense vector OK + + +A: triplet-form matrix, n_row = 5, n_col = 5 nz = 12. + 0 : 0 0 (2 + 1i) + 1 : 4 4 (1 + 0.4i) + 2 : 1 0 (3 + 0.1i) + 3 : 1 2 (4 + 0.2i) + 4 : 2 1 (-1 - 1i) + 5 : 2 2 (-3 - 0.2i) + 6 : 0 1 (3 + 0i) + 7 : 1 4 (6 + 6i) + 8 : 2 3 (2 + 3i) + 9 : 3 2 (1 + 0i) + 10 : 4 1 (4 + 0.3i) + 11 : 4 2 (2 + 0.3i) + triplet-form matrix OK + + +A: column-form matrix, n_row 5 n_col 5, nz = 12. + + column 0: start: 0 end: 1 entries: 2 + row 0 : (2 + 1i) + row 1 : (3 + 0.1i) + + column 1: start: 2 end: 4 entries: 3 + row 0 : (3 + 0i) + row 2 : (-1 - 1i) + row 4 : (4 + 0.3i) + + column 2: start: 5 end: 8 entries: 4 + row 1 : (4 + 0.2i) + row 2 : (-3 - 0.2i) + row 3 : (1 + 0i) + row 4 : (2 + 0.3i) + + column 3: start: 9 end: 9 entries: 1 + row 2 : (2 + 3i) + + column 4: start: 10 end: 11 entries: 2 + row 1 : (6 + 6i) + row 4 : (1 + 0.4i) + column-form matrix OK + + +Symbolic factorization of A: Symbolic object: + matrix to be factorized: + n_row: 5 n_col: 5 + number of entries: 12 + block size used for dense matrix kernels: 32 + strategy used: unsymmetric + ordering used: colamd on A + + performn column etree postorder: yes + prefer diagonal pivoting (attempt P=Q): no + variable-size part of Numeric object: + minimum initial size (Units): 84 (MBytes): 0.0 + estimated peak size (Units): 2542 (MBytes): 0.0 + estimated final size (Units): 25 (MBytes): 0.0 + symbolic factorization memory usage (Units): 144 (MBytes): 0.0 + frontal matrices / supercolumns: + number of frontal chains: 1 + number of frontal matrices: 1 + largest frontal matrix row dimension: 3 + largest frontal matrix column dimension: 3 + + Frontal chain: 0. Frontal matrices 0 to 0 + Largest frontal matrix in Frontal chain: 3-by-3 + Front: 0 pivot cols: 3 (pivot columns 0 to 2) + pivot row candidates: 2 to 4 + leftmost descendant: 0 + 1st new candidate row : 2 + parent: (none) + +Initial column permutation, Q1: permutation vector, n = 5. + 0 : 3 + 1 : 2 + 2 : 0 + 3 : 4 + 4 : 1 + permutation vector OK + + +Initial row permutation, P1: permutation vector, n = 5. + 0 : 2 + 1 : 3 + 2 : 0 + 3 : 1 + 4 : 4 + permutation vector OK + + Symbolic object: OK + + +Numeric factorization of A: Numeric object: + n_row: 5 n_col: 5 + relative pivot tolerance used: 0.1 + relative symmetric pivot tolerance used: 0.001 + matrix scaled: yes (divided each row by sum abs value in each row) + minimum sum (abs (rows of A)): 1.00000e+00 + maximum sum (abs (rows of A)): 1.93000e+01 + initial allocation parameter used: 0.7 + frontal matrix allocation parameter used: 0.5 + final total size of Numeric object (Units): 99 + final total size of Numeric object (MBytes): 0.0 + peak size of variable-size part (Units): 2527 + peak size of variable-size part (MBytes): 0.0 + largest actual frontal matrix size: 4 + memory defragmentations: 1 + memory reallocations: 1 + costly memory reallocations: 0 + entries in compressed pattern (L and U): 2 + number of nonzeros in L (excl diag): 4 + number of entries stored in L (excl diag): 2 + number of nonzeros in U (excl diag): 4 + number of entries stored in U (excl diag): 2 + factorization floating-point operations: 34 + number of nonzeros on diagonal of U: 5 + min abs. value on diagonal of U: 1.34629e-01 + max abs. value on diagonal of U: 1.77313e+00 + reciprocal condition number estimate: 7.59e-02 + +Scale factors applied via multiplication +Scale factors, Rs: dense vector, n = 5. + 0 : (0.166667) + 1 : (0.0518135) + 2 : (0.0980392) + 3 : (1) + 4 : (0.125) + dense vector OK + + +P: row permutation vector, n = 5. + 0 : 2 + 1 : 3 + 2 : 0 + 3 : 4 + 4 : 1 + permutation vector OK + + +Q: column permutation vector, n = 5. + 0 : 3 + 1 : 2 + 2 : 0 + 3 : 4 + 4 : 1 + permutation vector OK + + +L in Numeric object, in column-oriented compressed-pattern form: + Diagonal entries are all equal to 1.0 (not stored) + + column 0: length 0. + + column 1: length 2. + row 4 : (0.207254 + 0.0103627i) + row 3 : (0.25 + 0.0375i) + + column 2: add 1 entries. length 1. Start of Lchain. + row 4 : (0.379275 - 0.174093i) + + column 3: length 1. + row 4 : (3.00161 + 1.2864i) + + column 4: length 0. Start of Lchain. + + +U in Numeric object, in row-oriented compressed-pattern form: + Diagonal is stored separately. + + row 4: length 0. End of Uchain. + + row 3: length 1. End of Uchain. + col 4 : (0.5 + 0.0375i) + + row 2: length 1. + col 4 : (0.5 + 0i) + + row 1: length 0. End of Uchain. + + row 1: length 0. + + row 0: length 2. + col 1 : (-0.294118 - 0.0196078i) + col 4 : (-0.0980392 - 0.0980392i) + + +diagonal of U: dense vector, n = 5. + 0 : (0.196078 + 0.294118i) + 1 : (1 + 0i) + 2 : (0.333333 + 0.166667i) + 3 : (0.125 + 0.05i) + 4 : (-1.6422 - 0.668715i) + dense vector OK + + Numeric object: OK + + +UMFPACK V4.4 (Jan. 28, 2005), Info: + matrix entry defined as: double complex + Int (generic integer) defined as: long + BLAS library used: none. UMFPACK will be slow. + MATLAB: no. + CPU timer: POSIX times ( ) routine. + number of rows in matrix A: 5 + number of columns in matrix A: 5 + entries in matrix A: 12 + memory usage reported in: 8-byte Units + size of int: 4 bytes + size of long: 4 bytes + size of pointer: 4 bytes + size of numerical entry: 16 bytes + + strategy used: unsymmetric + ordering used: colamd on A + modify Q during factorization: yes + prefer diagonal pivoting: no + pivots with zero Markowitz cost: 2 + submatrix S after removing zero-cost pivots: + number of "dense" rows: 0 + number of "dense" columns: 0 + number of empty rows: 0 + number of empty columns 0 + submatrix S square and diagonal preserved + pattern of square submatrix S: + number rows and columns 3 + symmetry of nonzero pattern: 1.000000 + nz in S+S' (excl. diagonal): 4 + nz on diagonal of matrix S: 2 + fraction of nz on diagonal: 0.666667 + 2-by-2 pivoting to place large entries on diagonal: + # of small diagonal entries of S: 1 + # unmatched: 0 + symmetry of P2*S: 0.000000 + nz in P2*S+(P2*S)' (excl. diag.): 6 + nz on diagonal of P2*S: 3 + fraction of nz on diag of P2*S: 1.000000 + symbolic factorization defragmentations: 0 + symbolic memory usage (Units): 144 + symbolic memory usage (MBytes): 0.0 + Symbolic size (Units): 45 + Symbolic size (MBytes): 0 + symbolic factorization CPU time (sec): 0.00 + symbolic factorization wallclock time(sec): 0.00 + + matrix scaled: yes (divided each row by sum of abs values in each row) + minimum sum (abs (rows of A)): 1.00000e+00 + maximum sum (abs (rows of A)): 1.93000e+01 + + symbolic/numeric factorization: upper bound actual % + variable-sized part of Numeric object: + initial size (Units) 84 79 94% + peak size (Units) 2542 2527 99% + final size (Units) 25 21 84% + Numeric final size (Units) 106 100 94% + Numeric final size (MBytes) 0.0 0.0 94% + peak memory usage (Units) 2737 2722 99% + peak memory usage (MBytes) 0.0 0.0 99% + numeric factorization flops 6.70000e+01 3.40000e+01 51% + nz in L (incl diagonal) 10 9 90% + nz in U (incl diagonal) 10 9 90% + nz in L+U (incl diagonal) 15 13 87% + largest front (# entries) 9 4 44% + largest # rows in front 3 2 67% + largest # columns in front 3 2 67% + + initial allocation ratio used: 0.7 + # of forced updates due to frontal growth: 0 + nz in L (incl diagonal), if none dropped 9 + nz in U (incl diagonal), if none dropped 9 + number of small entries dropped 0 + nonzeros on diagonal of U: 5 + min abs. value on diagonal of U: 1.35e-01 + max abs. value on diagonal of U: 1.77e+00 + estimate of reciprocal of condition number: 7.59e-02 + indices in compressed pattern: 2 + numerical values stored in Numeric object: 9 + numeric factorization defragmentations: 1 + numeric factorization reallocations: 1 + costly numeric factorization reallocations: 0 + numeric factorization CPU time (sec): 0.00 + numeric factorization wallclock time (sec): 0.00 + symbolic + numeric CPU time (sec): 0.00 + symbolic + numeric wall clock time (sec): 0.00 + + solve flops: 5.23000e+02 + iterative refinement steps taken: 0 + iterative refinement steps attempted: 0 + sparse backward error omega1: 7.87e-17 + sparse backward error omega2: 0.00e+00 + solve CPU time (sec): 0.00 + solve wall clock time (sec): 0.00 + + total symbolic + numeric + solve flops: 5.57000e+02 + total symbolic + numeric + solve CPU time: 0.00 + total symbolic+numeric+solve wall clock time: 0.00 + + +UMFPACK: Copyright (c) 2005 by Timothy A. Davis. All Rights Reserved. + +UMFPACK V4.4 (Jan. 28, 2005): OK + + +x (solution of Ax=b): dense vector, n = 5. + 0 : (0.121188 - 0.561001i) + 1 : (2.39887 + 0.666938i) + 2 : (3 + 0i) + 3 : (1.57395 - 1.52801i) + 4 : (2.3876 - 3.04245i) + dense vector OK + +maxnorm of residual: 6.21725e-15 + + +UMFPACK: Copyright (c) 2005 by Timothy A. Davis. All Rights Reserved. + +UMFPACK V4.4 (Jan. 28, 2005): OK + +determinant: (-1.7814+ (2.3784)i) * 10^(2) + +x (solution of Ax=b, solve is split into 3 steps): dense vector, n = 5. + 0 : (0.121188 - 0.561001i) + 1 : (2.39887 + 0.666938i) + 2 : (3 + 0i) + 3 : (1.57395 - 1.52801i) + 4 : (2.3876 - 3.04245i) + dense vector OK + +maxnorm of residual: 6.21725e-15 + + +UMFPACK V4.4 (Jan. 28, 2005), Info: + matrix entry defined as: double complex + Int (generic integer) defined as: long + BLAS library used: none. UMFPACK will be slow. + MATLAB: no. + CPU timer: POSIX times ( ) routine. + number of rows in matrix A: 5 + number of columns in matrix A: 5 + entries in matrix A: 12 + memory usage reported in: 8-byte Units + size of int: 4 bytes + size of long: 4 bytes + size of pointer: 4 bytes + size of numerical entry: 16 bytes + + strategy used: unsymmetric + ordering used: colamd on A + modify Q during factorization: yes + prefer diagonal pivoting: no + pivots with zero Markowitz cost: 2 + submatrix S after removing zero-cost pivots: + number of "dense" rows: 0 + number of "dense" columns: 0 + number of empty rows: 0 + number of empty columns 0 + submatrix S square and diagonal preserved + pattern of square submatrix S: + number rows and columns 3 + symmetry of nonzero pattern: 1.000000 + nz in S+S' (excl. diagonal): 4 + nz on diagonal of matrix S: 2 + fraction of nz on diagonal: 0.666667 + 2-by-2 pivoting to place large entries on diagonal: + # of small diagonal entries of S: 1 + # unmatched: 0 + symmetry of P2*S: 0.000000 + nz in P2*S+(P2*S)' (excl. diag.): 6 + nz on diagonal of P2*S: 3 + fraction of nz on diag of P2*S: 1.000000 + symbolic factorization defragmentations: 0 + symbolic memory usage (Units): 144 + symbolic memory usage (MBytes): 0.0 + Symbolic size (Units): 45 + Symbolic size (MBytes): 0 + symbolic factorization CPU time (sec): 0.00 + symbolic factorization wallclock time(sec): 0.00 + + matrix scaled: yes (divided each row by sum of abs values in each row) + minimum sum (abs (rows of A)): 1.00000e+00 + maximum sum (abs (rows of A)): 1.93000e+01 + + symbolic/numeric factorization: upper bound actual % + variable-sized part of Numeric object: + initial size (Units) 84 79 94% + peak size (Units) 2542 2527 99% + final size (Units) 25 21 84% + Numeric final size (Units) 106 100 94% + Numeric final size (MBytes) 0.0 0.0 94% + peak memory usage (Units) 2737 2722 99% + peak memory usage (MBytes) 0.0 0.0 99% + numeric factorization flops 6.70000e+01 3.40000e+01 51% + nz in L (incl diagonal) 10 9 90% + nz in U (incl diagonal) 10 9 90% + nz in L+U (incl diagonal) 15 13 87% + largest front (# entries) 9 4 44% + largest # rows in front 3 2 67% + largest # columns in front 3 2 67% + + initial allocation ratio used: 0.7 + # of forced updates due to frontal growth: 0 + nz in L (incl diagonal), if none dropped 9 + nz in U (incl diagonal), if none dropped 9 + number of small entries dropped 0 + nonzeros on diagonal of U: 5 + min abs. value on diagonal of U: 1.35e-01 + max abs. value on diagonal of U: 1.77e+00 + estimate of reciprocal of condition number: 7.59e-02 + indices in compressed pattern: 2 + numerical values stored in Numeric object: 9 + numeric factorization defragmentations: 1 + numeric factorization reallocations: 1 + costly numeric factorization reallocations: 0 + numeric factorization CPU time (sec): 0.00 + numeric factorization wallclock time (sec): 0.00 + symbolic + numeric CPU time (sec): 0.00 + symbolic + numeric wall clock time (sec): 0.00 + + solve flops: 4.80000e+02 + iterative refinement steps taken: 0 + iterative refinement steps attempted: 0 + sparse backward error omega1: 6.06e-17 + sparse backward error omega2: 0.00e+00 + solve CPU time (sec): 0.00 + solve wall clock time (sec): 0.00 + + total symbolic + numeric + solve flops: 5.14000e+02 + total symbolic + numeric + solve CPU time: 0.00 + total symbolic+numeric+solve wall clock time: 0.00 + + +x (solution of A'x=b): dense vector, n = 5. + 0 : (3.39246 + 0.13257i) + 1 : (0.31463 + 1.38626i) + 2 : (0.461538 + 0.692308i) + 3 : (-20.9089 - 1.55801i) + 4 : (9.04015 - 0.613724i) + dense vector OK + +maxnorm of residual: 7.68703e-15 + + +changing A (1,4) to zero + +modified A: column-form matrix, n_row 5 n_col 5, nz = 12. + + column 0: start: 0 end: 1 entries: 2 + row 0 : (2 + 1i) + row 1 : (3 + 0.1i) + + column 1: start: 2 end: 4 entries: 3 + row 0 : (3 + 0i) + row 2 : (-1 - 1i) + row 4 : (4 + 0.3i) + + column 2: start: 5 end: 8 entries: 4 + row 1 : (4 + 0.2i) + row 2 : (-3 - 0.2i) + row 3 : (1 + 0i) + row 4 : (2 + 0.3i) + + column 3: start: 9 end: 9 entries: 1 + row 2 : (2 + 3i) + + column 4: start: 10 end: 11 entries: 2 + row 1 : (0 + 0i) + row 4 : (1 + 0.4i) + column-form matrix OK + + +Numeric factorization of modified A: Numeric object: + n_row: 5 n_col: 5 + relative pivot tolerance used: 0.1 + relative symmetric pivot tolerance used: 0.001 + matrix scaled: yes (divided each row by sum abs value in each row) + minimum sum (abs (rows of A)): 1.00000e+00 + maximum sum (abs (rows of A)): 1.02000e+01 + initial allocation parameter used: 0.7 + frontal matrix allocation parameter used: 0.5 + final total size of Numeric object (Units): 97 + final total size of Numeric object (MBytes): 0.0 + peak size of variable-size part (Units): 2527 + peak size of variable-size part (MBytes): 0.0 + largest actual frontal matrix size: 4 + memory defragmentations: 1 + memory reallocations: 1 + costly memory reallocations: 0 + entries in compressed pattern (L and U): 2 + number of nonzeros in L (excl diag): 3 + number of entries stored in L (excl diag): 1 + number of nonzeros in U (excl diag): 4 + number of entries stored in U (excl diag): 2 + factorization floating-point operations: 17 + number of nonzeros on diagonal of U: 5 + min abs. value on diagonal of U: 1.34629e-01 + max abs. value on diagonal of U: 1.00000e+00 + reciprocal condition number estimate: 1.35e-01 + +Scale factors applied via multiplication +Scale factors, Rs: dense vector, n = 5. + 0 : (0.166667) + 1 : (0.136986) + 2 : (0.0980392) + 3 : (1) + 4 : (0.125) + dense vector OK + + +P: row permutation vector, n = 5. + 0 : 2 + 1 : 3 + 2 : 0 + 3 : 4 + 4 : 1 + permutation vector OK + + +Q: column permutation vector, n = 5. + 0 : 3 + 1 : 2 + 2 : 0 + 3 : 4 + 4 : 1 + permutation vector OK + + +L in Numeric object, in column-oriented compressed-pattern form: + Diagonal entries are all equal to 1.0 (not stored) + + column 0: length 0. + + column 1: length 2. + row 4 : (0.547945 + 0.0273973i) + row 3 : (0.25 + 0.0375i) + + column 2: add 1 entries. length 1. Start of Lchain. + row 4 : (1.00274 - 0.460274i) + + column 3: length 0. Start of Lchain. + + column 4: length 0. Start of Lchain. + + +U in Numeric object, in row-oriented compressed-pattern form: + Diagonal is stored separately. + + row 4: length 0. End of Uchain. + + row 3: length 1. End of Uchain. + col 4 : (0.5 + 0.0375i) + + row 2: length 1. + col 4 : (0.5 + 0i) + + row 1: length 0. End of Uchain. + + row 1: length 0. + + row 0: length 2. + col 1 : (-0.294118 - 0.0196078i) + col 4 : (-0.0980392 - 0.0980392i) + + +diagonal of U: dense vector, n = 5. + 0 : (0.196078 + 0.294118i) + 1 : (1 + 0i) + 2 : (0.333333 + 0.166667i) + 3 : (0.125 + 0.05i) + 4 : (-0.50137 + 0.230137i) + dense vector OK + + Numeric object: OK + + +UMFPACK V4.4 (Jan. 28, 2005), Info: + matrix entry defined as: double complex + Int (generic integer) defined as: long + BLAS library used: none. UMFPACK will be slow. + MATLAB: no. + CPU timer: POSIX times ( ) routine. + number of rows in matrix A: 5 + number of columns in matrix A: 5 + entries in matrix A: 12 + memory usage reported in: 8-byte Units + size of int: 4 bytes + size of long: 4 bytes + size of pointer: 4 bytes + size of numerical entry: 16 bytes + + strategy used: unsymmetric + ordering used: colamd on A + modify Q during factorization: yes + prefer diagonal pivoting: no + pivots with zero Markowitz cost: 2 + submatrix S after removing zero-cost pivots: + number of "dense" rows: 0 + number of "dense" columns: 0 + number of empty rows: 0 + number of empty columns 0 + submatrix S square and diagonal preserved + pattern of square submatrix S: + number rows and columns 3 + symmetry of nonzero pattern: 1.000000 + nz in S+S' (excl. diagonal): 4 + nz on diagonal of matrix S: 2 + fraction of nz on diagonal: 0.666667 + 2-by-2 pivoting to place large entries on diagonal: + # of small diagonal entries of S: 1 + # unmatched: 0 + symmetry of P2*S: 0.000000 + nz in P2*S+(P2*S)' (excl. diag.): 6 + nz on diagonal of P2*S: 3 + fraction of nz on diag of P2*S: 1.000000 + symbolic factorization defragmentations: 0 + symbolic memory usage (Units): 144 + symbolic memory usage (MBytes): 0.0 + Symbolic size (Units): 45 + Symbolic size (MBytes): 0 + symbolic factorization CPU time (sec): 0.00 + symbolic factorization wallclock time(sec): 0.00 + + matrix scaled: yes (divided each row by sum of abs values in each row) + minimum sum (abs (rows of A)): 1.00000e+00 + maximum sum (abs (rows of A)): 1.02000e+01 + + symbolic/numeric factorization: upper bound actual % + variable-sized part of Numeric object: + initial size (Units) 84 79 94% + peak size (Units) 2542 2527 99% + final size (Units) 25 19 76% + Numeric final size (Units) 106 98 92% + Numeric final size (MBytes) 0.0 0.0 92% + peak memory usage (Units) 2737 2722 99% + peak memory usage (MBytes) 0.0 0.0 99% + numeric factorization flops 6.70000e+01 1.70000e+01 25% + nz in L (incl diagonal) 10 8 80% + nz in U (incl diagonal) 10 9 90% + nz in L+U (incl diagonal) 15 12 80% + largest front (# entries) 9 4 44% + largest # rows in front 3 2 67% + largest # columns in front 3 2 67% + + initial allocation ratio used: 0.7 + # of forced updates due to frontal growth: 0 + nz in L (incl diagonal), if none dropped 8 + nz in U (incl diagonal), if none dropped 9 + number of small entries dropped 0 + nonzeros on diagonal of U: 5 + min abs. value on diagonal of U: 1.35e-01 + max abs. value on diagonal of U: 1.00e+00 + estimate of reciprocal of condition number: 1.35e-01 + indices in compressed pattern: 2 + numerical values stored in Numeric object: 8 + numeric factorization defragmentations: 1 + numeric factorization reallocations: 1 + costly numeric factorization reallocations: 0 + numeric factorization CPU time (sec): 0.00 + numeric factorization wallclock time (sec): 0.00 + symbolic + numeric CPU time (sec): 0.00 + symbolic + numeric wall clock time (sec): 0.00 + + solve flops: 5.15000e+02 + iterative refinement steps taken: 0 + iterative refinement steps attempted: 0 + sparse backward error omega1: 7.33e-17 + sparse backward error omega2: 0.00e+00 + solve CPU time (sec): 0.00 + solve wall clock time (sec): 0.00 + + total symbolic + numeric + solve flops: 5.32000e+02 + total symbolic + numeric + solve CPU time: 0.00 + total symbolic+numeric+solve wall clock time: 0.00 + + +x (with modified A): dense vector, n = 5. + 0 : (10.9256 - 2.23085i) + 1 : (-5.36071 - 1.82131i) + 2 : (3 + 0i) + 3 : (-1.60191 - 1.88814i) + 4 : (32.7361 - 2.90097i) + dense vector OK + +maxnorm of residual: 3.9968e-15 + +changing real part of A (0,0) from 2 to 2 +changing real part of A (1,0) from 3 to 2 +changing real part of A (0,1) from 3 to 13 +changing real part of A (2,1) from -1 to 7 +changing real part of A (4,1) from 4 to 10 +changing real part of A (1,2) from 4 to 23 +changing real part of A (2,2) from -3 to 15 +changing real part of A (3,2) from 1 to 18 +changing real part of A (4,2) from 2 to 18 +changing real part of A (2,3) from 2 to 30 +changing real part of A (1,4) from 0 to 39 +changing real part of A (4,4) from 1 to 37 + +completely modified A (same pattern): column-form matrix, n_row 5 n_col 5, nz = 12. + + column 0: start: 0 end: 1 entries: 2 + row 0 : (2 + 1i) + row 1 : (2 + 0.1i) + + column 1: start: 2 end: 4 entries: 3 + row 0 : (13 + 0i) + row 2 : (7 - 1i) + row 4 : (10 + 0.3i) + + column 2: start: 5 end: 8 entries: 4 + row 1 : (23 + 0.2i) + row 2 : (15 - 0.2i) + row 3 : (18 + 0i) + row 4 : (18 + 0.3i) + + column 3: start: 9 end: 9 entries: 1 + row 2 : (30 + 3i) + + column 4: start: 10 end: 11 entries: 2 + row 1 : (39 + 0i) + row 4 : (37 + 0.4i) + column-form matrix OK + + +Saving symbolic object: + +Freeing symbolic object: + +Loading symbolic object: + +Done loading symbolic object + +Numeric factorization of completely modified A: Numeric object: + n_row: 5 n_col: 5 + relative pivot tolerance used: 0.1 + relative symmetric pivot tolerance used: 0.001 + matrix scaled: yes (divided each row by sum abs value in each row) + minimum sum (abs (rows of A)): 1.60000e+01 + maximum sum (abs (rows of A)): 6.60000e+01 + initial allocation parameter used: 0.7 + frontal matrix allocation parameter used: 0.5 + final total size of Numeric object (Units): 99 + final total size of Numeric object (MBytes): 0.0 + peak size of variable-size part (Units): 2527 + peak size of variable-size part (MBytes): 0.0 + largest actual frontal matrix size: 4 + memory defragmentations: 1 + memory reallocations: 1 + costly memory reallocations: 0 + entries in compressed pattern (L and U): 2 + number of nonzeros in L (excl diag): 4 + number of entries stored in L (excl diag): 2 + number of nonzeros in U (excl diag): 4 + number of entries stored in U (excl diag): 2 + factorization floating-point operations: 34 + number of nonzeros on diagonal of U: 5 + min abs. value on diagonal of U: 1.39754e-01 + max abs. value on diagonal of U: 1.00000e+00 + reciprocal condition number estimate: 1.40e-01 + +Scale factors applied via multiplication +Scale factors, Rs: dense vector, n = 5. + 0 : (0.0625) + 1 : (0.0155521) + 2 : (0.0177936) + 3 : (0.0555556) + 4 : (0.0151515) + dense vector OK + + +P: row permutation vector, n = 5. + 0 : 2 + 1 : 3 + 2 : 0 + 3 : 4 + 4 : 1 + permutation vector OK + + +Q: column permutation vector, n = 5. + 0 : 3 + 1 : 2 + 2 : 0 + 3 : 4 + 4 : 1 + permutation vector OK + + +L in Numeric object, in column-oriented compressed-pattern form: + Diagonal entries are all equal to 1.0 (not stored) + + column 0: length 0. + + column 1: length 2. + row 4 : (0.357698 + 0.00311042i) + row 3 : (0.272727 + 0.00454545i) + + column 2: add 1 entries. length 1. Start of Lchain. + row 4 : (0.204044 - 0.0895801i) + + column 3: length 1. + row 4 : (1.0818 - 0.0116951i) + + column 4: length 0. Start of Lchain. + + +U in Numeric object, in row-oriented compressed-pattern form: + Diagonal is stored separately. + + row 4: length 0. End of Uchain. + + row 3: length 1. End of Uchain. + col 4 : (0.151515 + 0.00454545i) + + row 2: length 1. + col 4 : (0.8125 + 0i) + + row 1: length 0. End of Uchain. + + row 1: length 0. + + row 0: length 2. + col 1 : (0.266904 - 0.00355872i) + col 4 : (0.124555 - 0.0177936i) + + +diagonal of U: dense vector, n = 5. + 0 : (0.533808 + 0.0533808i) + 1 : (1 + 0i) + 2 : (0.125 + 0.0625i) + 3 : (0.560606 + 0.00606061i) + 4 : (-0.329747 + 0.0696386i) + dense vector OK + + Numeric object: OK + + +UMFPACK V4.4 (Jan. 28, 2005), Info: + matrix entry defined as: double complex + Int (generic integer) defined as: long + BLAS library used: none. UMFPACK will be slow. + MATLAB: no. + CPU timer: POSIX times ( ) routine. + number of rows in matrix A: 5 + number of columns in matrix A: 5 + entries in matrix A: 12 + memory usage reported in: 8-byte Units + size of int: 4 bytes + size of long: 4 bytes + size of pointer: 4 bytes + size of numerical entry: 16 bytes + + strategy used: unsymmetric + ordering used: colamd on A + modify Q during factorization: yes + prefer diagonal pivoting: no + pivots with zero Markowitz cost: 2 + submatrix S after removing zero-cost pivots: + number of "dense" rows: 0 + number of "dense" columns: 0 + number of empty rows: 0 + number of empty columns 0 + submatrix S square and diagonal preserved + pattern of square submatrix S: + number rows and columns 3 + symmetry of nonzero pattern: 1.000000 + nz in S+S' (excl. diagonal): 4 + nz on diagonal of matrix S: 2 + fraction of nz on diagonal: 0.666667 + 2-by-2 pivoting to place large entries on diagonal: + # of small diagonal entries of S: 1 + # unmatched: 0 + symmetry of P2*S: 0.000000 + nz in P2*S+(P2*S)' (excl. diag.): 6 + nz on diagonal of P2*S: 3 + fraction of nz on diag of P2*S: 1.000000 + symbolic factorization defragmentations: 0 + symbolic memory usage (Units): 144 + symbolic memory usage (MBytes): 0.0 + Symbolic size (Units): 45 + Symbolic size (MBytes): 0 + symbolic factorization CPU time (sec): 0.00 + symbolic factorization wallclock time(sec): 0.00 + + matrix scaled: yes (divided each row by sum of abs values in each row) + minimum sum (abs (rows of A)): 1.60000e+01 + maximum sum (abs (rows of A)): 6.60000e+01 + + symbolic/numeric factorization: upper bound actual % + variable-sized part of Numeric object: + initial size (Units) 84 79 94% + peak size (Units) 2542 2527 99% + final size (Units) 25 21 84% + Numeric final size (Units) 106 100 94% + Numeric final size (MBytes) 0.0 0.0 94% + peak memory usage (Units) 2737 2722 99% + peak memory usage (MBytes) 0.0 0.0 99% + numeric factorization flops 6.70000e+01 3.40000e+01 51% + nz in L (incl diagonal) 10 9 90% + nz in U (incl diagonal) 10 9 90% + nz in L+U (incl diagonal) 15 13 87% + largest front (# entries) 9 4 44% + largest # rows in front 3 2 67% + largest # columns in front 3 2 67% + + initial allocation ratio used: 0.7 + # of forced updates due to frontal growth: 0 + nz in L (incl diagonal), if none dropped 9 + nz in U (incl diagonal), if none dropped 9 + number of small entries dropped 0 + nonzeros on diagonal of U: 5 + min abs. value on diagonal of U: 1.40e-01 + max abs. value on diagonal of U: 1.00e+00 + estimate of reciprocal of condition number: 1.40e-01 + indices in compressed pattern: 2 + numerical values stored in Numeric object: 9 + numeric factorization defragmentations: 1 + numeric factorization reallocations: 1 + costly numeric factorization reallocations: 0 + numeric factorization CPU time (sec): 0.00 + numeric factorization wallclock time (sec): 0.00 + symbolic + numeric CPU time (sec): 0.00 + symbolic + numeric wall clock time (sec): 0.00 + + solve flops: 5.23000e+02 + iterative refinement steps taken: 0 + iterative refinement steps attempted: 0 + sparse backward error omega1: 4.75e-17 + sparse backward error omega2: 0.00e+00 + solve CPU time (sec): 0.00 + solve wall clock time (sec): 0.00 + + total symbolic + numeric + solve flops: 5.57000e+02 + total symbolic + numeric + solve CPU time: 0.00 + total symbolic+numeric+solve wall clock time: 0.00 + + +x (with completely modified A): dense vector, n = 5. + 0 : (7.56307 - 3.68974i) + 1 : (-0.831991 + 0.0627998i) + 2 : (0.166667 + 0i) + 3 : (-0.00206892 - 0.107735i) + 4 : (0.658245 + 0.0407649i) + dense vector OK + +maxnorm of residual: 5.92582e-15 + + +C (transpose of A): column-form matrix, n_row 5 n_col 5, nz = 12. + + column 0: start: 0 end: 1 entries: 2 + row 0 : (2 - 1i) + row 1 : (13 + 0i) + + column 1: start: 2 end: 4 entries: 3 + row 0 : (2 - 0.1i) + row 2 : (23 - 0.2i) + row 4 : (39 + 0i) + + column 2: start: 5 end: 7 entries: 3 + row 1 : (7 + 1i) + row 2 : (15 + 0.2i) + row 3 : (30 - 3i) + + column 3: start: 8 end: 8 entries: 1 + row 2 : (18 + 0i) + + column 4: start: 9 end: 11 entries: 3 + row 1 : (10 - 0.3i) + row 2 : (18 - 0.3i) + row 4 : (37 - 0.4i) + column-form matrix OK + + +Symbolic factorization of C: Symbolic object: + matrix to be factorized: + n_row: 5 n_col: 5 + number of entries: 12 + block size used for dense matrix kernels: 32 + strategy used: unsymmetric + ordering used: colamd on A + + performn column etree postorder: yes + prefer diagonal pivoting (attempt P=Q): no + variable-size part of Numeric object: + minimum initial size (Units): 85 (MBytes): 0.0 + estimated peak size (Units): 2543 (MBytes): 0.0 + estimated final size (Units): 26 (MBytes): 0.0 + symbolic factorization memory usage (Units): 144 (MBytes): 0.0 + frontal matrices / supercolumns: + number of frontal chains: 1 + number of frontal matrices: 1 + largest frontal matrix row dimension: 3 + largest frontal matrix column dimension: 3 + + Frontal chain: 0. Frontal matrices 0 to 0 + Largest frontal matrix in Frontal chain: 3-by-3 + Front: 0 pivot cols: 3 (pivot columns 0 to 2) + pivot row candidates: 2 to 4 + leftmost descendant: 0 + 1st new candidate row : 2 + parent: (none) + +Initial column permutation, Q1: permutation vector, n = 5. + 0 : 3 + 1 : 2 + 2 : 0 + 3 : 4 + 4 : 1 + permutation vector OK + + +Initial row permutation, P1: permutation vector, n = 5. + 0 : 2 + 1 : 3 + 2 : 0 + 3 : 1 + 4 : 4 + permutation vector OK + + Symbolic object: OK + + +Get the contents of the Symbolic object for C: +(compare with umfpack_zl_report_symbolic output, above) +From the Symbolic object, C is of dimension 5-by-5 + with nz = 12, number of fronts = 1, + number of frontal matrix chains = 1 + +Pivot columns in each front, and parent of each front: + Front 0: parent front: -1 number of pivot cols: 3 + 0-th pivot column is column 3 in original matrix + 1-th pivot column is column 2 in original matrix + 2-th pivot column is column 0 in original matrix + +Note that the column ordering, above, will be refined +in the numeric factorization below. The assignment of pivot +columns to frontal matrices will always remain unchanged. + +Total number of pivot columns in frontal matrices: 3 + +Frontal matrix chains: + Frontal matrices 0 to 0 are factorized in a single + working array of size 3-by-3 + +Numeric factorization of C: Numeric object: + n_row: 5 n_col: 5 + relative pivot tolerance used: 0.1 + relative symmetric pivot tolerance used: 0.001 + matrix scaled: yes (divided each row by sum abs value in each row) + minimum sum (abs (rows of A)): 5.10000e+00 + maximum sum (abs (rows of A)): 7.64000e+01 + initial allocation parameter used: 0.7 + frontal matrix allocation parameter used: 0.5 + final total size of Numeric object (Units): 100 + final total size of Numeric object (MBytes): 0.0 + peak size of variable-size part (Units): 2528 + peak size of variable-size part (MBytes): 0.0 + largest actual frontal matrix size: 4 + memory defragmentations: 1 + memory reallocations: 1 + costly memory reallocations: 0 + entries in compressed pattern (L and U): 2 + number of nonzeros in L (excl diag): 3 + number of entries stored in L (excl diag): 2 + number of nonzeros in U (excl diag): 5 + number of entries stored in U (excl diag): 2 + factorization floating-point operations: 34 + number of nonzeros on diagonal of U: 5 + min abs. value on diagonal of U: 2.40964e-01 + max abs. value on diagonal of U: 9.13625e-01 + reciprocal condition number estimate: 2.64e-01 + +Scale factors applied via multiplication +Scale factors, Rs: dense vector, n = 5. + 0 : (0.196078) + 1 : (0.0319489) + 2 : (0.0133869) + 3 : (0.030303) + 4 : (0.013089) + dense vector OK + + +P: row permutation vector, n = 5. + 0 : 2 + 1 : 3 + 2 : 0 + 3 : 4 + 4 : 1 + permutation vector OK + + +Q: column permutation vector, n = 5. + 0 : 3 + 1 : 2 + 2 : 0 + 3 : 4 + 4 : 1 + permutation vector OK + + +L in Numeric object, in column-oriented compressed-pattern form: + Diagonal entries are all equal to 1.0 (not stored) + + column 0: length 0. + + column 1: length 1. + row 4 : (0.240091 + 0.0591529i) + + column 2: add 1 entries. length 1. Start of Lchain. + row 4 : (0.847284 + 0.423642i) + + column 3: length 1. + row 4 : (0.659838 - 0.0126577i) + + column 4: length 0. Start of Lchain. + + +U in Numeric object, in row-oriented compressed-pattern form: + Diagonal is stored separately. + + row 4: length 0. End of Uchain. + + row 3: length 1. End of Uchain. + col 4 : (0.510471 + 0i) + + row 2: length 1. + col 4 : (0.392157 - 0.0196078i) + + row 1: length 0. End of Uchain. + + row 1: length 0. + + row 0: length 3. + col 1 : (0.200803 + 0.00267738i) + col 3 : (0.240964 - 0.00401606i) + col 4 : (0.307898 - 0.00267738i) + + +diagonal of U: dense vector, n = 5. + 0 : (0.240964 + 0i) + 1 : (0.909091 - 0.0909091i) + 2 : (0.392157 - 0.196078i) + 3 : (0.484293 - 0.0052356i) + 4 : (-0.677403 - 0.143059i) + dense vector OK + + Numeric object: OK + + +L (lower triangular factor of C): row-form matrix, n_row 5 n_col 5, nz = 8. + + row 0: start: 0 end: 0 entries: 1 + column 0 : (1 + 0i) + + row 1: start: 1 end: 1 entries: 1 + column 1 : (1 + 0i) + + row 2: start: 2 end: 2 entries: 1 + column 2 : (1 + 0i) + + row 3: start: 3 end: 3 entries: 1 + column 3 : (1 + 0i) + + row 4: start: 4 end: 7 entries: 4 + column 1 : (0.240091 + 0.0591529i) + column 2 : (0.847284 + 0.423642i) + column 3 : (0.659838 - 0.0126577i) + column 4 : (1 + 0i) + row-form matrix OK + + +U (upper triangular factor of C): column-form matrix, n_row 5 n_col 5, nz = 10. + + column 0: start: 0 end: 0 entries: 1 + row 0 : (0.240964 + 0i) + + column 1: start: 1 end: 2 entries: 2 + row 0 : (0.200803 + 0.00267738i) + row 1 : (0.909091 - 0.0909091i) + + column 2: start: 3 end: 3 entries: 1 + row 2 : (0.392157 - 0.196078i) + + column 3: start: 4 end: 5 entries: 2 + row 0 : (0.240964 - 0.00401606i) + row 3 : (0.484293 - 0.0052356i) + + column 4: start: 6 end: 9 entries: 4 + row 0 : (0.307898 - 0.00267738i) + row 2 : (0.392157 - 0.0196078i) + row 3 : (0.510471 + 0i) + row 4 : (-0.677403 - 0.143059i) + column-form matrix OK + + +P: permutation vector, n = 5. + 0 : 2 + 1 : 3 + 2 : 0 + 3 : 4 + 4 : 1 + permutation vector OK + + +Q: permutation vector, n = 5. + 0 : 3 + 1 : 2 + 2 : 0 + 3 : 4 + 4 : 1 + permutation vector OK + + +Scale factors: row i of A is to be multiplied by the ith scale factor +0: 0.196078 +1: 0.0319489 +2: 0.0133869 +3: 0.030303 +4: 0.013089 + +Converting L to triplet form, and printing it: + +L, in triplet form: triplet-form matrix, n_row = 5, n_col = 5 nz = 8. + 0 : 0 0 (1 + 0i) + 1 : 1 1 (1 + 0i) + 2 : 2 2 (1 + 0i) + 3 : 3 3 (1 + 0i) + 4 : 4 1 (0.240091 + 0.0591529i) + 5 : 4 2 (0.847284 + 0.423642i) + 6 : 4 3 (0.659838 - 0.0126577i) + 7 : 4 4 (1 + 0i) + triplet-form matrix OK + + +Saving numeric object: + +Freeing numeric object: + +Loading numeric object: + +Done loading numeric object + +UMFPACK V4.4 (Jan. 28, 2005), Info: + matrix entry defined as: double complex + Int (generic integer) defined as: long + BLAS library used: none. UMFPACK will be slow. + MATLAB: no. + CPU timer: POSIX times ( ) routine. + number of rows in matrix A: 5 + number of columns in matrix A: 5 + entries in matrix A: 12 + memory usage reported in: 8-byte Units + size of int: 4 bytes + size of long: 4 bytes + size of pointer: 4 bytes + size of numerical entry: 16 bytes + + strategy used: unsymmetric + ordering used: colamd on A + modify Q during factorization: yes + prefer diagonal pivoting: no + pivots with zero Markowitz cost: 2 + submatrix S after removing zero-cost pivots: + number of "dense" rows: 0 + number of "dense" columns: 0 + number of empty rows: 0 + number of empty columns 0 + submatrix S square and diagonal preserved + pattern of square submatrix S: + number rows and columns 3 + symmetry of nonzero pattern: 1.000000 + nz in S+S' (excl. diagonal): 4 + nz on diagonal of matrix S: 2 + fraction of nz on diagonal: 0.666667 + 2-by-2 pivoting to place large entries on diagonal: + # of small diagonal entries of S: 1 + # unmatched: 0 + symmetry of P2*S: 0.000000 + nz in P2*S+(P2*S)' (excl. diag.): 6 + nz on diagonal of P2*S: 3 + fraction of nz on diag of P2*S: 1.000000 + symbolic factorization defragmentations: 0 + symbolic memory usage (Units): 144 + symbolic memory usage (MBytes): 0.0 + Symbolic size (Units): 45 + Symbolic size (MBytes): 0 + symbolic factorization CPU time (sec): 0.00 + symbolic factorization wallclock time(sec): 0.00 + + matrix scaled: yes (divided each row by sum of abs values in each row) + minimum sum (abs (rows of A)): 5.10000e+00 + maximum sum (abs (rows of A)): 7.64000e+01 + + symbolic/numeric factorization: upper bound actual % + variable-sized part of Numeric object: + initial size (Units) 85 80 94% + peak size (Units) 2543 2528 99% + final size (Units) 26 22 85% + Numeric final size (Units) 107 101 94% + Numeric final size (MBytes) 0.0 0.0 94% + peak memory usage (Units) 2738 2723 99% + peak memory usage (MBytes) 0.0 0.0 99% + numeric factorization flops 6.70000e+01 3.40000e+01 51% + nz in L (incl diagonal) 9 8 89% + nz in U (incl diagonal) 11 10 91% + nz in L+U (incl diagonal) 15 13 87% + largest front (# entries) 9 4 44% + largest # rows in front 3 2 67% + largest # columns in front 3 2 67% + + initial allocation ratio used: 0.7 + # of forced updates due to frontal growth: 0 + nz in L (incl diagonal), if none dropped 8 + nz in U (incl diagonal), if none dropped 10 + number of small entries dropped 0 + nonzeros on diagonal of U: 5 + min abs. value on diagonal of U: 2.41e-01 + max abs. value on diagonal of U: 9.14e-01 + estimate of reciprocal of condition number: 2.64e-01 + indices in compressed pattern: 2 + numerical values stored in Numeric object: 9 + numeric factorization defragmentations: 1 + numeric factorization reallocations: 1 + costly numeric factorization reallocations: 0 + numeric factorization CPU time (sec): 0.00 + numeric factorization wallclock time (sec): 0.00 + symbolic + numeric CPU time (sec): 0.00 + symbolic + numeric wall clock time (sec): 0.00 + + solve flops: 4.80000e+02 + iterative refinement steps taken: 0 + iterative refinement steps attempted: 0 + sparse backward error omega1: 8.89e-17 + sparse backward error omega2: 0.00e+00 + solve CPU time (sec): 0.00 + solve wall clock time (sec): 0.00 + + total symbolic + numeric + solve flops: 5.14000e+02 + total symbolic + numeric + solve CPU time: 0.00 + total symbolic+numeric+solve wall clock time: 0.00 + + +x (solution of C'x=b): dense vector, n = 5. + 0 : (7.56307 - 3.68974i) + 1 : (-0.831991 + 0.0627998i) + 2 : (0.166667 + 0i) + 3 : (-0.00206892 - 0.107735i) + 4 : (0.658245 + 0.0407649i) + dense vector OK + +maxnorm of residual: 5.6552e-15 + + +Solving C'x=b again, using umfpack_zl_wsolve instead: + +UMFPACK V4.4 (Jan. 28, 2005), Info: + matrix entry defined as: double complex + Int (generic integer) defined as: long + BLAS library used: none. UMFPACK will be slow. + MATLAB: no. + CPU timer: POSIX times ( ) routine. + number of rows in matrix A: 5 + number of columns in matrix A: 5 + entries in matrix A: 12 + memory usage reported in: 8-byte Units + size of int: 4 bytes + size of long: 4 bytes + size of pointer: 4 bytes + size of numerical entry: 16 bytes + + strategy used: unsymmetric + ordering used: colamd on A + modify Q during factorization: yes + prefer diagonal pivoting: no + pivots with zero Markowitz cost: 2 + submatrix S after removing zero-cost pivots: + number of "dense" rows: 0 + number of "dense" columns: 0 + number of empty rows: 0 + number of empty columns 0 + submatrix S square and diagonal preserved + pattern of square submatrix S: + number rows and columns 3 + symmetry of nonzero pattern: 1.000000 + nz in S+S' (excl. diagonal): 4 + nz on diagonal of matrix S: 2 + fraction of nz on diagonal: 0.666667 + 2-by-2 pivoting to place large entries on diagonal: + # of small diagonal entries of S: 1 + # unmatched: 0 + symmetry of P2*S: 0.000000 + nz in P2*S+(P2*S)' (excl. diag.): 6 + nz on diagonal of P2*S: 3 + fraction of nz on diag of P2*S: 1.000000 + symbolic factorization defragmentations: 0 + symbolic memory usage (Units): 144 + symbolic memory usage (MBytes): 0.0 + Symbolic size (Units): 45 + Symbolic size (MBytes): 0 + symbolic factorization CPU time (sec): 0.00 + symbolic factorization wallclock time(sec): 0.00 + + matrix scaled: yes (divided each row by sum of abs values in each row) + minimum sum (abs (rows of A)): 5.10000e+00 + maximum sum (abs (rows of A)): 7.64000e+01 + + symbolic/numeric factorization: upper bound actual % + variable-sized part of Numeric object: + initial size (Units) 85 80 94% + peak size (Units) 2543 2528 99% + final size (Units) 26 22 85% + Numeric final size (Units) 107 101 94% + Numeric final size (MBytes) 0.0 0.0 94% + peak memory usage (Units) 2738 2723 99% + peak memory usage (MBytes) 0.0 0.0 99% + numeric factorization flops 6.70000e+01 3.40000e+01 51% + nz in L (incl diagonal) 9 8 89% + nz in U (incl diagonal) 11 10 91% + nz in L+U (incl diagonal) 15 13 87% + largest front (# entries) 9 4 44% + largest # rows in front 3 2 67% + largest # columns in front 3 2 67% + + initial allocation ratio used: 0.7 + # of forced updates due to frontal growth: 0 + nz in L (incl diagonal), if none dropped 8 + nz in U (incl diagonal), if none dropped 10 + number of small entries dropped 0 + nonzeros on diagonal of U: 5 + min abs. value on diagonal of U: 2.41e-01 + max abs. value on diagonal of U: 9.14e-01 + estimate of reciprocal of condition number: 2.64e-01 + indices in compressed pattern: 2 + numerical values stored in Numeric object: 9 + numeric factorization defragmentations: 1 + numeric factorization reallocations: 1 + costly numeric factorization reallocations: 0 + numeric factorization CPU time (sec): 0.00 + numeric factorization wallclock time (sec): 0.00 + symbolic + numeric CPU time (sec): 0.00 + symbolic + numeric wall clock time (sec): 0.00 + + solve flops: 4.80000e+02 + iterative refinement steps taken: 0 + iterative refinement steps attempted: 0 + sparse backward error omega1: 8.89e-17 + sparse backward error omega2: 0.00e+00 + solve CPU time (sec): 0.00 + solve wall clock time (sec): 0.00 + + total symbolic + numeric + solve flops: 5.14000e+02 + total symbolic + numeric + solve CPU time: 0.00 + total symbolic+numeric+solve wall clock time: 0.00 + + +x (solution of C'x=b): dense vector, n = 5. + 0 : (7.56307 - 3.68974i) + 1 : (-0.831991 + 0.0627998i) + 2 : (0.166667 + 0i) + 3 : (-0.00206892 - 0.107735i) + 4 : (0.658245 + 0.0407649i) + dense vector OK + +maxnorm of residual: 5.6552e-15 + + +umfpack_zl_demo complete. +Total time: 0.00 seconds (CPU time), 0.01 seconds (wallclock time) diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Demo/umfpack_zl_demo.sed --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Demo/umfpack_zl_demo.sed Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,7 @@ +/::/d +1,$s/_xx_/_zl_/g +1,$s/Int/long/g +1,$s/WSIZE/10/ +/define ABS/ { + s/ABS/ABS(x,z) ((x) >= 0 ? (x) : -(x)) + ((z) >= 0 ? (z) : -(z))/ + } diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Doc/ChangeLog --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Doc/ChangeLog Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,385 @@ +Jan. 28, 2005: v4.4 released + + * bug fix: when Qinit is provided to umfpack_*_qsymbolic, + only the symmetric and unsymmetric strategies are now permitted. + The auto and 2-by-2 strategies are not allowed. In v4.3 and + earlier, providing Qinit and requesting the symmetric strategy + did not always work (you got the unsymmetric strategy instead). + This does not affect umfpack_*_symbolic, which computes its own + ordering and can use all 4 strategies (auto, symmetric, unsymmetric, + and 2-by-2). + + * umfpack_get_determinant added. + + * packed complex case added for all routines (previously only used in + umfpack_report_vector). This allows arrays of ANSI C/C++ complex + type to be passed directly to UMFPACK. + + * added umf_multicomple.c to assist in the compilation of UMFPACK + in Microsoft Visual Studio, which does not have the required + flexibility of the Unix "make" command. + + * local variable declarations reordered to encourage double-word + alignment of double's and Entry's, for better performance. + + * note that with the exception of the behavior when a user-provided + ordering is passed to umfpack_*_qsymbolic, versions 4.1 through 4.4 + have comparable performance (ordering quality, memory usage, + and run time). v4.1 is much better than v4.0 in performance. + +Jan. 11, 2005: v4.3.1 released + + * bug fix in umf_solve. This bug is only the 4th one found in the C + versions of UMFPACK to date (Version 3.0 to 4.3.1, from March 2001 to + Jan. 2005, excluding workarounds for quirky compilers). No bugs have + been reported in the last Fortran version of UMFPACK (MA38, or UMFPACK + V2.2.1) since its release in Jan. 1998. + + In Version 4.3, a bug in umf_solve caused iterative refinement + to be disabled when solving A'x=b or A.'x=b after factorizing A. + Modified the umfpack mexFunction to factorize A and then solve A'x=b + when performing the operation x=b/A (as "umfpack(b,'/',A). Note that + this has no effect on the use of UMFPACK in MATLAB itself, since MATLAB + does not use the umfpack mexFunction for x=b/A. When computing x=b/A, + MATLAB factorizes A' and computes x=(A'\b')' instead. The following + source code files changed: + + UMFPACK/MATLAB/umfpackmex.c (see above) + UMFPACK/Source/umf_solve.c (see source code: 2 lines changed) + UMFPACK/Include/umfpack.h (version and date changed) + UMFPACK/MATLAB/umfpack_test.m (new file) + +Jan. 16, 2004: v4.3 released. + + * user interface of v4.3 is upwardly-compatible with v4.2 and v4.1. + No bugs found in v4.1 (except for one workaround for an old compiler). + These changes add features only. + + * Note that v4.0 has a bug in umf_scale_column.c. The bug was patched + in that version on Jan. 12, 2004. The bug does not appear in v4.1 + and later. The bug is thus present in MATLAB 6.5, but it occurs + very rarely, fortunately. It can occur when dividing a nonzero entry + in the pivot column by the pivot value results in an underflow. + + * added to umfpackmex.c, for DBL_EPSILON. Some non-standard + compilers (Microsoft Visual C++) require this. + + * #pragma added to umf_analyze.c, as a workaround around a bug in an + old Intel compiler. + + * mexFunction interface to MATLAB modified. Call to mexCallMATLAB removed, + which can be slow. In V4.1 it was used only to get MATLAB's + spparms ('spumoni') value. + + * The AMD mexFunction was also modified in the same way (v1.1), with + the call to mexCallMATLAB removed. Note that UMFPACK v4.1 through + v4.3 can use either AMD v1.0 or AMD v1.1. + + * -DNO_DIVIDE_BY_ZERO option added. If this non-default option is enabled + at compile time, and if the pivot value is zero, then no division + occurs (zeros on the diagonal of U are treated as if they were equal + to one). By default, the division by zero does occur. + + * -DNO_TIMER option added. If this non-default option is enabled at + compile time, then no timers (times ( ), clock ( ), getrusage ( )) + are used. + +V4.2: A special release for COMSOL, Inc., only (FEMLAB) + + * drop tolerance added. A few new parameters in the Control array are used, + and a few new Info entries. + +May 6, 2003: V4.1 released. + + * No bugs were found in the prior version, Version 4.0. New features + added only. Major changes throughout the code. User interface + nearly unchanged, however. + + * Version 4.1 is upward-compatible with Version 4.0. The calling + sequence of some user-callable routines in Version 4.0 have changed + in this version. The routines umfpack_*_symbolic, umfpack_*_qsymbolic, + umfpack_*_get_symbolic, and umfpack_*_get_numeric have new arguments + added to them. The new arguments are optional. If you want to use + a calling sequence similar to v4.0, simply pass NULL pointers in + place of the new arguments. There are two new timing routines, + umfpack_tic and umfpack_toc. A new user-callable routine, + umfpack_*_scale, has been added. + + * "auto", "unsymmetric", "symmetric", and "2-by-2" strategies added. + The symmetric strategy uses AMD on A+A' as the column preordering, + followed by a postorder of the assembly tree of A+A'. Column ordering + refinement is turned off, and diagonal entries are prefered as pivots. + V4.0 only had the unsymmetric strategy. The 2-by-2 strategy does row + permutations and attempts to find a zero-free diagonal while at the + same time maintaining structural symmetry, and then uses the + symmetric strategy on the permuted matrix. + + * row-scaling added. The default is to divide each row by the sum of + the absolute values of each row. Other options are no scaling, + and to divide each row by the max abs value in each row. + + * Matrices with upper bound memory usage greater than the maximum integer + (2GB for 32-bit int's) can now be factorized (assuming the actual + memory usage is still less than the maximum integer). With this change, + the UMFPACK_ERROR_problem_too_large error code is no longer returned. + + * The current frontal matrix (Work->Fx) is no longer allocated as a + static size, via malloc. It can grow and shrink, and is allocated + from Numeric->Memory. + + * The AMD (Version 1.0) package is now required. It is available + separately. To compile UMFPACK, it must appear as ../AMD if you are + in the main UMFPACK directory. + + * The UMFPACK mexFunction now uses the internal utMalloc, utRealloc, + and utFree routines, by default (except on Windows). + + * Three control parameters for modifying relaxed amalgamation removed. + These values are now fixed at compile-time. + + * Many new statistics added to Info, and new control parameters added. + + * The umfpack mexFunction now returns permutation matrices for P and Q, + not permutation vectors. It also returns the scale factors as a + diagonal matrix. The factorization is now L*U = P*(R\A)*Q. + + * Option added for controlling the initial allocation of the workspace for + the current frontal matrix. + + * pivot tolerance of zero treated differently. symmetric pivot tolerance + added. + + * Makefile and GNUmakefile changed. umf_* routines with no double or + complex values are now compiled just twice (int and long versions) + rather than 4 times. + + * New routines added to save and load the Numeric and Symbolic objects + to/from binary files. + + * Simple Fortran interface added. + +Apr 11, 2002: + + * Version 4.0 released. + + * bug fix: the Microsoft compiler doesn't handle NaN's properly. + utIsNaN, and other ut* routines, added for MathWorks version + to handle this properly. + +Apr 1, 2002: + + * bug fix: if a column was all NaN's, then UMFPACK would fail + to find a pivot row. umf_row_search.c and umf_internal.h + modified to fix this problem. + +Mar 9, 2002: V4.0beta released + + * Map argument added to umfpack_*_triplet_to_col. New files + (umf_triplet.[ch]) added. + * minor changes made so that UMFPACK can be compiled with g++ + * additional error checking added to umfpack_*_numeric, for + detecting more changes in pattern (Ap, Ai) since last + call to umfpack_*_symbolic + +Feb 21, 2002: + + * User Guide explains the Makefile vs. GNUmakefile + + * umf_config.h modified, so that the complex SCSL C-BLAS uses + (void *) arguments instead of (scsl_zomplex *). gcc generates + some spurious warnings (cc doesn't complain). Affects the SGI + IRIX only. + + * ported to Compaq Alpha + +Feb 20, 2002: V4.0 (alpha) released. + + * V4.0 not yet ported to the Compaq Alpha (V3.2 was ported). + +Feb 6 to Feb 19, 2002: + + * Relaxed restrictions on sizes of arrays for umfpack_*_transpose and + umfpack_*_triplet_to_col. Size of "max(n,nz)" now just size nz. + + * workspace for umfpack_*_wsolve increased in size. + + * two user arrays for umfpack_*_get_symbolic increased in size, + by 1 (Chain_maxrows, Chain_maxcols). + + * lu_normest.m added. + +Jan 18 to Feb 5, 2002: + + * The matrix A can be complex, singular, and/or rectangular. + The solve step that uses the LU factors can only handle + matrices that are complex or real, singuluar or non-singular, + and *** square ***, however. + + * Estimate of the condition number computed: + (min (abs (diag (U))) / (max (abs (diag (U))))) + + * Forward/backsolves can solve with A.' as well as A'. + + * char * arguments removed from user-callable routines to make it + easier for Fortran to call UMFPACK. No Fortran interface is (yet) + provided, however. + + The solve codes for umfpack_*_*solve changed to #define'd + integers: + + UMFPACK_A Ax=b + UMFPACK_At A'x=b + UMFPACK_Aat A.'x=b + UMFPACK_Pt_L P'Lx=b + UMFPACK_L Lx=b + UMFPACK_Lt_P L'Px=b + UMFPACK_Lat_P L.'Px=b + UMFPACK_Lt L'x=b + UMFPACK_U_Qt UQ'x=b + UMFPACK_U Ux=b + UMFPACK_Q_Ut QU'x=b + UMFPACK_Q_Uat QU.'x=b + UMFPACK_Ut U'x=b + UMFPACK_Uat U.'x=b + + All arguments are now either int, long scalars (pass by value), + or int, long, double arrays (pass by reference), or void * pointers + (pass by value or reference). A void * pointer is of size 32 or 64 + bits on most machines. There is no need for the caller (C or Fortran) + to dereference the void * pointers, so these can be treated as + integer*4 or integer*8 in Fortran. A Fortran interface would have to + have all arguments passed by reference. + + * All user-callable routine names changed. The four sets are now: + umfpack_di_* real (double precision), int's as integers + umfpack_dl_* real (double precision), longs's as integers + umfpack_zi_* real (double precision), int's as integers + umfpack_zl_* real (double precision), longs's as integers + + * Ptree (row preordering) and info on pivotal rows for each front + added to Symbolic object (extracted by umfpack_*_get_symbolic). + Ptree added as output argument to "umfpack (A, 'symbolic')" + mexFunction. + + * umfpack_*_transpose can do A' or A.' + + * umfpack_wsolve.c file removed (now generated from umfpack_solve.c). + + * Can now extract just the diagonal of U with umfpack_*_get_numeric, + without having to extract the entire matrix U. + + * UMFPACK_ERROR_singular_matrix (-2) removed. + + * UMFPACK_WARNING_singular_matrix (1) added. + + * Control [UMFPACK_PIVOT_OPTION] removed. No longer any symmetric + pivot option (conflicts with the handling of singular and + rectangular matrices). + + * Iterative refinement can do Ax=b, A'x=b, or A.'x=b. + + * Most floating-point operations done in macros, to support the complex + versions. + + * Info [UMFPACK_N] is now Info [UMFPACK_NROW] + + * Info [UMFPACK_NCOL], Info [UMFPACK_UDIAG_NZ], Info [UMFPACK_UDIAG_NZ] + added. + + * umfpack_* routines with "n" as input now use two arguments, + n_row and n_col. + + * umfpack mexFunction now explicitly transposes A for b/A. It computes + it using the array transpose as (A.'\b.').' + +January 1, 2002: UMFPACK Version 3.2 released. Submitted to ACM Trans. + on Mathematical Software. + + * The umfpack mexFunction now returns the Info array when the matrix + is singular. Returned an empty array prior to this change. + + * Renamed variable that conflicted with system library routines + (system and j1). + + * Added a #ifdef MATHWORKS definition, so the built-in UMFPACK routine + (in a future release of MATLAB) can use the internal ut* memory + allocation routines, ut* assertion routine, and utPrintf. + + * MAX and MIN are not defined if they are already defined. + + * A bug fix in umf_kernel_init (a variable was not properly initialized). + + * Removed unused variables. + +October 8, 2001: UMFPACK Version 3.1 released. + +August-October, 2001: + + * added umfpack_btf M-file. + + * modified the BLAS update in the frontal matrix. If there are only + a few pivots in remaining in the current front, then the BLAS3 update + is delayed to include pivots in the next front. + + * Removed the special-case handling of dense columns from the numerical + factorization (kept it in the colamd preordering). This improves the + performance of UMFPACK on dense matrices by a factor of 5 or so, and + simplifies the code. + + * Added a symmetric-preference pivoting option. The option slightly + (but uniformly) improves the ordering when factorizing matrices with + symmetric nonzero pattern. That class of matrix is better handled by + the symmetric-pattern multifrontal method (MA41 in the Harwell + Subroutine Library), however. + + * Fixed the detection of integer overflow. The 32-bit version cannot + make use of more than 2GB of main memory (use the 64-bit version + in that case, instead). The 32-bit version did not correctly detect + when it was trying to factorize too large of a matrix. + +May 4, 2001: + + * SGI port extended. It can now call the SCSL Scientific Library, with + 64-bit BLAS. Make.sgi and umf_config.h modified. + +April 30, 2001: UMFPACK Version 3.0 released. Changes since 3.0Beta release: + + * Long integer version added (umfpack_l_* user-callable routines). + + * Peak memory usage in the numerical factorization reduced by a total of + 12n integers (8n temporary workspace used during numerical factorization, + and 4n for the permanent LU factors which was allocated + at the beginning of factorization). + + * Ported to the IBM RS 6000 and Compaq Alpha, with help from Anshul Gupta + and Friedrich Grund, respectively. + + * 64-bit version added. Uses dgemm_64, dgemv_64, and dger_64 in the Sun + Performance Library. 64-bit versions with the BLAS might not work on + any other platform, because they take int's as their integer input + arguments instead of long's. Unfortunately, the proposed ANSI + definition of the C-BLAS also uses int's as input integer arguments. + It ought to use long's, or include a version that uses long's, just + like the Sun Performance Library BLAS. + + * Additional statistics returned in Info: + Info [UMFPACK_SIZE_OF_INT] sizeof (int) + Info [UMFPACK_SIZE_OF_LONG] sizeof (long) + Info [UMFPACK_SIZE_OF_POINTER] sizeof (void *) + Info [UMFPACK_SIZE_OF_ENTRY] (was Info [UMFPACK_WORD]) + Info [UMFPACK_MAX_FRONT_SIZE_ESTIMATE] est. front matrix size + Info [UMFPACK_MAX_FRONT_SIZE] actual max frontal matrix size. + Contents of Info rearranged. + + * UMFPACK_ERROR_bad_configurution error code replaced with + UMFPACK_ERROR_problem_too_large error code. The "bad configuration" + error occured when sizeof (int) < sizeof (size_t). Now, the int + version of UMFPACK can use 32-bit int's and 64-bit pointers, and the + long version can use 64-bit long's and 64-bit pointers. Both versions + check to see if the array sizes allocated are larger than what can be + accessed by an integer index variable (int or long, depending on the + version), and returns UMFPACK_ERROR_problem_too_large if they become + too large. + +March 15, 2001: UMFPACK Version 3.0Beta released. + diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Doc/License --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Doc/License Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,53 @@ +UMFPACK Version 4.4 (Jan. 28, 2005), Copyright (c) 2005 by Timothy A. +Davis. All Rights Reserved. + +UMFPACK License: + + Your use or distribution of UMFPACK or any modified version of + UMFPACK implies that you agree to this License. + + THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY + EXPRESSED OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + + Permission is hereby granted to use or copy this program, 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 UMFPACK or any modified version of UMFPACK 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. This + software was developed with support from the National Science Foundation, + and is provided to you free of charge. + +Availability: + + http://www.cise.ufl.edu/research/sparse/umfpack + +-------------------------------------------------------------------------------- + +AMD Version 1.1 (Jan. 10, 2004), Copyright (c) 2004 by Timothy A. +Davis, Patrick R. Amestoy, and Iain S. Duff. All Rights Reserved. + +AMD License: + + Your use or distribution of AMD or any modified version of + AMD implies that you agree to this License. + + THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY + EXPRESSED OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + + Permission is hereby granted to use or copy this program, 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 AMD or any modified version of AMD 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. This + software was developed with support from the National Science Foundation, + and is provided to you free of charge. + +Availability: + + http://www.cise.ufl.edu/research/sparse/amd diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Doc/Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Doc/Makefile Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,56 @@ +#------------------------------------------------------------------------------- +# UMFPACK Makefile for compiling on Unix systems (for GNU or original make) +#------------------------------------------------------------------------------- + +# UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. +# All Rights Reserved. See ../Doc/License for License. + +all: dist + +include ../Make/Make.include + +#------------------------------------------------------------------------------- +# Remove all but the files in the original distribution +#------------------------------------------------------------------------------- + +# Note that UserGuide.tex is created from UserGuide.stex, the files in +# the ../Include directory, and the ../Demo/umfpack_simple.c file. +purge: clean + - $(RM) *.aux *.bbl *.blg *.log *.toc + - $(RM) UserGuide.tex + +#------------------------------------------------------------------------------- +# Create the User Guide and Quick Start Guide +#------------------------------------------------------------------------------- + +UMFPACK = umfpack_col_to_triplet umfpack_defaults umfpack_free_numeric \ + umfpack_free_symbolic umfpack_get_numeric umfpack_get_lunz \ + umfpack_get_determinant \ + umfpack_get_symbolic umfpack_numeric umfpack_qsymbolic \ + umfpack_report_control umfpack_report_info umfpack_report_matrix \ + umfpack_report_numeric umfpack_report_perm umfpack_report_status \ + umfpack_report_symbolic umfpack_report_triplet \ + umfpack_report_vector umfpack_solve umfpack_symbolic \ + umfpack_transpose umfpack_triplet_to_col umfpack_scale + +UMFPACKW = umfpack_wsolve + +USER = $(UMFPACKW) $(UMFPACK) + +SRC = $(addprefix ../Include/, $(addsuffix .h,$(USER))) ../Demo/umfpack_simple.c + +UserGuide.pdf: UserGuide.stex UserGuide.sed1 UserGuide.sed2 $(SRC) + sed -f UserGuide.sed1 < UserGuide.stex | sed -f UserGuide.sed2 \ + | expand -8 > UserGuide.tex + pdflatex UserGuide + bibtex UserGuide + pdflatex UserGuide + pdflatex UserGuide + +QuickStart.pdf: QuickStart.tex + pdflatex QuickStart + pdflatex QuickStart + +dist: QuickStart.pdf UserGuide.pdf + - $(RM) *.aux *.bbl *.blg *.log *.toc + - $(RM) UserGuide.tex diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Doc/QuickStart.pdf Binary file liboctave/UMFPACK/UMFPACK/Doc/QuickStart.pdf has changed diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Doc/QuickStart.tex --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Doc/QuickStart.tex Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,1029 @@ +%------------------------------------------------------------------------------- +% The QuickStart.tex file. +%------------------------------------------------------------------------------- + +\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} + +\author{Timothy A. Davis \\ +Dept. of Computer and Information Science and Engineering \\ +Univ. of Florida, Gainesville, FL} +\title{UMFPACK Version 4.4 Quick Start Guide} +\date{Jan. 28, 2005} +\maketitle + +%------------------------------------------------------------------------------- +\begin{abstract} + UMFPACK is a set of routines for solving unsymmetric sparse linear + systems, $\m{Ax}=\m{b}$, using the Unsymmetric-pattern MultiFrontal method + and direct sparse LU factorization. It is written in ANSI/ISO C, with a + MATLAB interface. UMFPACK relies on the Level-3 + Basic Linear Algebra Subprograms (dense matrix multiply) for its + performance. This code works on Windows and many versions of Unix (Sun + Solaris, Red Hat Linux, IBM AIX, SGI IRIX, and Compaq Alpha). + This is a ``quick start'' guide for Unix users of the C interface. +\end{abstract} +%------------------------------------------------------------------------------- + +UMFPACK Version 4.4 (Jan. 28, 2005), Copyright\copyright 2005 by Timothy A. +Davis. All Rights Reserved. Refer to the UMFPACK User Guide +for the License. See \newline +http://www.cise.ufl.edu/research/sparse/umfpack +for the code and full documentation. + +%------------------------------------------------------------------------------- +\section{Overview} +%------------------------------------------------------------------------------- + +UMFPACK is a set of routines for solving systems of linear +equations, $\m{Ax}=\m{b}$, when $\m{A}$ is sparse and unsymmetric. +The sparse matrix $\m{A}$ can be square or rectangular, singular +or non-singular, and real or complex (or any combination). Only square +matrices $\m{A}$ can be used to solve $\m{Ax}=\m{b}$ or related systems. +Rectangular matrices can only be factorized. + +UMFPACK Version 4.3 is a built-in routine in MATLAB 7.1, used by the forward and +backslash operator, and the {\tt lu} routine. MATLAB 6.5 used Version 4.0. +The following is a short +introduction to Unix users of the C interface of UMFPACK. + +%------------------------------------------------------------------------------- + +The C-callable UMFPACK library consists of 32 user-callable routines and one +include file. Twenty-eight of the routines come in four versions, with +different sizes of integers and for real or complex floating-point numbers. +This Quick Start Guide assumes you are working with real matrices +(not complex) and with {\tt int}'s as integers (not {\tt long}'s). +Refer to the User Guide for information about the complex and +long integer versions. The include file {\tt umfpack.h} +must be included in any C program that uses UMFPACK. + +For more details, see: +{\em A column pre-ordering strategy for the unsymmetric-pattern multifrontal method}, +Davis, T. A., +ACM Trans. Math. Software, vol 30. no 2, 2004, pp. 165-195, and +{\em Algorithm 832: {UMFPACK}, an unsymmetric-pattern multifrontal method}, +same issue, pp. 196-199. + +%------------------------------------------------------------------------------- +\section{Primary routines, and a simple example} +%------------------------------------------------------------------------------- + +Five primary UMFPACK routines are required to factorize $\m{A}$ or +solve $\m{Ax}=\m{b}$. An overview of the primary features of the routines +is given in Section~\ref{Primary}. +Additional routines are available for passing a different column ordering +to UMFPACK, changing default parameters, manipulating sparse matrices, +getting the LU factors, save and loading the LU factors from a file, +computing the determinant, +and reporting results. See the User Guide for more information. + +\begin{itemize} +\item {\tt umfpack\_di\_symbolic}: + + Pre-orders the columns of $\m{A}$ to reduce fill-in and performs a + symbolic analysis. + Returns an opaque {\tt Symbolic} object as a {\tt void *} + pointer. The object contains the symbolic analysis and is needed for the + numerical factorization. + +\item {\tt umfpack\_di\_numeric}: + + Numerically scales and then factorizes a sparse matrix + $\m{PAQ}$, $\m{PRAQ}$, or $\m{PR}^{-1}\m{AQ}$ into the product $\m{LU}$, + where + $\m{P}$ and $\m{Q}$ are permutation matrices, $\m{R}$ is a diagonal + matrix of scale factors, $\m{L}$ is lower triangular with unit diagonal, + and $\m{U}$ is upper triangular. Requires the + symbolic ordering and analysis computed by {\tt umfpack\_di\_symbolic}. + Returns an opaque {\tt Numeric} object as a + {\tt void *} pointer. The object contains the numerical factorization and + is used by {\tt umfpack\_di\_solve}. + +\item {\tt umfpack\_di\_solve}: + + Solves a sparse linear system ($\m{Ax}=\m{b}$, $\m{A}\tr\m{x}=\m{b}$, or + systems involving just $\m{L}$ or $\m{U}$), using the numeric factorization + computed by {\tt umfpack\_di\_numeric}. + +\item {\tt umfpack\_di\_free\_symbolic}: + + Frees the {\tt Symbolic} object created by {\tt umfpack\_di\_symbolic}. + +\item {\tt umfpack\_di\_free\_numeric}: + + Frees the {\tt Numeric} object created by {\tt umfpack\_di\_numeric}. + +\end{itemize} + +The matrix $\m{A}$ is represented in compressed column form, which is +identical to the sparse matrix representation used by MATLAB. It consists +of three arrays, where the matrix is {\tt m}-by-{\tt n}, +with {\tt nz} entries: + +{\footnotesize +\begin{verbatim} + int Ap [n+1] ; + int Ai [nz] ; + double Ax [nz] ; +\end{verbatim} +} + +All nonzeros are entries, but an entry may be numerically zero. The row indices +of entries in column {\tt j} are stored in + {\tt Ai[Ap[j]} ... {\tt Ap[j+1]-1]}. +The corresponding numerical values are stored in + {\tt Ax[Ap[j]} ... {\tt Ap[j+1]-1]}. + +No duplicate row indices may be present, and the row indices in any given +column must be sorted in ascending order. The first entry {\tt Ap[0]} must be +zero. The total number of entries in the matrix is thus {\tt nz = Ap[n]}. +Except for the fact that extra zero entries can be included, there is thus a +unique compressed column representation of any given matrix $\m{A}$. + +Here is a simple main program, {\tt umfpack\_simple.c}, that illustrates the +basic usage of UMFPACK. + +{\footnotesize +\begin{verbatim} + #include + #include "umfpack.h" + + int n = 5 ; + int Ap [ ] = {0, 2, 5, 9, 10, 12} ; + int Ai [ ] = { 0, 1, 0, 2, 4, 1, 2, 3, 4, 2, 1, 4} ; + double Ax [ ] = {2., 3., 3., -1., 4., 4., -3., 1., 2., 2., 6., 1.} ; + double b [ ] = {8., 45., -3., 3., 19.} ; + double x [5] ; + + int main (void) + { + double *null = (double *) NULL ; + int i ; + void *Symbolic, *Numeric ; + (void) umfpack_di_symbolic (n, n, Ap, Ai, Ax, &Symbolic, null, null) ; + (void) umfpack_di_numeric (Ap, Ai, Ax, Symbolic, &Numeric, null, null) ; + umfpack_di_free_symbolic (&Symbolic) ; + (void) umfpack_di_solve (UMFPACK_A, Ap, Ai, Ax, x, b, Numeric, null, null) ; + umfpack_di_free_numeric (&Numeric) ; + for (i = 0 ; i < n ; i++) printf ("x [%d] = %g\n", i, x [i]) ; + return (0) ; + } +\end{verbatim} +} + +The {\tt Ap}, {\tt Ai}, and {\tt Ax} arrays represent the matrix +\[ +\m{A} = \left[ +\begin{array}{rrrrr} + 2 & 3 & 0 & 0 & 0 \\ + 3 & 0 & 4 & 0 & 6 \\ + 0 & -1 & -3 & 2 & 0 \\ + 0 & 0 & 1 & 0 & 0 \\ + 0 & 4 & 2 & 0 & 1 \\ +\end{array} +\right]. +\] +and the solution is $\m{x} = [1 \, 2 \, 3 \, 4 \, 5]\tr$. 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}). + +For routines to manipulate a simpler ``triplet-form'' data structure for your +sparse matrix $\m{A}$, refer to the UMFPACK User Guide. + +%------------------------------------------------------------------------------- +\section{Synopsis of primary C-callable routines} +\label{Synopsis} +%------------------------------------------------------------------------------- + +The matrix $\m{A}$ is {\tt m}-by-{\tt n} with {\tt nz} entries. +The optional {\tt umfpack\_di\_defaults} routine loads the default control +parameters into the {\tt Control} array. The settings can then be modified +before passing the array to the other routines. Refer to Section~\ref{Primary} +for more details. + +{\footnotesize +\begin{verbatim} + #include "umfpack.h" + int status, sys, n, m, nz, Ap [n+1], Ai [nz] ; + double Control [UMFPACK_CONTROL], Info [UMFPACK_INFO], Ax [nz], X [n], B [n] ; + void *Symbolic, *Numeric ; + + status = umfpack_di_symbolic (m, n, Ap, Ai, Ax, &Symbolic, Control, Info) ; + status = umfpack_di_numeric (Ap, Ai, Ax, Symbolic, &Numeric, Control, Info) ; + status = umfpack_di_solve (sys, Ap, Ai, Ax, X, B, Numeric, Control, Info) ; + umfpack_di_free_symbolic (&Symbolic) ; + umfpack_di_free_numeric (&Numeric) ; + umfpack_di_defaults (Control) ; +\end{verbatim} +} + +%------------------------------------------------------------------------------- +\section{Installation} +\label{Install} +%------------------------------------------------------------------------------- + +You will need to install both UMFPACK v4.4 and AMD v1.1 (or AMD v1.0) to use UMFPACK. +The {\tt UMFPACK} and {\tt AMD} subdirectories must be placed side-by-side +within the same parent directory. AMD is a stand-alone package that +is required by UMFPACK. UMFPACK can be compiled without the +BLAS but your performance will be much less than what it should be. + +System-dependent configurations are in the {\tt AMD/Make} +and {\tt UMFPACK/Make} directories +(Note that {\tt UMFPACK/Make} is a symbolic link to {\tt AMD/Make}). +You can edit the {\tt Make.include} +file in those directories to customize the compilation. The default +settings will work on most systems, except that UMFPACK will be compiled so +that it does not use the BLAS. Sample configuration files are provided +for Linux, Sun Solaris, SGI IRIX, IBM AIX, and the DEC/Compaq Alpha. + +To compile and install both packages, +go to the UMFPACK directory and type {\tt make}. This will compile the +libraries ({\tt AMD/Lib/libamd.a} and {\tt UMFPACK/Lib/libumfpack.a}). +A demo of the AMD ordering routine will be compiled and tested in +the {\tt AMD/Demo} directory, and five demo programs will then be +compiled and tested in the {\tt UMFPACK/Demo} directory. +The outputs of these demo programs will then be compared with output +files in the distribution. Expect to see a few differences, such as +residual norms, compile-time control settings, and perhaps memory usage +differences. The AMD and MATLAB mexFunctions for +use in MATLAB will also be compiled. If you do not have MATLAB, +type {\tt make lib} instead. + +If you compile UMFPACK and AMD and then later change the {\tt Make.include} +file or your system-specific configuration file such as {\tt Make.linux}, +then you should type {\tt make purge} and then {\tt make} to recompile. + +Here are the various parameters that you can control in your +{\tt Make.include} file: + +\begin{itemize} +\item {\tt CC = } your C compiler, such as {\tt cc}. +\item {\tt RANLIB = } your system's {\tt ranlib} program, if needed. +\item {\tt CFLAGS = } optimization flags, such as {\tt -O}. +\item {\tt CONFIG = } configuration settings, for the BLAS, memory allocation + routines, and timing routines. +\item {\tt LIB = } your libraries, such as {\tt -lm} or {\tt -lblas}. +\item {\tt RM =} the command to delete a file. +\item {\tt MV =} the command to rename a file. +\item {\tt MEX =} the command to compile a MATLAB mexFunction. +\item {\tt F77 =} the command to compile a Fortran program (optional). +\item {\tt F77FLAGS =} the Fortran compiler flags (optional). +\item {\tt F77LIB =} the Fortran libraries (optional). +\end{itemize} + +The {\tt CONFIG} string can include combinations of the following; +most deal with how the BLAS are called: +\begin{itemize} +\item {\tt -DNBLAS} if you do not have any BLAS at all. +\item {\tt -DCBLAS} if you have the C-BLAS. +\item {\tt -DNSUNPERF} if you are on Solaris but do not have the Sun + Performance Library. +\item {\tt -DNSCSL} if you on SGI IRIX but do not have the SCSL BLAS library. +\item {\tt -DLONGBLAS} if your BLAS can take {\tt long} integer input + arguments. +\item Options for controlling how C calls the Fortran BLAS: + {\tt -DBLAS\_BY\_VALUE}, {\tt -DBLAS\_NO\_UNDERSCORE}, + and {\tt -DBLAS\_CHAR\_ARG}. These are set automatically for Windows, + Sun Solaris, SGI Irix, Red Hat Linux, Compaq Alpha, and + AIX (the IBM RS 6000). +\item {\tt -DGETRUSAGE} if you have the {\tt getrusage} function. +\item {\tt -DLP64} if you are compiling in the LP64 model (32 bit {\tt int}'s, + 64 bit {\tt long}'s, and 64 bit pointers). +\item {\tt -DNUTIL} if you wish to compile the MATLAB-callable + UMFPACK mexFunction with the {\tt mxMalloc}, {\tt mxRealloc} + and {\tt mxFree} routines, instead of the undocumented (but + superior) {\tt utMalloc}, {\tt utRealloc}, and {\tt utFree} + routines. +\item {\tt -DNPOSIX} if you do not have the POSIX-compliant + {\tt sysconf} and {\tt times} routines. +\item {\tt -DNRECIPROCAL} controls a trade-off between speed and accuracy. + This is off by default (speed preferred over accuracy) except when + compiling for MATLAB. +\end{itemize} + +When you compile your program that uses the C-callable UMFPACK library, +you need to add the both {\tt UMFPACK/Lib/libumfpack.a} and +{\tt AMD/Lib/libamd.a} +libraries, and you need to tell your compiler to look in the +directories {\tt UMFPACK/Include} and {\tt AMD/Include} for include +files. See {\tt UMFPACK/Demo/Makefile} for an example. +You do not need to directly include any AMD include files in your +program, unless you directly call AMD routines. You only need the +\begin{verbatim} +#include "umfpack.h" +\end{verbatim} +statement, as described in Section~\ref{Synopsis}. + +%------------------------------------------------------------------------------- +\newpage +\section{The primary UMFPACK routines} +\label{Primary} +%------------------------------------------------------------------------------- + +\subsection{umfpack\_di\_symbolic} + +{\footnotesize +\begin{verbatim} +int umfpack_di_symbolic +( + int n_row, + int n_col, + const int Ap [ ], + const int Ai [ ], + const double Ax [ ], + void **Symbolic, + const double Control [UMFPACK_CONTROL], + double Info [UMFPACK_INFO] +) ; + +Purpose: + + Given nonzero pattern of a sparse matrix A in column-oriented form, + umfpack_di_symbolic performs a column pre-ordering to reduce fill-in + (using COLAMD or AMD) and a symbolic factorization. This is required + before the matrix can be numerically factorized with umfpack_di_numeric. + + For the following discussion, let S be the submatrix of A obtained after + eliminating all pivots of zero Markowitz cost. S has dimension + (n_row-n1-nempty_row) -by- (n_col-n1-nempty_col), where + n1 = Info [UMFPACK_COL_SINGLETONS] + Info [UMFPACK_ROW_SINGLETONS], + nempty_row = Info [UMFPACK_NEMPTY_ROW] and + nempty_col = Info [UMFPACK_NEMPTY_COL]. + +Returns: + + The status code is returned. See Info [UMFPACK_STATUS], below. + +Arguments: + + Int n_row ; Input argument, not modified. + Int n_col ; Input argument, not modified. + + A is an n_row-by-n_col matrix. Restriction: n_row > 0 and n_col > 0. + + Int Ap [n_col+1] ; Input argument, not modified. + + Ap is an integer array of size n_col+1. On input, it holds the + "pointers" for the column form of the sparse matrix A. Column j of + the matrix A is held in Ai [(Ap [j]) ... (Ap [j+1]-1)]. The first + entry, Ap [0], must be zero, and Ap [j] <= Ap [j+1] must hold for all + j in the range 0 to n_col-1. The value nz = Ap [n_col] is thus the + total number of entries in the pattern of the matrix A. nz must be + greater than or equal to zero. + + Int Ai [nz] ; Input argument, not modified, of size nz = Ap [n_col]. + + The nonzero pattern (row indices) for column j is stored in + Ai [(Ap [j]) ... (Ap [j+1]-1)]. The row indices in a given column j + must be in ascending order, and no duplicate row indices may be present. + Row indices must be in the range 0 to n_row-1 (the matrix is 0-based). + + double Ax [nz] ; Optional input argument, not modified. + + The numerical values of the sparse matrix A. The nonzero pattern (row + indices) for column j is stored in Ai [(Ap [j]) ... (Ap [j+1]-1)], and + the corresponding numerical values are stored in + Ax [(Ap [j]) ... (Ap [j+1]-1)]. Used only by the 2-by-2 strategy to + determine whether entries are "large" or "small". You do not have to + pass the same numerical values to umfpack_di_numeric. If Ax is not + present (a (double *) NULL pointer), then any entry in A is assumed to + be "large". + + void **Symbolic ; Output argument. + + **Symbolic is the address of a (void *) pointer variable in the user's + calling routine (see Syntax, above). On input, the contents of this + variable are not defined. On output, this variable holds a (void *) + pointer to the Symbolic object (if successful), or (void *) NULL if + a failure occurred. + + double Control [UMFPACK_CONTROL] ; Input argument, not modified. + + If a (double *) NULL pointer is passed, then the default control + settings are used. Only the primary parameters are listed below: + + Control [UMFPACK_STRATEGY]: This is the most important control + parameter. It determines what kind of ordering and pivoting + strategy that UMFPACK should use. It is new to Version 4.1 + There are 4 options: + + UMFPACK_STRATEGY_AUTO: This is the default. The input matrix is + analyzed to determine how symmetric the nonzero pattern is, and + how many entries there are on the diagonal. It then selects one + of the following strategies. Refer to the User Guide for a + description of how the strategy is automatically selected. + + UMFPACK_STRATEGY_UNSYMMETRIC: Use the unsymmetric strategy. COLAMD + is used to order the columns of A, followed by a postorder of + the column elimination tree. No attempt is made to perform + diagonal pivoting. The column ordering is refined during + factorization. This strategy was the only one provided with + UMFPACK V4.0. + + In the numerical factorization, the + Control [UMFPACK_SYM_PIVOT_TOLERANCE] parameter is ignored. A + pivot is selected if its magnitude is >= + Control [UMFPACK_PIVOT_TOLERANCE] (default 0.1) times the + largest entry in its column. + + UMFPACK_STRATEGY_SYMMETRIC: Use the symmetric strategy (new to + Version 4.1). In this method, the approximate minimum degree + ordering (AMD) is applied to A+A', followed by a postorder of + the elimination tree of A+A'. UMFPACK attempts to perform + diagonal pivoting during numerical factorization. No refinement + of the column preordering is performed during factorization. + + In the numerical factorization, a nonzero entry on the diagonal + is selected as the pivot if its magnitude is >= Control + [UMFPACK_SYM_PIVOT_TOLERANCE] (default 0.001) times the largest + entry in its column. If this is not acceptable, then an + off-diagonal pivot is selected with magnitude >= Control + [UMFPACK_PIVOT_TOLERANCE] (default 0.1) times the largest entry + in its column. + + UMFPACK_STRATEGY_2BY2: a row permutation P2 is found that places + large entries on the diagonal. The matrix P2*A is then + factorized using the symmetric strategy, described above. + Refer to the User Guide for more information. + + Control [UMFPACK_2BY2_TOLERANCE]: a diagonal entry S (k,k) is + considered "small" if it is < tol * max (abs (S (:,k))), where S a + submatrix of the scaled input matrix, with pivots of zero Markowitz + cost removed. + + Control [UMFPACK_SCALE]: This parameter is new to V4.1. See + umfpack_numeric.h for a description. Only affects the 2-by-2 + strategy. Default: UMFPACK_SCALE_SUM. + + double Info [UMFPACK_INFO] ; Output argument, not defined on input. + + Contains statistics about the symbolic analysis. If a (double *) NULL + pointer is passed, then no statistics are returned in Info (this is not + an error condition). The entire Info array is cleared (all entries set + to -1) and then the following statistics are computed (only the + primary statistics are listed): + + Info [UMFPACK_STATUS]: status code. This is also the return value, + whether or not Info is present. + + UMFPACK_OK + + Each column of the input matrix contained row indices + in increasing order, with no duplicates. Only in this case + does umfpack_di_symbolic compute a valid symbolic factorization. + For the other cases below, no Symbolic object is created + (*Symbolic is (void *) NULL). + + UMFPACK_ERROR_n_nonpositive + + n is less than or equal to zero. + + UMFPACK_ERROR_invalid_matrix + + Number of entries in the matrix is negative, Ap [0] is nonzero, + a column has a negative number of entries, a row index is out of + bounds, or the columns of input matrix were jumbled (unsorted + columns or duplicate entries). + + UMFPACK_ERROR_out_of_memory + + Insufficient memory to perform the symbolic analysis. If the + analysis requires more than 2GB of memory and you are using + the 32-bit ("int") version of UMFPACK, then you are guaranteed + to run out of memory. Try using the 64-bit version of UMFPACK. + + UMFPACK_ERROR_argument_missing + + One or more required arguments is missing. + + UMFPACK_ERROR_internal_error + + Something very serious went wrong. This is a bug. + Please contact the author (davis@cise.ufl.edu). + + Info [UMFPACK_SIZE_OF_UNIT]: the number of bytes in a Unit, + for memory usage statistics below. + + Info [UMFPACK_SYMBOLIC_PEAK_MEMORY]: the amount of memory (in Units) + required for umfpack_di_symbolic to complete. This count includes + the size of the Symbolic object itself, which is also reported in + Info [UMFPACK_SYMBOLIC_SIZE]. + + Info [UMFPACK_NUMERIC_SIZE_ESTIMATE]: an estimate of the final size (in + Units) of the entire Numeric object (both fixed-size and variable- + sized parts), which holds the LU factorization (including the L, U, + P and Q matrices). + + Info [UMFPACK_PEAK_MEMORY_ESTIMATE]: an estimate of the total amount of + memory (in Units) required by umfpack_di_symbolic and + umfpack_di_numeric to perform both the symbolic and numeric + factorization. This is the larger of the amount of memory needed + in umfpack_di_numeric itself, and the amount of memory needed in + umfpack_di_symbolic (Info [UMFPACK_SYMBOLIC_PEAK_MEMORY]). The + count includes the size of both the Symbolic and Numeric objects + themselves. It can be a very loose upper bound, particularly when + the symmetric or 2-by-2 strategies are used. + + Info [UMFPACK_FLOPS_ESTIMATE]: an estimate of the total floating-point + operations required to factorize the matrix. This is a "true" + theoretical estimate of the number of flops that would be performed + by a flop-parsimonious sparse LU algorithm. It assumes that no + extra flops are performed except for what is strictly required to + compute the LU factorization. It ignores, for example, the flops + performed by umfpack_di_numeric to add contribution blocks of + frontal matrices together. If L and U are the upper bound on the + pattern of the factors, then this flop count estimate can be + represented in MATLAB (for real matrices, not complex) as: + + Lnz = full (sum (spones (L))) - 1 ; % nz in each col of L + Unz = full (sum (spones (U')))' - 1 ; % nz in each row of U + flops = 2*Lnz*Unz + sum (Lnz) ; + + The actual "true flop" count found by umfpack_di_numeric will be + less than this estimate. + + Info [UMFPACK_LNZ_ESTIMATE]: an estimate of the number of nonzeros in + L, including the diagonal. Since L is unit-diagonal, the diagonal + of L is not stored. This estimate is a strict upper bound on the + actual nonzeros in L to be computed by umfpack_di_numeric. + + Info [UMFPACK_UNZ_ESTIMATE]: an estimate of the number of nonzeros in + U, including the diagonal. This estimate is a strict upper bound on + the actual nonzeros in U to be computed by umfpack_di_numeric. + + Info [UMFPACK_SYMBOLIC_TIME]: The CPU time taken, in seconds. + + Info [UMFPACK_STRATEGY_USED]: The ordering strategy used: + UMFPACK_STRATEGY_SYMMETRIC, UMFPACK_STRATEGY_UNSYMMETRIC, or + UMFPACK_STRATEGY_2BY2. +\end{verbatim} +} + + +%------------------------------------------------------------------------------- +\newpage +\subsection{umfpack\_di\_numeric} + +{\footnotesize +\begin{verbatim} +int umfpack_di_numeric +( + const int Ap [ ], + const int Ai [ ], + const double Ax [ ], + void *Symbolic, + void **Numeric, + const double Control [UMFPACK_CONTROL], + double Info [UMFPACK_INFO] +) ; + +Purpose: + + Given a sparse matrix A in column-oriented form, and a symbolic analysis + computed by umfpack_di_symbolic, the umfpack_di_numeric routine performs the + numerical factorization, PAQ=LU, PRAQ=LU, or P(R\A)Q=LU, where P and Q are + permutation matrices (represented as permutation vectors), R is the row + scaling, L is unit-lower triangular, and U is upper triangular. This is + required before the system Ax=b (or other related linear systems) can be + solved. umfpack_di_numeric can be called multiple times for each call to + umfpack_di_symbolic, to factorize a sequence of matrices with identical + nonzero pattern. Simply compute the Symbolic object once, with + umfpack_di_symbolic, and reuse it for subsequent matrices. + umfpack_di_numeric safely detects if the pattern changes, and sets an + appropriate error code. + +Returns: + + The status code is returned. See Info [UMFPACK_STATUS], below. + +Arguments: + + Int Ap [n_col+1] ; Input argument, not modified. + + This must be identical to the Ap array passed to umfpack_di_symbolic. + The value of n_col is what was passed to umfpack_di_symbolic (this is + held in the Symbolic object). + + Int Ai [nz] ; Input argument, not modified, of size nz = Ap [n_col]. + + This must be identical to the Ai array passed to umfpack_di_symbolic. + + double Ax [nz] ; Input argument, not modified, of size nz = Ap [n_col]. + + The numerical values of the sparse matrix A. The nonzero pattern (row + indices) for column j is stored in Ai [(Ap [j]) ... (Ap [j+1]-1)], and + the corresponding numerical values are stored in + Ax [(Ap [j]) ... (Ap [j+1]-1)]. + + void *Symbolic ; Input argument, not modified. + + The Symbolic object, which holds the symbolic factorization computed by + umfpack_di_symbolic. The Symbolic object is not modified by + umfpack_di_numeric. + + void **Numeric ; Output argument. + + **Numeric is the address of a (void *) pointer variable in the user's + calling routine (see Syntax, above). On input, the contents of this + variable are not defined. On output, this variable holds a (void *) + pointer to the Numeric object (if successful), or (void *) NULL if + a failure occurred. + + double Control [UMFPACK_CONTROL] ; Input argument, not modified. + + If a (double *) NULL pointer is passed, then the default control + settings are used. Only the primary parameters are listed below: + + Control [UMFPACK_PIVOT_TOLERANCE]: relative pivot tolerance for + threshold partial pivoting with row interchanges. In any given + column, an entry is numerically acceptable if its absolute value is + greater than or equal to Control [UMFPACK_PIVOT_TOLERANCE] times + the largest absolute value in the column. A value of 1.0 gives true + partial pivoting. If less than or equal to zero, then any nonzero + entry is numerically acceptable as a pivot (this is changed from + Version 4.0). Default: 0.1. + + Smaller values tend to lead to sparser LU factors, but the solution + to the linear system can become inaccurate. Larger values can lead + to a more accurate solution (but not always), and usually an + increase in the total work. + + Control [UMFPACK_SYM_PIVOT_TOLERANCE]: This parameter is new to V4.1. + If diagonal pivoting is attempted (the symmetric or symmetric-2by2 + strategies are used) then this parameter is used to control when the + diagonal entry is selected in a given pivot column. The absolute + value of the entry must be >= Control [UMFPACK_SYM_PIVOT_TOLERANCE] + times the largest absolute value in the column. A value of zero + will ensure that no off-diagonal pivoting is performed, except that + zero diagonal entries are not selected if there are any off-diagonal + nonzero entries. + + If an off-diagonal pivot is selected, an attempt is made to restore + symmetry later on. Suppose A (i,j) is selected, where i != j. + If column i has not yet been selected as a pivot column, then + the entry A (j,i) is redefined as a "diagonal" entry, except that + the tighter tolerance (Control [UMFPACK_PIVOT_TOLERANCE]) is + applied. This strategy has an effect similar to 2-by-2 pivoting + for symmetric indefinite matrices. If a 2-by-2 block pivot with + nonzero structure + + i j + i: 0 x + j: x 0 + + is selected in a symmetric indefinite factorization method, the + 2-by-2 block is inverted and a rank-2 update is applied. In + UMFPACK, this 2-by-2 block would be reordered as + + j i + i: x 0 + j: 0 x + + In both cases, the symmetry of the Schur complement is preserved. + + Control [UMFPACK_SCALE]: This parameter is new to V4.1. Version 4.0 + did not scale the matrix. Note that the user's input matrix is + never modified, only an internal copy is scaled. + + There are three valid settings for this parameter. If any other + value is provided, the default is used. + + UMFPACK_SCALE_NONE: no scaling is performed. + + UMFPACK_SCALE_SUM: each row of the input matrix A is divided by + the sum of the absolute values of the entries in that row. + The scaled matrix has an infinity norm of 1. + + UMFPACK_SCALE_MAX: each row of the input matrix A is divided by + the maximum the absolute values of the entries in that row. + In the scaled matrix the largest entry in each row has + a magnitude exactly equal to 1. + + Scaling is very important for the "symmetric" strategy when + diagonal pivoting is attempted. It also improves the performance + of the "unsymmetric" strategy. + + Default: UMFPACK_SCALE_SUM. + + double Info [UMFPACK_INFO] ; Output argument. + + Contains statistics about the numeric factorization. If a + (double *) NULL pointer is passed, then no statistics are returned in + Info (this is not an error condition). The following statistics are + computed in umfpack_di_numeric (only the primary statistics are listed): + + Info [UMFPACK_STATUS]: status code. This is also the return value, + whether or not Info is present. + + UMFPACK_OK + + Numeric factorization was successful. umfpack_di_numeric + computed a valid numeric factorization. + + UMFPACK_WARNING_singular_matrix + + Numeric factorization was successful, but the matrix is + singular. umfpack_di_numeric computed a valid numeric + factorization, but you will get a divide by zero in + umfpack_di_solve. For the other cases below, no Numeric object + is created (*Numeric is (void *) NULL). + + UMFPACK_ERROR_out_of_memory + + Insufficient memory to complete the numeric factorization. + + UMFPACK_ERROR_argument_missing + + One or more required arguments are missing. + + UMFPACK_ERROR_invalid_Symbolic_object + + Symbolic object provided as input is invalid. + + UMFPACK_ERROR_different_pattern + + The pattern (Ap and/or Ai) has changed since the call to + umfpack_di_symbolic which produced the Symbolic object. + + Info [UMFPACK_NUMERIC_SIZE]: the actual final size (in Units) of the + entire Numeric object, including the final size of the variable + part of the object. Info [UMFPACK_NUMERIC_SIZE_ESTIMATE], + an estimate, was computed by umfpack_di_symbolic. The estimate is + normally an upper bound on the actual final size, but this is not + guaranteed. + + Info [UMFPACK_PEAK_MEMORY]: the actual peak memory usage (in Units) of + both umfpack_di_symbolic and umfpack_di_numeric. An estimate, + Info [UMFPACK_PEAK_MEMORY_ESTIMATE], was computed by + umfpack_di_symbolic. The estimate is normally an upper bound on the + actual peak usage, but this is not guaranteed. With testing on + hundreds of matrix arising in real applications, I have never + observed a matrix where this estimate or the Numeric size estimate + was less than the actual result, but this is theoretically possible. + Please send me one if you find such a matrix. + + Info [UMFPACK_FLOPS]: the actual count of the (useful) floating-point + operations performed. An estimate, Info [UMFPACK_FLOPS_ESTIMATE], + was computed by umfpack_di_symbolic. The estimate is guaranteed to + be an upper bound on this flop count. The flop count excludes + "useless" flops on zero values, flops performed during the pivot + search (for tentative updates and assembly of candidate columns), + and flops performed to add frontal matrices together. + + Info [UMFPACK_LNZ]: the actual nonzero entries in final factor L, + including the diagonal. This excludes any zero entries in L, + although some of these are stored in the Numeric object. The + Info [UMFPACK_LU_ENTRIES] statistic does account for all + explicitly stored zeros, however. Info [UMFPACK_LNZ_ESTIMATE], + an estimate, was computed by umfpack_di_symbolic. The estimate is + guaranteed to be an upper bound on Info [UMFPACK_LNZ]. + + Info [UMFPACK_UNZ]: the actual nonzero entries in final factor U, + including the diagonal. This excludes any zero entries in U, + although some of these are stored in the Numeric object. The + Info [UMFPACK_LU_ENTRIES] statistic does account for all + explicitly stored zeros, however. Info [UMFPACK_UNZ_ESTIMATE], + an estimate, was computed by umfpack_di_symbolic. The estimate is + guaranteed to be an upper bound on Info [UMFPACK_UNZ]. + + Info [UMFPACK_NUMERIC_TIME]: The CPU time taken, in seconds. +\end{verbatim} +} + +%------------------------------------------------------------------------------- +\newpage +\subsection{umfpack\_di\_solve} + +{\footnotesize +\begin{verbatim} +int umfpack_di_solve +( + int sys, + const int Ap [ ], + const int Ai [ ], + const double Ax [ ], + double X [ ], + const double B [ ], + void *Numeric, + const double Control [UMFPACK_CONTROL], + double Info [UMFPACK_INFO] +) ; + +Purpose: + + Given LU factors computed by umfpack_di_numeric (PAQ=LU, PRAQ=LU, or + P(R\A)Q=LU) and the right-hand-side, B, solve a linear system for the + solution X. Iterative refinement is optionally performed. Only square + systems are handled. Singular matrices result in a divide-by-zero for all + systems except those involving just the matrix L. Iterative refinement is + not performed for singular matrices. + + In the discussion below, n is equal to n_row and n_col, because only + square systems are handled. + +Returns: + + The status code is returned. See Info [UMFPACK_STATUS], below. + +Arguments: + + Int sys ; Input argument, not modified. + + Defines which system to solve. (') is the linear algebraic transpose. + + sys value system solved + + UMFPACK_A Ax=b + UMFPACK_At A'x=b + UMFPACK_Pt_L P'Lx=b + UMFPACK_L Lx=b + UMFPACK_Lt_P L'Px=b + UMFPACK_Lt L'x=b + UMFPACK_U_Qt UQ'x=b + UMFPACK_U Ux=b + UMFPACK_Q_Ut QU'x=b + UMFPACK_Ut U'x=b + + Iterative refinement can be optionally performed when sys is any of + the following: + + UMFPACK_A Ax=b + UMFPACK_At A'x=b + + For the other values of the sys argument, iterative refinement is not + performed (Control [UMFPACK_IRSTEP], Ap, Ai, and Ax are ignored). + + Int Ap [n+1] ; Input argument, not modified. + Int Ai [nz] ; Input argument, not modified. + double Ax [nz] ; Input argument, not modified. + + If iterative refinement is requested (Control [UMFPACK_IRSTEP] >= 1, + Ax=b or A'x=b is being solved, and A is nonsingular), then + these arrays must be identical to the same ones passed to + umfpack_di_numeric. The umfpack_di_solve routine does not check the + contents of these arguments, so the results are undefined if Ap, Ai, Ax, + are modified between the calls the umfpack_di_numeric and + umfpack_di_solve. These three arrays do not need to be present (NULL + pointers can be passed) if Control [UMFPACK_IRSTEP] is zero, or if a + system other than Ax=b or A'x=b is being solved, or if A is + singular, since in each of these cases A is not accessed. + + double X [n] ; Output argument. + + The solution to the linear system, where n = n_row = n_col is the + dimension of the matrices A, L, and U. + + double B [n] ; Input argument, not modified. + + The right-hand side vector, b, stored as a conventional array of size n + (or two arrays of size n for complex versions). This routine does not + solve for multiple right-hand-sides, nor does it allow b to be stored in + a sparse-column form. + + void *Numeric ; Input argument, not modified. + + Numeric must point to a valid Numeric object, computed by + umfpack_di_numeric. + + double Control [UMFPACK_CONTROL] ; Input argument, not modified. + + If a (double *) NULL pointer is passed, then the default control + settings are used. + + Control [UMFPACK_IRSTEP]: The maximum number of iterative refinement + steps to attempt. A value less than zero is treated as zero. If + less than 1, or if Ax=b or A'x=b is not being solved, or + if A is singular, then the Ap, Ai, and Ax arguments are not + accessed. Default: 2. + + double Info [UMFPACK_INFO] ; Output argument. + + Contains statistics about the solution factorization. If a + (double *) NULL pointer is passed, then no statistics are returned in + Info (this is not an error condition). The following statistics are + computed in umfpack_di_solve (only the primary statistics are listed): + + Info [UMFPACK_STATUS]: status code. This is also the return value, + whether or not Info is present. + + UMFPACK_OK + + The linear system was successfully solved. + + UMFPACK_WARNING_singular_matrix + + A divide-by-zero occurred. Your solution will contain Inf's + and/or NaN's. Some parts of the solution may be valid. For + example, solving Ax=b with + + A = [2 0] b = [ 1 ] returns x = [ 0.5 ] + [0 0] [ 0 ] [ Inf ] + + UMFPACK_ERROR_out_of_memory + + Insufficient memory to solve the linear system. + + UMFPACK_ERROR_argument_missing + + One or more required arguments are missing. The B and X + arguments are always required. Info and Control are not + required. Ap, Ai and Ax are required if Ax=b or + A'x=b is to be solved, the (default) iterative + refinement is requested, and the matrix A is nonsingular. + + UMFPACK_ERROR_invalid_system + + The sys argument is not valid, or the matrix A is not square. + + UMFPACK_ERROR_invalid_Numeric_object + + The Numeric object is not valid. + + Info [UMFPACK_SOLVE_FLOPS]: the number of floating point operations + performed to solve the linear system. This includes the work + taken for all iterative refinement steps, including the backtrack + (if any). + + Info [UMFPACK_SOLVE_TIME]: The time taken, in seconds. +\end{verbatim} +} + + +%------------------------------------------------------------------------------- +\newpage + +\subsection{umfpack\_di\_free\_symbolic} +{\footnotesize +\begin{verbatim} +void umfpack_di_free_symbolic +( + void **Symbolic +) ; + +Purpose: + + Deallocates the Symbolic object and sets the Symbolic handle to NULL. + +Arguments: + + void **Symbolic ; Input argument, deallocated and Symbolic is + set to (void *) NULL on output. +\end{verbatim} +} + +%------------------------------------------------------------------------------- +\subsection{umfpack\_di\_free\_numeric} + +{\footnotesize +\begin{verbatim} +void umfpack_di_free_numeric +( + void **Numeric +) ; + +Purpose: + + Deallocates the Numeric object and sets the Numeric handle to NULL. + +Arguments: + + void **Numeric ; Input argument, deallocated and Numeric is + set to (void *) NULL on output. +\end{verbatim} +} + +%------------------------------------------------------------------------------- +\subsection{umfpack\_di\_defaults} + +{\footnotesize +\begin{verbatim} +void umfpack_di_defaults +( + double Control [UMFPACK_CONTROL] +) ; + +Purpose: + + Sets the default control parameter settings. + +Arguments: + + double Control [UMFPACK_CONTROL] ; Output argument. + + Control is set to the default control parameter settings. +\end{verbatim} +} +\end{document} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Doc/UserGuide.bib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Doc/UserGuide.bib Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,322 @@ +@string{TOMS = "ACM Trans. Math. Softw."} +@string{SIMAX = "SIAM J. Matrix Anal. Applic."} +@string{SINUM = "SIAM J. Numer. Anal."} +@string{SIAMJSC = "SIAM J. Sci. Comput."} +@string{SIAMJSSC = "SIAM J. Sci. Statist. Comput."} +@string{IJNME = "Internat. J. Numer. Methods Eng."} +@string{SIAMJADM = "SIAM J. Alg. Disc. Meth."} + +@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}} + +@techreport{AmestoyDavisDuff03_user, + author={Amestoy, P. R. and Davis, T. A. and Duff, I. S.}, + title={{AMD} Version 1.0 User Guide}, + institution={CISE Dept., Univ. of Florida}, + year={2003} + ,number={TR-03-011} + ,address={Gainesville, FL} + ,note={www.cise.ufl.edu/tech-reports.} + } + +@article{Davis03, + author={Davis, T. A.}, + title={A column pre-ordering strategy for the unsymmetric-pattern multifrontal method}, + journal=TOMS, + year={2004} + ,volume={30} + ,number={2} + ,pages={165-195}} + +@article{Davis03_algo, + author={Davis, T. A.}, + title={Algorithm 832: {UMFPACK}, an unsymmetric-pattern multifrontal method}, + journal=TOMS, + year={2004} + ,volume={30} + ,number={2} + ,pages={196-199}} + +@techreport{Davis03_umf, + author={Davis, T. A.}, + title={{UMFPACK} Version 4.4 User Guide}, + institution={Univ. of Florida, CISE Dept.}, + year={2004} + ,number={TR-04-003} + ,address={Gainesville, FL} + ,note={(www.cise.ufl.edu/tech-reports)} + } + +@techreport{Davis03_umfquick, + author={Davis, T. A.}, + title={{UMFPACK} Version 4.4 Quick Start Guide}, + institution={Univ. of Florida, CISE Dept.}, + year={2004} + ,number={TR-04-005} + ,address={Gainesville, FL} + ,note={(www.cise.ufl.edu/tech-reports)} + } + +@article{DavisDuff97, + author={Davis, T. A. and Duff, I. S.}, + title={An unsymmetric-pattern multifrontal method for sparse {LU} factorization}, + journal=SIMAX, + year={1997} + ,volume={18} + ,number={1} + ,pages={140-158}} + +@article{DavisDuff99, + author={Davis, T. A. and Duff, I. S.}, + title={A combined unifrontal/multifrontal method for unsymmetric sparse matrices}, + journal=TOMS, + volume={25}, + number={1}, + pages={1-19}, + year={1999}} + +@article{SuperLU99, + author={Demmel, J. W. and Eisenstat, S. C. and Gilbert, J. R. and Li, X. S. and Liu, J. W. H.}, + title={A supernodal approach to sparse partial pivoting}, + journal=SIMAX, + year={1999} + ,volume={20} + ,number={3} + ,pages={720-755} + ,note={www.netlib.org} + } + +@article{ACM679a, + author={Dongarra, J. J. and Du Croz, J. and Duff, I. S. and Hammarling, S.}, + title={A set of level-3 basic linear algebra subprograms}, + journal=TOMS, + year={1990} + ,volume={16} + ,number={1} + ,pages={1--17}} + +@article{netlib, + author={Dongarra, J. J. and Grosse, E.}, + title={Distribution of mathematical software via electronic mail}, + journal={Comm. ACM}, + year={1987} + ,volume={30} + ,pages={403-407} + ,note={www.netlib.org} + } + +@article{Duff78b, + author={Duff, I. S. and Reid, J. K.}, + year={1978}, + title={Algorithm 529: Permutations to Block Triangular Form}, + journal=TOMS, + volume={4}, + annote={f}, + number={2}, + pages={189-192}, + keywords={102 ordering block triangular form}} + +@article{Duff81b, + author={Duff, I. S.}, + year={1981}, + title={Algorithm 575: Permutations for a Zero-Free Diagonal}, + journal=TOMS, + annote={f}, + volume={7}, + pages={387-390}, + keywords={ordering, zero-free diagonal}} + +@techreport{GotoVandeGeijn02, + author = {Goto, K. and van de Geijn, R.}, + title = {On Reducing {TLB} Misses in Matrix Multiplication, {FLAME} Working Note 9}, + institution={The University of Texas at Austin, Department of Computer Sciences}, + number={TR-2002-55}, + month={Nov.}, + year={2002}} + +@article{GeorgeNg85, + author={George, A. and Ng, E. G.}, + year={1985}, + title={An Implementation of {G}aussian Elimination with + Partial Pivoting for Sparse Systems}, + journal=SIAMJSSC, + volume={6}, + number={2}, + pages={390-409}} + +@article{GeorgeNg87, + author={George, A. and Ng, E. G.}, + year={1987}, + title={Symbolic Factorization for Sparse {G}aussian Elimination + with Partial Pivoting}, + journal={SIAM J. Sci. Statist. Comput.}, + volume={8}, + number={6}, + pages={877-898}} + +@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}} + +@article{GilbertPeierls88, + author={Gilbert, J. R. and Peierls, T.}, + year={1988}, + title={Sparse Partial Pivoting in Time Proportional to Arithmetic Operations}, + journal={SIAM J. Sci. Statist. Comput.}, + volume={9}, + pages={862-874}} + +@article{Gustavson78, + author={Gustavson, F. G.}, + year={1978}, + title={Two Fast Algorithms for Sparse Matrices: Multiplication and Permuted Transposition}, + journal=TOMS, + volume={4}, + number={3}, + pages={250-269}} + +@techreport{Larimore98, + author={Larimore, S. I.}, + title={An approximate minimum degree column ordering algorithm}, + institution={Univ. of Florida, CISE Dept.}, + year={1998} + ,number={TR-98-016} + ,address={Gainesville, FL} + ,note={www.cise.ufl.edu/tech-reports}} + +@article{DavisGilbertLarimoreNg00, + 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} + ,number={3} + ,pages={353-376}} + +@article{DavisGilbertLarimoreNg00_algo, + author={Davis, T. A. and Gilbert, J. R. and Larimore, S. I. and Ng, E. G.}, + title={Algorithm 836: {COLAMD}, a column approximate minimum degree ordering algorithm}, + journal=TOMS, + year={2004} + ,volume={30} + ,number={3} + ,pages={377-380}} + +@INCOLLECTION{GilbertNg93, + author = {J. R. Gilbert and E. G. Ng}, + editor = {A. George and J. R. Gilbert and J. W.H. Liu}, + year = 1993, + title = {Predicting Structure in Nonsymmetric Sparse Matrix Factorizations}, + booktitle = {Graph Theory and Sparse Matrix Computation}, + series = {Volume 56 of the {IMA} Volumes in Mathematics and its Applications}, + pages = {107-139}, + publisher = {Springer-Verlag} +} + + +@techreport{ATLAS, + author={Whaley, R. C and Petitet, A. and Dongarra, J. J.}, + title={Automated Emperical Optimization of Software and the {ATLAS} Project}, + institution={Computer Science Department, The University of Tennessee}, + year={2000} + ,number={LAPACK Working Note 147} + ,month={September} + ,note={www.netlib.org/atlas} + } + +@article{DaydeDuff99, + author = "M. J. Dayd\'{e} and I. S. Duff", + title = "The {RISC} {BLAS}: A Blocked Implementation of Level 3 {BLAS} for {RISC} Processors", + journal = TOMS, + volume = "25", + number = "3", + month = {Sept.}, + year ="1999" + } + + +@article{ardd:89, + author = {M. Arioli and J. W. Demmel and I. S. Duff}, + year = "1989", + title = {Solving sparse linear systems with sparse backward error}, + journal = SIMAX, + volume = {10}, + pages = {165-190} +} + + +@article{DavisHager99, + author={Davis, T. A. and Hager, W. W.}, + title={Modifying a sparse {C}holesky factorization}, + journal=SIMAX, + year={1999} + ,volume={20} + ,number={3} + ,pages={606-627} + } + + +@article{dusc:96, + author = {I. S. Duff and J. A. Scott}, + title = {The design of a new frontal code for solving sparse unsymmetric systems}, + journal = TOMS, + year = "1996", + volume = "22", + number = "1", + pages = "30-45" + } + + +@article{Duff78a, + author={Duff, I. S. and Reid, J. K.}, + year={1978}, + title={An Implementation of {T}arjan's Algorithm for the Block Triangularization of a Matrix}, + journal=TOMS, + volume={4}, + number={2}, + pages={137-147} + } + +@book{GeorgeLiu, + author={George, A. and Liu, J. W. H.}, + year={1981}, + title={Computer Solution of Large Sparse Positive Definite Systems}, + publisher={Englewood Cliffs, New Jersey: Prentice-Hall} + } + +@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} + } + +@techreport{DuffGrimesLewis87b, + author={Duff, I. S. and Grimes, R. G. and Lewis, J. G.}, + year={1987}, + title={Users' Guide for the Harwell-Boeing Sparse Matrix Test Collection}, + institution={AERE Harwell Laboratory, United Kingdom Atomic Energy Authority}} + diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Doc/UserGuide.pdf Binary file liboctave/UMFPACK/UMFPACK/Doc/UserGuide.pdf has changed diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Doc/UserGuide.sed1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Doc/UserGuide.sed1 Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,33 @@ +/INCLUDE umfpack_col_to_triplet.h/r ../Include/umfpack_col_to_triplet.h +/INCLUDE umfpack_defaults.h/r ../Include/umfpack_defaults.h +/INCLUDE umfpack_free_numeric.h/r ../Include/umfpack_free_numeric.h +/INCLUDE umfpack_free_symbolic.h/r ../Include/umfpack_free_symbolic.h +/INCLUDE umfpack_get_lunz.h/r ../Include/umfpack_get_lunz.h +/INCLUDE umfpack_get_numeric.h/r ../Include/umfpack_get_numeric.h +/INCLUDE umfpack_get_symbolic.h/r ../Include/umfpack_get_symbolic.h +/INCLUDE umfpack_get_scale.h/r ../Include/umfpack_get_scale.h +/INCLUDE umfpack_numeric.h/r ../Include/umfpack_numeric.h +/INCLUDE umfpack_qsymbolic.h/r ../Include/umfpack_qsymbolic.h +/INCLUDE umfpack_report_control.h/r ../Include/umfpack_report_control.h +/INCLUDE umfpack_report_info.h/r ../Include/umfpack_report_info.h +/INCLUDE umfpack_report_matrix.h/r ../Include/umfpack_report_matrix.h +/INCLUDE umfpack_report_numeric.h/r ../Include/umfpack_report_numeric.h +/INCLUDE umfpack_report_perm.h/r ../Include/umfpack_report_perm.h +/INCLUDE umfpack_report_status.h/r ../Include/umfpack_report_status.h +/INCLUDE umfpack_report_symbolic.h/r ../Include/umfpack_report_symbolic.h +/INCLUDE umfpack_report_triplet.h/r ../Include/umfpack_report_triplet.h +/INCLUDE umfpack_report_vector.h/r ../Include/umfpack_report_vector.h +/INCLUDE umfpack_simple.c/r ../Demo/umfpack_simple.c +/INCLUDE umfpack_solve.h/r ../Include/umfpack_solve.h +/INCLUDE umfpack_scale.h/r ../Include/umfpack_scale.h +/INCLUDE umfpack_symbolic.h/r ../Include/umfpack_symbolic.h +/INCLUDE umfpack_timer.h/r ../Include/umfpack_timer.h +/INCLUDE umfpack_tictoc.h/r ../Include/umfpack_tictoc.h +/INCLUDE umfpack_transpose.h/r ../Include/umfpack_transpose.h +/INCLUDE umfpack_triplet_to_col.h/r ../Include/umfpack_triplet_to_col.h +/INCLUDE umfpack_wsolve.h/r ../Include/umfpack_wsolve.h +/INCLUDE umfpack_load_numeric.h/r ../Include/umfpack_load_numeric.h +/INCLUDE umfpack_load_symbolic.h/r ../Include/umfpack_load_symbolic.h +/INCLUDE umfpack_save_numeric.h/r ../Include/umfpack_save_numeric.h +/INCLUDE umfpack_save_symbolic.h/r ../Include/umfpack_save_symbolic.h +/INCLUDE umfpack_get_determinant.h/r ../Include/umfpack_get_determinant.h diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Doc/UserGuide.sed2 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Doc/UserGuide.sed2 Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,3 @@ +/[/][*]/d +/[*][/]/d +/INCLUDE umfpack/d diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Doc/UserGuide.stex --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Doc/UserGuide.stex Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,2673 @@ +%------------------------------------------------------------------------------- +% The UserGuide.stex file. Processed into UserGuide.tex via sed. +%------------------------------------------------------------------------------- + +\documentclass[11pt]{article} + +\newcommand{\m}[1]{{\bf{#1}}} % for matrices and vectors +\newcommand{\tr}{^{\sf T}} % transpose +\newcommand{\he}{^{\sf H}} % complex conjugate transpose +\newcommand{\implies}{\rightarrow} + +\topmargin 0in +\textheight 9in +\oddsidemargin 0pt +\evensidemargin 0pt +\textwidth 6.5in + +\begin{document} + +\author{Timothy A. Davis \\ +Dept. of Computer and Information Science and Engineering \\ +Univ. of Florida, Gainesville, FL} +\title{UMFPACK Version 4.4 User Guide} +\date{Jan. 28, 2005} +\maketitle + +%------------------------------------------------------------------------------- +\begin{abstract} + UMFPACK is a set of routines for solving unsymmetric sparse linear + systems, $\m{Ax}=\m{b}$, using the Unsymmetric MultiFrontal method + and direct sparse LU factorization. It is written in ANSI/ISO C, with a + MATLAB interface. UMFPACK relies on the Level-3 Basic + Linear Algebra Subprograms (dense matrix multiply) for its performance. + This code works on Windows and many versions of Unix (Sun Solaris, + Red Hat Linux, IBM AIX, SGI IRIX, and Compaq Alpha). +\end{abstract} +%------------------------------------------------------------------------------- + +Technical Report TR-04-003 (revised) + +UMFPACK Version 4.4 (Jan. 28, 2005), Copyright\copyright 2005 by Timothy A. +Davis. All Rights Reserved. + +{\bf UMFPACK License:} + Your use or distribution of UMFPACK or any modified version of + UMFPACK implies that you agree to this License. + + THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY + EXPRESSED OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + + Permission is hereby granted to use or copy this program, 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 UMFPACK or any modified version of UMFPACK 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. This + software was developed with support from the National Science Foundation, + and is provided to you free of charge. + +{\bf Availability:} + http://www.cise.ufl.edu/research/sparse/umfpack + +{\bf Acknowledgments:} + + This work was supported by the National Science Foundation, under + grants DMS-9504974, DMS-9803599, and CCR-0203270. + The upgrade to Version 4.1 and the inclusion of the + symmetric and 2-by-2 pivoting strategies + were done while the author was on sabbatical at + Stanford University and Lawrence Berkeley National Laboratory. + +%------------------------------------------------------------------------------- +\newpage +%------------------------------------------------------------------------------- + +\tableofcontents + +%------------------------------------------------------------------------------- +\newpage +\section{Overview} +%------------------------------------------------------------------------------- + +UMFPACK\footnote{Pronounced with two syllables: umph-pack} +Version 4.4 is a set of routines for solving systems of linear +equations, $\m{Ax}=\m{b}$, when $\m{A}$ is sparse and unsymmetric. It is based +on the Unsymmetric-pattern MultiFrontal method \cite{DavisDuff97,DavisDuff99}. +UMFPACK factorizes +$\m{PAQ}$, $\m{PRAQ}$, or $\m{PR}^{-1}\m{AQ}$ into the product $\m{LU}$, +where $\m{L}$ and $\m{U}$ +are lower and upper triangular, respectively, $\m{P}$ and $\m{Q}$ are +permutation matrices, and $\m{R}$ is a diagonal matrix of row scaling factors +(or $\m{R}=\m{I}$ if row-scaling is not used). Both $\m{P}$ and $\m{Q}$ are +chosen to reduce fill-in (new nonzeros in $\m{L}$ and $\m{U}$ that are not +present in $\m{A}$). The permutation $\m{P}$ has the dual role of reducing +fill-in and maintaining numerical accuracy (via relaxed partial pivoting +and row interchanges). + +The sparse matrix $\m{A}$ can be square or rectangular, singular +or non-singular, and real or complex (or any combination). Only square +matrices $\m{A}$ can be used to solve $\m{Ax}=\m{b}$ or related systems. +Rectangular matrices can only be factorized. + +UMFPACK first finds a column pre-ordering that reduces fill-in, without regard +to numerical values. It scales and analyzes the matrix, and then automatically +selects one of three strategies for pre-ordering the rows and columns: +{\em unsymmetric}, +{\em 2-by-2}, and +{\em symmetric}. These strategies are described below. + +First, all pivots with zero Markowitz cost are eliminated and placed in the +LU factors. The remaining submatrix $\m{S}$ is then analyzed. +The following rules are applied, and the first one that matches defines +the strategy. + +\begin{itemize} +\item Rule 1: $\m{A}$ rectangular $\implies$ unsymmetric. +\item Rule 2: + If the zero-Markowitz elimination results in a rectangular $\m{S}$, + or an $\m{S}$ whose diagonal has not been preserved, the + unsymmetric strategy is used. +\item The symmetry $\sigma_1$ of $\m{S}$ is computed. It is defined as + the number of {\em matched} off-diagonal entries, divided by the + total number of off-diagonal entries. An entry $s_{ij}$ is matched + if $s_{ji}$ is also an entry. They need not be numerically equal. + An {\em entry} is a value in $\m{A}$ which is present + in the input data structure. All nonzeros are entries, but some entries + may be numerically zero. + Rule 3: $\sigma_1 < 0.1 \implies$ unsymmetric. + The matrix is very unsymmetric. +\item Let $d$ be the number of nonzero entries on the diagonal of $\m{S}$. + Let $\m{S}$ be $\nu$-by-$\nu$. + Rule 4: $(\sigma_1 \ge 0.7) \:\wedge\: (d = \nu) \implies$ symmetric. + The matrix has a nearly symmetric nonzero pattern, and a zero-free + diagonal. +\end{itemize} + +If the strategy has not yet been determined, +the 2-by-2 strategy is attempted. A row permutation $\m{P}_2$ +is found which attempts to reduce the number of small +diagonal entries of $\m{P}_2 \m{S}$. +An entry $s_{ij}$ is determined to be small if +$|s_{ij}| < 0.01 \max |s_{*j}|$, or large otherwise. +If $s_{ii}$ is numerically small, the method attempts to swap +two rows $i$ and $j$, such that both $s_{ij}$ and $s_{ji}$ are large. +Once these rows are swapped, +they remain in place. Let $\sigma_2$ be the symmetry of $\m{P}_2 \m{S}$, +and let $d_2$ be the number of nonzero entries (either small or large) +on the diagonal of $\m{P}_2 \m{S}$. + +\begin{itemize} +\item Rule 5: + ($\sigma_2 > 1.1 \sigma_1) \:\wedge\: (d_2 > 0.9 \nu) \implies$ 2-by-2. + The 2-by-2 permutation has made the matrix significantly more symmetric. +\item Rule 6: $\sigma_2 < 0.7 \sigma_1 \implies$ unsymmetric. + The 2-by-2 strategy has significantly deteriorated the symmetry, +\item Rule 7: $\sigma_2 < 0.25 \implies$ unsymmetric. + The matrix is still very unsymmetric. +\item Rule 8: $\sigma_2 \ge 0.51 \implies$ 2-by-2. + The matrix is roughly symmetric. +\item Rule 9: $\sigma_2 \ge 0.999 \sigma_1 \implies$ 2-by-2. + The 2-by-2 permutation has preserved symmetry, or made it only + slightly worse. +\item Rule 10: if no rule has yet triggered, use the unsymmetric strategy. +\end{itemize} + +Each strategy is described below: +\begin{itemize} +\item {\em unsymmetric}: +The column pre-ordering of $\m{S}$ is computed by a modified version of COLAMD +\cite{DavisGilbertLarimoreNg00_algo,DavisGilbertLarimoreNg00,Larimore98}. +The method finds a symmetric permutation $\m{Q}$ of the matrix $\m{S}\tr\m{S}$ +(without forming $\m{S}\tr\m{S}$ explicitly). This is a good choice for +$\m{Q}$, since the Cholesky factors of $\m{(SQ)\tr(SQ)}$ are an upper bound (in +terms of nonzero pattern) of the factor $\m{U}$ for the unsymmetric LU +factorization ($\m{PSQ}=\m{LU}$) regardless of the choice of $\m{P}$ +\cite{GeorgeNg85,GeorgeNg87,GilbertNg93}. This modified version of +COLAMD also computes the column elimination tree and post-orders the +tree. It finds the upper bound on the number of nonzeros in L and U. +It also has a different threshold for determining dense rows and columns. +During factorization, the column pre-ordering can be modified. +Columns within a single super-column can be reshuffled, to reduce fill-in. +Threshold partial pivoting is used with no preference given to the diagonal +entry. Within a given pivot column $j$, an entry $a_{ij}$ can be chosen if +$|a_{ij}| \ge 0.1 \max |a_{*j}|$. Among those numerically acceptable +entries, the sparsest row $i$ is chosen as the pivot row. + +\item {\em 2-by-2}: +The symmetric strategy (see below) is applied to the matrix $\m{P}_2 \m{S}$, +rather than $\m{S}$. + +\item {\em symmetric}: +The column ordering is computed from AMD +\cite{AmestoyDavisDuff96,AmestoyDavisDuff03}, +applied to the pattern of $\m{S}+\m{S}\tr$ +followed by a post-ordering of the supernodal elimination +tree of $\m{S}+\m{S}\tr$. +No modification of the column pre-ordering is made during numerical +factorization. Threshold partial pivoting is used, with a strong +preference given to the diagonal entry. The diagonal entry is chosen if +$a_{jj} \ge 0.001 \max |a_{*j}|$. Otherwise, a sparse row is selected, +using the same method used by the unsymmetric strategy. + +\end{itemize} + +The symmetric and 2-by-2 strategies, and their automatic selection, +are new to Version 4.1. Version 4.0 only used the unsymmetric strategy. + +Once the strategy is selected, +the factorization of the matrix $\m{A}$ is broken down into the factorization +of a sequence of dense rectangular frontal matrices. The frontal matrices are +related to each other by a supernodal column elimination tree, in which each +node in the tree represents one frontal matrix. This analysis phase also +determines upper bounds on the memory usage, the floating-point operation count, +and the number of nonzeros in the LU factors. + +UMFPACK factorizes each {\em chain} of frontal matrices in a single working +array, similar to how the unifrontal method \cite{dusc:96} factorizes the whole +matrix. A chain of frontal matrices is a sequence of fronts where the parent +of front $i$ is $i$+1 in the supernodal column elimination tree. For the +nonsingular matrices factorized with the unsymmetric strategy, there are +exactly the same number of chains as there are leaves in the supernodal +column elimination tree. UMFPACK is an +outer-product based, right-looking method. At the $k$-th step of Gaussian +elimination, it represents the updated submatrix $\m{A}_k$ as an implicit +summation of a set of dense sub-matrices (referred to as {\em elements}, +borrowing a phrase from finite-element methods) that arise when the frontal +matrices are factorized and their pivot rows and columns eliminated. + +Each frontal matrix represents the elimination of one or more columns; +each column of $\m{A}$ will be eliminated in a specific frontal matrix, +and which frontal matrix will be used for which column is determined by +the pre-analysis phase. The pre-analysis phase also determines the worst-case +size of each frontal matrix so that they can hold any candidate pivot column +and any candidate pivot row. From the perspective of the analysis phase, any +candidate pivot column in the frontal matrix is identical (in terms of nonzero +pattern), and so is any row. However, the numeric factorization phase has +more information than the analysis phase. It uses this information to reorder +the columns within each frontal matrix to reduce fill-in. Similarly, since +the number of nonzeros in each row and column are maintained (more precisely, +COLMMD-style approximate degrees \cite{GilbertMolerSchreiber}), a pivot row can +be selected based on sparsity-preserving criteria (low degree) as well as +numerical considerations (relaxed threshold partial pivoting). + +When the symmetric or 2-by-2 strategies are used, +the column preordering is not refined during numeric factorization. +Row pivoting for sparsity and numerical accuracy is performed if the +diagonal entry is too small. + +More details of the method, including experimental results, are +described in \cite{Davis03,Davis03_algo}, available at +http://www.cise.ufl.edu/tech-reports. + +%------------------------------------------------------------------------------- +\section{Availability} +%------------------------------------------------------------------------------- + +In addition to appearing as a Collected Algorithm of the ACM, +UMFPACK Version 4.4 is available at http://www.cise.ufl.edu/research/sparse. +Version 4.3 is included as a built-in routine in MATLAB +7.1. Version 4.0 (in MATLAB 6.5) +does not have the symmetric or 2-by-2 strategies and it takes +less advantage of the level-3 +BLAS \cite{DaydeDuff99,ACM679a,ATLAS,GotoVandeGeijn02}. +Version 4.4 (and v4.3 through v4.1) tend to be much faster than Version 4.0, +particularly on unsymmetric matrices with mostly symmetric +nonzero pattern (such as finite element and circuit simulation matrices). +Version 3.0 and following make +use of a modified version of COLAMD V2.0 by Timothy A.~Davis, Stefan +Larimore, John Gilbert, and Esmond Ng. The original COLAMD V2.1 is available in +as a built-in routine in MATLAB V6.0 (or later), and at +http://www.cise.ufl.edu/research/sparse. +These codes are also available in Netlib \cite{netlib} at +http://www.netlib.org. +UMFPACK Versions 2.2.1 and earlier, co-authored with Iain Duff, +are available at http://www.cise.ufl.edu/research/sparse and as +MA38 (functionally equivalent to Version 2.2.1) in the Harwell +Subroutine Library. + +%------------------------------------------------------------------------------- +\section{Primary changes from prior versions} +%------------------------------------------------------------------------------- + +A detailed list of changes is in the {\tt ChangeLog} file. + +%------------------------------------------------------------------------------- +\subsection{Version 4.4} +%------------------------------------------------------------------------------- + +Bug fix in strategy selection in {\tt umfpack\_*\_qsymbolic}. +Added packed complex case for all complex input/output arguments. +Added {\tt umfpack\_get\_determinant}. +Added minimal support for Microsoft Visual Studio +(the {\tt umf\_multicompile.c} file). + +%------------------------------------------------------------------------------- +\subsection{Version 4.3.1} +%------------------------------------------------------------------------------- + +Minor bug fix in the forward/backsolve. This bug had the effect of turning +off iterative refinement when solving $\m{A}\tr\m{x}=\m{b}$ after factorizing +$\m{A}$. UMFPACK mexFunction now factorizes $\m{A}\tr$ in its forward-slash +operation. + +%------------------------------------------------------------------------------- +\subsection{Version 4.3} +%------------------------------------------------------------------------------- + +No changes are visible to the C or MATLAB user, except the presence of +one new control parameter in the {\tt Control} array, +and three new statistics in the {\tt Info} array. +The primary change is the addition of an (optional) drop tolerance. + +%------------------------------------------------------------------------------- +\subsection{Version 4.1} +%------------------------------------------------------------------------------- + +The following is a summary of the main changes that are visible to the C +or MATLAB user: + +\begin{enumerate} + +\item New ordering strategies added. No changes are required in user code + (either C or MATLAB) to use the new default strategy, which is an automatic + selection of the unsymmetric, symmetric, or 2-by-2 strategies. + +\item Row scaling added. This is only visible to the MATLAB caller when using + the form {\tt [L,U,P,Q,R] = umfpack (A)}, to retrieve the LU factors. + Likewise, it is only visible to the C caller when the LU factors are + retrieved, or when solving systems with just $\m{L}$ or $\m{U}$. + New C-callable and MATLAB-callable routines are included to get and to + apply the scale factors computed by UMFPACK. Row scaling is enabled by + default, but can be disabled. Row scaling usually leads to a better + factorization, particularly when the symmetric strategy is used. + +\item Error code {\tt UMFPACK\_ERROR\_problem\_to\_large} removed. + Version 4.0 would generate this error when the upper bound memory usage + exceeded 2GB (for the {\tt int} version), even when the actual memory + usage was less than this. The new version properly handles this case, + and can successfully factorize the matrix if sufficient memory is + available. + +\item New control parameters and statistics provided. + +\item The AMD symmetric approximate minimum degree ordering routine added + \cite{AmestoyDavisDuff96,AmestoyDavisDuff03}. + It is used by UMFPACK, and can also be called independently from C or + MATLAB. + +\item The {\tt umfpack} mexFunction now returns permutation matrices, not + permutation vectors, when using the form {\tt [L,U,P,Q] = umfpack (A)} + or the new form {\tt [L,U,P,Q,R] = umfpack (A)}. + +\item New arguments added to the user-callable routines + {\tt umfpack\_*\_symbolic}, + {\tt umfpack\_*\_qsymbolic}, + {\tt umfpack\_*\_get\_numeric}, and + {\tt umfpack\_*\_get\_symbolic}. + The symbolic analysis now makes use of the numerical values of the matrix + $\m{A}$, to guide the 2-by-2 strategy. The subsequent matrix passed to + the numeric factorization step does not have to have the same numerical + values. All of the new arguments are optional. If you do not wish to + include them, simply pass {\tt NULL} pointers instead. The 2-by-2 strategy + will assume all entries are numerically large, for example. + +\item New routines added to save and load the {\tt Numeric} and {\tt Symbolic} + objects to and from a binary file. + +\item A Fortran interface added. It provides access to a subset of + UMFPACK's features. + +\item You can compute an incomplete LU factorization, by dropping small + entries from $\m{L}$ and $\m{U}$. By default, no nonzero entry is + dropped, no matter how small in absolute value. This feature is new + to Version 4.3. + +\end{enumerate} + +%------------------------------------------------------------------------------- +\section{Using UMFPACK in MATLAB} +%------------------------------------------------------------------------------- + +The easiest way to use UMFPACK is within MATLAB. Version 4.3 is a built-in +routine in MATLAB 7.1, and is used in {\tt x = A}$\backslash${\tt b} when +{\tt A} is sparse, square, unsymmetric (or symmetric but not positive definite), +and with nonzero entries that are not confined in a narrow band. +It is also used for the {\tt [L,U,P,Q] = lu (A)} usage of {\tt lu}. +Type {\tt help lu} in MATLAB 6.5 or later for more details. + +To use the UMFPACK mexFunction, you must download and compile it, +since the mexFunction itself is not part of MATLAB. +The following discussion assumes that +you have MATLAB Version 6.0 or later (which includes the BLAS, and the +{\tt colamd} ordering routine). To compile both the UMFPACK and AMD +mexFunctions, just type {\tt make} in the Unix system shell, +while in the {\tt UMFPACK} directory. +You can also type {\tt umfpack\_make} in MATLAB, if you are in the +{\tt UMFPACK/MATLAB} directory, or if that directory is in your MATLAB path. +This works on any system with MATLAB, including Windows. +See Section~\ref{Install} for more details on how to install UMFPACK. +Once installed, the UMFPACK mexFunction can analyze, factor, and solve linear +systems. Table~\ref{matlab} summarizes some of the more common uses +of the UMFPACK mexFunction within MATLAB. + +An optional input argument can be used to modify the control parameters for +UMFPACK, and an optional output argument provides statistics on the +factorization. + +Refer to the AMD User Guide for more details about the AMD mexFunction. + +\begin{table} +\caption{Using UMFPACK's MATLAB interface} +\label{matlab} +\vspace{0.1in} +{\footnotesize +\begin{tabular}{l|l|l} +\hline +Function & Using UMFPACK & MATLAB 6.0 equivalent \\ +\hline + & & \\ +\begin{minipage}[t]{1.5in} +Solve $\m{Ax}=\m{b}$. +\end{minipage} +& +\begin{minipage}[t]{2.2in} +\begin{verbatim} +x = umfpack (A,'\',b) ; +\end{verbatim} +\end{minipage} +& +\begin{minipage}[t]{2.2in} +\begin{verbatim} +x = A \ b ; +\end{verbatim} +\end{minipage} + \\ + & & \\ +\hline + & & \\ +\begin{minipage}[t]{1.5in} +Solve $\m{Ax}=\m{b}$ using a different row and column pre-ordering +(symmetric ordering). +\end{minipage} +& +\begin{minipage}[t]{2.2in} +\begin{verbatim} +S = spones (A) ; +Q = symamd (S+S') ; +Control = umfpack ; +Control (6) = 3 ; +x = umfpack (A,Q,'\',b,Control) ; +\end{verbatim} +\end{minipage} +& +\begin{minipage}[t]{2.2in} +\begin{verbatim} +spparms ('autommd',0) ; +S = spones (A) ; +Q = symamd (S+S') ; +x = A (Q,Q) \ b (Q) ; +x (Q) = x ; +spparms ('autommd',1) ; +\end{verbatim} +\end{minipage} + \\ + & & \\ +\hline + & & \\ +\begin{minipage}[t]{1.5in} +Solve $\m{A}\tr\m{x}\tr = \m{b}\tr$. +\end{minipage} +& +\begin{minipage}[t]{2.2in} +\begin{verbatim} +x = umfpack (b,'/',A) ; +\end{verbatim} +Note: $\m{A}$ is factorized. +\end{minipage} +& +\begin{minipage}[t]{2.2in} +\begin{verbatim} +x = b / A ; +\end{verbatim} +Note: $\m{A}\tr$ is factorized. +\end{minipage} + \\ + & & \\ +\hline + & & \\ +\begin{minipage}[t]{1.5in} +Scale and factorize $\m{A}$, then solve $\m{Ax}=\m{b}$. +\end{minipage} +& +\begin{minipage}[t]{2.2in} +\begin{verbatim} +[L,U,P,Q,R] = umfpack (A) ; +c = P * (R \ b) ; +x = Q * (U \ (L \ c)) ; +\end{verbatim} +\end{minipage} +& +\begin{minipage}[t]{2.2in} +\begin{verbatim} +[m n] = size (A) ; +r = full (sum (abs (A), 2)) ; +r (find (r == 0)) = 1 ; +R = spdiags (r, 0, m, m) ; +I = speye (n) ; +Q = I (:, colamd (A)) ; +[L,U,P] = lu ((R\A)*Q) ; +c = P * (R \ b) ; +x = Q * (U \ (L \ c)) ; +\end{verbatim} +\end{minipage} + \\ + & & \\ +\hline +\end{tabular} +} +\end{table} + +Note: in MATLAB 6.5 or later, use {\tt spparms ('autoamd',0)} in addition to +{\tt spparms ('autommd',0)}, in Table~\ref{matlab}, to turn off MATLAB's +default reordering. + +UMFPACK requires +{\tt b} to be a dense vector (real or complex) of the appropriate dimension. +This is more restrictive than what you can do with MATLAB's +backslash or forward slash. See {\tt umfpack\_solve} for an M-file that +removes this restriction. +This restriction does not apply to the built-in backslash operator +in MATLAB 6.5 or later, which uses UMFPACK to factorize the matrix. +You can do this yourself in MATLAB: + +{\footnotesize +\begin{verbatim} + [L,U,P,Q,R] = umfpack (A) ; + x = Q * (U \ (L \ (P * (R \ b)))) ; +\end{verbatim} +} + +or, with no row scaling: + +{\footnotesize +\begin{verbatim} + [L,U,P,Q] = umfpack (A) ; + x = Q * (U \ (L \ (P * b))) ; +\end{verbatim} +} + +The above examples do not make use of the iterative refinement +that is built into +{\tt x = }{\tt umfpack (A,'}$\backslash${\tt ',b)} +however. + +MATLAB's {\tt [L,U,P] = lu(A)} returns a lower triangular {\tt L}, an upper +triangular {\tt U}, and a permutation matrix {\tt P} such that {\tt P*A} is +equal to {\tt L*U}. UMFPACK behaves differently. By default, it scales +the rows of {\tt A} and reorders the columns of {\tt A} prior to +factorization, so that {\tt L*U} is equal to {\tt P*(R}$\backslash${\tt A)*Q}, +where {\tt R} is a diagonal sparse matrix of scale factors for the rows +of {\tt A}. The scale factors {\tt R} are applied to {\tt A} via the MATLAB +expression {\tt R}$\backslash${\tt A} to avoid multiplying by +the reciprocal, which can be numerically inaccurate. + +There are more options; you can provide your own column pre-ordering (in which +case UMFPACK does not call COLAMD or AMD), you can modify other control settings +(similar to the {\tt spparms} in MATLAB), and you can get various statistics on +the analysis, factorization, and solution of the linear system. Type +{\tt umfpack\_details} and {\tt umfpack\_report} in MATLAB for more +information. Two demo M-files are provided. Just type {\tt umfpack\_simple} +and {\tt umfpack\_demo} to run them. +The output of these two programs should be about the same +as the files {\tt umfpack\_simple.m.out} and {\tt umfpack\_demo.m.out} +that are provided. + +Factorizing {\tt A'} (or {\tt A.'}) and using the transposed factors can +sometimes be faster than factorizing {\tt A}. It can also be preferable to +factorize {\tt A'} if {\tt A} is rectangular. UMFPACK pre-orders the columns +to maintain sparsity; the row ordering is not determined until the matrix +is factorized. Thus, if {\tt A} is {\tt m} by {\tt n} with rank {\tt m} +and {\tt m} $<$ {\tt n}, then {\tt umfpack} might not find a factor +{\tt U} with a zero-free diagonal. Unless the matrix ill-conditioned or +poorly scaled, factorizing {\tt A'} in this case will guarantee that both +factors will have zero-free diagonals. Here's how you can factorize {\tt A'} +and get the factors of {\tt A} instead: + +\begin{verbatim} + [l,u,p,q] = umfpack (A') ; + L = u' ; + U = l' ; + P = q ; + Q = p ; + clear l u p q +\end{verbatim} + +This is an alternative to {\tt [L,U,P,Q]=umfpack(A)}. + +A simple M-file ({\tt umfpack\_btf}) is provided that first permutes the matrix +to upper block triangular form, using MATLAB's {\tt dmperm} routine, and then +solves each block. The LU factors are not returned. Its usage is simple: +{\tt x = umfpack\_btf(A,b)}. Type {\tt help umfpack\_btf} for more options. +An estimate of the 1-norm of {\tt L*U-P*A*Q} can be computed in MATLAB +as {\tt lu\_normest(P*A*Q,L,U)}, using the {\tt lu\_normest.m} M-file +by Hager and Davis \cite{DavisHager99} that is included with the +UMFPACK distribution. With row scaling enabled, use +{\tt lu\_normest(P*(R}$\backslash${\tt A)*Q,L,U)} instead. + +One issue you may encounter is how UMFPACK allocates its memory when being used +in a mexFunction. One part of its working space is of variable size. The +symbolic analysis phase determines an upper bound on the size of this memory, +but not all of this memory will typically be used in the numerical +factorization. UMFPACK tries to allocate a decent amount of working space. +This is 70\% of the upper bound, by default, for the unsymmetric strategy. +For the symmetric strategy, the fraction of the upper bound is computed +automatically (assuming a best-case scenario with no numerical pivoting +required during numeric factorization). +If this initial allocation fails, it reduces its request +and uses less memory. If the space is not large enough during factorization, +it is increased via {\tt mxRealloc}. + +However, {\tt mxMalloc} and {\tt mxRealloc} abort the {\tt umfpack} mexFunction +if they fail, so this strategy does not work in MATLAB. The strategy works fine +when {\tt malloc} or the internal memory allocator {\tt utMalloc} are used +instead, since those routines return {\tt NULL} on failure, and do not terminate +the mexFunction. The {\tt umfpack} mexFunction can be compiled to use +{\tt utMalloc}, but this is an internal undocumented utility routine in MATLAB, +and thus using {\tt utMalloc} might not always be successful. +To use the documented {\tt mxMalloc} routine instead, compile the +mexFunction with the {\tt -DNUTIL} flag enabled. + +To compute the determinant with UMFPACK: + +\begin{verbatim} + d = umfpack (A, 'det') ; + [d e] = umfpack (A, 'det') ; +\end{verbatim} + +The first case is identical to MATLAB's {\tt det}. +The second case returns the determinant in the form +$d \times 10^e$, which avoids overflow if $e$ is large. + +%------------------------------------------------------------------------------- +\section{Using UMFPACK in a C program} +\label{C} +%------------------------------------------------------------------------------- + +The C-callable UMFPACK library consists of 32 user-callable routines and one +include file. All but three of the routines come in four versions, with +different sizes of integers and for real or complex floating-point numbers: +\begin{enumerate} +\item {\tt umfpack\_di\_*}: real double precision, {\tt int} integers. +\item {\tt umfpack\_dl\_*}: real double precision, {\tt long} integers. +\item {\tt umfpack\_zi\_*}: complex double precision, {\tt int} integers. +\item {\tt umfpack\_zl\_*}: complex double precision, {\tt long} integers. +\end{enumerate} +where {\tt *} denotes the specific name of one of the routines. +Routine names beginning with {\tt umf\_} are internal to the package, +and should not be called by the user. The include file {\tt umfpack.h} +must be included in any C program that uses UMFPACK. +The other three routines are the same for all four versions. + +In addition, the C-callable AMD library distributed with UMFPACK +includes 4 user-callable routines (in two versions with {\tt int} and +{\tt long} integers) and one include file. Refer to the AMD documentation +for more details. + +Use only one version for any one problem; do not attempt to use one version +to analyze the matrix and another version to factorize the matrix, for example. + +The notation {\tt umfpack\_di\_*} refers to all user-callable routines +for the real double precision and {\tt int} integer case. The notation +{\tt umfpack\_*\_numeric}, for example, refers all four versions +(real/complex, int/long) of a single operation +(in this case numeric factorization). + +%------------------------------------------------------------------------------- +\subsection{The size of an integer} +%------------------------------------------------------------------------------- + +The {\tt umfpack\_di\_*} and {\tt umfpack\_zi\_*} routines use {\tt int} integer +arguments; those starting with {\tt umfpack\_dl\_} or {\tt umfpack\_zl\_} +use {\tt long} integer arguments. If you compile UMFPACK 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 UMFPACK 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. In the LP64 mode, the {\tt umfpack\_dl\_*} +and {\tt umfpack\_zl\_*} routines can solve huge +problems (not limited to 2GB), limited of course by the amount of available +memory. The only drawback to the 64-bit mode is that not all BLAS libraries +support 64-bit integers. This limits the performance you will obtain. +Those that do support 64-bit integers are specific to particular +architectures, and are not portable. UMFPACK and AMD should be compiled +in the same mode. +If you compile UMFPACK and AMD in the LP64 mode, +be sure to add {\tt -DLP64} to the compilation command. See the examples in +{\tt Make.alpha}, {\tt Make.sgi}, and {\tt Make.solaris}. + +%------------------------------------------------------------------------------- +\subsection{Real and complex floating-point} +%------------------------------------------------------------------------------- + +The {\tt umfpack\_di\_*} and {\tt umfpack\_dl\_*} routines take (real) double +precision arguments, and return double precision arguments. In the +{\tt umfpack\_zi\_*} and {\tt umfpack\_zl\_*} routines, these same arguments +hold the real part of the matrices; and second double precision arrays hold +the imaginary part of the input and output matrices. Internally, complex +numbers are stored in arrays with their real and imaginary parts interleaved, +as required by the BLAS (``packed'' complex form). + +New to Version 4.4 is the option of providing input/output arguments +in packed complex form. + +%------------------------------------------------------------------------------- +\subsection{Primary routines, and a simple example} +%------------------------------------------------------------------------------- + +Five primary UMFPACK routines are required to factorize $\m{A}$ or +solve $\m{Ax}=\m{b}$. They are fully described in Section~\ref{Primary}: + +\begin{itemize} +\item {\tt umfpack\_*\_symbolic}: + + Pre-orders the columns of $\m{A}$ to reduce fill-in. + Returns an opaque {\tt Symbolic} object as a {\tt void *} + pointer. The object contains the symbolic analysis and is needed for the + numeric factorization. This routine requires only $O(|\m{A}|)$ space, + where $|\m{A}|$ is the number of nonzero entries in the matrix. It computes + upper bounds on the nonzeros in $\m{L}$ and $\m{U}$, the floating-point + operations required, and the memory usage of {\tt umfpack\_*\_numeric}. The + {\tt Symbolic} object is small; it contains just the column pre-ordering, + the supernodal column elimination tree, and information about each frontal + matrix. It is no larger than about $13n$ integers if $\m{A}$ is + $n$-by-$n$. + +\item {\tt umfpack\_*\_numeric}: + + Numerically scales and then factorizes a sparse matrix into + $\m{PAQ}$, $\m{PRAQ}$, or $\m{PR}^{-1}\m{AQ}$ into the product $\m{LU}$, + where + $\m{P}$ and $\m{Q}$ are permutation matrices, $\m{R}$ is a diagonal + matrix of scale factors, $\m{L}$ is lower triangular with unit diagonal, + and $\m{U}$ is upper triangular. Requires the + symbolic ordering and analysis computed by {\tt umfpack\_*\_symbolic} + or {\tt umfpack\_*\_qsymbolic}. + Returns an opaque {\tt Numeric} object as a + {\tt void *} pointer. The object contains the numerical factorization and + is used by {\tt umfpack\_*\_solve}. You can factorize a new matrix with a + different values (but identical pattern) as the matrix analyzed by + {\tt umfpack\_*\_symbolic} or {\tt umfpack\_*\_qsymbolic} by re-using the + {\tt Symbolic} object (this feature is available when using UMFPACK in a + C or Fortran program, but not in MATLAB). + The matrix + $\m{U}$ will have zeros on the diagonal if $\m{A}$ is singular; this + produces a warning, but the factorization is still valid. + +\item {\tt umfpack\_*\_solve}: + + Solves a sparse linear system ($\m{Ax}=\m{b}$, $\m{A}\tr\m{x}=\m{b}$, or + systems involving just $\m{L}$ or $\m{U}$), using the numeric factorization + computed by {\tt umfpack\_*\_numeric}. Iterative refinement with sparse + backward error \cite{ardd:89} is used by default. The matrix $\m{A}$ must + be square. If it is singular, then a divide-by-zero will occur, and your + solution with contain IEEE Inf's or NaN's in the appropriate places. + +\item {\tt umfpack\_*\_free\_symbolic}: + + Frees the {\tt Symbolic} object created by {\tt umfpack\_*\_symbolic} + or {\tt umfpack\_*\_qsymbolic}. + +\item {\tt umfpack\_*\_free\_numeric}: + + Frees the {\tt Numeric} object created by {\tt umfpack\_*\_numeric}. + +\end{itemize} + +Be careful not to free a {\tt Symbolic} object with +{\tt umfpack\_*\_free\_numeric}. Nor should you attempt to free a {\tt Numeric} +object with {\tt umfpack\_*\_free\_symbolic}. +Failure to free these objects will lead to memory leaks. + +The matrix $\m{A}$ is represented in compressed column form, which is +identical to the sparse matrix representation used by MATLAB. It consists +of three or four arrays, where the matrix is {\tt m}-by-{\tt n}, +with {\tt nz} entries. For the {\tt int} version of UMFPACK: + +{\footnotesize +\begin{verbatim} + int Ap [n+1] ; + int Ai [nz] ; + double Ax [nz] ; +\end{verbatim} +} + +For the {\tt long} version of UMFPACK: + +{\footnotesize +\begin{verbatim} + long Ap [n+1] ; + long Ai [nz] ; + double Ax [nz] ; +\end{verbatim} +} + +The complex versions add another array for the imaginary part: + +{\footnotesize +\begin{verbatim} + double Az [nz] ; +\end{verbatim} +} + +Alternatively, if {\tt Az} is {\tt NULL}, +the real part of the $k$th entry is located in +{\tt Ax[2*k]} and the imaginary part is located in +{\tt Ax[2*k+1]}, and the {\tt Ax} array is of size {\tt 2*nz}. + +All nonzeros are entries, but an entry may be numerically zero. The row indices +of entries in column {\tt j} are stored in + {\tt Ai[Ap[j]} \ldots {\tt Ap[j+1]-1]}. +The corresponding numerical values are stored in + {\tt Ax[Ap[j]} \ldots {\tt Ap[j+1]-1]}. +The imaginary part, for the complex versions, is stored in + {\tt Az[Ap[j]} \ldots {\tt Ap[j+1]-1]} + (see above for the packed complex case). + +No duplicate row indices may be present, and the row indices in any given +column must be sorted in ascending order. The first entry {\tt Ap[0]} must be +zero. The total number of entries in the matrix is thus {\tt nz = Ap[n]}. +Except for the fact that extra zero entries can be included, there is thus a +unique compressed column representation of any given matrix $\m{A}$. +For a more flexible method for providing an input matrix to UMFPACK, +see Section~\ref{triplet}. + +Here is a simple main program, {\tt umfpack\_simple.c}, that illustrates the +basic usage of UMFPACK. See Section~\ref{Synopsis} for a short description +of each calling sequence, including a list of options for the first +argument of {\tt umfpack\_di\_solve}. + +{\footnotesize +\begin{verbatim} +INCLUDE umfpack_simple.c via sed +\end{verbatim} +} + +The {\tt Ap}, {\tt Ai}, and {\tt Ax} arrays represent the matrix +\[ +\m{A} = \left[ +\begin{array}{rrrrr} + 2 & 3 & 0 & 0 & 0 \\ + 3 & 0 & 4 & 0 & 6 \\ + 0 & -1 & -3 & 2 & 0 \\ + 0 & 0 & 1 & 0 & 0 \\ + 0 & 4 & 2 & 0 & 1 \\ +\end{array} +\right]. +\] +and the solution to $\m{Ax}=\m{b}$ is $\m{x} = [1 \, 2 \, 3 \, 4 \, 5]\tr$. +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 +most user-callable UMFPACK routines. + +%------------------------------------------------------------------------------- +\subsection{A note about zero-sized arrays} +%------------------------------------------------------------------------------- + +UMFPACK uses many user-provided arrays of +size {\tt m} or {\tt n} (the order of the matrix), and of size +{\tt nz} (the number of nonzeros in a matrix). UMFPACK does not handle +zero-dimensioned arrays; +it returns an error code if {\tt m} or {\tt n} +are zero. However, {\tt nz} can be zero, since all singular matrices are +handled correctly. If you attempt to {\tt malloc} an array of size {\tt nz} += 0, however, {\tt malloc} will return a null pointer which UMFPACK will report +as a missing argument. If you {\tt malloc} an array of +size {\tt nz} to pass to UMFPACK, make sure that you handle the {\tt nz} = 0 +case correctly (use a size equal to the maximum of {\tt nz} and 1, or use a +size of {\tt nz+1}). + +%------------------------------------------------------------------------------- +\subsection{Alternative routines} +%------------------------------------------------------------------------------- + +Three alternative routines are provided that modify UMFPACK's default +behavior. They are fully described in Section~\ref{Alternative}: + +\begin{itemize} +\item {\tt umfpack\_*\_defaults}: + + Sets the default control parameters in the {\tt Control} array. These can + then be modified as desired before passing the array to the other UMFPACK + routines. Control parameters are summarized in Section~\ref{control_param}. + Three particular parameters deserve special notice. + UMFPACK uses relaxed partial pivoting, where a candidate pivot entry is + numerically acceptable if its magnitude is greater than or equal to a + tolerance parameter times the magnitude of the largest entry in the same + column. The parameter {\tt Control [UMFPACK\_PIVOT\_TOLERANCE]} has a + default value of 0.1, and is used for the unsymmetric strategy. + For complex matrices, a cheap approximation of the absolute value is + used for the threshold pivoting test + ($|a| \approx |a_{\mbox{real}}|+|a_{\mbox{imag}}|$). + + For the symmetric strategy, a second tolerance is used for diagonal + entries: \newline {\tt Control [UMFPACK\_SYM\_PIVOT\_TOLERANCE]}, with + a default value of 0.001. The first parameter (with a default of 0.1) + is used for any off-diagonal candidate pivot entries. + + These two parameters may be too small for some matrices, particularly for + ill-conditioned or poorly scaled ones. With the default pivot tolerances + and default iterative refinement, + {\tt x = umfpack (A,'}$\backslash${\tt ',b)} + is just as accurate as (or more accurate) than + {\tt x = A}$\backslash${\tt b} + in MATLAB 6.1 for nearly all matrices. + + If {\tt Control [UMFPACK\_PIVOT\_TOLERANCE]} is zero, than any + nonzero entry is acceptable as a pivot (this is changed from Version 4.0, + which treated a value of 0.0 the same as 1.0). If the symmetric strategy is + used, and {\tt Control [UMFPACK\_SYM\_PIVOT\_TOLERANCE]} is zero, then any + nonzero entry on the diagonal is accepted as a pivot. Off-diagonal pivoting + will still occur if the diagonal entry is exactly zero. The + {\tt Control [UMFPACK\_SYM\_PIVOT\_TOLERANCE]} parameter is new to Version + 4.1. It is similar in function to the pivot tolerance for left-looking + methods (the MATLAB {\tt THRESH} option in {\tt [L,U,P] = lu (A, THRESH)}, + and the pivot tolerance parameter in SuperLU). + + The parameter {\tt Control [UMFPACK\_STRATEGY]} can be used to bypass + UMFPACK's automatic strategy selection. The automatic strategy nearly + always selects the best method. When it does not, the different methods + nearly always give about the same quality of results. There may be + cases where the automatic strategy fails to pick a good strategy. Also, + you can save some computing time if you know the right strategy for your + set of matrix problems. + +\item {\tt umfpack\_*\_qsymbolic}: + + An alternative to {\tt umfpack\_*\_symbolic}. Allows the user to specify + his or her own column pre-ordering, rather than using the default COLAMD + or AMD pre-orderings. For example, a graph partitioning-based order + of $\m{A}\tr\m{A}$ would be suitable for UMFPACK's unsymmetric strategy. + A partitioning of $\m{A}+\m{A}\tr$ would be suitable for UMFPACK's + symmetric or 2-by-2 strategies. + +\item {\tt umfpack\_*\_wsolve}: + + An alternative to {\tt umfpack\_*\_solve} which does not dynamically + allocate any memory. Requires the user to pass two additional work + arrays. + +\end{itemize} + +%------------------------------------------------------------------------------- +\subsection{Matrix manipulation routines} +\label{triplet} +%------------------------------------------------------------------------------- + +The compressed column data structure is compact, and simplifies the UMFPACK +routines that operate on the sparse matrix $\m{A}$. However, it can be +inconvenient for the user to generate. Section~\ref{Manipulate} presents the +details of routines for manipulating sparse matrices in {\em triplet} form, +compressed column form, and compressed row form (the transpose of the +compressed column form). The triplet form of a matrix consists of three or +four arrays. For the {\tt int} version of UMFPACK: + +{\footnotesize +\begin{verbatim} + int Ti [nz] ; + int Tj [nz] ; + double Tx [nz] ; +\end{verbatim} +} + +For the {\tt long} version: + +{\footnotesize +\begin{verbatim} + long Ti [nz] ; + long Tj [nz] ; + double Tx [nz] ; +\end{verbatim} +} + +The complex versions use another array to hold the imaginary part: + +{\footnotesize +\begin{verbatim} + double Tz [nz] ; +\end{verbatim} +} + +The {\tt k}-th triplet is $(i,j,a_{ij})$, where $i =$ {\tt Ti[k]}, +$j =$ {\tt Tj[k]}, and $a_{ij} =$ {\tt Tx[k]}. For the complex versions, +{\tt Tx[k]} is the real part of $a_{ij}$ and +{\tt Tz[k]} is the imaginary part. +The triplets can be in any +order in the {\tt Ti}, {\tt Tj}, and {\tt Tx} arrays (and {\tt Tz} for +the complex versions), and duplicate entries may +exist. +If {\tt Tz} is NULL, then the array {\tt Tx} becomes of size {\tt 2*nz}, +and the real and imaginary parts of the +{\tt k}-th triplet are located in {\tt Tx[2*k]} and {\tt Tx[2*k+1]}, +respectively. +Any duplicate entries are summed when the triplet form is converted to +compressed column form. This is a convenient way to create a matrix arising in +finite-element methods, for example. + +Four routines are provided for manipulating sparse matrices: + +\begin{itemize} +\item {\tt umfpack\_*\_triplet\_to\_col}: + + Converts a triplet form of a matrix to compressed column form (ready for + input to \newline + {\tt umfpack\_*\_symbolic}, {\tt umfpack\_*\_qsymbolic}, and + {\tt umfpack\_*\_numeric}). Identical to {\tt A = spconvert(i,j,x)} in + MATLAB, except that zero entries are not removed, so that the pattern of + entries in the compressed column form of $\m{A}$ are fully under user + control. This is important if you want to factorize a new matrix with the + {\tt Symbolic} object from a prior matrix with the same pattern as the new + one. + +\item {\tt umfpack\_*\_col\_to\_triplet}: + + The opposite of {\tt umfpack\_*\_triplet\_to\_col}. Identical to + {\tt [i,j,x] = find(A)} in MATLAB, except that numerically zero entries + may be included. + +\item {\tt umfpack\_*\_transpose}: + + Transposes and optionally permutes a column form matrix \cite{Gustavson78}. + Identical to + {\tt R = A(P,Q)'} (linear algebraic transpose, using the complex conjugate) + or {\tt R = A(P,Q).'} (the array transpose) + in MATLAB, except for the presence of numerically zero entries. + + Factorizing $\m{A}\tr$ and then solving $\m{Ax}=\m{b}$ with the transposed + factors can sometimes be much faster or much slower than factorizing + $\m{A}$. It is highly dependent on your particular matrix. + +\item {\tt umfpack\_*\_scale}: + + Applies the row scale factors to a user-provided vector. This is not + required to solve the sparse linear system $\m{Ax}=\m{b}$ or + $\m{A}\tr\m{x}=\m{b}$, since {\tt umfpack\_*\_solve} applies the scale + factors for those systems. + +\end{itemize} + +It is quite easy to add matrices in triplet form, subtract them, transpose +them, permute them, construct a submatrix, and multiply a triplet-form matrix +times a vector. UMFPACK does not provide code for these basic operations, +however. Refer to the discussion of +{\tt umfpack\_*\_triplet\_to\_col} in Section~\ref{Manipulate} for more details +on how to compute these operations in your own code. +The only primary matrix operation not provided by UMFPACK is the +multiplication of two sparse matrices \cite{Gustavson78}. +A future package under development (as of Jan. 2005), CHOLMOD, +will provide many of these matrix operations, which +can then be used in conjunction with UMFPACK. +Watch my web page for details. + +%------------------------------------------------------------------------------- +\subsection{Getting the contents of opaque objects} +%------------------------------------------------------------------------------- + +There are cases where you may wish to do more with the LU factorization +of a matrix than solve a linear system. The opaque {\tt Symbolic} and +{\tt Numeric} objects are just that - opaque. You cannot do anything with them +except to pass them back to subsequent calls to UMFPACK. Three routines +are provided for copying their contents into user-provided arrays using simpler +data structures. Four routines are provided for saving and loading the +{\tt Numeric} and {\tt Symbolic} objects to/from binary files. +An additional routine is provided that computes the determinant. +They are fully described in Section~\ref{Get}: + +\begin{itemize} +\item {\tt umfpack\_*\_get\_lunz}: + + Returns the number of nonzeros in $\m{L}$ and $\m{U}$. + +\item {\tt umfpack\_*\_get\_numeric}: + + Copies $\m{L}$, $\m{U}$, $\m{P}$, $\m{Q}$, and $\m{R}$ + from the {\tt Numeric} object + into arrays provided by the user. The matrix $\m{L}$ is returned in + compressed row form (with the column indices in each row sorted in ascending + order). The matrix $\m{U}$ is returned in compressed column form (with + sorted columns). There are no explicit zero entries in $\m{L}$ and $\m{U}$, + but such entries may exist in the {\tt Numeric} object. The permutations + $\m{P}$ and $\m{Q}$ are represented as permutation vectors, where + {\tt P[k] = i} means that row {\tt i} of the original matrix is the + the {\tt k}-th row of $\m{PAQ}$, and where + {\tt Q[k] = j} means that column {\tt j} of the original matrix is the + {\tt k}-th column of $\m{PAQ}$. This is identical to how MATLAB uses + permutation vectors (type {\tt help colamd} in MATLAB 6.1 or later). + +\item {\tt umfpack\_*\_get\_symbolic}: + + Copies the contents of the {\tt Symbolic} object (the initial row and column + preordering, supernodal column elimination tree, and information + about each frontal matrix) into arrays provided by the user. + +\item {\tt umfpack\_*\_get\_determinant}: + + Computes the determinant from the diagonal of $\m{U}$ and the permutations + $\m{P}$ and $\m{Q}$. This is mostly of theoretical interest. + It is not a good test to determine if your matrix is singular or not. + +\item {\tt umfpack\_*\_save\_numeric}: + + Saves a copy of the {\tt Numeric} object to a file, in binary format. + +\item {\tt umfpack\_*\_load\_numeric}: + + Creates a {\tt Numeric} object by loading it from a file created + by {\tt umfpack\_*\_save\_numeric}. + +\item {\tt umfpack\_*\_save\_symbolic}: + + Saves a copy of the {\tt Symbolic} object to a file, in binary format. + +\item {\tt umfpack\_*\_load\_symbolic}: + + Creates a {\tt Symbolic} object by loading it from a file created + by {\tt umfpack\_*\_save\_symbolic}. + +\end{itemize} + +UMFPACK itself does not make use of these routines; +they are provided solely for returning the contents of the opaque +{\tt Symbolic} and {\tt Numeric} objects to the user, and saving/loading +them to/from a binary file. None of them do any computation, except for +{\tt umfpack\_*\_get\_determinant}. + +%------------------------------------------------------------------------------- +\subsection{Reporting routines} +\label{Reporting} +%------------------------------------------------------------------------------- + +None of the UMFPACK routines discussed so far prints anything, even when an +error occurs. UMFPACK provides you with nine routines for printing the input +and output arguments (including the {\tt Control} settings and {\tt Info} +statistics) of UMFPACK routines discussed above. They are fully described in +Section~\ref{Report}: + +\begin{itemize} +\item {\tt umfpack\_*\_report\_status}: + + Prints the status (return value) of other {\tt umfpack\_*} routines. + +\item {\tt umfpack\_*\_report\_info}: + + Prints the statistics returned in the {\tt Info} array by + {\tt umfpack\_*\_*symbolic}, + {\tt umfpack\_*\_numeric}, and {\tt umfpack\_*\_*solve}. + +\item {\tt umfpack\_*\_report\_control}: + + Prints the {\tt Control} settings. + +\item {\tt umfpack\_*\_report\_matrix}: + + Verifies and prints a compressed column-form or compressed row-form sparse + matrix. + +\item {\tt umfpack\_*\_report\_triplet}: + + Verifies and prints a matrix in triplet form. + +\item {\tt umfpack\_*\_report\_symbolic}: + + Verifies and prints a {\tt Symbolic} object. + +\item {\tt umfpack\_*\_report\_numeric}: + + Verifies and prints a {\tt Numeric} object. + +\item {\tt umfpack\_*\_report\_perm}: + + Verifies and prints a permutation vector. + +\item {\tt umfpack\_*\_report\_vector}: + + Verifies and prints a real or complex vector. + +\end{itemize} + +The {\tt umfpack\_*\_report\_*} routines behave slightly differently when +compiled +into the C-callable UMFPACK library than when used in the MATLAB mexFunction. +MATLAB stores its sparse matrices using the same compressed column data +structure discussed above, where row and column indices of an $m$-by-$n$ +matrix are in the range 0 to $m-1$ or $n-1$, respectively\footnote{Complex +matrices in MATLAB use the split array form, with one {\tt double} array +for the real part and another array for the imaginary part. UMFPACK +supports that format, as well as the packed complex format (new to Version 4.4).} +It prints them as if they are in the range 1 to $m$ or $n$. +The UMFPACK mexFunction behaves the same way. + +You can control how much the {\tt umfpack\_*\_report\_*} routines print by +modifying the {\tt Control [UMFPACK\_PRL]} parameter. Its default value is 1. +Here is a summary of how the routines use this print level parameter: + +\begin{itemize} +\item {\tt umfpack\_*\_report\_status}: + + No output if the print level is 0 or less, even when an error occurs. + If 1, then error messages are printed, and nothing is printed if + the status is {\tt UMFPACK\_OK}. A warning message is printed if + the matrix is singular. If 2 or more, then the status is always + printed. If 4 or more, then the UMFPACK Copyright is printed. + If 6 or more, then the UMFPACK License is printed. See also the first page + of this User Guide for the Copyright and License. + +\item {\tt umfpack\_*\_report\_control}: + + No output if the print level is 1 or less. If 2 or more, all of + {\tt Control} is printed. + +\item {\tt umfpack\_*\_report\_info}: + + No output if the print level is 1 or less. If 2 or more, all of + {\tt Info} is printed. + +\item all other {\tt umfpack\_*\_report\_*} routines: + + If the print level is 2 or less, then these routines return silently without + checking their inputs. If 3 or more, the inputs are fully verified and a + short status summary is printed. If 4, then the first few entries of the + input arguments are printed. If 5, then all of the input arguments are + printed. + +\end{itemize} + +This print level parameter has an additional effect on the MATLAB mexFunction. +If zero, then no warnings of singular or nearly singular matrices are +printed (similar to the MATLAB commands +{\tt warning off MATLAB:singularMatrix} and +{\tt warning off MATLAB:nearlySingularMatrix}). + +%------------------------------------------------------------------------------- +\subsection{Utility routines} +%------------------------------------------------------------------------------- + +UMFPACK v4.0 included a routine that returns the time used by the process, +{\tt umfpack\_timer}. The routine uses either {\tt getrusage} (which is +preferred), or the ANSI C {\tt clock} routine if that is not available. +It is fully described in Section~\ref{Utility}. It is still available in +UMFPACK v4.1 and following, but not used internally. +Two new timing routines are provided in UMFPACK Version 4.1 and following, +{\tt umfpack\_tic} and {\tt umfpack\_toc}. They use POSIX-compliant +{\tt sysconf} and {\tt times} routines to find both the CPU time +and wallclock time. +These three routines are the only user-callable +routine that is identical in all four {\tt int}/{\tt long}, real/complex +versions (there is no {\tt umfpack\_di\_timer} routine, for example). + +%------------------------------------------------------------------------------- +\subsection{Control parameters} +\label{control_param} +%------------------------------------------------------------------------------- + +UMFPACK uses an optional {\tt double} array (currently of size 20) +to modify its control parameters. If you pass {\tt (double *) NULL} instead +of a {\tt Control} array, then defaults are used. These defaults provide +nearly optimal performance (both speed, memory usage, and numerical accuracy) +for a wide range of matrices from real applications. + +This array will almost certainly grow in size in future releases, +so be sure to dimension your {\tt Control} array to be of size +{\tt UMFPACK\_CONTROL}. That constant is currently defined to be 20, +but may increase in future versions, since all 20 entries are in use. + +The contents of this array may be modified by the user +(see {\tt umfpack\_*\_defaults}). Each +user-callable routine includes a complete description of how each control +setting modifies its behavior. Table~\ref{control} summarizes the entire +contents of the {\tt Control} array. +Note that ANSI C uses 0-based indexing, while MATLAB uses 1-based +indexing. Thus, {\tt Control(1)} in MATLAB is the same as +{\tt Control[0]} or {\tt Control[UMFPACK\_PRL]} in ANSI C. + +\begin{table} +\caption{UMFPACK Control parameters} +\label{control} +{\footnotesize +\begin{tabular}{llll} +\hline + +MATLAB & ANSI C & default & description \\ +\hline +{\tt Control(1)} & {\tt Control[UMFPACK\_PRL]} & 1 & printing level \\ +{\tt Control(2)} & {\tt Control[UMFPACK\_DENSE\_ROW]} & 0.2 & dense row parameter \\ +{\tt Control(3)} & {\tt Control[UMFPACK\_DENSE\_COL]} & 0.2 & dense column parameter \\ +{\tt Control(4)} & {\tt Control[UMFPACK\_PIVOT\_TOLERANCE]} & 0.1 & partial pivoting tolerance \\ +{\tt Control(5)} & {\tt Control[UMFPACK\_BLOCK\_SIZE]} & 32 & BLAS block size \\ +{\tt Control(6)} & {\tt Control[UMFPACK\_STRATEGY]} & 0 (auto) & select strategy \\ +{\tt Control(7)} & {\tt Control[UMFPACK\_ALLOC\_INIT]} & 0.7 & initial memory allocation \\ +{\tt Control(8)} & {\tt Control[UMFPACK\_IRSTEP]} & 2 & max iter. refinement steps \\ +{\tt Control(13)} & {\tt Control[UMFPACK\_2BY2\_TOLERANCE]} & 0.01 & defines ``large'' entries \\ +{\tt Control(14)} & {\tt Control[UMFPACK\_FIXQ]} & 0 (auto) & fix or modify Q \\ +{\tt Control(15)} & {\tt Control[UMFPACK\_AMD\_DENSE]} & 10 & AMD dense row/column parameter \\ +{\tt Control(16)} & {\tt Control[UMFPACK\_SYM\_PIVOT\_TOLERANCE]} & 0.001 & for diagonal entries \\ +{\tt Control(17)} & {\tt Control[UMFPACK\_SCALE]} & 1 (sum) & row scaling (none, sum, or max) \\ +{\tt Control(18)} & {\tt Control[UMFPACK\_FRONT\_ALLOC\_INIT]} & 0.5 & frontal matrix allocation ratio \\ +{\tt Control(19)} & {\tt Control[UMFPACK\_DROPTOL]} & 0 & drop tolerance \\ +{\tt Control(20)} & {\tt Control[UMFPACK\_AGGRESSIVE]} & 1 (yes) & aggressive absorption \\ + & & & in AMD and COLAMD \\ +% +\hline +\multicolumn{4}{l}{Can only be changed at compile time:} \\ +{\tt Control(9)} & {\tt Control[UMFPACK\_COMPILED\_WITH\_BLAS]} & - & true if BLAS is used \\ +{\tt Control(10)} & {\tt Control[UMFPACK\_COMPILED\_FOR\_MATLAB]} & - & true for mexFunction \\ +{\tt Control(11)} & {\tt Control[UMFPACK\_COMPILED\_WITH\_GETRUSAGE]} & - & 1 if {\tt getrusage} used \\ +{\tt Control(12)} & {\tt Control[UMFPACK\_COMPILED\_IN\_DEBUG\_MODE]} & - & true if debug mode enabled \\ +\hline +\end{tabular} +} +\end{table} + +Let $\alpha_r = ${\tt Control [UMFPACK\_DENSE\_ROW]}, + $\alpha_c = ${\tt Control [UMFPACK\_DENSE\_COL]}, and + $\alpha = ${\tt Control [UMFPACK\_AMD\_DENSE]}. +Suppose the submatrix $\m{S}$, obtained after eliminating pivots with +zero Markowitz cost, is $m$-by-$n$. +Then a row is considered ``dense'' if it has more than +$\max (16, 16 \alpha_r \sqrt{n})$ entries. +A column is considered ``dense'' if it has more than +$\max (16, 16 \alpha_c \sqrt{m})$ entries. +These rows and columns are treated different in COLAMD and during numerical +factorization. In COLAMD, dense columns are placed last in their natural +order, and dense rows are ignored. During numerical factorization, dense +rows are stored differently. +In AMD, a row/column of the square matrix $\m{S}+\m{S}\tr$ is +considered ``dense'' if it has more than $\max (16, \alpha \sqrt{n})$ entries. +These rows/columns are placed last in AMD's output ordering. +For more details on the control parameters, refer to the documentation of +{\tt umfpack\_*\_qsymbolic}, {\tt umfpack\_*\_numeric}, {\tt umfpack\_*\_solve}, +and the {\tt umfpack\_*\_report\_*} routines, +in Sections~\ref{Primary}~through~\ref{Report}, below. + +%------------------------------------------------------------------------------- +\subsection{Error codes} +\label{error_codes} +%------------------------------------------------------------------------------- + +Many of the routines return a {\tt status} value. +This is also returned as the first entry in the {\tt Info} array, for +those routines with that argument. The following list summarizes +all of the error codes in UMFPACK. Each error code is given a +specific name in the {\tt umfpack.h} include file, so you can use +those constants instead of hard-coded values in your program. +Future versions may report additional error codes. + +A value of zero means everything was successful, and the matrix is +non-singular. A value greater than zero means the routine was successful, +but a warning occurred. +A negative value means the routine was not successful. +In this case, no {\tt Symbolic} or {\tt Numeric} object was created. + +\begin{itemize} +\item {\tt UMFPACK\_OK}, (0): UMFPACK was successful. + +\item {\tt UMFPACK\_WARNING\_singular\_matrix}, (1): Matrix is singular. + There are exact zeros on the diagonal of $\m{U}$. + +\item {\tt UMFPACK\_WARNING\_determinant\_underflow}, (2): + The determinant is nonzero, but smaller in magnitude than + the smallest positive floating-point number. + +\item {\tt UMFPACK\_WARNING\_determinant\_overflow}, (3): + The determinant is larger in magnitude than + the largest positive floating-point number (IEEE Inf). + +\item {\tt UMFPACK\_ERROR\_out\_of\_memory}, (-1): Not enough memory. + The ANSI C {\tt malloc} or {\tt realloc} routine failed. + +\item {\tt UMFPACK\_ERROR\_invalid\_Numeric\_object}, (-3): + Routines that take a {\tt Numeric} object as input (or load it + from a file) check this object and return this error code if it is + invalid. This can be caused by a memory leak or overrun in your + program, which can overwrite part of the Numeric object. It can also + be caused by passing a Symbolic object by mistake, or some other pointer. + If you try to factorize a matrix using one version of UMFPACK and + then use the factors in another version, this error code will trigger as + well. You cannot factor your matrix using + version 4.0 and then solve with version 4.1, for example.\footnote{ + Exception: v4.3, v4.3.1, and v4.4 use identical data structures + for the {\tt Numeric} and {\tt Symbolic} objects}. + You cannot use different precisions of the same version + (real and complex, for example). + It is possible for the {\tt Numeric} object to be corrupted by your + program in subtle ways that are not detectable by this quick check. + In this case, you may see an + {\tt UMFPACK\_ERROR\_different\_pattern} error code, or even an + {\tt UMFPACK\_ERROR\_internal\_error}. + +\item {\tt UMFPACK\_ERROR\_invalid\_Symbolic\_object}, (-4): + Routines that take a {\tt Symbolic} object as input (or load it + from a file) check this object and return this error code if it is + invalid. The causes of this error are analogous to the + {\tt UMFPACK\_ERROR\_invalid\_Numeric\_object} error described above. + +\item {\tt UMFPACK\_ERROR\_argument\_missing}, (-5): + Some arguments of some are optional (you can pass a {\tt NULL} pointer + instead of an array). This error code occurs if you pass a {\tt NULL} + pointer when that argument is required to be present. + +\item {\tt UMFPACK\_ERROR\_n\_nonpositive} (-6): + The number of rows or columns of the matrix must be greater than zero. + +\item {\tt UMFPACK\_ERROR\_invalid\_matrix} (-8): + The matrix is invalid. For the column-oriented input, this error + code will occur if the contents of {\tt Ap} and/or {\tt Ai} are invalid. + + {\tt Ap} is an integer array of size {\tt n\_col+1}. + On input, it holds the + ``pointers'' for the column form of the sparse matrix $\m{A}$. + Column {\tt j} of + the matrix A is held in {\tt Ai [(Ap [j])} \ldots {\tt (Ap [j+1]-1)]}. + The first entry, {\tt Ap [0]}, must be zero, + and {\tt Ap [j]} $\le$ {\tt Ap [j+1]} must hold for all + {\tt j} in the range 0 to {\tt n\_col-1}. + The value {\tt nz = Ap [n\_col]} is thus the + total number of entries in the pattern of the matrix A. + {\tt nz} must be greater than or equal to zero. + + The nonzero pattern (row indices) for column {\tt j} is stored in + {\tt Ai [(Ap [j])} \ldots {\tt (Ap [j+1]-1)]}. The row indices in a given + column {\tt j} + must be in ascending order, and no duplicate row indices may be present. + Row indices must be in the range 0 to {\tt n\_row-1} + (the matrix is 0-based). + + Some routines take a triplet-form input, with arguments + {\tt nz}, {\tt Ti}, and {\tt Tj}. This error code is returned + if {\tt nz} is less than zero, + if any row index in {\tt Ti} is outside the range 0 to {\tt n\_col-1}, or + if any column index in {\tt Tj} is outside the range 0 to {\tt n\_row-1}. + +\item {\tt UMFPACK\_ERROR\_different\_pattern}, (-11): + The most common cause of this error is that the pattern of the + matrix has changed between the symbolic and numeric factorization. + It can also occur if the {\tt Numeric} or {\tt Symbolic} object has + been subtly corrupted by your program. + +\item {\tt UMFPACK\_ERROR\_invalid\_system}, (-13): + The {\tt sys} argument provided to one of the solve routines is invalid. + +\item {\tt UMFPACK\_ERROR\_invalid\_permutation}, (-15): + The permutation vector provided as input is invalid. + +\item {\tt UMFPACK\_ERROR\_file\_IO}, (-17): + This error code is returned by the routines that save and load + the {\tt Numeric} or {\tt Symbolic} objects to/from a file, if a + file I/O error has occurred. The file may not exist or may not be readable, + you may be trying to create a file that you don't have permission to create, + or you may be out of disk space. The file you are trying to read might + be the wrong one, and an earlier end-of-file condition would then result + in this error. + +\item {\tt UMFPACK\_ERROR\_internal\_error}, (-911): + An internal error has occurred, of unknown cause. This is either a bug + in UMFPACK, or the result of a memory overrun from your program. + Try modifying the file {\tt AMD/Source/amd\_internal.h} and adding + the statement {\tt \#undef NDEBUG}, to enable the debugging mode. + Recompile UMFPACK and rerun your program. + A failed assertion might occur which + can give you a better indication as to what is going wrong. Be aware that + UMFPACK will be extraordinarily slow when running in debug mode. + If all else fails, contact the developer (davis@cise.ufl.edu) with + as many details as possible. + +\end{itemize} + +%------------------------------------------------------------------------------- +\subsection{Larger examples} +%------------------------------------------------------------------------------- + +Full examples of all user-callable UMFPACK routines +are available in four stand-alone C main programs, {\tt umfpack\_*\_demo.c}. +Another example is +the UMFPACK mexFunction, {\tt umfpackmex.c}. The mexFunction accesses only the +user-callable C interface to UMFPACK. The only features that it does not use +are the support for the triplet form (MATLAB's sparse arrays are already in the +compressed column form) and the ability to reuse the {\tt Symbolic} object to +numerically factorize a matrix whose pattern is the same as a prior matrix +analyzed by {\tt umfpack\_*\_symbolic} or {\tt umfpack\_*\_qsymbolic}. The +latter is an important feature, but the mexFunction does not return its opaque +{\tt Symbolic} and {\tt Numeric} objects to MATLAB. Instead, it gets the +contents of these objects after extracting them via the {\tt umfpack\_*\_get\_*} +routines, and returns them as MATLAB sparse matrices. + +The {\tt umf4.c} program for reading matrices in Harwell/Boeing format +\cite{DuffGrimesLewis87b} is provided. It requires three Fortran 77 programs +({\tt readhb.f}, {\tt readhb\_nozeros.f}, and {\tt readhb\_size.f}) +for reading in the sample Harwell/Boeing files in the {\tt UMFPACK/Demo/HB} +directory. More matrices are available at +http://www.cise.ufl.edu/research/sparse/matrices. +Type {\tt make hb} in the {\tt UMFPACK/Demo/HB} directory +to compile and run this demo. This program was used for the experimental +results in \cite{Davis03}. + +%------------------------------------------------------------------------------- +\section{Synopsis of C-callable routines} +\label{Synopsis} +%------------------------------------------------------------------------------- + +Each subsection, below, summarizes the input variables, output variables, return +values, and calling sequences of the routines in one category. Variables with +the same name as those already listed in a prior category have the same size +and type. + +The real, {\tt long} integer {\tt umfpack\_dl\_*} routines are +identical to the real, {\tt int} routines, except that {\tt \_di\_} is replaced +with {\tt \_dl\_} in the name, and all {\tt int} arguments become {\tt long}. +Similarly, the complex, {\tt long} integer {\tt umfpack\_zl\_*} routines are +identical to the complex, {\tt int} routines, except that {\tt \_zi\_} is +replaced +with {\tt \_zl\_} in the name, and all {\tt int} arguments become {\tt long}. +Only the real and complex {\tt int} versions are listed in the synopsis below. + +The matrix $\m{A}$ is {\tt m}-by-{\tt n} with {\tt nz} entries. + +The {\tt sys} argument of {\tt umfpack\_*\_solve} +is an integer in the range 0 to 14 which defines which linear system is +to be solved. +\footnote{Integer values for {\tt sys} are used instead of strings (as in LINPACK +and LAPACK) to avoid C-to-Fortran portability issues.} +Valid values are listed in Table~\ref{sys}. +The notation $\m{A}\he$ refers to the matrix transpose, which is the +complex conjugate transpose for complex matrices ({\tt A'} in MATLAB). +The array transpose is $\m{A}\tr$, which is {\tt A.'} in MATLAB. + +\begin{table} +\begin{center} +\caption{UMFPACK {\tt sys} parameter} +\label{sys} +{\footnotesize +\begin{tabular}{ll|l} +\hline +Value & & system \\ +\hline +& & \\ +{\tt UMFPACK\_A} & (0) & $\m{Ax}=\m{b}$ \\ +{\tt UMFPACK\_At} & (1) & $\m{A}\he\m{x}=\m{b}$ \\ +{\tt UMFPACK\_Aat} & (2) & $\m{A}\tr\m{x}=\m{b}$ \\ +& & \\ +\hline +& & \\ +{\tt UMFPACK\_Pt\_L} & (3) & $\m{P}\tr\m{Lx}=\m{b}$ \\ +{\tt UMFPACK\_L} & (4) & $\m{Lx}=\m{b}$ \\ +{\tt UMFPACK\_Lt\_P} & (5) & $\m{L}\he\m{Px}=\m{b}$ \\ +{\tt UMFPACK\_Lat\_P} & (6) & $\m{L}\tr\m{Px}=\m{b}$ \\ +{\tt UMFPACK\_Lt} & (7) & $\m{L}\he\m{x}=\m{b}$ \\ +{\tt UMFPACK\_Lat} & (8) & $\m{L}\tr\m{x}=\m{b}$ \\ +& & \\ +\hline +& & \\ +{\tt UMFPACK\_U\_Qt} & (9) & $\m{UQ}\tr\m{x}=\m{b}$ \\ +{\tt UMFPACK\_U} & (10) & $\m{Ux}=\m{b}$ \\ +{\tt UMFPACK\_Q\_Ut} & (11) & $\m{QU}\he\m{x}=\m{b}$ \\ +{\tt UMFPACK\_Q\_Uat} & (12) & $\m{QU}\tr\m{x}=\m{b}$ \\ +{\tt UMFPACK\_Ut} & (13) & $\m{U}\he\m{x}=\m{b}$ \\ +{\tt UMFPACK\_Uat} & (14) & $\m{U}\tr\m{x}=\m{b}$ \\ +& & \\ +\hline +\end{tabular} +} +\end{center} +\end{table} + +%------------------------------------------------------------------------------- +\subsection{Primary routines: real/{\tt int}} +%------------------------------------------------------------------------------- + +{\footnotesize +\begin{verbatim} +#include "umfpack.h" +int status, sys, n, m, nz, Ap [n+1], Ai [nz] ; +double Control [UMFPACK_CONTROL], Info [UMFPACK_INFO], Ax [nz], X [n], B [n] ; +void *Symbolic, *Numeric ; + +status = umfpack_di_symbolic (m, n, Ap, Ai, Ax, &Symbolic, Control, Info) ; +status = umfpack_di_numeric (Ap, Ai, Ax, Symbolic, &Numeric, Control, Info) ; +status = umfpack_di_solve (sys, Ap, Ai, Ax, X, B, Numeric, Control, Info) ; +umfpack_di_free_symbolic (&Symbolic) ; +umfpack_di_free_numeric (&Numeric) ; +\end{verbatim} +} + +%------------------------------------------------------------------------------- +\subsection{Alternative routines: real/{\tt int}} +%------------------------------------------------------------------------------- + +{\footnotesize +\begin{verbatim} +int Qinit [n], Wi [n] ; +double W [5*n] ; + +umfpack_di_defaults (Control) ; +status = umfpack_di_qsymbolic (m, n, Ap, Ai, Ax, Qinit, &Symbolic, Control, Info) ; +status = umfpack_di_wsolve (sys, Ap, Ai, Ax, X, B, Numeric, Control, Info, Wi, W) ; +\end{verbatim} +} + +%------------------------------------------------------------------------------- +\subsection{Matrix manipulation routines: real/{\tt int}} +%------------------------------------------------------------------------------- + +{\footnotesize +\begin{verbatim} +int Ti [nz], Tj [nz], P [m], Q [n], Rp [m+1], Ri [nz], Map [nz] ; +double Tx [nz], Rx [nz], Y [m], Z [m] ; + +status = umfpack_di_col_to_triplet (n, Ap, Tj) ; +status = umfpack_di_triplet_to_col (m, n, nz, Ti, Tj, Tx, Ap, Ai, Ax, Map) ; +status = umfpack_di_transpose (m, n, Ap, Ai, Ax, P, Q, Rp, Ri, Rx) ; +status = umfpack_di_scale (Y, Z, Numeric) ; +\end{verbatim} +} + +%------------------------------------------------------------------------------- +\subsection{Getting the contents of opaque objects: real/{\tt int}} +%------------------------------------------------------------------------------- + +The {\tt filename} string should be large enough to hold the name of a file. + +{\footnotesize +\begin{verbatim} +int lnz, unz, Lp [m+1], Lj [lnz], Up [n+1], Ui [unz], do_recip ; +double Lx [lnz], Ux [unz], D [min (m,n)], Rs [m], Mx [1], Ex [1] ; +int nfr, nchains, P1 [m], Q1 [n], Front_npivcol [n+1], Front_parent [n+1], Front_1strow [n+1], + Front_leftmostdesc [n+1], Chain_start [n+1], Chain_maxrows [n+1], Chain_maxcols [n+1] ; +char filename [100] ; + +status = umfpack_di_get_lunz (&lnz, &unz, &m, &n, &nz_udiag, Numeric) ; +status = umfpack_di_get_numeric (Lp, Lj, Lx, Up, Ui, Ux, P, Q, D, + &do_recip, Rs, Numeric) ; +status = umfpack_di_get_symbolic (&m, &n, &n1, &nz, &nfr, &nchains, P1, Q1, + Front_npivcol, Front_parent, Front_1strow, Front_leftmostdesc, + Chain_start, Chain_maxrows, Chain_maxcols, Symbolic) ; +status = umfpack_di_load_numeric (&Numeric, filename) ; +status = umfpack_di_save_numeric (Numeric, filename) ; +status = umfpack_di_load_symbolic (&Symbolic, filename) ; +status = umfpack_di_save_symbolic (Symbolic, filename) ; +status = umfapck_di_get_determinant (Mx, Ex, Numeric, Info) ; +\end{verbatim} +} + +%------------------------------------------------------------------------------- +\subsection{Reporting routines: real/{\tt int}} +%------------------------------------------------------------------------------- + +{\footnotesize +\begin{verbatim} + +umfpack_di_report_status (Control, status) ; +umfpack_di_report_control (Control) ; +umfpack_di_report_info (Control, Info) ; +status = umfpack_di_report_matrix (m, n, Ap, Ai, Ax, 1, Control) ; +status = umfpack_di_report_matrix (m, n, Rp, Ri, Rx, 0, Control) ; +status = umfpack_di_report_numeric (Numeric, Control) ; +status = umfpack_di_report_perm (m, P, Control) ; +status = umfpack_di_report_perm (n, Q, Control) ; +status = umfpack_di_report_symbolic (Symbolic, Control) ; +status = umfpack_di_report_triplet (m, n, nz, Ti, Tj, Tx, Control) ; +status = umfpack_di_report_vector (n, X, Control) ; +\end{verbatim} +} + + + + + + +%------------------------------------------------------------------------------- +\subsection{Primary routines: complex/{\tt int}} +%------------------------------------------------------------------------------- + +{\footnotesize +\begin{verbatim} +double Az [nz], Xx [n], Xz [n], Bx [n], Bz [n] ; + +status = umfpack_zi_symbolic (m, n, Ap, Ai, Ax, Az, &Symbolic, Control, Info) ; +status = umfpack_zi_numeric (Ap, Ai, Ax, Az, Symbolic, &Numeric, Control, Info) ; +status = umfpack_zi_solve (sys, Ap, Ai, Ax, Az, Xx, Xz, Bx, Bz, Numeric, Control, Info) ; +umfpack_zi_free_symbolic (&Symbolic) ; +umfpack_zi_free_numeric (&Numeric) ; +\end{verbatim} +} + +The arrays {\tt Ax}, {\tt Bx}, and {\tt Xx} double in size if +any imaginary argument ({\tt Az}, {\tt Xz}, or {\tt Bz}) is {\tt NULL}. + +%------------------------------------------------------------------------------- +\subsection{Alternative routines: complex/{\tt int}} +%------------------------------------------------------------------------------- + +{\footnotesize +\begin{verbatim} +double Wz [10*n] ; + +umfpack_zi_defaults (Control) ; +status = umfpack_zi_qsymbolic (m, n, Ap, Ai, Ax, Az, Qinit, &Symbolic, Control, Info) ; +status = umfpack_zi_wsolve (sys, Ap, Ai, Ax, Az, Xx, Xz, Bx, Bz, Numeric, Control, Info, Wi, Wz) ; +\end{verbatim} +} + +%------------------------------------------------------------------------------- +\subsection{Matrix manipulation routines: complex/{\tt int}} +%------------------------------------------------------------------------------- + +{\footnotesize +\begin{verbatim} +double Tz [nz], Rz [nz], Yx [m], Yz [m], Zx [m], Zz [m] ; + +status = umfpack_zi_col_to_triplet (n, Ap, Tj) ; +status = umfpack_zi_triplet_to_col (m, n, nz, Ti, Tj, Tx, Tz, Ap, Ai, Ax, Az, Map) ; +status = umfpack_zi_transpose (m, n, Ap, Ai, Ax, Az, P, Q, Rp, Ri, Rx, Rz, 1) ; +status = umfpack_zi_transpose (m, n, Ap, Ai, Ax, Az, P, Q, Rp, Ri, Rx, Rz, 0) ; +status = umfpack_zi_scale (Yx, Yz, Zx, Zz, Numeric) ; +\end{verbatim} +} + +The arrays {\tt Tx}, {\tt Rx}, {\tt Yx}, and {\tt Zx} double in size if +any imaginary argument ({\tt Tz}, {\tt Rz}, {\tt Yz}, or {\tt Zz}) is {\tt NULL}. + +%------------------------------------------------------------------------------- +\subsection{Getting the contents of opaque objects: complex/{\tt int}} +%------------------------------------------------------------------------------- + +{\footnotesize +\begin{verbatim} +double Lz [lnz], Uz [unz], Dx [min (m,n)], Dz [min (m,n)], Mz [1] ; + +status = umfpack_zi_get_lunz (&lnz, &unz, &m, &n, &nz_udiag, Numeric) ; +status = umfpack_zi_get_numeric (Lp, Lj, Lx, Lz, Up, Ui, Ux, Uz, P, Q, Dx, Dz, + &do_recip, Rs, Numeric) ; +status = umfpack_zi_get_symbolic (&m, &n, &n1, &nz, &nfr, &nchains, P1, Q1, + Front_npivcol, Front_parent, Front_1strow, Front_leftmostdesc, + Chain_start, Chain_maxrows, Chain_maxcols, Symbolic) ; +status = umfpack_zi_load_numeric (&Numeric, filename) ; +status = umfpack_zi_save_numeric (Numeric, filename) ; +status = umfpack_zi_load_symbolic (&Symbolic, filename) ; +status = umfpack_zi_save_symbolic (Symbolic, filename) ; +status = umfapck_zi_get_determinant (Mx, Mz, Ex, Numeric, Info) ; +\end{verbatim} +} + +The arrays {\tt Lx}, {\tt Ux}, {\tt Dx}, and {\tt Mx} double in size if +any imaginary argument ({\tt Lz}, {\tt Uz}, {\tt Dz}, or {\tt Mz}) is {\tt NULL}. + +%------------------------------------------------------------------------------- +\subsection{Reporting routines: complex/{\tt int}} +%------------------------------------------------------------------------------- + +{\footnotesize +\begin{verbatim} + +umfpack_zi_report_status (Control, status) ; +umfpack_zi_report_control (Control) ; +umfpack_zi_report_info (Control, Info) ; +status = umfpack_zi_report_matrix (m, n, Ap, Ai, Ax, Az, 1, Control) ; +status = umfpack_zi_report_matrix (m, n, Rp, Ri, Rx, Rz, 0, Control) ; +status = umfpack_zi_report_numeric (Numeric, Control) ; +status = umfpack_zi_report_perm (m, P, Control) ; +status = umfpack_zi_report_perm (n, Q, Control) ; +status = umfpack_zi_report_symbolic (Symbolic, Control) ; +status = umfpack_zi_report_triplet (m, n, nz, Ti, Tj, Tx, Tz, Control) ; +status = umfpack_zi_report_vector (n, Xx, Xz, Control) ; +\end{verbatim} +} + +The arrays {\tt Ax}, {\tt Rx}, {\tt Tx}, and {\tt Xx} double in size if +any imaginary argument ({\tt Az}, {\tt Rz}, {\tt Tz}, or {\tt Xz}) is {\tt NULL}. + + + + +%------------------------------------------------------------------------------- +\subsection{Utility routines} +%------------------------------------------------------------------------------- + +These routines are the same in all four versions of UMFPACK. + +{\footnotesize +\begin{verbatim} +double t, s [2] ; + +t = umfpack_timer ( ) ; +umfpack_tic (s) ; +umfpack_toc (s) ; + +\end{verbatim} +} + +%------------------------------------------------------------------------------- +\subsection{AMD ordering routines} +%------------------------------------------------------------------------------- + +UMFPACK makes use of the AMD ordering package for its symmetric ordering +strategy. You may also use these four user-callable routines in your own C +programs. You need to include the {\tt amd.h} file only if you make direct +calls to the AMD routines themselves. The {\tt int} versions are summarized +below; {\tt long} versions are also available. Refer to the AMD User Guide +for more information, or to the file {\tt amd.h} which documents these routines. + +{\footnotesize +\begin{verbatim} +#include "amd.h" +double amd_control [AMD_CONTROL], amd_info [AMD_INFO] ; + +amd_defaults (amd_control) ; +status = amd_order (n, Ap, Ai, P, amd_control, amd_info) ; +amd_control (amd_control) ; +amd_info (amd_info) ; + +\end{verbatim} +} + +%------------------------------------------------------------------------------- +\section{Using UMFPACK in a Fortran program} +%------------------------------------------------------------------------------- + +UMFPACK includes a basic Fortran 77 interface to some of the C-callable +UMFPACK routines. +Since interfacing C and Fortran programs is not portable, this interface might +not work with all C and Fortran compilers. Refer to Section~\ref{Install} for +more details. The following Fortran routines are provided. +The list includes the C-callable routines that the Fortran interface +routine calls. Refer to the corresponding C routines in Section~\ref{C} for +more details on what the Fortran routine does. + +\begin{itemize} +\item {\tt umf4def}: sets the default control parameters + ({\tt umfpack\_di\_defaults}). + +\item {\tt umf4sym}: pre-ordering and symbolic factorization + ({\tt umfpack\_di\_symbolic}). + +\item {\tt umf4num}: numeric factorization + ({\tt umfpack\_di\_numeric}). + +\item {\tt umf4solr}: solve a linear system with iterative refinement + ({\tt umfpack\_di\_solve}). + +\item {\tt umf4sol}: solve a linear system without iterative refinement + ({\tt umfpack\_di\_solve}). Sets {\tt Control [UMFPACK\_IRSTEP]} + to zero, and does not require the matrix $\m{A}$. + +\item {\tt umf4scal}: scales a vector using UMFPACK's scale factors + ({\tt umfpack\_di\_scale}). + +\item {\tt umf4fnum}: free the {\tt Numeric} object + ({\tt umfpack\_di\_free\_numeric}). + +\item {\tt umf4fsym}: free the {\tt Symbolic} object + ({\tt umfpack\_di\_free\_symbolic}). + +\item {\tt umf4pcon}: prints the control parameters + ({\tt umfpack\_di\_report\_control}). + +\item {\tt umf4pinf}: print statistics + ({\tt umfpack\_di\_report\_info}). + +\item {\tt umf4snum}: save the {\tt Numeric} object to a file + ({\tt umfpack\_di\_save\_numeric}). + +\item {\tt umf4ssym}: save the {\tt Symbolic} object to a file + ({\tt umfpack\_di\_save\_symbolic}). + +\item {\tt umf4lnum}: load the {\tt Numeric} object from a file + ({\tt umfpack\_di\_load\_numeric}). + +\item {\tt umf4lsym}: load the {\tt Symbolic} object from a file + ({\tt umfpack\_di\_load\_symbolic}). +\end{itemize} + +The matrix $\m{A}$ is passed to UMFPACK in compressed column form, with 0-based +indices. In Fortran, for an {\tt m}-by-{\tt n} matrix $\m{A}$ with {\tt nz} +entries, the row indices of the first column (column 1) are in +{\tt Ai (Ap(1)+1} \ldots {\tt Ap(2))}, with values in +{\tt Ax (Ap(1)+1} \ldots {\tt Ap(2))}. The last column (column {\tt n}) is in +{\tt Ai (Ap(n)+1} \ldots {\tt Ap(n+1))} and +{\tt Ax (Ap(n)+1} \ldots {\tt Ap(n+1))}. +The number of entries in the matrix is thus {\tt nz = Ap (n+1)}. +The row indices in {\tt Ai} are in the range 0 to {\tt m}-1. They must be +sorted, with no duplicate entries allowed. None of the UMFPACK routines +modify the input matrix $\m{A}$. +The following definitions apply for the Fortran routines: + +{\footnotesize +\begin{verbatim} + integer m, n, Ap (n+1), Ai (nz), symbolic, numeric, filenum, status + double precision Ax (nz), control (20), info (90), x (n), b (n) +\end{verbatim} +} + +UMFPACK's status is returned in either a {\tt status} argument, or in +{\tt info (1)}. +It is zero if UMFPACK was successful, 1 if the matrix is singular (this is a +warning, not an error), and negative if an error occurred. +Section~\ref{error_codes} summarizes the possible values of {\tt status} +and {\tt info (1)}. +See Table~\ref{sys} for a list of the values of the {\tt sys} argument. +See Table~\ref{control} for a list of the control parameters (the +Fortran usage is the same as the MATLAB usage for this array). + +For the {\tt Numeric} and {\tt Symbolic} handles, it is probably safe to +assume that a Fortran {\tt integer} is sufficient to store a C pointer. If +that does not work, try defining {\tt numeric} and {\tt symbolic} in your +Fortran program as integer arrays of size 2. You will need to define them +as {\tt integer*8} if you compile UMFPACK in the 64-bit mode. + +To avoid passing strings between C and Fortran in the load/save routines, +a file number is passed instead, and the C interface constructs a file name +(if {\tt filenum} is 42, the {\tt Numeric} file name is {\tt n42.umf}, and +the {\tt Symbolic} file name is {\tt s42.umf}). + +The following is a summary of the calling sequence of each Fortran +interface routine. An example of their use is in the {\tt Demo/umf4hb.f} +file. That routine also includes an example of how to convert a 1-based +sparse matrix into 0-based form. For more details on the arguments of each +routine, refer to the arguments of the same name in the corresponding +C-callable routine, in Sections~\ref{Primary}~through~\ref{Utility}. +The only exception is the {\tt control} argument of {\tt umf4sol}, +which sets {\tt control (8)} to zero to disable iterative refinement. +Note that the solve routines do not overwrite {\tt b} with the solution, +but return their solution in a different array, {\tt x}. + +{\footnotesize +\begin{verbatim} + call umf4def (control) + call umf4sym (m, n, Ap, Ai, Ax, symbolic, control, info) + call umf4num (Ap, Ai, Ax, symbolic, numeric, control, info) + call umf4solr (sys, Ap, Ai, Ax, x, b, numeric, control, info) + call umf4sol (sys, x, b, numeric, control, info) + call umf4scal (x, b, numeric, status) + call umf4fnum (numeric) + call umf4fsym (symbolic) + call umf4pcon (control) + call umf4pinf (control) + call umf4snum (numeric, filenum, status) + call umf4ssym (symbolic, filenum, status) + call umf4lnum (numeric, filenum, status) + call umf4lsym (symbolic, filenum, status) +\end{verbatim} +} + +Access to the complex routines in UMFPACK is provided by the interface +routines in {\tt umf4\_f77zwrapper.c}. The following is a synopsis +of each routine. All the arguments are the same as the real versions, +except {\tt Az}, {\tt xz}, and {\tt bz} are the imaginary parts of +the matrix, solution, and right-hand-side, respectively. The +{\tt Ax}, {\tt x}, and {\tt b} are the real parts. + +{\footnotesize +\begin{verbatim} + call umf4zdef (control) + call umf4zsym (m, n, Ap, Ai, Ax, Az, symbolic, control, info) + call umf4znum (Ap, Ai, Ax, Az, symbolic, numeric, control, info) + call umf4zsolr (sys, Ap, Ai, Ax, Az, x, xz, b, bz, numeric, control, info) + call umf4zsol (sys, x, xz, b, bz, numeric, control, info) + call umf4zscal (x, xz, b, bz, numeric, status) + call umf4zfnum (numeric) + call umf4zfsym (symbolic) + call umf4zpcon (control) + call umf4zpinf (control) + call umf4zsnum (numeric, filenum, status) + call umf4zssym (symbolic, filenum, status) + call umf4zlnum (numeric, filenum, status) + call umf4zlsym (symbolic, filenum, status) +\end{verbatim} +} + +The Fortran interface does not support the packed complex case. + +%------------------------------------------------------------------------------- +\section{Installation} +\label{Install} +%------------------------------------------------------------------------------- + +%------------------------------------------------------------------------------- +\subsection{Installing the C library} +%------------------------------------------------------------------------------- + +The following discussion assumes you have the {\tt make} program, either in +Unix, or in Windows with Cygwin\footnote{www.cygwin.com}. +You can skip this section and go to next one if all you want to use is +the UMFPACK and AMD mexFunctions in MATLAB. + +You will need to install both UMFPACK v4.4 and AMD v1.1 (or AMD v1.0) to use UMFPACK. +The {\tt UMFPACK} and {\tt AMD} subdirectories must be placed side-by-side +within the same directory. AMD is a stand-alone package that +is required by UMFPACK. UMFPACK can be compiled without the +BLAS \cite{DaydeDuff99,ACM679a,ATLAS,GotoVandeGeijn02}, +but your performance will be much less than what it should be. + +System-dependent configurations are in the {\tt AMD/Make} +and {\tt UMFPACK/Make} directories (the \newline +{\tt UMFPACK/Make} directory is actually +just a symbolic link to {\tt AMD/Make}\footnote{Windows might not extract +the symbolic link {\tt UMFPACK/Make} correctly. If it doesn't, simply +create the {\tt UMFPACK/Make} folder by copying it from {\tt AMD/Make}.}). +You can edit the {\tt Make.include} +files in either of those directories to customize the compilation. The default +settings will work on most systems, except that UMFPACK will be compiled so +that it does not use the BLAS. Sample configuration files are provided +for Linux, Sun Solaris, SGI IRIX, IBM AIX, and the DEC/Compaq Alpha. + +To compile and install both packages, +go to the {\tt UMFPACK} directory and type {\tt make}. This will compile the +libraries ({\tt AMD/Lib/libamd.a} and {\tt UMFPACK/Lib/libumfpack.a}). +A demo of the AMD ordering routine will be compiled and tested in +the {\tt AMD/Demo} directory, and five demo programs will then be +compiled and tested in the {\tt UMFPACK/Demo} directory. +The outputs of these demo programs will then be compared with output +files in the distribution. Expect to see a few differences, such as +residual norms, compile-time control settings, and perhaps memory usage +differences. The AMD and UMFPACK mexFunctions for +use in MATLAB will also be compiled. If you do not have MATLAB 6.0 or +later, type {\tt make lib} instead. + +If you have the GNU version of {\tt make}, the {\tt Source/GNUmakefile} and +{\tt MATLAB/GNUmakefile} files are used. These are much more concise than +what the ``old'' version of {\tt make} can handle. If you do not have +GNU {\tt make}, the {\tt Source/Makefile} and {\tt MATLAB/Makefile} files +are used instead. Each UMFPACK source file is compiled into four +versions ({\tt double} / complex, and {\tt int} / {\tt long}). A proper +old-style {\tt Makefile} is cumbersome in this case, so these two +{\tt Makefile}'s have been constructed by brute force. They ignore +dependencies, and simply compile everything. I highly recommend using GNU +{\tt make} if you wish to modify UMFPACK. + +If you compile UMFPACK and AMD and then later change the {\tt Make.include} +file or your system-specific configuration file such as {\tt Make.linux}, +then you should type {\tt make purge} and then {\tt make} to recompile. + +Here are the various parameters that you can control in your +{\tt Make.include} file: + +\begin{itemize} +\item {\tt CC = } your C compiler, such as {\tt cc}. +\item {\tt RANLIB = } your system's {\tt ranlib} program, if needed. +\item {\tt CFLAGS = } optimization flags, such as {\tt -O}. + Add {\tt -DLP64} if you are compiling in 64-bit mode + (32 bit {\tt int}'s, 64 bit {\tt long}'s, and 64 bit pointers). +\item {\tt CONFIG = } configuration settings for the BLAS, memory allocation + routines, and timing routines. +\item {\tt LIB = } your libraries, such as {\tt -lm} or {\tt -lblas}. +\item {\tt RM =} the command to delete a file. +\item {\tt MV =} the command to rename a file. +\item {\tt MEX =} the command to compile a MATLAB mexFunction. + If you are using MATLAB 5, you need to add {\tt -DNBLAS} and + {\tt -DNUTIL} to this command. An example is provided in + the {\tt Make/Make.include} file. +\item {\tt F77 =} the command to compile a Fortran program (optional). +\item {\tt F77FLAGS =} the Fortran compiler flags (optional). +\item {\tt F77LIB =} the Fortran libraries (optional). +\end{itemize} + +The {\tt CONFIG} string can include combinations of the following; +most deal with how the BLAS are called: +\begin{itemize} +\item {\tt -DNBLAS} if you do not have any BLAS at all. +\item {\tt -DCBLAS} if you have the C-BLAS \cite{ATLAS}. +\item {\tt -DNSUNPERF} if you are on Solaris but do not have the Sun + Performance Library (for the BLAS). +\item {\tt -DNSCSL} if you on SGI IRIX but do not have the SCSL BLAS library. +\item {\tt -DLONGBLAS} if your BLAS can take {\tt long} integer input + arguments. If not defined, then the {\tt umfpack\_*l\_*} versions of + UMFPACK that use {\tt long} integers do not call the BLAS. + This flag is set internally when using the Sun Performance BLAS + or SGI's SCSL BLAS (both have 64-bit versions of the BLAS). +\item Options for controlling how C calls the Fortran BLAS: + {\tt -DBLAS\_BY\_VALUE}, {\tt -DBLAS\_NO\_UNDERSCORE}, + and {\tt -DBLAS\_CHAR\_ARG}. These are set automatically for Windows, + Sun Solaris, SGI Irix, Red Hat Linux, Compaq Alpha, and + AIX (the IBM RS 6000). They are ignored if you are using + the C-BLAS interface to the BLAS. +\item {\tt -DGETRUSAGE} if you have the {\tt getrusage} function. +\item {\tt -DNUTIL} if you wish to compile the MATLAB-callable + UMFPACK mexFunction with the {\tt mxMalloc}, {\tt mxRealloc} + and {\tt mxFree} routines, instead of the undocumented (but + superior) {\tt utMalloc}, {\tt utRealloc}, and {\tt utFree} + routines. The default is to use the {\tt ut*} routines on + Unix, and the {\tt mx*} routines on Windows. +\item {\tt -DNPOSIX} if you do not have the POSIX-compliant + {\tt sysconf} and {\tt times} routines used by + {\tt umfpack\_tic} and {\tt umfpack\_toc}. +\item {\tt -DNRECIPROCAL} controls a trade-off between speed and accuracy. + If defined (or if the pivot value itself is less than $10^{-12}$), + then the pivot column is divided by the pivot value during numeric + factorization. Otherwise, it is multiplied by the reciprocal of the + pivot, which is faster but can be less accurate. The default is + to multiply by the reciprocal unless the pivot value is small. + This option also modifies how the rows of the matrix $\m{A}$ are + scaled. If {\tt -DNRECIPROCAL} is defined (or if any scale factor is + less than $10^{-12}$), entries in the rows of $\m{A}$ are divided + by the scale factors. Otherwise, they are multiplied by the reciprocal. + When compiling the complex routines with the GNU {\tt gcc} compiler, the + pivot column is always divided by the pivot entry, because of a + numerical accuracy issue encountered with {\tt gcc} version 3.2 with a + few complex matrices on a Pentium 4M (running Linux). You can still + use {\tt -DNRECIPROCAL} to control how the scale factors + for the rows of $\m{A}$ are applied. +\item {\tt -DNO\_DIVIDE\_BY\_ZERO} controls how UMFPACK treats zeros + on the diagonal of $\m{U}$, for a singular matrix $\m{A}$. + If defined, then no division by + zero is performed (a zero entry on the diagonal of $\m{U}$ is + treated as if it were equal to one). By default, + UMFPACK will divide by zero. +\item {\tt -DNO\_TIMER} controls whether or not timing routines + are to be called. If defined, no timers are used. + Timers are included by default. +\end{itemize} + +If a Fortran BLAS package is used you may see compiler warnings. The BLAS +routines +{\tt dgemm}, {\tt dgemv}, {\tt dger}, {\tt dtrsm}, {\tt dtrsv}, {\tt dscal} +and their corresponding complex versions are used. +Header files are not provided for the Fortran +BLAS. You may safely ignore all of these warnings. + +I highly recommend the recent BLAS by Goto and van de Geijn +\cite{GotoVandeGeijn02}. Using this BLAS increased the performance +of UMFPACK by up to 50\% on a Dell Latitude C840 laptop (2GHz Pentium 4M, +512K L2 cache, 1GB main memory). The peak performance of +{\tt umfpack\_di\_numeric} with Goto and van de Geijn's BLAS is 1.6 Gflops +on this computer. In MATLAB, the peak performance of UMFPACK on +a dense matrix (stored in sparse format) is 900 Mflops, as compared to +1 Gflop for {\tt x = A}$\backslash${\tt b} +when {\tt A} is stored as a regular full matrix. + +When you compile your program that uses the C-callable UMFPACK library, +you need to link your program with both libraries +({\tt UMFPACK/Lib/libumfpack.a} and {\tt AMD/Lib/libamd.a}) +and you need to tell your compiler to look in the +directories {\tt UMFPACK/Include} and {\tt AMD/Include} for include +files. See {\tt UMFPACK/Demo/Makefile} for an example. +You do not need to directly include any AMD include files in your +program, unless you directly call AMD routines. You only need the +\begin{verbatim} +#include "umfpack.h" +\end{verbatim} +statement, as described in Section~\ref{Synopsis}. + +If you would like to compile both 32-bit and 64-bit versions of the libraries, +you will need to do it in two steps. Modify your {\tt Make/Make.} +file, and select the 32-bit option. Type {\tt make} in the {\tt UMFPACK} +directory, which creates the {\tt UMFPACK/Lib/libumfpack.a} and +{\tt AMD/Lib/libamd.a} libraries. Rename those two files. Edit your +{\tt Make/Make.} and select the 64-bit option. Type {\tt make purge}, +and then {\tt make}, and you will create the 64-bit libraries. +You can use the same {\tt umfpack.h} include file for both 32-bit and +64-bit versions. Simply link your program with the appropriate 32-bit +or 64-bit compiled version of the UMFPACK and AMD libraries. + +Type {\tt make hb} in the {\tt UMFPACK/Demo/HB} directory +to compile and run a C program that reads in and factorizes +Harwell/Boeing matrices. Note that this uses a stand-alone Fortran +program to read in the Fortran-formatted Harwell/Boeing matrices and +write them to a file which can be read by a C program. + +The {\tt umf\_multicompile.c} file has been added to assist in the +compilation of UMFPACK in Microsoft Visual Studio, for Windows. + +%------------------------------------------------------------------------------- +\subsection{Installing the MATLAB interface} +%------------------------------------------------------------------------------- + +If all you want to do is use the UMFPACK mexFunction in MATLAB, you can skip +the use of the {\tt make} command described above. Simply type +{\tt umfpack\_make} in MATLAB while in the {\tt UMFPACK/MATLAB} directory. +You can also type {\tt amd\_make} in the {\tt AMD/MATLAB} directory +to compile the stand-alone AMD mexFunction (this is not required to +compile the UMFPACK mexFunction). This works on any computer with MATLAB, +including Windows. + +You will be prompted to select several configuration options, including +whether or not to use the BLAS. +MATLAB 5.3 (or earlier) does not include the BLAS, so you either have to +compile UMFPACK without the BLAS (UMFPACK will be slow), or modify your +{\tt /bin/mexopts.sh} by adding your BLAS library +to the {\tt CLIBS} string, +where {\tt } is the directory in which MATLAB is installed. + +If you are using Windows and the {\tt lcc} compiler bundled with +MATLAB 6.1, then you may need to copy the +{\tt UMFPACK}$\backslash${\tt MATLAB}$\backslash${\tt lcc\_lib}$\backslash${\tt libmwlapack.lib} +file into the +{\tt }$\backslash${\tt extern}$\backslash${\tt lib}$\backslash${\tt win32}$\backslash${\tt lcc}$\backslash$ +directory. +Next, type {\tt mex -setup} +at the MATLAB prompt, and ask MATLAB to select the {\tt lcc} compiler. +MATLAB 6.1 has built-in BLAS, but in that version of MATLAB the BLAS +cannot be accessed by a mexFunction compiled by {\tt lcc} without first copying +this file to the location listed above. +If you have MATLAB 6.5 or later, you can probably skip this step. + +%------------------------------------------------------------------------------- +\subsection{Installing the Fortran interface} +%------------------------------------------------------------------------------- + +Once the 32-bit C-callable UMFPACK library is compiled, you can also compile +the Fortran interface, by typing {\tt make fortran}. This will create +the {\tt umf4hb} program, test it, and compare the output with the +file {\tt umf4hb.out} in the distribution. +If you compiled UMFPACK in 64-bit mode, you need to use {\tt make fortran64} +instead, which compiles the {\tt umf4hb64} program and compares its output +with the file {\tt umf4hb64.out}. +Refer to the comments in the {\tt Demo/umf4\_f77wrapper.c} file +for more details. + +This interface is {\bf highly} non-portable, since it depends +on how C and Fortran are interfaced. +Because of this issue, the interface is included in the {\tt Demo} directory, +and not as a primary part of the UMFPACK library. The interface routines are +not included in the compiled {\tt UMFPACK/Lib/libumfpack.a} library, but left +as stand-alone compiled files ({\tt umf4\_f77wrapper.o} and +{\tt umf4\_f77wrapper64.o} in the {\tt Demo} directory). +You may need to modify the interface routines in the file +{\tt umf4\_f77wrapper.c} if you are using compilers for which this interface +has not been tested. + +%------------------------------------------------------------------------------- +\subsection{Known Issues} +%------------------------------------------------------------------------------- + +The Microsoft C or C++ compilers on a Pentium badly break the IEEE 754 standard, +and do not treat NaN's properly. According to IEEE 754, the expression +{\tt (x != x)} is supposed to be true if and only if {\tt x} is NaN. For +non-compliant compilers in Windows that expression is always false, and another +test must be used: {\tt (x < x)} is true if and only if {\tt x} +is NaN. For compliant compilers, {\tt (x < x)} is always false, for any +value of {\tt x} (including NaN). +To cover both cases, UMFPACK when running under Microsoft Windows +defines the following macro, which is true if and only if {\tt x} is NaN, +regardless of whether your compiler is compliant or not: + +\begin{verbatim} +#define SCALAR_IS_NAN(x) (((x) != (x)) || ((x) < (x))) +\end{verbatim} + +If your compiler breaks this test, then UMFPACK will fail catastrophically +if it encounters a NaN. You will not just see NaN's in your output; UMFPACK +will probably crash with a segmentation fault. In that case, you might try to +see if the common (but non-ANSI C) routine {\tt isnan} is available, and modify +the macro {\tt SCALAR\_IS\_NAN} in {\tt umf\_version.h} accordingly. The +simpler (and IEEE 754-compliant) test {\tt (x != x)} is always true with Linux +on a PC, and on every Unix compiler I have tested. + +Some compilers will complain about the Fortran BLAS being defined implicitly. +C prototypes for the BLAS are not used, except the C-BLAS. Some compilers +will complain about unrecognized {\tt \#pragma}'s. You may safely ignore +all of these warnings. + +%------------------------------------------------------------------------------- +\section{Future work} +\label{Future} +%------------------------------------------------------------------------------- + +Here are a few features that are not in UMFPACK Version 4.4, in no particular +order. They may appear in a future release of UMFPACK. If you are interested, +let me know and I could consider including them: + +\begin{enumerate} + +\item Future versions may have different default {\tt Control} parameters. + Future versions may return more statistics in the {\tt Info} array, and + they may use more entries in the {\tt Control} array. + These two arrays will probably become larger, since there are very few + unused entries. If they change in size, the constants + {\tt UMFPACK\_CONTROL} and {\tt UMFPACK\_INFO} defined in {\tt umfpack.h} + will be changed to reflect their new size. Your C program should use + these constants when declaring the size of these two arrays. Do not + define them as {\tt Control [20]} and {\tt Info [90]}. + +\item Forward/back solvers for the conventional row or column-form data + structure for $\m{L}$ and $\m{U}$ (the output of + {\tt umfpack\_*\_di\_get\_numeric}). This would enable a separate + solver that could be used to write a MATLAB mexFunction + {\tt x = lu\_refine (A, b, L, U, P, Q, R)} that gives MATLAB access + to the iterative refinement algorithm with sparse backward error + analysis. It would also be easier to handle sparse right-hand-sides + in this data structure, and end up with good asymptotic run-time + in this case + (particularly for $\m{Lx}=\m{b}$; see \cite{GilbertPeierls88}). + +\item Complex absolute value computations could be + based on FDLIBM (see \newline + http://www.netlib.org/fdlibm), + using the {\tt hypot(x,y)} routine. + +\item When using iterative refinement, the residual $\m{Ax}-\m{b}$ could be + returned by {\tt umfpack\_solve}. + +\item The solve routines could handle multiple right-hand sides, and sparse + right-hand sides. See {\tt umfpack\_solve} for the MATLAB version + of this feature. + +\item An option to redirect the error and diagnostic output. + +\item Permutation to block-triangular-form \cite{Duff78a} for the C-callable + interface. There are two routines in the ACM Collected + Algorithms (529 and 575) \cite{Duff81b,Duff78b} + that could be translated from Fortran + to C and included in UMFPACK. This would result in better performance + for matrices from circuit simulation and + chemical process engineering. See {\tt umfpack\_btf.m} for the MATLAB + version of this feature. An upcoming package (KLU) will include + this feature. + +\item The ability to use user-provided {\tt malloc}, {\tt free}, and + {\tt realloc} memory allocation routines. Note that UMFPACK makes very + few calls to these routines. You can do this at compile-time by + modifying the definitions of {\tt ALLOCATE}, {\tt FREE}, and + {\tt REALLOCATE} in the file {\tt umf\_internal.h}. Be sure to document + your changes carefully when you change UMFPACK source code. + +\item The ability to use user-provided work arrays, so that {\tt malloc}, + {\tt free}, and {\tt realloc} realloc are not called. The + {\tt umfpack\_*\_wsolve} routine is one example. + +\item A method that takes time proportional to the number of nonzeros in + $\m{A}$ to compute the symbolic factorization \cite{GilbertNgPeyton94}. + This would improve the performance of the symmetric and 2-by-2 strategies, + and the unsymmetric strategy when dense rows are present. + The current method takes + time proportional to the number of nonzeros in the upper bound of $\m{U}$. + The method used in UMFPACK exploits super-columns, however, so this + bound is rarely reached. + +\item Other basic sparse matrix operations, such as sparse matrix + multiplication, could be included. + +\item A more complete Fortran interface. + +\item A C++ interface. + +\item A parallel version using MPI. This would require a large amount + of effort. + +\end{enumerate} + + +%------------------------------------------------------------------------------- +\newpage +\section{The primary UMFPACK routines} +\label{Primary} +%------------------------------------------------------------------------------- + +The include files are the same for all four versions of +UMFPACK. The generic integer type is {\tt Int}, which is an {\tt int} or +{\tt long}, depending on which version of UMFPACK you are using. + +\subsection{umfpack\_*\_symbolic} + +{\footnotesize +\begin{verbatim} +INCLUDE umfpack_symbolic.h via sed +\end{verbatim} +} + +\newpage +\subsection{umfpack\_*\_numeric} + +{\footnotesize +\begin{verbatim} +INCLUDE umfpack_numeric.h via sed +\end{verbatim} +} + +\newpage +\subsection{umfpack\_*\_solve} + +{\footnotesize +\begin{verbatim} +INCLUDE umfpack_solve.h via sed +\end{verbatim} +} + +\newpage +\subsection{umfpack\_*\_free\_symbolic} + +{\footnotesize +\begin{verbatim} +INCLUDE umfpack_free_symbolic.h via sed +\end{verbatim} +} + +\newpage +\subsection{umfpack\_*\_free\_numeric} + +{\footnotesize +\begin{verbatim} +INCLUDE umfpack_free_numeric.h via sed +\end{verbatim} +} + +%------------------------------------------------------------------------------- +\newpage +\section{Alternative routines} +\label{Alternative} +%------------------------------------------------------------------------------- + +\subsection{umfpack\_*\_defaults} + +{\footnotesize +\begin{verbatim} +INCLUDE umfpack_defaults.h via sed +\end{verbatim} +} + +\newpage +\subsection{umfpack\_*\_qsymbolic} + +{\footnotesize +\begin{verbatim} +INCLUDE umfpack_qsymbolic.h via sed +\end{verbatim} +} + +\newpage +\subsection{umfpack\_*\_wsolve} + +{\footnotesize +\begin{verbatim} +INCLUDE umfpack_wsolve.h via sed +\end{verbatim} +} + +%------------------------------------------------------------------------------- +\newpage +\section{Matrix manipulation routines} +\label{Manipulate} +%------------------------------------------------------------------------------- + +\subsection{umfpack\_*\_col\_to\_triplet} + +{\footnotesize +\begin{verbatim} +INCLUDE umfpack_col_to_triplet.h via sed +\end{verbatim} +} + +\newpage +\subsection{umfpack\_*\_triplet\_to\_col} + +{\footnotesize +\begin{verbatim} +INCLUDE umfpack_triplet_to_col.h via sed +\end{verbatim} +} + +\newpage +\subsection{umfpack\_*\_transpose} + +{\footnotesize +\begin{verbatim} +INCLUDE umfpack_transpose.h via sed +\end{verbatim} +} + +\newpage +\subsection{umfpack\_*\_scale} + +{\footnotesize +\begin{verbatim} +INCLUDE umfpack_scale.h via sed +\end{verbatim} +} + +%------------------------------------------------------------------------------- +\newpage +\section{Getting the contents of opaque objects} +\label{Get} +%------------------------------------------------------------------------------- + +\subsection{umfpack\_*\_get\_lunz} + +{\footnotesize +\begin{verbatim} +INCLUDE umfpack_get_lunz.h via sed +\end{verbatim} +} + +\newpage +\subsection{umfpack\_*\_get\_numeric} + +{\footnotesize +\begin{verbatim} +INCLUDE umfpack_get_numeric.h via sed +\end{verbatim} +} + +\newpage +\subsection{umfpack\_*\_get\_symbolic} + +{\footnotesize +\begin{verbatim} +INCLUDE umfpack_get_symbolic.h via sed +\end{verbatim} +} + +\newpage +\subsection{umfpack\_*\_save\_numeric} + +{\footnotesize +\begin{verbatim} +INCLUDE umfpack_save_numeric.h via sed +\end{verbatim} +} + +\newpage +\subsection{umfpack\_*\_load\_numeric} + +{\footnotesize +\begin{verbatim} +INCLUDE umfpack_load_numeric.h via sed +\end{verbatim} +} + +\newpage +\subsection{umfpack\_*\_save\_symbolic} + +{\footnotesize +\begin{verbatim} +INCLUDE umfpack_save_symbolic.h via sed +\end{verbatim} +} + +\newpage +\subsection{umfpack\_*\_load\_symbolic} + +{\footnotesize +\begin{verbatim} +INCLUDE umfpack_load_symbolic.h via sed +\end{verbatim} +} + +\newpage +\subsection{umfpack\_*\_get\_determinant} + +{\footnotesize +\begin{verbatim} +INCLUDE umfpack_get_determinant.h via sed +\end{verbatim} +} + +%------------------------------------------------------------------------------- +\newpage +\section{Reporting routines} +\label{Report} +%------------------------------------------------------------------------------- + +\subsection{umfpack\_*\_report\_status} + +{\footnotesize +\begin{verbatim} +INCLUDE umfpack_report_status.h via sed +\end{verbatim} +} + +\newpage +\subsection{umfpack\_*\_report\_control} + +{\footnotesize +\begin{verbatim} +INCLUDE umfpack_report_control.h via sed +\end{verbatim} +} + +\newpage +\subsection{umfpack\_*\_report\_info} + +{\footnotesize +\begin{verbatim} +INCLUDE umfpack_report_info.h via sed +\end{verbatim} +} + +\newpage +\subsection{umfpack\_*\_report\_matrix} + +{\footnotesize +\begin{verbatim} +INCLUDE umfpack_report_matrix.h via sed +\end{verbatim} +} + +\newpage +\subsection{umfpack\_*\_report\_numeric} + +{\footnotesize +\begin{verbatim} +INCLUDE umfpack_report_numeric.h via sed +\end{verbatim} +} + +\newpage +\subsection{umfpack\_*\_report\_perm} + +{\footnotesize +\begin{verbatim} +INCLUDE umfpack_report_perm.h via sed +\end{verbatim} +} + +\newpage +\subsection{umfpack\_*\_report\_symbolic} + +{\footnotesize +\begin{verbatim} +INCLUDE umfpack_report_symbolic.h via sed +\end{verbatim} +} + +\newpage +\subsection{umfpack\_*\_report\_triplet} + +{\footnotesize +\begin{verbatim} +INCLUDE umfpack_report_triplet.h via sed +\end{verbatim} +} + +\newpage +\subsection{umfpack\_*\_report\_vector} + +{\footnotesize +\begin{verbatim} +INCLUDE umfpack_report_vector.h via sed +\end{verbatim} +} + +%------------------------------------------------------------------------------- +\newpage +\section{Utility routines} +\label{Utility} +%------------------------------------------------------------------------------- + +\subsection{umfpack\_timer} + +{\footnotesize +\begin{verbatim} +INCLUDE umfpack_timer.h via sed +\end{verbatim} +} + +\newpage +\subsection{umfpack\_tic and umfpack\_toc} + +{\footnotesize +\begin{verbatim} +INCLUDE umfpack_tictoc.h via sed +\end{verbatim} +} + + +%------------------------------------------------------------------------------- +\newpage +% References +%------------------------------------------------------------------------------- + +\bibliographystyle{plain} +\bibliography{UserGuide} + +\end{document} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Include/umfpack.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,374 @@ +/* ========================================================================== */ +/* === umfpack.h ============================================================ */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + This is the umfpack.h include file, and should be included in all user code + that uses UMFPACK. Do not include any of the umf_* header files in user + code. All routines in UMFPACK starting with "umfpack_" are user-callable. + All other routines are prefixed "umf_XY_", (where X is d or z, and Y is + i or l) and are not user-callable. +*/ + +#ifndef UMFPACK_H +#define UMFPACK_H + +/* -------------------------------------------------------------------------- */ +/* size of Info and Control arrays */ +/* -------------------------------------------------------------------------- */ + +/* These might be larger in future versions, since there are only 3 unused + * entries in Info, and no unused entries in Control. */ + +#define UMFPACK_INFO 90 +#define UMFPACK_CONTROL 20 + +/* -------------------------------------------------------------------------- */ +/* User-callable routines */ +/* -------------------------------------------------------------------------- */ + +/* Primary routines: */ +#include "umfpack_symbolic.h" +#include "umfpack_numeric.h" +#include "umfpack_solve.h" +#include "umfpack_free_symbolic.h" +#include "umfpack_free_numeric.h" + +/* Alternative routines: */ +#include "umfpack_defaults.h" +#include "umfpack_qsymbolic.h" +#include "umfpack_wsolve.h" + +/* Matrix manipulation routines: */ +#include "umfpack_triplet_to_col.h" +#include "umfpack_col_to_triplet.h" +#include "umfpack_transpose.h" +#include "umfpack_scale.h" + +/* Getting the contents of the Symbolic and Numeric opaque objects: */ +#include "umfpack_get_lunz.h" +#include "umfpack_get_numeric.h" +#include "umfpack_get_symbolic.h" +#include "umfpack_save_numeric.h" +#include "umfpack_load_numeric.h" +#include "umfpack_save_symbolic.h" +#include "umfpack_load_symbolic.h" +#include "umfpack_get_determinant.h" + +/* Reporting routines (the above 14 routines print nothing): */ +#include "umfpack_report_status.h" +#include "umfpack_report_info.h" +#include "umfpack_report_control.h" +#include "umfpack_report_matrix.h" +#include "umfpack_report_triplet.h" +#include "umfpack_report_vector.h" +#include "umfpack_report_symbolic.h" +#include "umfpack_report_numeric.h" +#include "umfpack_report_perm.h" + +/* Utility routines: */ +#include "umfpack_timer.h" +#include "umfpack_tictoc.h" + +/* -------------------------------------------------------------------------- */ +/* Version, copyright, and license */ +/* -------------------------------------------------------------------------- */ + +#define UMFPACK_VERSION "UMFPACK V4.4 (Jan. 28, 2005)" + +#define UMFPACK_COPYRIGHT \ +"UMFPACK: Copyright (c) 2005 by Timothy A. Davis. All Rights Reserved.\n" + +#define UMFPACK_LICENSE_PART1 \ +"\nUMFPACK License:\n" \ +"\n" \ +" Your use or distribution of UMFPACK or any modified version of\n" \ +" UMFPACK implies that you agree to this License.\n" \ +"\n" \ +" THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY\n" \ +" EXPRESSED OR IMPLIED. ANY USE IS AT YOUR OWN RISK.\n" +#define UMFPACK_LICENSE_PART2 \ +"\n" \ +" Permission is hereby granted to use or copy this program, provided\n" \ +" that the Copyright, this License, and the Availability of the original\n" \ +" version is retained on all copies. User documentation of any code that\n" \ +" uses UMFPACK or any modified version of UMFPACK code must cite the\n" \ +" Copyright, this License, the Availability note, and \"Used by permission.\"\n" +#define UMFPACK_LICENSE_PART3 \ +" Permission to modify the code and to distribute modified code is granted,\n" \ +" provided the Copyright, this License, and the Availability note are\n" \ +" retained, and a notice that the code was modified is included. This\n" \ +" software was developed with support from the National Science Foundation,\n" \ +" and is provided to you free of charge.\n" \ +"\n" \ +"Availability: http://www.cise.ufl.edu/research/sparse/umfpack\n" \ +"\n" + +/* -------------------------------------------------------------------------- */ +/* contents of Info */ +/* -------------------------------------------------------------------------- */ + +/* Note that umfpack_report.m must coincide with these definitions. S is + * the submatrix of A after removing row/col singletons and empty rows/cols. */ + +/* returned by all routines that use Info: */ +#define UMFPACK_STATUS 0 /* UMFPACK_OK, or other result */ +#define UMFPACK_NROW 1 /* n_row input value */ +#define UMFPACK_NCOL 16 /* n_col input value */ +#define UMFPACK_NZ 2 /* # of entries in A */ + +/* computed in UMFPACK_*symbolic and UMFPACK_numeric: */ +#define UMFPACK_SIZE_OF_UNIT 3 /* sizeof (Unit) */ + +/* computed in UMFPACK_*symbolic: */ +#define UMFPACK_SIZE_OF_INT 4 /* sizeof (int) */ +#define UMFPACK_SIZE_OF_LONG 5 /* sizeof (long) */ +#define UMFPACK_SIZE_OF_POINTER 6 /* sizeof (void *) */ +#define UMFPACK_SIZE_OF_ENTRY 7 /* sizeof (Entry), real or complex */ +#define UMFPACK_NDENSE_ROW 8 /* number of dense rows */ +#define UMFPACK_NEMPTY_ROW 9 /* number of empty rows */ +#define UMFPACK_NDENSE_COL 10 /* number of dense rows */ +#define UMFPACK_NEMPTY_COL 11 /* number of empty rows */ +#define UMFPACK_SYMBOLIC_DEFRAG 12 /* # of memory compactions */ +#define UMFPACK_SYMBOLIC_PEAK_MEMORY 13 /* memory used by symbolic analysis */ +#define UMFPACK_SYMBOLIC_SIZE 14 /* size of Symbolic object, in Units */ +#define UMFPACK_SYMBOLIC_TIME 15 /* time (sec.) for symbolic analysis */ +#define UMFPACK_SYMBOLIC_WALLTIME 17 /* wall clock time for sym. analysis */ +#define UMFPACK_STRATEGY_USED 18 /* strategy used: sym, unsym, 2by2 */ +#define UMFPACK_ORDERING_USED 19 /* ordering used: colamd, amd, given */ +#define UMFPACK_QFIXED 31 /* whether Q is fixed or refined */ +#define UMFPACK_DIAG_PREFERRED 32 /* whether diagonal pivoting attempted*/ +#define UMFPACK_PATTERN_SYMMETRY 33 /* symmetry of pattern of S */ +#define UMFPACK_NZ_A_PLUS_AT 34 /* nnz (S+S'), excl. diagonal */ +#define UMFPACK_NZDIAG 35 /* nnz (diag (S)) */ + +/* AMD statistics, computed in UMFPACK_*symbolic: */ +#define UMFPACK_SYMMETRIC_LUNZ 36 /* nz in L+U, if AMD ordering used */ +#define UMFPACK_SYMMETRIC_FLOPS 37 /* flops for LU, if AMD ordering used */ +#define UMFPACK_SYMMETRIC_NDENSE 38 /* # of "dense" rows/cols in S+S' */ +#define UMFPACK_SYMMETRIC_DMAX 39 /* max nz in cols of L, for AMD */ + +/* statistics for 2-by-2 strategy */ +#define UMFPACK_2BY2_NWEAK 51 /* number of weak diagonal entries*/ +#define UMFPACK_2BY2_UNMATCHED 52 /* # of weak diagonals not matched*/ +#define UMFPACK_2BY2_PATTERN_SYMMETRY 53 /* symmetry of pattern of P*S */ +#define UMFPACK_2BY2_NZ_PA_PLUS_PAT 54 /* nz in PS+(PS)' */ +#define UMFPACK_2BY2_NZDIAG 55 /* nz on diagonal of PS+(PS)' */ + +/* statistcs for singleton pruning */ +#define UMFPACK_COL_SINGLETONS 56 /* # of column singletons */ +#define UMFPACK_ROW_SINGLETONS 57 /* # of row singletons */ +#define UMFPACK_N2 58 /* size of S */ +#define UMFPACK_S_SYMMETRIC 59 /* 1 if S square and symmetricly perm.*/ + +/* estimates computed in UMFPACK_*symbolic: */ +#define UMFPACK_NUMERIC_SIZE_ESTIMATE 20 /* final size of Numeric->Memory */ +#define UMFPACK_PEAK_MEMORY_ESTIMATE 21 /* for symbolic & numeric */ +#define UMFPACK_FLOPS_ESTIMATE 22 /* flop count */ +#define UMFPACK_LNZ_ESTIMATE 23 /* nz in L, incl. diagonal */ +#define UMFPACK_UNZ_ESTIMATE 24 /* nz in U, incl. diagonal */ +#define UMFPACK_VARIABLE_INIT_ESTIMATE 25 /* initial size of Numeric->Memory*/ +#define UMFPACK_VARIABLE_PEAK_ESTIMATE 26 /* peak size of Numeric->Memory */ +#define UMFPACK_VARIABLE_FINAL_ESTIMATE 27 /* final size of Numeric->Memory */ +#define UMFPACK_MAX_FRONT_SIZE_ESTIMATE 28 /* max frontal matrix size */ +#define UMFPACK_MAX_FRONT_NROWS_ESTIMATE 29 /* max # rows in any front */ +#define UMFPACK_MAX_FRONT_NCOLS_ESTIMATE 30 /* max # columns in any front */ + +/* exact values, (estimates shown above) computed in UMFPACK_numeric: */ +#define UMFPACK_NUMERIC_SIZE 40 /* final size of Numeric->Memory */ +#define UMFPACK_PEAK_MEMORY 41 /* for symbolic & numeric */ +#define UMFPACK_FLOPS 42 /* flop count */ +#define UMFPACK_LNZ 43 /* nz in L, incl. diagonal */ +#define UMFPACK_UNZ 44 /* nz in U, incl. diagonal */ +#define UMFPACK_VARIABLE_INIT 45 /* initial size of Numeric->Memory*/ +#define UMFPACK_VARIABLE_PEAK 46 /* peak size of Numeric->Memory */ +#define UMFPACK_VARIABLE_FINAL 47 /* final size of Numeric->Memory */ +#define UMFPACK_MAX_FRONT_SIZE 48 /* max frontal matrix size */ +#define UMFPACK_MAX_FRONT_NROWS 49 /* max # rows in any front */ +#define UMFPACK_MAX_FRONT_NCOLS 50 /* max # columns in any front */ + +/* computed in UMFPACK_numeric: */ +#define UMFPACK_NUMERIC_DEFRAG 60 /* # of garbage collections */ +#define UMFPACK_NUMERIC_REALLOC 61 /* # of memory reallocations */ +#define UMFPACK_NUMERIC_COSTLY_REALLOC 62 /* # of costlly memory realloc's */ +#define UMFPACK_COMPRESSED_PATTERN 63 /* # of integers in LU pattern */ +#define UMFPACK_LU_ENTRIES 64 /* # of reals in LU factors */ +#define UMFPACK_NUMERIC_TIME 65 /* numeric factorization time */ +#define UMFPACK_UDIAG_NZ 66 /* nz on diagonal of U */ +#define UMFPACK_RCOND 67 /* est. reciprocal condition # */ +#define UMFPACK_WAS_SCALED 68 /* none, max row, or sum row */ +#define UMFPACK_RSMIN 69 /* min (max row) or min (sum row) */ +#define UMFPACK_RSMAX 70 /* max (max row) or max (sum row) */ +#define UMFPACK_UMIN 71 /* min abs diagonal entry of U */ +#define UMFPACK_UMAX 72 /* max abs diagonal entry of U */ +#define UMFPACK_ALLOC_INIT_USED 73 /* alloc_init parameter used */ +#define UMFPACK_FORCED_UPDATES 74 /* # of forced updates */ +#define UMFPACK_NUMERIC_WALLTIME 75 /* numeric wall clock time */ +#define UMFPACK_NOFF_DIAG 76 /* number of off-diagonal pivots */ + +#define UMFPACK_ALL_LNZ 77 /* nz in L, if no dropped entries */ +#define UMFPACK_ALL_UNZ 78 /* nz in U, if no dropped entries */ +#define UMFPACK_NZDROPPED 79 /* # of dropped small entries */ + +/* computed in UMFPACK_solve: */ +#define UMFPACK_IR_TAKEN 80 /* # of iterative refinement steps taken */ +#define UMFPACK_IR_ATTEMPTED 81 /* # of iter. refinement steps attempted */ +#define UMFPACK_OMEGA1 82 /* omega1, sparse backward error estimate */ +#define UMFPACK_OMEGA2 83 /* omega2, sparse backward error estimate */ +#define UMFPACK_SOLVE_FLOPS 84 /* flop count for solve */ +#define UMFPACK_SOLVE_TIME 85 /* solve time (seconds) */ +#define UMFPACK_SOLVE_WALLTIME 86 /* solve time (wall clock, seconds) */ + +/* Info [87, 88, 89] unused */ + +/* Unused parts of Info may be used in future versions of UMFPACK. */ + +/* -------------------------------------------------------------------------- */ + +/* Info [UMFPACK_ORDERING_USED] is one of the following: */ +#define UMFPACK_ORDERING_COLAMD 0 /* COLAMD(A) */ +#define UMFPACK_ORDERING_AMD 1 /* AMD(A+A') */ +#define UMFPACK_ORDERING_GIVEN 2 /* Q is provided on input */ + +/* -------------------------------------------------------------------------- */ +/* contents of Control */ +/* -------------------------------------------------------------------------- */ + +/* used in all UMFPACK_report_* routines: */ +#define UMFPACK_PRL 0 /* print level */ + +/* used in UMFPACK_*symbolic only: */ +#define UMFPACK_DENSE_ROW 1 /* dense row parameter */ +#define UMFPACK_DENSE_COL 2 /* dense col parameter */ +#define UMFPACK_BLOCK_SIZE 4 /* BLAS-3 block size */ +#define UMFPACK_STRATEGY 5 /* auto, symmetric, unsym., or 2by2 */ +#define UMFPACK_2BY2_TOLERANCE 12 /* 2-by-2 pivot tolerance */ +#define UMFPACK_FIXQ 13 /* -1: no fixQ, 0: default, 1: fixQ */ +#define UMFPACK_AMD_DENSE 14 /* for AMD ordering */ +#define UMFPACK_AGGRESSIVE 19 /* whether or not to use aggressive + * absorption in AMD and COLAMD */ + +/* used in UMFPACK_numeric only: */ +#define UMFPACK_PIVOT_TOLERANCE 3 /* threshold partial pivoting setting */ +#define UMFPACK_ALLOC_INIT 6 /* initial allocation ratio */ +#define UMFPACK_SYM_PIVOT_TOLERANCE 15 /* threshold, only for diag. entries */ +#define UMFPACK_SCALE 16 /* what row scaling to do */ +#define UMFPACK_FRONT_ALLOC_INIT 17 /* frontal matrix allocation ratio */ +#define UMFPACK_DROPTOL 18 /* drop tolerance for entries in L,U */ + +/* used in UMFPACK_*solve only: */ +#define UMFPACK_IRSTEP 7 /* max # of iterative refinements */ + +/* compile-time settings - Control [8..11] cannot be changed at run time: */ +#define UMFPACK_COMPILED_WITH_BLAS 8 /* uses the BLAS */ +#define UMFPACK_COMPILED_FOR_MATLAB 9 /* 1 if MATLAB mexFunction, etc. */ +#define UMFPACK_COMPILED_WITH_GETRUSAGE 10 /* uses getrusage timer, or not */ +#define UMFPACK_COMPILED_IN_DEBUG_MODE 11 /* debugging enabled (very slow!) */ + +/* -------------------------------------------------------------------------- */ + +/* Control [UMFPACK_STRATEGY] is one of the following: */ +#define UMFPACK_STRATEGY_AUTO 0 /* use sym. or unsym. strategy */ +#define UMFPACK_STRATEGY_UNSYMMETRIC 1 /* COLAMD(A), coletree postorder, + not prefer diag*/ +#define UMFPACK_STRATEGY_2BY2 2 /* AMD(PA+PA'), no coletree postorder, + prefer diag(PA) where P is pseudo + max transversal */ +#define UMFPACK_STRATEGY_SYMMETRIC 3 /* AMD(A+A'), no coletree postorder, + prefer diagonal */ + +/* Control [UMFPACK_SCALE] is one of the following: */ +#define UMFPACK_SCALE_NONE 0 /* no scaling */ +#define UMFPACK_SCALE_SUM 1 /* default: divide each row by sum (abs (row))*/ +#define UMFPACK_SCALE_MAX 2 /* divide each row by max (abs (row)) */ + +/* -------------------------------------------------------------------------- */ +/* default values of Control: */ +/* -------------------------------------------------------------------------- */ + +#define UMFPACK_DEFAULT_PRL 1 +#define UMFPACK_DEFAULT_DENSE_ROW 0.2 +#define UMFPACK_DEFAULT_DENSE_COL 0.2 +#define UMFPACK_DEFAULT_PIVOT_TOLERANCE 0.1 +#define UMFPACK_DEFAULT_2BY2_TOLERANCE 0.01 +#define UMFPACK_DEFAULT_SYM_PIVOT_TOLERANCE 0.001 +#define UMFPACK_DEFAULT_BLOCK_SIZE 32 +#define UMFPACK_DEFAULT_ALLOC_INIT 0.7 +#define UMFPACK_DEFAULT_FRONT_ALLOC_INIT 0.5 +#define UMFPACK_DEFAULT_IRSTEP 2 +#define UMFPACK_DEFAULT_SCALE UMFPACK_SCALE_SUM +#define UMFPACK_DEFAULT_STRATEGY UMFPACK_STRATEGY_AUTO +#define UMFPACK_DEFAULT_AMD_DENSE AMD_DEFAULT_DENSE +#define UMFPACK_DEFAULT_FIXQ 0 +#define UMFPACK_DEFAULT_AGGRESSIVE 1 +#define UMFPACK_DEFAULT_DROPTOL 0 + +/* default values of Control may change in future versions of UMFPACK. */ + +/* -------------------------------------------------------------------------- */ +/* status codes */ +/* -------------------------------------------------------------------------- */ + +#define UMFPACK_OK (0) + +/* status > 0 means a warning, but the method was successful anyway. */ +/* A Symbolic or Numeric object was still created. */ +#define UMFPACK_WARNING_singular_matrix (1) + +/* The following warnings were added in umfpack_*_get_determinant */ +#define UMFPACK_WARNING_determinant_underflow (2) +#define UMFPACK_WARNING_determinant_overflow (3) + +/* status < 0 means an error, and the method was not successful. */ +/* No Symbolic of Numeric object was created. */ +#define UMFPACK_ERROR_out_of_memory (-1) +#define UMFPACK_ERROR_invalid_Numeric_object (-3) +#define UMFPACK_ERROR_invalid_Symbolic_object (-4) +#define UMFPACK_ERROR_argument_missing (-5) +#define UMFPACK_ERROR_n_nonpositive (-6) +#define UMFPACK_ERROR_invalid_matrix (-8) +#define UMFPACK_ERROR_different_pattern (-11) +#define UMFPACK_ERROR_invalid_system (-13) +#define UMFPACK_ERROR_invalid_permutation (-15) +#define UMFPACK_ERROR_internal_error (-911) /* yes, call me if you get this! */ +#define UMFPACK_ERROR_file_IO (-17) + +/* -------------------------------------------------------------------------- */ +/* solve codes */ +/* -------------------------------------------------------------------------- */ + +/* Solve the system ( )x=b, where ( ) is defined below. "t" refers to the */ +/* linear algebraic transpose (complex conjugate if A is complex), or the (') */ +/* operator in MATLAB. "at" refers to the array transpose, or the (.') */ +/* operator in MATLAB. */ + +#define UMFPACK_A (0) /* Ax=b */ +#define UMFPACK_At (1) /* A'x=b */ +#define UMFPACK_Aat (2) /* A.'x=b */ + +#define UMFPACK_Pt_L (3) /* P'Lx=b */ +#define UMFPACK_L (4) /* Lx=b */ +#define UMFPACK_Lt_P (5) /* L'Px=b */ +#define UMFPACK_Lat_P (6) /* L.'Px=b */ +#define UMFPACK_Lt (7) /* L'x=b */ +#define UMFPACK_Lat (8) /* L.'x=b */ + +#define UMFPACK_U_Qt (9) /* UQ'x=b */ +#define UMFPACK_U (10) /* Ux=b */ +#define UMFPACK_Q_Ut (11) /* QU'x=b */ +#define UMFPACK_Q_Uat (12) /* QU.'x=b */ +#define UMFPACK_Ut (13) /* U'x=b */ +#define UMFPACK_Uat (14) /* U.'x=b */ + +/* -------------------------------------------------------------------------- */ + +/* Integer constants are used for status and solve codes instead of enum */ +/* to make it easier for a Fortran code to call UMFPACK. */ + +#endif /* UMFPACK_H */ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Include/umfpack_col_to_triplet.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_col_to_triplet.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,110 @@ +/* ========================================================================== */ +/* === umfpack_col_to_triplet =============================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +int umfpack_di_col_to_triplet +( + int n_col, + const int Ap [ ], + int Tj [ ] +) ; + +long umfpack_dl_col_to_triplet +( + long n_col, + const long Ap [ ], + long Tj [ ] +) ; + +int umfpack_zi_col_to_triplet +( + int n_col, + const int Ap [ ], + int Tj [ ] +) ; + +long umfpack_zl_col_to_triplet +( + long n_col, + const long Ap [ ], + long Tj [ ] +) ; + +/* +double int Syntax: + + #include "umfpack.h" + int n_col, *Tj, *Ap, status ; + status = umfpack_di_col_to_triplet (n_col, Ap, Tj) ; + +double long Syntax: + + #include "umfpack.h" + long n_col, *Tj, *Ap, status ; + status = umfpack_dl_col_to_triplet (n_col, Ap, Tj) ; + +complex int Syntax: + + #include "umfpack.h" + int n_col, *Tj, *Ap, status ; + status = umfpack_zi_col_to_triplet (n_col, Ap, Tj) ; + +complex long Syntax: + + #include "umfpack.h" + long n_col, *Tj, *Ap, status ; + status = umfpack_zl_col_to_triplet (n_col, Ap, Tj) ; + +Purpose: + + Converts a column-oriented matrix to a triplet form. Only the column + pointers, Ap, are required, and only the column indices of the triplet form + are constructed. This routine is the opposite of umfpack_*_triplet_to_col. + The matrix may be singular and/or rectangular. Analogous to [i, Tj, x] = + find (A) in MATLAB, except that zero entries present in the column-form of + A are present in the output, and i and x are not created (those are just Ai + and Ax+Az*1i, respectively, for a column-form matrix A). + +Returns: + + UMFPACK_OK if successful + UMFPACK_ERROR_argument_missing if Ap or Tj is missing + UMFPACK_ERROR_n_nonpositive if n_col <= 0 + UMFPACK_ERROR_invalid_matrix if Ap [n_col] < 0, Ap [0] != 0, or + Ap [j] > Ap [j+1] for any j in the range 0 to n-1. + Unsorted columns and duplicate entries do not cause an error (these would + only be evident by examining Ai). Empty rows and columns are OK. + +Arguments: + + Int n_col ; Input argument, not modified. + + A is an n_row-by-n_col matrix. Restriction: n_col > 0. + (n_row is not required) + + Int Ap [n_col+1] ; Input argument, not modified. + + The column pointers of the column-oriented form of the matrix. See + umfpack_*_*symbolic for a description. The number of entries in + the matrix is nz = Ap [n_col]. Restrictions on Ap are the same as those + for umfpack_*_transpose. Ap [0] must be zero, nz must be >= 0, and + Ap [j] <= Ap [j+1] and Ap [j] <= Ap [n_col] must be true for all j in + the range 0 to n_col-1. Empty columns are OK (that is, Ap [j] may equal + Ap [j+1] for any j in the range 0 to n_col-1). + + Int Tj [nz] ; Output argument. + + Tj is an integer array of size nz on input, where nz = Ap [n_col]. + Suppose the column-form of the matrix is held in Ap, Ai, Ax, and Az + (see umfpack_*_*symbolic for a description). Then on output, the + triplet form of the same matrix is held in Ai (row indices), Tj (column + indices), and Ax (numerical values). Note, however, that this routine + does not require Ai and Ax (or Az for the complex version) in order to + do the conversion. +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Include/umfpack_defaults.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_defaults.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,69 @@ +/* ========================================================================== */ +/* === umfpack_defaults ===================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +void umfpack_di_defaults +( + double Control [UMFPACK_CONTROL] +) ; + +void umfpack_dl_defaults +( + double Control [UMFPACK_CONTROL] +) ; + +void umfpack_zi_defaults +( + double Control [UMFPACK_CONTROL] +) ; + +void umfpack_zl_defaults +( + double Control [UMFPACK_CONTROL] +) ; + +/* +double int Syntax: + + #include "umfpack.h" + double Control [UMFPACK_CONTROL] ; + umfpack_di_defaults (Control) ; + +double long Syntax: + + #include "umfpack.h" + double Control [UMFPACK_CONTROL] ; + umfpack_dl_defaults (Control) ; + +complex int Syntax: + + #include "umfpack.h" + double Control [UMFPACK_CONTROL] ; + umfpack_zi_defaults (Control) ; + +complex long Syntax: + + #include "umfpack.h" + double Control [UMFPACK_CONTROL] ; + umfpack_zl_defaults (Control) ; + +Purpose: + + Sets the default control parameter settings. + +Arguments: + + double Control [UMFPACK_CONTROL] ; Output argument. + + Control is set to the default control parameter settings. You can + then modify individual settings by changing specific entries in the + Control array. If Control is a (double *) NULL pointer, then + umfpack_*_defaults returns silently (no error is generated, since + passing a NULL pointer for Control to any UMFPACK routine is valid). +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Include/umfpack_free_numeric.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_free_numeric.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,67 @@ +/* ========================================================================== */ +/* === umfpack_free_numeric ================================================= */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +void umfpack_di_free_numeric +( + void **Numeric +) ; + +void umfpack_dl_free_numeric +( + void **Numeric +) ; + +void umfpack_zi_free_numeric +( + void **Numeric +) ; + +void umfpack_zl_free_numeric +( + void **Numeric +) ; + +/* +double int Syntax: + + #include "umfpack.h" + void *Numeric ; + umfpack_di_free_numeric (&Numeric) ; + +double long Syntax: + + #include "umfpack.h" + void *Numeric ; + umfpack_dl_free_numeric (&Numeric) ; + +complex int Syntax: + + #include "umfpack.h" + void *Numeric ; + umfpack_zi_free_numeric (&Numeric) ; + +complex long Syntax: + + #include "umfpack.h" + void *Numeric ; + umfpack_zl_free_numeric (&Numeric) ; + +Purpose: + + Deallocates the Numeric object and sets the Numeric handle to NULL. This + routine is the only valid way of destroying the Numeric object. + +Arguments: + + void **Numeric ; Input argument, set to (void *) NULL on output. + + Numeric points to a valid Numeric object, computed by umfpack_*_numeric. + No action is taken if Numeric is a (void *) NULL pointer. +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Include/umfpack_free_symbolic.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_free_symbolic.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,67 @@ +/* ========================================================================== */ +/* === umfpack_free_symbolic ================================================ */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +void umfpack_di_free_symbolic +( + void **Symbolic +) ; + +void umfpack_dl_free_symbolic +( + void **Symbolic +) ; + +void umfpack_zi_free_symbolic +( + void **Symbolic +) ; + +void umfpack_zl_free_symbolic +( + void **Symbolic +) ; + +/* +double int Syntax: + + #include "umfpack.h" + void *Symbolic ; + umfpack_di_free_symbolic (&Symbolic) ; + +double long Syntax: + + #include "umfpack.h" + void *Symbolic ; + umfpack_dl_free_symbolic (&Symbolic) ; + +complex int Syntax: + + #include "umfpack.h" + void *Symbolic ; + umfpack_zi_free_symbolic (&Symbolic) ; + +complex long Syntax: + + #include "umfpack.h" + void *Symbolic ; + umfpack_zl_free_symbolic (&Symbolic) ; + +Purpose: + + Deallocates the Symbolic object and sets the Symbolic handle to NULL. This + routine is the only valid way of destroying the Symbolic object. + +Arguments: + + void **Symbolic ; Input argument, set to (void *) NULL on output. + + Points to a valid Symbolic object computed by umfpack_*_symbolic. + No action is taken if Symbolic is a (void *) NULL pointer. +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Include/umfpack_get_determinant.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_get_determinant.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,192 @@ +/* ========================================================================== */ +/* === UMFPACK_get_determinant ============================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +int umfpack_di_get_determinant +( + double *Mx, + double *Ex, + void *NumericHandle, + double User_Info [UMFPACK_INFO] +) ; + +long umfpack_dl_get_determinant +( + double *Mx, + double *Ex, + void *NumericHandle, + double User_Info [UMFPACK_INFO] +) ; + +int umfpack_zi_get_determinant +( + double *Mx, + double *Mz, + double *Ex, + void *NumericHandle, + double User_Info [UMFPACK_INFO] +) ; + +long umfpack_zl_get_determinant +( + double *Mx, + double *Mz, + double *Ex, + void *NumericHandle, + double User_Info [UMFPACK_INFO] +) ; + +/* +double int Syntax: + + #include "umfpack.h" + void *Numeric ; + int status ; + double Mx, Ex, Info [UMFPACK_INFO] ; + status = umfpack_di_get_determinant (&Mx, &Ex, Numeric, Info) ; + +double long Syntax: + + #include "umfpack.h" + void *Numeric ; + long status ; + double Mx, Ex, Info [UMFPACK_INFO] ; + status = umfpack_dl_get_determinant (&Mx, &Ex, Numeric, Info) ; + +complex int Syntax: + + #include "umfpack.h" + void *Numeric ; + int status ; + double Mx, Mz, Ex, Info [UMFPACK_INFO] ; + status = umfpack_zi_get_determinant (&Mx, &Mz, &Ex, Numeric, Info) ; + +complex int Syntax: + + #include "umfpack.h" + void *Numeric ; + long status ; + double *Mx, *Mz, *Ex, Info [UMFPACK_INFO] ; + status = umfpack_zl_get_determinant (&Mx, &Mz, &Ex, Numeric, Info) ; + +packed complex int Syntax: + + Same as above, except Mz is NULL. + +Purpose: + + Using the LU factors and the permutation vectors contained in the Numeric + object, calculate the determinant of the matrix A. + + The value of the determinant can be returned in two forms, depending on + whether Ex is NULL or not. If Ex is NULL then the value of the determinant + is returned on Mx and Mz for the real and imaginary parts. However, to + avoid over- or underflows, the determinant can be split into a mantissa + and exponent, and the parts returned separately, in which case Ex is not + NULL. The actual determinant is then given by + + double det ; + det = Mx * pow (10.0, Ex) ; + + for the double case, or + + double det [2] ; + det [0] = Mx * pow (10.0, Ex) ; // real part + det [1] = Mz * pow (10.0, Ex) ; // imaginary part + + for the complex case. Information on if the determinant will or has + over or under-flowed is given by Info [UMFPACK_STATUS]. + + In the "packed complex" syntax, Mx [0] holds the real part and Mx [1] + holds the imaginary part. Mz is not used (it is NULL). + +Returns: + + Returns UMFPACK_OK if sucessful. Returns UMFPACK_ERROR_out_of_memory if + insufficient memory is available for the n_row integer workspace that + umfpack_*_get_determinant allocates to construct pivots from the + permutation vectors. Returns UMFPACK_ERROR_invalid_Numeric_object if the + Numeric object provided as input is invalid. Returns + UMFPACK_WARNING_singular_matrix if the determinant is zero. Returns + UMFPACK_WARNING_determinant_underflow or + UMFPACK_WARNING_determinant_overflow if the determinant has underflowed + overflowed (for the case when Ex is NULL), or will overflow if Ex is not + NULL and det is computed (see above) in the user program. + +Arguments: + + double *Mx ; Output argument (array of size 1, or size 2 if Mz is NULL) + double *Mz ; Output argument (optional) + double *Ex ; Output argument (optional) + + The determinant returned in mantissa/exponent form, as discussed above. + If Mz is NULL, then both the original and imaginary parts will be + returned in Mx. If Ex is NULL then the determinant is returned directly + in Mx and Mz (or Mx [0] and Mx [1] if Mz is NULL), rather than in + mantissa/exponent form. + + void *Numeric ; Input argument, not modified. + + Numeric must point to a valid Numeric object, computed by + umfpack_*_numeric. + + double Info [UMFPACK_INFO] ; Output argument. + + Contains information about the calculation of the determinant. If a + (double *) NULL pointer is passed, then no statistics are returned in + Info (this is not an error condition). The following statistics are + computed in umfpack_*_determinant: + + Info [UMFPACK_STATUS]: status code. This is also the return value, + whether or not Info is present. + + UMFPACK_OK + + The determinant was successfully found. + + UMFPACK_ERROR_out_of_memory + + Insufficient memory to solve the linear system. + + UMFPACK_ERROR_argument_missing + + Mx is missing (NULL). + + UMFPACK_ERROR_invalid_Numeric_object + + The Numeric object is not valid. + + UMFPACK_ERROR_invalid_system + + The matrix is rectangular. Only square systems can be + handled. + + UMFPACK_WARNING_singluar_matrix + + The determinant is zero or NaN. The matrix is singular. + + UMFPACK_WARNING_determinant_underflow + + When passing from mantissa/exponent form to the determinant + an underflow has or will occur. If the mantissa/exponent from + of obtaining the determinant is used, the underflow will occur + in the user program. If the single argument method of + obtaining the determinant is used, the underflow has already + occurred. + + UMFPACK_WARNING_determinant_overflow + + When passing from mantissa/exponent form to the determinant + an overflow has or will occur. If the mantissa/exponent from + of obtaining the determinant is used, the overflow will occur + in the user program. If the single argument method of + obtaining the determinant is used, the overflow has already + occurred. + +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Include/umfpack_get_lunz.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_get_lunz.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,133 @@ +/* ========================================================================== */ +/* === umfpack_get_lunz ===================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +int umfpack_di_get_lunz +( + int *lnz, + int *unz, + int *n_row, + int *n_col, + int *nz_udiag, + void *Numeric +) ; + +long umfpack_dl_get_lunz +( + long *lnz, + long *unz, + long *n_row, + long *n_col, + long *nz_udiag, + void *Numeric +) ; + +int umfpack_zi_get_lunz +( + int *lnz, + int *unz, + int *n_row, + int *n_col, + int *nz_udiag, + void *Numeric +) ; + +long umfpack_zl_get_lunz +( + long *lnz, + long *unz, + long *n_row, + long *n_col, + long *nz_udiag, + void *Numeric +) ; + +/* +double int Syntax: + + #include "umfpack.h" + void *Numeric ; + int status, lnz, unz, n_row, n_col ; + status = umfpack_di_get_lunz (&lnz, &unz, &n_row, &n_col, Numeric) ; + +double long Syntax: + + #include "umfpack.h" + void *Numeric ; + long status, lnz, unz, n_row, n_col ; + status = umfpack_dl_get_lunz (&lnz, &unz, &n_row, &n_col, Numeric) ; + +complex int Syntax: + + #include "umfpack.h" + void *Numeric ; + int status, lnz, unz, n_row, n_col ; + status = umfpack_zi_get_lunz (&lnz, &unz, &n_row, &n_col, Numeric) ; + +complex long Syntax: + + #include "umfpack.h" + void *Numeric ; + long status, lnz, unz, n_row, n_col ; + status = umfpack_zl_get_lunz (&lnz, &unz, &n_row, &n_col, Numeric) ; + +Purpose: + + Determines the size and number of nonzeros in the LU factors held by the + Numeric object. These are also the sizes of the output arrays required + by umfpack_*_get_numeric. + + The matrix L is n_row -by- min(n_row,n_col), with lnz nonzeros, including + the entries on the unit diagonal of L. + + The matrix U is min(n_row,n_col) -by- n_col, with unz nonzeros, including + nonzeros on the diagonal of U. + +Returns: + + UMFPACK_OK if successful. + UMFPACK_ERROR_invalid_Numeric_object if Numeric is not a valid object. + UMFPACK_ERROR_argument_missing if any other argument is (Int *) NULL. + +Arguments: + + Int *lnz ; Output argument. + + The number of nonzeros in L, including the diagonal (which is all + one's). This value is the required size of the Lj and Lx arrays as + computed by umfpack_*_get_numeric. The value of lnz is identical to + Info [UMFPACK_LNZ], if that value was returned by umfpack_*_numeric. + + Int *unz ; Output argument. + + The number of nonzeros in U, including the diagonal. This value is the + required size of the Ui and Ux arrays as computed by + umfpack_*_get_numeric. The value of unz is identical to + Info [UMFPACK_UNZ], if that value was returned by umfpack_*_numeric. + + Int *n_row ; Output argument. + Int *n_col ; Output argument. + + The order of the L and U matrices. L is n_row -by- min(n_row,n_col) + and U is min(n_row,n_col) -by- n_col. + + Int *nz_udiag ; Output argument. + + The number of numerically nonzero values on the diagonal of U. The + matrix is singular if nz_diag < min(n_row,n_col). A divide-by-zero + will occur if nz_diag < n_row == n_col when solving a sparse system + involving the matrix U in umfpack_*_*solve. The value of nz_udiag is + identical to Info [UMFPACK_UDIAG_NZ] if that value was returned by + umfpack_*_numeric. + + void *Numeric ; Input argument, not modified. + + Numeric must point to a valid Numeric object, computed by + umfpack_*_numeric. +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Include/umfpack_get_numeric.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_get_numeric.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,252 @@ +/* ========================================================================== */ +/* === umfpack_get_numeric ================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +int umfpack_di_get_numeric +( + int Lp [ ], + int Lj [ ], + double Lx [ ], + int Up [ ], + int Ui [ ], + double Ux [ ], + int P [ ], + int Q [ ], + double Dx [ ], + int *do_recip, + double Rs [ ], + void *Numeric +) ; + +long umfpack_dl_get_numeric +( + long Lp [ ], + long Lj [ ], + double Lx [ ], + long Up [ ], + long Ui [ ], + double Ux [ ], + long P [ ], + long Q [ ], + double Dx [ ], + long *do_recip, + double Rs [ ], + void *Numeric +) ; + +int umfpack_zi_get_numeric +( + int Lp [ ], + int Lj [ ], + double Lx [ ], double Lz [ ], + int Up [ ], + int Ui [ ], + double Ux [ ], double Uz [ ], + int P [ ], + int Q [ ], + double Dx [ ], double Dz [ ], + int *do_recip, + double Rs [ ], + void *Numeric +) ; + +long umfpack_zl_get_numeric +( + long Lp [ ], + long Lj [ ], + double Lx [ ], double Lz [ ], + long Up [ ], + long Ui [ ], + double Ux [ ], double Uz [ ], + long P [ ], + long Q [ ], + double Dx [ ], double Dz [ ], + long *do_recip, + double Rs [ ], + void *Numeric +) ; + +/* +double int Syntax: + + #include "umfpack.h" + void *Numeric ; + int *Lp, *Lj, *Up, *Ui, *P, *Q, status, do_recip ; + double *Lx, *Ux, *Dx, *Rs ; + status = umfpack_di_get_numeric (Lp, Lj, Lx, Up, Ui, Ux, P, Q, Dx, + &do_recip, Rs, Numeric) ; + +double long Syntax: + + #include "umfpack.h" + void *Numeric ; + long *Lp, *Lj, *Up, *Ui, *P, *Q, status, do_recip ; + double *Lx, *Ux, *Dx, *Rs ; + status = umfpack_dl_get_numeric (Lp, Lj, Lx, Up, Ui, Ux, P, Q, Dx, + &do_recip, Rs, Numeric) ; + +complex int Syntax: + + #include "umfpack.h" + void *Numeric ; + int *Lp, *Lj, *Up, *Ui, *P, *Q, status, do_recip ; + double *Lx, *Lz, *Ux, *Uz, *Dx, *Dz, *Rs ; + status = umfpack_zi_get_numeric (Lp, Lj, Lx, Lz, Up, Ui, Ux, Uz, P, Q, + Dx, Dz, &do_recip, Rs, Numeric) ; + +complex long Syntax: + + #include "umfpack.h" + void *Numeric ; + long *Lp, *Lj, *Up, *Ui, *P, *Q, status, do_recip ; + double *Lx, *Lz, *Ux, *Uz, *Dx, *Dz, *Rs ; + status = umfpack_zl_get_numeric (Lp, Lj, Lx, Lz, Up, Ui, Ux, Uz, P, Q, + Dx, Dz, &do_recip, Rs, Numeric) ; + +packed complex int/long Syntax: + + Same as above, except Lz, Uz, and Dz are all NULL. + +Purpose: + + This routine copies the LU factors and permutation vectors from the Numeric + object into user-accessible arrays. This routine is not needed to solve a + linear system. Note that the output arrays Lp, Lj, Lx, Up, Ui, Ux, P, Q, + Dx, and Rs are not allocated by umfpack_*_get_numeric; they must exist on + input. + + All output arguments are optional. If any of them are NULL + on input, then that part of the LU factorization is not copied. You can + use this routine to extract just the parts of the LU factorization that + you want. For example, to retrieve just the column permutation Q, use: + + #define noD (double *) NULL + #define noI (int *) NULL + status = umfpack_di_get_numeric (noI, noI, noD, noI, noI, noD, noI, + Q, noD, noI, noD, Numeric) ; + +Returns: + + Returns UMFPACK_OK if successful. Returns UMFPACK_ERROR_out_of_memory + if insufficient memory is available for the 2*max(n_row,n_col) integer + workspace that umfpack_*_get_numeric allocates to construct L and/or U. + Returns UMFPACK_ERROR_invalid_Numeric_object if the Numeric object provided + as input is invalid. + +Arguments: + + Int Lp [n_row+1] ; Output argument. + Int Lj [lnz] ; Output argument. + double Lx [lnz] ; Output argument. Size 2*lnz for packed complex case. + double Lz [lnz] ; Output argument for complex versions. + + The n_row-by-min(n_row,n_col) matrix L is returned in compressed-row + form. The column indices of row i and corresponding numerical values + are in: + + Lj [Lp [i] ... Lp [i+1]-1] + Lx [Lp [i] ... Lp [i+1]-1] real part + Lz [Lp [i] ... Lp [i+1]-1] imaginary part (complex versions) + + respectively. Each row is stored in sorted order, from low column + indices to higher. The last entry in each row is the diagonal, which + is numerically equal to one. The sizes of Lp, Lj, Lx, and Lz are + returned by umfpack_*_get_lunz. If Lp, Lj, or Lx are not present, + then the matrix L is not returned. This is not an error condition. + The L matrix can be printed if n_row, Lp, Lj, Lx (and Lz for the split + complex case) are passed to umfpack_*_report_matrix (using the + "row" form). + + If Lx is present and Lz is NULL, then both real + and imaginary parts are returned in Lx[0..2*lnz-1], with Lx[2*k] + and Lx[2*k+1] being the real and imaginary part of the kth entry. + + Int Up [n_col+1] ; Output argument. + Int Ui [unz] ; Output argument. + double Ux [unz] ; Output argument. Size 2*unz for packed complex case. + double Uz [unz] ; Output argument for complex versions. + + The min(n_row,n_col)-by-n_col matrix U is returned in compressed-column + form. The row indices of column j and corresponding numerical values + are in + + Ui [Up [j] ... Up [j+1]-1] + Ux [Up [j] ... Up [j+1]-1] real part + Uz [Up [j] ... Up [j+1]-1] imaginary part (complex versions) + + respectively. Each column is stored in sorted order, from low row + indices to higher. The last entry in each column is the diagonal + (assuming that it is nonzero). The sizes of Up, Ui, Ux, and Uz are + returned by umfpack_*_get_lunz. If Up, Ui, or Ux are not present, + then the matrix U is not returned. This is not an error condition. + The U matrix can be printed if n_col, Up, Ui, Ux (and Uz for the + split complex case) are passed to umfpack_*_report_matrix (using the + "column" form). + + If Ux is present and Uz is NULL, then both real + and imaginary parts are returned in Ux[0..2*unz-1], with Ux[2*k] + and Ux[2*k+1] being the real and imaginary part of the kth entry. + + Int P [n_row] ; Output argument. + + The permutation vector P is defined as P [k] = i, where the original + row i of A is the kth pivot row in PAQ. If you do not want the P vector + to be returned, simply pass (Int *) NULL for P. This is not an error + condition. You can print P and Q with umfpack_*_report_perm. + + Int Q [n_col] ; Output argument. + + The permutation vector Q is defined as Q [k] = j, where the original + column j of A is the kth pivot column in PAQ. If you not want the Q + vector to be returned, simply pass (Int *) NULL for Q. This is not + an error condition. Note that Q is not necessarily identical to + Qtree, the column pre-ordering held in the Symbolic object. Refer to + the description of Qtree and Front_npivcol in umfpack_*_get_symbolic for + details. + + double Dx [min(n_row,n_col)] ; Output argument. Size 2*n for + the packed complex case. + double Dz [min(n_row,n_col)] ; Output argument for complex versions. + + The diagonal of U is also returned in Dx and Dz. You can extract the + diagonal of U without getting all of U by passing a non-NULL Dx (and + Dz for the complex version) and passing Up, Ui, and Ux as NULL. Dx is + the real part of the diagonal, and Dz is the imaginary part. + + If Dx is present and Dz is NULL, then both real + and imaginary parts are returned in Dx[0..2*min(n_row,n_col)-1], + with Dx[2*k] and Dx[2*k+1] being the real and imaginary part of the kth + entry. + + Int *do_recip ; Output argument. + + If do_recip is returned as zero (false), then the scale factors Rs [i] + are to be used by multiplying row i by Rs [i]. Otherwise, the entries + in row i are to be divided by Rs [i]. + + If UMFPACK has been compiled with gcc, or for MATLAB as either a + built-in routine or as a mexFunction, then the NRECIPROCAL flag is + set, and do_recip will always be zero (false). + + double Rs [n_row] ; Output argument. + + The row scale factors are returned in Rs [0..n_row-1]. Row i of A is + scaled by dividing or multiplying its values by Rs [i]. If default + scaling is in use, Rs [i] is the sum of the absolute values of row i + (or its reciprocal). If max row scaling is in use, then Rs [i] is the + maximum absolute value in row i (or its reciprocal). + Otherwise, Rs [i] = 1. If row i is all zero, Rs [i] = 1 as well. For + the complex version, an approximate absolute value is used + (|x_real|+|x_imag|). + + void *Numeric ; Input argument, not modified. + + Numeric must point to a valid Numeric object, computed by + umfpack_*_numeric. +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Include/umfpack_get_symbolic.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_get_symbolic.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,339 @@ +/* ========================================================================== */ +/* === umfpack_get_symbolic ================================================= */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +int umfpack_di_get_symbolic +( + int *n_row, + int *n_col, + int *n1, + int *nz, + int *nfr, + int *nchains, + int P [ ], + int Q [ ], + int Front_npivcol [ ], + int Front_parent [ ], + int Front_1strow [ ], + int Front_leftmostdesc [ ], + int Chain_start [ ], + int Chain_maxrows [ ], + int Chain_maxcols [ ], + void *Symbolic +) ; + +long umfpack_dl_get_symbolic +( + long *n_row, + long *n_col, + long *n1, + long *nz, + long *nfr, + long *nchains, + long P [ ], + long Q [ ], + long Front_npivcol [ ], + long Front_parent [ ], + long Front_1strow [ ], + long Front_leftmostdesc [ ], + long Chain_start [ ], + long Chain_maxrows [ ], + long Chain_maxcols [ ], + void *Symbolic +) ; + +int umfpack_zi_get_symbolic +( + int *n_row, + int *n_col, + int *n1, + int *nz, + int *nfr, + int *nchains, + int P [ ], + int Q [ ], + int Front_npivcol [ ], + int Front_parent [ ], + int Front_1strow [ ], + int Front_leftmostdesc [ ], + int Chain_start [ ], + int Chain_maxrows [ ], + int Chain_maxcols [ ], + void *Symbolic +) ; + +long umfpack_zl_get_symbolic +( + long *n_row, + long *n_col, + long *n1, + long *nz, + long *nfr, + long *nchains, + long P [ ], + long Q [ ], + long Front_npivcol [ ], + long Front_parent [ ], + long Front_1strow [ ], + long Front_leftmostdesc [ ], + long Chain_start [ ], + long Chain_maxrows [ ], + long Chain_maxcols [ ], + void *Symbolic +) ; + +/* + +double int Syntax: + + #include "umfpack.h" + int status, n_row, n_col, nz, nfr, nchains, *P, *Q, + *Front_npivcol, *Front_parent, *Front_1strow, *Front_leftmostdesc, + *Chain_start, *Chain_maxrows, *Chain_maxcols ; + void *Symbolic ; + status = umfpack_di_get_symbolic (&n_row, &n_col, &nz, &nfr, &nchains, + P, Q, Front_npivcol, Front_parent, Front_1strow, + Front_leftmostdesc, Chain_start, Chain_maxrows, Chain_maxcols, + Symbolic) ; + +double long Syntax: + + #include "umfpack.h" + long status, n_row, n_col, nz, nfr, nchains, *P, *Q, + *Front_npivcol, *Front_parent, *Front_1strow, *Front_leftmostdesc, + *Chain_start, *Chain_maxrows, *Chain_maxcols ; + void *Symbolic ; + status = umfpack_dl_get_symbolic (&n_row, &n_col, &nz, &nfr, &nchains, + P, Q, Front_npivcol, Front_parent, Front_1strow, + Front_leftmostdesc, Chain_start, Chain_maxrows, Chain_maxcols, + Symbolic) ; + +complex int Syntax: + + #include "umfpack.h" + int status, n_row, n_col, nz, nfr, nchains, *P, *Q, + *Front_npivcol, *Front_parent, *Front_1strow, *Front_leftmostdesc, + *Chain_start, *Chain_maxrows, *Chain_maxcols ; + void *Symbolic ; + status = umfpack_zi_get_symbolic (&n_row, &n_col, &nz, &nfr, &nchains, + P, Q, Front_npivcol, Front_parent, Front_1strow, + Front_leftmostdesc, Chain_start, Chain_maxrows, Chain_maxcols, + Symbolic) ; + +complex long Syntax: + + #include "umfpack.h" + long status, n_row, n_col, nz, nfr, nchains, *P, *Q, + *Front_npivcol, *Front_parent, *Front_1strow, *Front_leftmostdesc, + *Chain_start, *Chain_maxrows, *Chain_maxcols ; + void *Symbolic ; + status = umfpack_zl_get_symbolic (&n_row, &n_col, &nz, &nfr, &nchains, + P, Q, Front_npivcol, Front_parent, Front_1strow, + Front_leftmostdesc, Chain_start, Chain_maxrows, Chain_maxcols, + Symbolic) ; + +Purpose: + + Copies the contents of the Symbolic object into simple integer arrays + accessible to the user. This routine is not needed to factorize and/or + solve a sparse linear system using UMFPACK. Note that the output arrays + P, Q, Front_npivcol, Front_parent, Front_1strow, Front_leftmostdesc, + Chain_start, Chain_maxrows, and Chain_maxcols are not allocated by + umfpack_*_get_symbolic; they must exist on input. + + All output arguments are optional. If any of them are NULL + on input, then that part of the symbolic analysis is not copied. You can + use this routine to extract just the parts of the symbolic analysis that + you want. For example, to retrieve just the column permutation Q, use: + + #define noI (int *) NULL + status = umfpack_di_get_symbolic (noI, noI, noI, noI, noI, noI, noI, + Q, noI, noI, noI, noI, noI, noI, noI, Symbolic) ; + + The only required argument the last one, the pointer to the Symbolic object. + + The Symbolic object is small. Its size for an n-by-n square matrix varies + from 4*n to 13*n, depending on the matrix. The object holds the initial + column permutation, the supernodal column elimination tree, and information + about each frontal matrix. You can print it with umfpack_*_report_symbolic. + +Returns: + + Returns UMFPACK_OK if successful, UMFPACK_ERROR_invalid_Symbolic_object + if Symbolic is an invalid object. + +Arguments: + + Int *n_row ; Output argument. + Int *n_col ; Output argument. + + The dimensions of the matrix A analyzed by the call to + umfpack_*_symbolic that generated the Symbolic object. + + Int *n1 ; Output argument. + + The number of pivots with zero Markowitz cost (they have just one entry + in the pivot row, or the pivot column, or both). These appear first in + the output permutations P and Q. + + Int *nz ; Output argument. + + The number of nonzeros in A. + + Int *nfr ; Output argument. + + The number of frontal matrices that will be used by umfpack_*_numeric + to factorize the matrix A. It is in the range 0 to n_col. + + Int *nchains ; Output argument. + + The frontal matrices are related to one another by the supernodal + column elimination tree. Each node in this tree is one frontal matrix. + The tree is partitioned into a set of disjoint paths, and a frontal + matrix chain is one path in this tree. Each chain is factorized using + a unifrontal technique, with a single working array that holds each + frontal matrix in the chain, one at a time. nchains is in the range + 0 to nfr. + + Int P [n_row] ; Output argument. + + The initial row permutation. If P [k] = i, then this means that + row i is the kth row in the pre-ordered matrix. In general, this P is + not the same as the final row permutation computed by umfpack_*_numeric. + + For the unsymmetric strategy, P defines the row-merge order. Let j be + the column index of the leftmost nonzero entry in row i of A*Q. Then + P defines a sort of the rows according to this value. A row can appear + earlier in this ordering if it is aggressively absorbed before it can + become a pivot row. If P [k] = i, row i typically will not be the kth + pivot row. + + For the symmetric strategy, P = Q. For the 2-by-2 strategy, P is the + row permutation that places large entries on the diagonal of P*A*Q. + If no pivoting occurs during numerical factorization, P [k] = i also + defines the final permutation of umfpack_*_numeric, for either the + symmetric or 2-by-2 strategies. + + Int Q [n_col] ; Output argument. + + The initial column permutation. If Q [k] = j, then this means that + column j is the kth pivot column in the pre-ordered matrix. Q is + not necessarily the same as the final column permutation Q, computed by + umfpack_*_numeric. The numeric factorization may reorder the pivot + columns within each frontal matrix to reduce fill-in. If the matrix is + structurally singular, and if the symmetric or 2-by-2 strategies or + used (or if Control [UMFPACK_FIXQ] > 0), then this Q will be the same + as the final column permutation computed in umfpack_*_numeric. + + Int Front_npivcol [n_col+1] ; Output argument. + + This array should be of size at least n_col+1, in order to guarantee + that it will be large enough to hold the output. Only the first nfr+1 + entries are used, however. + + The kth frontal matrix holds Front_npivcol [k] pivot columns. Thus, the + first frontal matrix, front 0, is used to factorize the first + Front_npivcol [0] columns; these correspond to the original columns + Q [0] through Q [Front_npivcol [0]-1]. The next frontal matrix + is used to factorize the next Front_npivcol [1] columns, which are thus + the original columns Q [Front_npivcol [0]] through + Q [Front_npivcol [0] + Front_npivcol [1] - 1], and so on. Columns + with no entries at all are put in a placeholder "front", + Front_npivcol [nfr]. The sum of Front_npivcol [0..nfr] is equal to + n_col. + + Any modifications that umfpack_*_numeric makes to the initial column + permutation are constrained to within each frontal matrix. Thus, for + the first frontal matrix, Q [0] through Q [Front_npivcol [0]-1] is some + permutation of the columns Q [0] through + Q [Front_npivcol [0]-1]. For second frontal matrix, + Q [Front_npivcol [0]] through Q [Front_npivcol [0] + Front_npivcol[1]-1] + is some permutation of the same portion of Q, and so on. All pivot + columns are numerically factorized within the frontal matrix originally + determined by the symbolic factorization; there is no delayed pivoting + across frontal matrices. + + Int Front_parent [n_col+1] ; Output argument. + + This array should be of size at least n_col+1, in order to guarantee + that it will be large enough to hold the output. Only the first nfr+1 + entries are used, however. + + Front_parent [0..nfr] holds the supernodal column elimination tree + (including the placeholder front nfr, which may be empty). Each node in + the tree corresponds to a single frontal matrix. The parent of node f + is Front_parent [f]. + + Int Front_1strow [n_col+1] ; Output argument. + + This array should be of size at least n_col+1, in order to guarantee + that it will be large enough to hold the output. Only the first nfr+1 + entries are used, however. + + Front_1strow [k] is the row index of the first row in A (P,Q) + whose leftmost entry is in a pivot column for the kth front. This is + necessary only to properly factorize singular matrices. Rows in the + range Front_1strow [k] to Front_1strow [k+1]-1 first become pivot row + candidates at the kth front. Any rows not eliminated in the kth front + may be selected as pivot rows in the parent of k (Front_parent [k]) + and so on up the tree. + + Int Front_leftmostdesc [n_col+1] ; Output argument. + + This array should be of size at least n_col+1, in order to guarantee + that it will be large enough to hold the output. Only the first nfr+1 + entries are used, however. + + Front_leftmostdesc [k] is the leftmost descendant of front k, or k + if the front has no children in the tree. Since the rows and columns + (P and Q) have been post-ordered via a depth-first-search of + the tree, rows in the range Front_1strow [Front_leftmostdesc [k]] to + Front_1strow [k+1]-1 form the entire set of candidate pivot rows for + the kth front (some of these will typically have already been selected + by fronts in the range Front_leftmostdesc [k] to front k-1, before + the factorization reaches front k). + + Chain_start [n_col+1] ; Output argument. + + This array should be of size at least n_col+1, in order to guarantee + that it will be large enough to hold the output. Only the first + nchains+1 entries are used, however. + + The kth frontal matrix chain consists of frontal matrices Chain_start[k] + through Chain_start [k+1]-1. Thus, Chain_start [0] is always 0, and + Chain_start [nchains] is the total number of frontal matrices, nfr. For + two adjacent fronts f and f+1 within a single chain, f+1 is always the + parent of f (that is, Front_parent [f] = f+1). + + Int Chain_maxrows [n_col+1] ; Output argument. + Int Chain_maxcols [n_col+1] ; Output argument. + + These arrays should be of size at least n_col+1, in order to guarantee + that they will be large enough to hold the output. Only the first + nchains entries are used, however. + + The kth frontal matrix chain requires a single working array of + dimension Chain_maxrows [k] by Chain_maxcols [k], for the unifrontal + technique that factorizes the frontal matrix chain. Since the symbolic + factorization only provides an upper bound on the size of each frontal + matrix, not all of the working array is necessarily used during the + numerical factorization. + + Note that the upper bound on the number of rows and columns of each + frontal matrix is computed by umfpack_*_symbolic, but all that is + required by umfpack_*_numeric is the maximum of these two sets of + values for each frontal matrix chain. Thus, the size of each + individual frontal matrix is not preserved in the Symbolic object. + + void *Symbolic ; Input argument, not modified. + + The Symbolic object, which holds the symbolic factorization computed by + umfpack_*_symbolic. The Symbolic object is not modified by + umfpack_*_get_symbolic. +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Include/umfpack_load_numeric.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_load_numeric.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,95 @@ +/* ========================================================================== */ +/* === umfpack_load_numeric ================================================= */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +int umfpack_di_load_numeric +( + void **Numeric, + char *filename +) ; + +long umfpack_dl_load_numeric +( + void **Numeric, + char *filename +) ; + +int umfpack_zi_load_numeric +( + void **Numeric, + char *filename +) ; + +long umfpack_zl_load_numeric +( + void **Numeric, + char *filename +) ; + +/* +double int Syntax: + + #include "umfpack.h" + int status ; + char *filename ; + void *Numeric ; + status = umfpack_di_load_numeric (&Numeric, filename) ; + +double long Syntax: + + #include "umfpack.h" + long status ; + char *filename ; + void *Numeric ; + status = umfpack_dl_load_numeric (&Numeric, filename) ; + +complex int Syntax: + + #include "umfpack.h" + int status ; + char *filename ; + void *Numeric ; + status = umfpack_zi_load_numeric (&Numeric, filename) ; + +complex long Syntax: + + #include "umfpack.h" + long status ; + char *filename ; + void *Numeric ; + status = umfpack_zl_load_numeric (&Numeric, filename) ; + +Purpose: + + Loads a Numeric object from a file created by umfpack_*_save_numeric. The + Numeric handle passed to this routine is overwritten with the new object. + If that object exists prior to calling this routine, a memory leak will + occur. The contents of Numeric are ignored on input. + +Returns: + + UMFPACK_OK if successful. + UMFPACK_ERROR_out_of_memory if not enough memory is available. + UMFPACK_ERROR_file_IO if an I/O error occurred. + +Arguments: + + void **Numeric ; Output argument. + + **Numeric is the address of a (void *) pointer variable in the user's + calling routine (see Syntax, above). On input, the contents of this + variable are not defined. On output, this variable holds a (void *) + pointer to the Numeric object (if successful), or (void *) NULL if + a failure occurred. + + char *filename ; Input argument, not modified. + + A string that contains the filename from which to read the Numeric + object. +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Include/umfpack_load_symbolic.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_load_symbolic.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,95 @@ +/* ========================================================================== */ +/* === umfpack_load_symbolic ================================================ */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +int umfpack_di_load_symbolic +( + void **Symbolic, + char *filename +) ; + +long umfpack_dl_load_symbolic +( + void **Symbolic, + char *filename +) ; + +int umfpack_zi_load_symbolic +( + void **Symbolic, + char *filename +) ; + +long umfpack_zl_load_symbolic +( + void **Symbolic, + char *filename +) ; + +/* +double int Syntax: + + #include "umfpack.h" + int status ; + char *filename ; + void *Symbolic ; + status = umfpack_di_load_symbolic (&Symbolic, filename) ; + +double long Syntax: + + #include "umfpack.h" + long status ; + char *filename ; + void *Symbolic ; + status = umfpack_dl_load_symbolic (&Symbolic, filename) ; + +complex int Syntax: + + #include "umfpack.h" + int status ; + char *filename ; + void *Symbolic ; + status = umfpack_zi_load_symbolic (&Symbolic, filename) ; + +complex long Syntax: + + #include "umfpack.h" + long status ; + char *filename ; + void *Symbolic ; + status = umfpack_zl_load_symbolic (&Symbolic, filename) ; + +Purpose: + + Loads a Symbolic object from a file created by umfpack_*_save_symbolic. The + Symbolic handle passed to this routine is overwritten with the new object. + If that object exists prior to calling this routine, a memory leak will + occur. The contents of Symbolic are ignored on input. + +Returns: + + UMFPACK_OK if successful. + UMFPACK_ERROR_out_of_memory if not enough memory is available. + UMFPACK_ERROR_file_IO if an I/O error occurred. + +Arguments: + + void **Symbolic ; Output argument. + + **Symbolic is the address of a (void *) pointer variable in the user's + calling routine (see Syntax, above). On input, the contents of this + variable are not defined. On output, this variable holds a (void *) + pointer to the Symbolic object (if successful), or (void *) NULL if + a failure occurred. + + char *filename ; Input argument, not modified. + + A string that contains the filename from which to read the Symbolic + object. +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Include/umfpack_numeric.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_numeric.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,546 @@ +/* ========================================================================== */ +/* === umfpack_numeric ====================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +int umfpack_di_numeric +( + const int Ap [ ], + const int Ai [ ], + const double Ax [ ], + void *Symbolic, + void **Numeric, + const double Control [UMFPACK_CONTROL], + double Info [UMFPACK_INFO] +) ; + +long umfpack_dl_numeric +( + const long Ap [ ], + const long Ai [ ], + const double Ax [ ], + void *Symbolic, + void **Numeric, + const double Control [UMFPACK_CONTROL], + double Info [UMFPACK_INFO] +) ; + +int umfpack_zi_numeric +( + const int Ap [ ], + const int Ai [ ], + const double Ax [ ], const double Az [ ], + void *Symbolic, + void **Numeric, + const double Control [UMFPACK_CONTROL], + double Info [UMFPACK_INFO] +) ; + +long umfpack_zl_numeric +( + const long Ap [ ], + const long Ai [ ], + const double Ax [ ], const double Az [ ], + void *Symbolic, + void **Numeric, + const double Control [UMFPACK_CONTROL], + double Info [UMFPACK_INFO] +) ; + +/* +double int Syntax: + + #include "umfpack.h" + void *Symbolic, *Numeric ; + int *Ap, *Ai, status ; + double *Ax, Control [UMFPACK_CONTROL], Info [UMFPACK_INFO] ; + status = umfpack_di_numeric (Ap, Ai, Ax, Symbolic, &Numeric, Control, Info); + +double long Syntax: + + #include "umfpack.h" + void *Symbolic, *Numeric ; + long *Ap, *Ai, status ; + double *Ax, Control [UMFPACK_CONTROL], Info [UMFPACK_INFO] ; + status = umfpack_dl_numeric (Ap, Ai, Ax, Symbolic, &Numeric, Control, Info); + +complex int Syntax: + + #include "umfpack.h" + void *Symbolic, *Numeric ; + int *Ap, *Ai, status ; + double *Ax, *Az, Control [UMFPACK_CONTROL], Info [UMFPACK_INFO] ; + status = umfpack_zi_numeric (Ap, Ai, Ax, Az, Symbolic, &Numeric, + Control, Info) ; + +complex long Syntax: + + #include "umfpack.h" + void *Symbolic, *Numeric ; + long *Ap, *Ai, status ; + double *Ax, *Az, Control [UMFPACK_CONTROL], Info [UMFPACK_INFO] ; + status = umfpack_zl_numeric (Ap, Ai, Ax, Az, Symbolic, &Numeric, + Control, Info) ; + +packed complex Syntax: + + Same as above, except that Az is NULL. + +Purpose: + + Given a sparse matrix A in column-oriented form, and a symbolic analysis + computed by umfpack_*_*symbolic, the umfpack_*_numeric routine performs the + numerical factorization, PAQ=LU, PRAQ=LU, or P(R\A)Q=LU, where P and Q are + permutation matrices (represented as permutation vectors), R is the row + scaling, L is unit-lower triangular, and U is upper triangular. This is + required before the system Ax=b (or other related linear systems) can be + solved. umfpack_*_numeric can be called multiple times for each call to + umfpack_*_*symbolic, to factorize a sequence of matrices with identical + nonzero pattern. Simply compute the Symbolic object once, with + umfpack_*_*symbolic, and reuse it for subsequent matrices. This routine + safely detects if the pattern changes, and sets an appropriate error code. + +Returns: + + The status code is returned. See Info [UMFPACK_STATUS], below. + +Arguments: + + Int Ap [n_col+1] ; Input argument, not modified. + + This must be identical to the Ap array passed to umfpack_*_*symbolic. + The value of n_col is what was passed to umfpack_*_*symbolic (this is + held in the Symbolic object). + + Int Ai [nz] ; Input argument, not modified, of size nz = Ap [n_col]. + + This must be identical to the Ai array passed to umfpack_*_*symbolic. + + double Ax [nz] ; Input argument, not modified, of size nz = Ap [n_col]. + Size 2*nz for packed complex case. + + The numerical values of the sparse matrix A. The nonzero pattern (row + indices) for column j is stored in Ai [(Ap [j]) ... (Ap [j+1]-1)], and + the corresponding numerical values are stored in + Ax [(Ap [j]) ... (Ap [j+1]-1)]. + + double Az [nz] ; Input argument, not modified, for complex versions. + + For the complex versions, this holds the imaginary part of A. The + imaginary part of column j is held in Az [(Ap [j]) ... (Ap [j+1]-1)]. + + If Az is NULL, then both real + and imaginary parts are contained in Ax[0..2*nz-1], with Ax[2*k] + and Ax[2*k+1] being the real and imaginary part of the kth entry. + + void *Symbolic ; Input argument, not modified. + + The Symbolic object, which holds the symbolic factorization computed by + umfpack_*_*symbolic. The Symbolic object is not modified by + umfpack_*_numeric. + + void **Numeric ; Output argument. + + **Numeric is the address of a (void *) pointer variable in the user's + calling routine (see Syntax, above). On input, the contents of this + variable are not defined. On output, this variable holds a (void *) + pointer to the Numeric object (if successful), or (void *) NULL if + a failure occurred. + + double Control [UMFPACK_CONTROL] ; Input argument, not modified. + + If a (double *) NULL pointer is passed, then the default control + settings are used. Otherwise, the settings are determined from the + Control array. See umfpack_*_defaults on how to fill the Control + array with the default settings. If Control contains NaN's, the + defaults are used. The following Control parameters are used: + + Control [UMFPACK_PIVOT_TOLERANCE]: relative pivot tolerance for + threshold partial pivoting with row interchanges. In any given + column, an entry is numerically acceptable if its absolute value is + greater than or equal to Control [UMFPACK_PIVOT_TOLERANCE] times + the largest absolute value in the column. A value of 1.0 gives true + partial pivoting. If less than or equal to zero, then any nonzero + entry is numerically acceptable as a pivot. Default: 0.1. + + Smaller values tend to lead to sparser LU factors, but the solution + to the linear system can become inaccurate. Larger values can lead + to a more accurate solution (but not always), and usually an + increase in the total work. + + For complex matrices, a cheap approximate of the absolute value + is used for the threshold partial pivoting test (|a_real| + |a_imag| + instead of the more expensive-to-compute exact absolute value + sqrt (a_real^2 + a_imag^2)). + + Control [UMFPACK_SYM_PIVOT_TOLERANCE]: + If diagonal pivoting is attempted (the symmetric or symmetric-2by2 + strategies are used) then this parameter is used to control when the + diagonal entry is selected in a given pivot column. The absolute + value of the entry must be >= Control [UMFPACK_SYM_PIVOT_TOLERANCE] + times the largest absolute value in the column. A value of zero + will ensure that no off-diagonal pivoting is performed, except that + zero diagonal entries are not selected if there are any off-diagonal + nonzero entries. + + If an off-diagonal pivot is selected, an attempt is made to restore + symmetry later on. Suppose A (i,j) is selected, where i != j. + If column i has not yet been selected as a pivot column, then + the entry A (j,i) is redefined as a "diagonal" entry, except that + the tighter tolerance (Control [UMFPACK_PIVOT_TOLERANCE]) is + applied. This strategy has an effect similar to 2-by-2 pivoting + for symmetric indefinite matrices. If a 2-by-2 block pivot with + nonzero structure + + i j + i: 0 x + j: x 0 + + is selected in a symmetric indefinite factorization method, the + 2-by-2 block is inverted and a rank-2 update is applied. In + UMFPACK, this 2-by-2 block would be reordered as + + j i + i: x 0 + j: 0 x + + In both cases, the symmetry of the Schur complement is preserved. + + Control [UMFPACK_SCALE]: Note that the user's input matrix is + never modified, only an internal copy is scaled. + + There are three valid settings for this parameter. If any other + value is provided, the default is used. + + UMFPACK_SCALE_NONE: no scaling is performed. + + UMFPACK_SCALE_SUM: each row of the input matrix A is divided by + the sum of the absolute values of the entries in that row. + The scaled matrix has an infinity norm of 1. + + UMFPACK_SCALE_MAX: each row of the input matrix A is divided by + the maximum the absolute values of the entries in that row. + In the scaled matrix the largest entry in each row has + a magnitude exactly equal to 1. + + Note that for complex matrices, a cheap approximate absolute value + is used, |a_real| + |a_imag|, instead of the exact absolute value + sqrt ((a_real)^2 + (a_imag)^2). + + Scaling is very important for the "symmetric" strategy when + diagonal pivoting is attempted. It also improves the performance + of the "unsymmetric" strategy. + + Default: UMFPACK_SCALE_SUM. + + Control [UMFPACK_ALLOC_INIT]: + + When umfpack_*_numeric starts, it allocates memory for the Numeric + object. Part of this is of fixed size (approximately n double's + + 12*n integers). The remainder is of variable size, which grows to + hold the LU factors and the frontal matrices created during + factorization. A estimate of the upper bound is computed by + umfpack_*_*symbolic, and returned by umfpack_*_*symbolic in + Info [UMFPACK_VARIABLE_PEAK_ESTIMATE] (in Units). + + If Control [UMFPACK_ALLOC_INIT] is >= 0, umfpack_*_numeric initially + allocates space for the variable-sized part equal to this estimate + times Control [UMFPACK_ALLOC_INIT]. Typically, for matrices for + which the "unsymmetric" strategy applies, umfpack_*_numeric needs + only about half the estimated memory space, so a setting of 0.5 or + 0.6 often provides enough memory for umfpack_*_numeric to factorize + the matrix with no subsequent increases in the size of this block. + + If the matrix is ordered via AMD, then this non-negative parameter + is ignored. The initial allocation ratio computed automatically, + as 1.2 * (nz + Info [UMFPACK_SYMMETRIC_LUNZ]) / + (Info [UMFPACK_LNZ_ESTIMATE] + Info [UMFPACK_UNZ_ESTIMATE] - + min (n_row, n_col)). + + If Control [UMFPACK_ALLOC_INIT] is negative, then umfpack_*_numeric + allocates a space with initial size (in Units) equal to + (-Control [UMFPACK_ALLOC_INIT]). + + Regardless of the value of this parameter, a space equal to or + greater than the the bare minimum amount of memory needed to start + the factorization is always initially allocated. The bare initial + memory required is returned by umfpack_*_*symbolic in + Info [UMFPACK_VARIABLE_INIT_ESTIMATE] (an exact value, not an + estimate). + + If the variable-size part of the Numeric object is found to be too + small sometime after numerical factorization has started, the memory + is increased in size by a factor of 1.2. If this fails, the + request is reduced by a factor of 0.95 until it succeeds, or until + it determines that no increase in size is possible. Garbage + collection then occurs. + + The strategy of attempting to "malloc" a working space, and + re-trying with a smaller space, may not work under MATLAB, since + mxMalloc aborts the mexFunction if it fails. The built-in umfpack + routine in MATLAB 6.5 uses utMalloc instead, which + avoids this problem. As a mexFunction, utMalloc is used unless + -DNUTIL is defined at compile time. The utMalloc routine, and + utFree and utRealloc, are not documented. If the mexFunction + doesn't work, then compile it with -DNUTIL instead. + + If you are using the umfpack mexFunction, decrease the magnitude of + Control [UMFPACK_ALLOC_INIT] if you run out of memory in MATLAB. + + Default initial allocation size: 0.7. Thus, with the default + control settings and the "unsymmetric" strategy, the upper-bound is + reached after two reallocations (0.7 * 1.2 * 1.2 = 1.008). + + Changing this parameter has little effect on fill-in or operation + count. It has a small impact on run-time (the extra time required + to do the garbage collection and memory reallocation). + + Control [UMFPACK_FRONT_ALLOC_INIT]: + + When UMFPACK starts the factorization of each "chain" of frontal + matrices, it allocates a working array to hold the frontal matrices + as they are factorized. The symbolic factorization computes the + size of the largest possible frontal matrix that could occur during + the factorization of each chain. + + If Control [UMFPACK_FRONT_ALLOC_INIT] is >= 0, the following + strategy is used. If the AMD ordering was used, this non-negative + parameter is ignored. A front of size (d+2)*(d+2) is allocated, + where d = Info [UMFPACK_SYMMETRIC_DMAX]. Otherwise, a front of + size Control [UMFPACK_FRONT_ALLOC_INIT] times the largest front + possible for this chain is allocated. + + If Control [UMFPACK_FRONT_ALLOC_INIT] is negative, then a front of + size (-Control [UMFPACK_FRONT_ALLOC_INIT]) is allocated (where the + size is in terms of the number of numerical entries). This is done + regardless of the ordering method or ordering strategy used. + + Default: 0.5. + + Control [UMFPACK_DROPTOL]: + + Entries in L and U with absolute value less than or equal to the + drop tolerance are removed from the data structures (unless leaving + them there reduces memory usage by reducing the space required + for the nonzero pattern of L and U). + + Default: 0.0. + + double Info [UMFPACK_INFO] ; Output argument. + + Contains statistics about the numeric factorization. If a + (double *) NULL pointer is passed, then no statistics are returned in + Info (this is not an error condition). The following statistics are + computed in umfpack_*_numeric: + + Info [UMFPACK_STATUS]: status code. This is also the return value, + whether or not Info is present. + + UMFPACK_OK + + Numeric factorization was successful. umfpack_*_numeric + computed a valid numeric factorization. + + UMFPACK_WARNING_singular_matrix + + Numeric factorization was successful, but the matrix is + singular. umfpack_*_numeric computed a valid numeric + factorization, but you will get a divide by zero in + umfpack_*_*solve. For the other cases below, no Numeric object + is created (*Numeric is (void *) NULL). + + UMFPACK_ERROR_out_of_memory + + Insufficient memory to complete the numeric factorization. + + UMFPACK_ERROR_argument_missing + + One or more required arguments are missing. + + UMFPACK_ERROR_invalid_Symbolic_object + + Symbolic object provided as input is invalid. + + UMFPACK_ERROR_different_pattern + + The pattern (Ap and/or Ai) has changed since the call to + umfpack_*_*symbolic which produced the Symbolic object. + + Info [UMFPACK_NROW]: the value of n_row stored in the Symbolic object. + + Info [UMFPACK_NCOL]: the value of n_col stored in the Symbolic object. + + Info [UMFPACK_NZ]: the number of entries in the input matrix. + This value is obtained from the Symbolic object. + + Info [UMFPACK_SIZE_OF_UNIT]: the number of bytes in a Unit, for memory + usage statistics below. + + Info [UMFPACK_VARIABLE_INIT]: the initial size (in Units) of the + variable-sized part of the Numeric object. If this differs from + Info [UMFPACK_VARIABLE_INIT_ESTIMATE], then the pattern (Ap and/or + Ai) has changed since the last call to umfpack_*_*symbolic, which is + an error condition. + + Info [UMFPACK_VARIABLE_PEAK]: the peak size (in Units) of the + variable-sized part of the Numeric object. This size is the amount + of space actually used inside the block of memory, not the space + allocated via UMF_malloc. You can reduce UMFPACK's memory + requirements by setting Control [UMFPACK_ALLOC_INIT] to the ratio + Info [UMFPACK_VARIABLE_PEAK] / Info[UMFPACK_VARIABLE_PEAK_ESTIMATE]. + This will ensure that no memory reallocations occur (you may want to + add 0.001 to make sure that integer roundoff does not lead to a + memory size that is 1 Unit too small; otherwise, garbage collection + and reallocation will occur). + + Info [UMFPACK_VARIABLE_FINAL]: the final size (in Units) of the + variable-sized part of the Numeric object. It holds just the + sparse LU factors. + + Info [UMFPACK_NUMERIC_SIZE]: the actual final size (in Units) of the + entire Numeric object, including the final size of the variable + part of the object. Info [UMFPACK_NUMERIC_SIZE_ESTIMATE], + an estimate, was computed by umfpack_*_*symbolic. The estimate is + normally an upper bound on the actual final size, but this is not + guaranteed. + + Info [UMFPACK_PEAK_MEMORY]: the actual peak memory usage (in Units) of + both umfpack_*_*symbolic and umfpack_*_numeric. An estimate, + Info [UMFPACK_PEAK_MEMORY_ESTIMATE], was computed by + umfpack_*_*symbolic. The estimate is normally an upper bound on the + actual peak usage, but this is not guaranteed. With testing on + hundreds of matrix arising in real applications, I have never + observed a matrix where this estimate or the Numeric size estimate + was less than the actual result, but this is theoretically possible. + Please send me one if you find such a matrix. + + Info [UMFPACK_FLOPS]: the actual count of the (useful) floating-point + operations performed. An estimate, Info [UMFPACK_FLOPS_ESTIMATE], + was computed by umfpack_*_*symbolic. The estimate is guaranteed to + be an upper bound on this flop count. The flop count excludes + "useless" flops on zero values, flops performed during the pivot + search (for tentative updates and assembly of candidate columns), + and flops performed to add frontal matrices together. + + For the real version, only (+ - * /) are counted. For the complex + version, the following counts are used: + + operation flops + c = 1/b 6 + c = a*b 6 + c -= a*b 8 + + Info [UMFPACK_LNZ]: the actual nonzero entries in final factor L, + including the diagonal. This excludes any zero entries in L, + although some of these are stored in the Numeric object. The + Info [UMFPACK_LU_ENTRIES] statistic does account for all + explicitly stored zeros, however. Info [UMFPACK_LNZ_ESTIMATE], + an estimate, was computed by umfpack_*_*symbolic. The estimate is + guaranteed to be an upper bound on Info [UMFPACK_LNZ]. + + Info [UMFPACK_UNZ]: the actual nonzero entries in final factor U, + including the diagonal. This excludes any zero entries in U, + although some of these are stored in the Numeric object. The + Info [UMFPACK_LU_ENTRIES] statistic does account for all + explicitly stored zeros, however. Info [UMFPACK_UNZ_ESTIMATE], + an estimate, was computed by umfpack_*_*symbolic. The estimate is + guaranteed to be an upper bound on Info [UMFPACK_UNZ]. + + Info [UMFPACK_NUMERIC_DEFRAG]: The number of garbage collections + performed during umfpack_*_numeric, to compact the contents of the + variable-sized workspace used by umfpack_*_numeric. No estimate was + computed by umfpack_*_*symbolic. In the current version of UMFPACK, + garbage collection is performed and then the memory is reallocated, + so this statistic is the same as Info [UMFPACK_NUMERIC_REALLOC], + below. It may differ in future releases. + + Info [UMFPACK_NUMERIC_REALLOC]: The number of times that the Numeric + object was increased in size from its initial size. A rough upper + bound on the peak size of the Numeric object was computed by + umfpack_*_*symbolic, so reallocations should be rare. However, if + umfpack_*_numeric is unable to allocate that much storage, it + reduces its request until either the allocation succeeds, or until + it gets too small to do anything with. If the memory that it + finally got was small, but usable, then the reallocation count + could be high. No estimate of this count was computed by + umfpack_*_*symbolic. + + Info [UMFPACK_NUMERIC_COSTLY_REALLOC]: The number of times that the + system realloc library routine (or mxRealloc for the mexFunction) + had to move the workspace. Realloc can sometimes increase the size + of a block of memory without moving it, which is much faster. This + statistic will always be <= Info [UMFPACK_NUMERIC_REALLOC]. If your + memory space is fragmented, then the number of "costly" realloc's + will be equal to Info [UMFPACK_NUMERIC_REALLOC]. + + Info [UMFPACK_COMPRESSED_PATTERN]: The number of integers used to + represent the pattern of L and U. + + Info [UMFPACK_LU_ENTRIES]: The total number of numerical values that + are stored for the LU factors. Some of the values may be explicitly + zero in order to save space (allowing for a smaller compressed + pattern). + + Info [UMFPACK_NUMERIC_TIME]: The CPU time taken, in seconds. + + Info [UMFPACK_RCOND]: A rough estimate of the condition number, equal + to min (abs (diag (U))) / max (abs (diag (U))), or zero if the + diagonal of U is all zero. + + Info [UMFPACK_UDIAG_NZ]: The number of numerically nonzero values on + the diagonal of U. + + Info [UMFPACK_UMIN]: the smallest absolute value on the diagonal of U. + + Info [UMFPACK_UMAX]: the smallest absolute value on the diagonal of U. + + Info [UMFPACK_MAX_FRONT_SIZE]: the size of the + largest frontal matrix (number of entries). + + Info [UMFPACK_NUMERIC_WALLTIME]: The wallclock time taken, in seconds. + + Info [UMFPACK_MAX_FRONT_NROWS]: the max number of + rows in any frontal matrix. + + Info [UMFPACK_MAX_FRONT_NCOLS]: the max number of + columns in any frontal matrix. + + Info [UMFPACK_WAS_SCALED]: the scaling used, either UMFPACK_SCALE_NONE, + UMFPACK_SCALE_SUM, or UMFPACK_SCALE_MAX. + + Info [UMFPACK_RSMIN]: if scaling is performed, the smallest scale factor + for any row (either the smallest sum of absolute entries, or the + smallest maximum of absolute entries). + + Info [UMFPACK_RSMAX]: if scaling is performed, the largest scale factor + for any row (either the largest sum of absolute entries, or the + largest maximum of absolute entries). + + Info [UMFPACK_ALLOC_INIT_USED]: the initial allocation parameter used. + + Info [UMFPACK_FORCED_UPDATES]: the number of BLAS-3 updates to the + frontal matrices that were required because the frontal matrix + grew larger than its current working array. + + Info [UMFPACK_NOFF_DIAG]: number of off-diagonal pivots selected, if the + symmetric or 2-by-2 strategies are used. + + Info [UMFPACK_NZDROPPED]: the number of entries smaller in absolute + value than Control [UMFPACK_DROPTOL] that were dropped from L and U. + Note that entries on the diagonal of U are never dropped. + + Info [UMFPACK_ALL_LNZ]: the number of entries in L, including the + diagonal, if no small entries are dropped. + + Info [UMFPACK_ALL_UNZ]: the number of entries in U, including the + diagonal, if no small entries are dropped. + + Only the above listed Info [...] entries are accessed. The remaining + entries of Info are not accessed or modified by umfpack_*_numeric. + Future versions might modify different parts of Info. +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Include/umfpack_qsymbolic.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_qsymbolic.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,150 @@ +/* ========================================================================== */ +/* === umfpack_qsymbolic ==================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +int umfpack_di_qsymbolic +( + int n_row, + int n_col, + const int Ap [ ], + const int Ai [ ], + const double Ax [ ], + const int Qinit [ ], + void **Symbolic, + const double Control [UMFPACK_CONTROL], + double Info [UMFPACK_INFO] +) ; + +long umfpack_dl_qsymbolic +( + long n_row, + long n_col, + const long Ap [ ], + const long Ai [ ], + const double Ax [ ], + const long Qinit [ ], + void **Symbolic, + const double Control [UMFPACK_CONTROL], + double Info [UMFPACK_INFO] +) ; + +int umfpack_zi_qsymbolic +( + int n_row, + int n_col, + const int Ap [ ], + const int Ai [ ], + const double Ax [ ], const double Az [ ], + const int Qinit [ ], + void **Symbolic, + const double Control [UMFPACK_CONTROL], + double Info [UMFPACK_INFO] +) ; + +long umfpack_zl_qsymbolic +( + long n_row, + long n_col, + const long Ap [ ], + const long Ai [ ], + const double Ax [ ], const double Az [ ], + const long Qinit [ ], + void **Symbolic, + const double Control [UMFPACK_CONTROL], + double Info [UMFPACK_INFO] +) ; + +/* +double int Syntax: + + #include "umfpack.h" + void *Symbolic ; + int n_row, n_col, *Ap, *Ai, *Qinit, status ; + double Control [UMFPACK_CONTROL], Info [UMFPACK_INFO], *Ax ; + status = umfpack_di_qsymbolic (n_row, n_col, Ap, Ai, Ax, Qinit, + &Symbolic, Control, Info) ; + +double long Syntax: + + #include "umfpack.h" + void *Symbolic ; + long n_row, n_col, *Ap, *Ai, *Qinit, status ; + double Control [UMFPACK_CONTROL], Info [UMFPACK_INFO], *Ax ; + status = umfpack_dl_qsymbolic (n_row, n_col, Ap, Ai, Ax, Qinit, + &Symbolic, Control, Info) ; + +complex int Syntax: + + #include "umfpack.h" + void *Symbolic ; + int n_row, n_col, *Ap, *Ai, *Qinit, status ; + double Control [UMFPACK_CONTROL], Info [UMFPACK_INFO], *Ax, *Az ; + status = umfpack_zi_qsymbolic (n_row, n_col, Ap, Ai, Ax, Az, Qinit, + &Symbolic, Control, Info) ; + +complex long Syntax: + + #include "umfpack.h" + void *Symbolic ; + long n_row, n_col, *Ap, *Ai, *Qinit, status ; + double Control [UMFPACK_CONTROL], Info [UMFPACK_INFO], *Ax, *Az ; + status = umfpack_zl_qsymbolic (n_row, n_col, Ap, Ai, Ax, Az, Qinit, + &Symbolic, Control, Info) ; + +packed complex Syntax: + + Same as above, except Az is NULL. + +Purpose: + + Given the nonzero pattern of a sparse matrix A in column-oriented form, and + a sparsity preserving column pre-ordering Qinit, umfpack_*_qsymbolic + performs the symbolic factorization of A*Qinit (or A (:,Qinit) in MATLAB + notation). This is identical to umfpack_*_symbolic, except that neither + COLAMD nor AMD are called and the user input column order Qinit is used + instead. Note that in general, the Qinit passed to umfpack_*_qsymbolic + can differ from the final Q found in umfpack_*_numeric. The unsymmetric + strategy will perform a column etree postordering done in + umfpack_*_qsymbolic and sparsity-preserving modifications are made within + each frontal matrix during umfpack_*_numeric. The symmetric and 2-by-2 + strategies will preserve Qinit, unless the matrix is structurally singular. + + See umfpack_*_symbolic for more information. + + *** WARNING *** A poor choice of Qinit can easily cause umfpack_*_numeric + to use a huge amount of memory and do a lot of work. The "default" symbolic + analysis method is umfpack_*_symbolic, not this routine. If you use this + routine, the performance of UMFPACK is your responsibility; UMFPACK will + not try to second-guess a poor choice of Qinit. + +Returns: + + The value of Info [UMFPACK_STATUS]; see umfpack_*_symbolic. + Also returns UMFPACK_ERROR_invalid_permuation if Qinit is not a valid + permutation vector. + +Arguments: + + All arguments are the same as umfpack_*_symbolic, except for the following: + + Int Qinit [n_col] ; Input argument, not modified. + + The user's fill-reducing initial column pre-ordering. This must be a + permutation of 0..n_col-1. If Qinit [k] = j, then column j is the kth + column of the matrix A (:,Qinit) to be factorized. If Qinit is an + (Int *) NULL pointer, then COLAMD or AMD are called instead. + + double Control [UMFPACK_CONTROL] ; Input argument, not modified. + + If Qinit is not NULL, then only two strategies are recognized: + the unsymmetric strategy and the symmetric strategy. + If Control [UMFPACK_STRATEGY] is UMFPACK_STRATEGY_SYMMETRIC, + then the symmetric strategy is used. Otherwise the unsymmetric + strategy is used. +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Include/umfpack_report_control.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_report_control.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,76 @@ +/* ========================================================================== */ +/* === umfpack_report_control =============================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +void umfpack_di_report_control +( + const double Control [UMFPACK_CONTROL] +) ; + +void umfpack_dl_report_control +( + const double Control [UMFPACK_CONTROL] +) ; + +void umfpack_zi_report_control +( + const double Control [UMFPACK_CONTROL] +) ; + +void umfpack_zl_report_control +( + const double Control [UMFPACK_CONTROL] +) ; + +/* +double int Syntax: + + #include "umfpack.h" + double Control [UMFPACK_CONTROL] ; + umfpack_di_report_control (Control) ; + +double long Syntax: + + #include "umfpack.h" + double Control [UMFPACK_CONTROL] ; + umfpack_dl_report_control (Control) ; + +complex int Syntax: + + #include "umfpack.h" + double Control [UMFPACK_CONTROL] ; + umfpack_zi_report_control (Control) ; + +double long Syntax: + + #include "umfpack.h" + double Control [UMFPACK_CONTROL] ; + umfpack_zl_report_control (Control) ; + +Purpose: + + Prints the current control settings. Note that with the default print + level, nothing is printed. Does nothing if Control is (double *) NULL. + +Arguments: + + double Control [UMFPACK_CONTROL] ; Input argument, not modified. + + If a (double *) NULL pointer is passed, then the default control + settings are used. Otherwise, the settings are determined from the + Control array. See umfpack_*_defaults on how to fill the Control + array with the default settings. If Control contains NaN's, the + defaults are used. The following Control parameters are used: + + Control [UMFPACK_PRL]: printing level. + + 1 or less: no output + 2 or more: print all of Control + Default: 1 +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Include/umfpack_report_info.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_report_info.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,86 @@ +/* ========================================================================== */ +/* === umfpack_report_info ================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +void umfpack_di_report_info +( + const double Control [UMFPACK_CONTROL], + const double Info [UMFPACK_INFO] +) ; + +void umfpack_dl_report_info +( + const double Control [UMFPACK_CONTROL], + const double Info [UMFPACK_INFO] +) ; + +void umfpack_zi_report_info +( + const double Control [UMFPACK_CONTROL], + const double Info [UMFPACK_INFO] +) ; + +void umfpack_zl_report_info +( + const double Control [UMFPACK_CONTROL], + const double Info [UMFPACK_INFO] +) ; + +/* +double int Syntax: + + #include "umfpack.h" + double Control [UMFPACK_CONTROL], Info [UMFPACK_INFO] ; + umfpack_di_report_info (Control, Info) ; + +double long Syntax: + + #include "umfpack.h" + double Control [UMFPACK_CONTROL], Info [UMFPACK_INFO] ; + umfpack_dl_report_info (Control, Info) ; + +complex int Syntax: + + #include "umfpack.h" + double Control [UMFPACK_CONTROL], Info [UMFPACK_INFO] ; + umfpack_zi_report_info (Control, Info) ; + +complex long Syntax: + + #include "umfpack.h" + double Control [UMFPACK_CONTROL], Info [UMFPACK_INFO] ; + umfpack_zl_report_info (Control, Info) ; + +Purpose: + + Reports statistics from the umfpack_*_*symbolic, umfpack_*_numeric, and + umfpack_*_*solve routines. + +Arguments: + + double Control [UMFPACK_CONTROL] ; Input argument, not modified. + + If a (double *) NULL pointer is passed, then the default control + settings are used. Otherwise, the settings are determined from the + Control array. See umfpack_*_defaults on how to fill the Control + array with the default settings. If Control contains NaN's, the + defaults are used. The following Control parameters are used: + + Control [UMFPACK_PRL]: printing level. + + 0 or less: no output, even when an error occurs + 1: error messages only + 2 or more: error messages, and print all of Info + Default: 1 + + double Info [UMFPACK_INFO] ; Input argument, not modified. + + Info is an output argument of several UMFPACK routines. + The contents of Info are printed on standard output. +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Include/umfpack_report_matrix.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_report_matrix.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,203 @@ +/* ========================================================================== */ +/* === umfpack_report_matrix ================================================ */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +int umfpack_di_report_matrix +( + int n_row, + int n_col, + const int Ap [ ], + const int Ai [ ], + const double Ax [ ], + int col_form, + const double Control [UMFPACK_CONTROL] +) ; + +long umfpack_dl_report_matrix +( + long n_row, + long n_col, + const long Ap [ ], + const long Ai [ ], + const double Ax [ ], + long col_form, + const double Control [UMFPACK_CONTROL] +) ; + +int umfpack_zi_report_matrix +( + int n_row, + int n_col, + const int Ap [ ], + const int Ai [ ], + const double Ax [ ], const double Az [ ], + int col_form, + const double Control [UMFPACK_CONTROL] +) ; + +long umfpack_zl_report_matrix +( + long n_row, + long n_col, + const long Ap [ ], + const long Ai [ ], + const double Ax [ ], const double Az [ ], + long col_form, + const double Control [UMFPACK_CONTROL] +) ; + +/* +double int Syntax: + + #include "umfpack.h" + int n_row, n_col, *Ap, *Ai, status ; + double *Ax, Control [UMFPACK_CONTROL] ; + status = umfpack_di_report_matrix (n_row, n_col, Ap, Ai, Ax, 1, Control) ; +or: + status = umfpack_di_report_matrix (n_row, n_col, Ap, Ai, Ax, 0, Control) ; + +double long Syntax: + + #include "umfpack.h" + long n_row, n_col, *Ap, *Ai, status ; + double *Ax, Control [UMFPACK_CONTROL] ; + status = umfpack_dl_report_matrix (n_row, n_col, Ap, Ai, Ax, 1, Control) ; +or: + status = umfpack_dl_report_matrix (n_row, n_col, Ap, Ai, Ax, 0, Control) ; + +complex int Syntax: + + #include "umfpack.h" + int n_row, n_col, *Ap, *Ai, status ; + double *Ax, *Az, Control [UMFPACK_CONTROL] ; + status = umfpack_zi_report_matrix (n_row, n_col, Ap, Ai, Ax, Az, 1, + Control) ; +or: + status = umfpack_zi_report_matrix (n_row, n_col, Ap, Ai, Ax, Az, 0, + Control) ; + +complex long Syntax: + + #include "umfpack.h" + long n_row, n_col, *Ap, *Ai, status ; + double *Ax, Control [UMFPACK_CONTROL] ; + status = umfpack_zl_report_matrix (n_row, n_col, Ap, Ai, Ax, Az, 1, + Control) ; +or: + status = umfpack_zl_report_matrix (n_row, n_col, Ap, Ai, Ax, Az, 0, + Control) ; + +packed complex Syntax: + + Same as above, except Az is NULL. + +Purpose: + + Verifies and prints a row or column-oriented sparse matrix. + +Returns: + + UMFPACK_OK if Control [UMFPACK_PRL] <= 2 (the input is not checked). + + Otherwise (where n is n_col for the column form and n_row for row + and let ni be n_row for the column form and n_col for row): + + UMFPACK_OK if the matrix is valid. + + UMFPACK_ERROR_n_nonpositive if n_row <= 0 or n_col <= 0. + UMFPACK_ERROR_argument_missing if Ap and/or Ai are missing. + UMFPACK_ERROR_invalid_matrix if Ap [n] < 0, if Ap [0] is not zero, + if Ap [j+1] < Ap [j] for any j in the range 0 to n-1, + if any row index in Ai is not in the range 0 to ni-1, or + if the row indices in any column are not in + ascending order, or contain duplicates. + UMFPACK_ERROR_out_of_memory if out of memory. + +Arguments: + + Int n_row ; Input argument, not modified. + Int n_col ; Input argument, not modified. + + A is an n_row-by-n_row matrix. Restriction: n_row > 0 and n_col > 0. + + Int Ap [n+1] ; Input argument, not modified. + + n is n_row for a row-form matrix, and n_col for a column-form matrix. + + Ap is an integer array of size n+1. If col_form is true (nonzero), + then on input, it holds the "pointers" for the column form of the + sparse matrix A. The row indices of column j of the matrix A are held + in Ai [(Ap [j]) ... (Ap [j+1]-1)]. Otherwise, Ap holds the + row pointers, and the column indices of row j of the matrix are held + in Ai [(Ap [j]) ... (Ap [j+1]-1)]. + + The first entry, Ap [0], must be zero, and Ap [j] <= Ap [j+1] must hold + for all j in the range 0 to n-1. The value nz = Ap [n] is thus the + total number of entries in the pattern of the matrix A. + + Int Ai [nz] ; Input argument, not modified, of size nz = Ap [n]. + + If col_form is true (nonzero), then the nonzero pattern (row indices) + for column j is stored in Ai [(Ap [j]) ... (Ap [j+1]-1)]. Row indices + must be in the range 0 to n_row-1 (the matrix is 0-based). + + Otherwise, the nonzero pattern (column indices) for row j is stored in + Ai [(Ap [j]) ... (Ap [j+1]-1)]. Column indices must be in the range 0 + to n_col-1 (the matrix is 0-based). + + double Ax [nz] ; Input argument, not modified, of size nz = Ap [n]. + Size 2*nz for packed complex case. + + The numerical values of the sparse matrix A. + + If col_form is true (nonzero), then the nonzero pattern (row indices) + for column j is stored in Ai [(Ap [j]) ... (Ap [j+1]-1)], and the + corresponding (real) numerical values are stored in + Ax [(Ap [j]) ... (Ap [j+1]-1)]. The imaginary parts are stored in + Az [(Ap [j]) ... (Ap [j+1]-1)], for the complex versions + (see below if Az is NULL). + + Otherwise, the nonzero pattern (column indices) for row j + is stored in Ai [(Ap [j]) ... (Ap [j+1]-1)], and the corresponding + (real) numerical values are stored in Ax [(Ap [j]) ... (Ap [j+1]-1)]. + The imaginary parts are stored in Az [(Ap [j]) ... (Ap [j+1]-1)], + for the complex versions (see below if Az is NULL). + + No numerical values are printed if Ax is NULL. + + double Az [nz] ; Input argument, not modified, for complex versions. + + The imaginary values of the sparse matrix A. See the description + of Ax, above. + + If Az is NULL, then both real + and imaginary parts are contained in Ax[0..2*nz-1], with Ax[2*k] + and Ax[2*k+1] being the real and imaginary part of the kth entry. + + Int col_form ; Input argument, not modified. + + The matrix is in row-oriented form if form is col_form is false (0). + Otherwise, the matrix is in column-oriented form. + + double Control [UMFPACK_CONTROL] ; Input argument, not modified. + + If a (double *) NULL pointer is passed, then the default control + settings are used. Otherwise, the settings are determined from the + Control array. See umfpack_*_defaults on how to fill the Control + array with the default settings. If Control contains NaN's, the + defaults are used. The following Control parameters are used: + + Control [UMFPACK_PRL]: printing level. + + 2 or less: no output. returns silently without checking anything. + 3: fully check input, and print a short summary of its status + 4: as 3, but print first few entries of the input + 5: as 3, but print all of the input + Default: 1 +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Include/umfpack_report_numeric.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_report_numeric.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,112 @@ +/* ========================================================================== */ +/* === umfpack_report_numeric =============================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +int umfpack_di_report_numeric +( + void *Numeric, + const double Control [UMFPACK_CONTROL] +) ; + +long umfpack_dl_report_numeric +( + void *Numeric, + const double Control [UMFPACK_CONTROL] +) ; + +int umfpack_zi_report_numeric +( + void *Numeric, + const double Control [UMFPACK_CONTROL] +) ; + +long umfpack_zl_report_numeric +( + void *Numeric, + const double Control [UMFPACK_CONTROL] +) ; + +/* +double int Syntax: + + #include "umfpack.h" + void *Numeric ; + double Control [UMFPACK_CONTROL] ; + int status ; + status = umfpack_di_report_numeric (Numeric, Control) ; + +double long Syntax: + + #include "umfpack.h" + void *Numeric ; + double Control [UMFPACK_CONTROL] ; + long status ; + status = umfpack_dl_report_numeric (Numeric, Control) ; + +complex int Syntax: + + #include "umfpack.h" + void *Numeric ; + double Control [UMFPACK_CONTROL] ; + int status ; + status = umfpack_zi_report_numeric (Numeric, Control) ; + +complex long Syntax: + + #include "umfpack.h" + void *Numeric ; + double Control [UMFPACK_CONTROL] ; + long status ; + status = umfpack_zl_report_numeric (Numeric, Control) ; + +Purpose: + + Verifies and prints a Numeric object (the LU factorization, both its pattern + numerical values, and permutation vectors P and Q). This routine checks the + object more carefully than the computational routines. Normally, this check + is not required, since umfpack_*_numeric either returns (void *) NULL, or a + valid Numeric object. However, if you suspect that your own code has + corrupted the Numeric object (by overruning memory bounds, for example), + then this routine might be able to detect a corrupted Numeric object. Since + this is a complex object, not all such user-generated errors are guaranteed + to be caught by this routine. + +Returns: + + UMFPACK_OK if Control [UMFPACK_PRL] <= 2 (the input is not checked). + + Otherwise: + + UMFPACK_OK if the Numeric object is valid. + UMFPACK_ERROR_invalid_Numeric_object if the Numeric object is invalid. + UMFPACK_ERROR_out_of_memory if out of memory. + +Arguments: + + void *Numeric ; Input argument, not modified. + + The Numeric object, which holds the numeric factorization computed by + umfpack_*_numeric. + + double Control [UMFPACK_CONTROL] ; Input argument, not modified. + + If a (double *) NULL pointer is passed, then the default control + settings are used. Otherwise, the settings are determined from the + Control array. See umfpack_*_defaults on how to fill the Control + array with the default settings. If Control contains NaN's, the + defaults are used. The following Control parameters are used: + + Control [UMFPACK_PRL]: printing level. + + 2 or less: no output. returns silently without checking anything. + 3: fully check input, and print a short summary of its status + 4: as 3, but print first few entries of the input + 5: as 3, but print all of the input + Default: 1 +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Include/umfpack_report_perm.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_report_perm.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,112 @@ +/* ========================================================================== */ +/* === umfpack_report_perm ================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +int umfpack_di_report_perm +( + int np, + const int Perm [ ], + const double Control [UMFPACK_CONTROL] +) ; + +long umfpack_dl_report_perm +( + long np, + const long Perm [ ], + const double Control [UMFPACK_CONTROL] +) ; + +int umfpack_zi_report_perm +( + int np, + const int Perm [ ], + const double Control [UMFPACK_CONTROL] +) ; + +long umfpack_zl_report_perm +( + long np, + const long Perm [ ], + const double Control [UMFPACK_CONTROL] +) ; + +/* +double int Syntax: + + #include "umfpack.h" + int np, *Perm, status ; + double Control [UMFPACK_CONTROL] ; + status = umfpack_di_report_perm (np, Perm, Control) ; + +double long Syntax: + + #include "umfpack.h" + long np, *Perm, status ; + double Control [UMFPACK_CONTROL] ; + status = umfpack_dl_report_perm (np, Perm, Control) ; + +complex int Syntax: + + #include "umfpack.h" + int np, *Perm, status ; + double Control [UMFPACK_CONTROL] ; + status = umfpack_zi_report_perm (np, Perm, Control) ; + +complex long Syntax: + + #include "umfpack.h" + long np, *Perm, status ; + double Control [UMFPACK_CONTROL] ; + status = umfpack_zl_report_perm (np, Perm, Control) ; + +Purpose: + + Verifies and prints a permutation vector. + +Returns: + + UMFPACK_OK if Control [UMFPACK_PRL] <= 2 (the input is not checked). + + Otherwise: + UMFPACK_OK if the permutation vector is valid (this includes that case + when Perm is (Int *) NULL, which is not an error condition). + UMFPACK_ERROR_n_nonpositive if np <= 0. + UMFPACK_ERROR_out_of_memory if out of memory. + UMFPACK_ERROR_invalid_permutation if Perm is not a valid permutation vector. + +Arguments: + + Int np ; Input argument, not modified. + + Perm is an integer vector of size np. Restriction: np > 0. + + Int Perm [np] ; Input argument, not modified. + + A permutation vector of size np. If Perm is not present (an (Int *) + NULL pointer), then it is assumed to be the identity permutation. This + is consistent with its use as an input argument to umfpack_*_qsymbolic, + and is not an error condition. If Perm is present, the entries in Perm + must range between 0 and np-1, and no duplicates may exist. + + double Control [UMFPACK_CONTROL] ; Input argument, not modified. + + If a (double *) NULL pointer is passed, then the default control + settings are used. Otherwise, the settings are determined from the + Control array. See umfpack_*_defaults on how to fill the Control + array with the default settings. If Control contains NaN's, the + defaults are used. The following Control parameters are used: + + Control [UMFPACK_PRL]: printing level. + + 2 or less: no output. returns silently without checking anything. + 3: fully check input, and print a short summary of its status + 4: as 3, but print first few entries of the input + 5: as 3, but print all of the input + Default: 1 +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Include/umfpack_report_status.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_report_status.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,90 @@ +/* ========================================================================== */ +/* === umfpack_report_status ================================================ */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +void umfpack_di_report_status +( + const double Control [UMFPACK_CONTROL], + int status +) ; + +void umfpack_dl_report_status +( + const double Control [UMFPACK_CONTROL], + long status +) ; + +void umfpack_zi_report_status +( + const double Control [UMFPACK_CONTROL], + int status +) ; + +void umfpack_zl_report_status +( + const double Control [UMFPACK_CONTROL], + long status +) ; + +/* +double int Syntax: + + #include "umfpack.h" + double Control [UMFPACK_CONTROL] ; + int status ; + umfpack_di_report_status (Control, status) ; + +double long Syntax: + + #include "umfpack.h" + double Control [UMFPACK_CONTROL] ; + long status ; + umfpack_dl_report_status (Control, status) ; + +complex int Syntax: + + #include "umfpack.h" + double Control [UMFPACK_CONTROL] ; + int status ; + umfpack_zi_report_status (Control, status) ; + +complex long Syntax: + + #include "umfpack.h" + double Control [UMFPACK_CONTROL] ; + long status ; + umfpack_zl_report_status (Control, status) ; + +Purpose: + + Prints the status (return value) of other umfpack_* routines. + +Arguments: + + double Control [UMFPACK_CONTROL] ; Input argument, not modified. + + If a (double *) NULL pointer is passed, then the default control + settings are used. Otherwise, the settings are determined from the + Control array. See umfpack_*_defaults on how to fill the Control + array with the default settings. If Control contains NaN's, the + defaults are used. The following Control parameters are used: + + Control [UMFPACK_PRL]: printing level. + + 0 or less: no output, even when an error occurs + 1: error messages only + 2 or more: print status, whether or not an error occurred + 4 or more: also print the UMFPACK Copyright + 6 or more: also print the UMFPACK License + Default: 1 + + Int status ; Input argument, not modified. + + The return value from another umfpack_* routine. +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Include/umfpack_report_symbolic.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_report_symbolic.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,111 @@ +/* ========================================================================== */ +/* === umfpack_report_symbolic ============================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +int umfpack_di_report_symbolic +( + void *Symbolic, + const double Control [UMFPACK_CONTROL] +) ; + +long umfpack_dl_report_symbolic +( + void *Symbolic, + const double Control [UMFPACK_CONTROL] +) ; + +int umfpack_zi_report_symbolic +( + void *Symbolic, + const double Control [UMFPACK_CONTROL] +) ; + +long umfpack_zl_report_symbolic +( + void *Symbolic, + const double Control [UMFPACK_CONTROL] +) ; + +/* +double int Syntax: + + #include "umfpack.h" + void *Symbolic ; + double Control [UMFPACK_CONTROL] ; + int status ; + status = umfpack_di_report_symbolic (Symbolic, Control) ; + +double long Syntax: + + #include "umfpack.h" + void *Symbolic ; + double Control [UMFPACK_CONTROL] ; + long status ; + status = umfpack_dl_report_symbolic (Symbolic, Control) ; + +complex int Syntax: + + #include "umfpack.h" + void *Symbolic ; + double Control [UMFPACK_CONTROL] ; + int status ; + status = umfpack_zi_report_symbolic (Symbolic, Control) ; + +complex long Syntax: + + #include "umfpack.h" + void *Symbolic ; + double Control [UMFPACK_CONTROL] ; + long status ; + status = umfpack_zl_report_symbolic (Symbolic, Control) ; + +Purpose: + + Verifies and prints a Symbolic object. This routine checks the object more + carefully than the computational routines. Normally, this check is not + required, since umfpack_*_*symbolic either returns (void *) NULL, or a valid + Symbolic object. However, if you suspect that your own code has corrupted + the Symbolic object (by overruning memory bounds, for example), then this + routine might be able to detect a corrupted Symbolic object. Since this is + a complex object, not all such user-generated errors are guaranteed to be + caught by this routine. + +Returns: + + UMFPACK_OK if Control [UMFPACK_PRL] is <= 2 (no inputs are checked). + + Otherwise: + + UMFPACK_OK if the Symbolic object is valid. + UMFPACK_ERROR_invalid_Symbolic_object if the Symbolic object is invalid. + UMFPACK_ERROR_out_of_memory if out of memory. + +Arguments: + + void *Symbolic ; Input argument, not modified. + + The Symbolic object, which holds the symbolic factorization computed by + umfpack_*_*symbolic. + + double Control [UMFPACK_CONTROL] ; Input argument, not modified. + + If a (double *) NULL pointer is passed, then the default control + settings are used. Otherwise, the settings are determined from the + Control array. See umfpack_*_defaults on how to fill the Control + array with the default settings. If Control contains NaN's, the + defaults are used. The following Control parameters are used: + + Control [UMFPACK_PRL]: printing level. + + 2 or less: no output. returns silently without checking anything. + 3: fully check input, and print a short summary of its status + 4: as 3, but print first few entries of the input + 5: as 3, but print all of the input + Default: 1 +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Include/umfpack_report_triplet.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_report_triplet.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,153 @@ +/* ========================================================================== */ +/* === umfpack_report_triplet =============================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +int umfpack_di_report_triplet +( + int n_row, + int n_col, + int nz, + const int Ti [ ], + const int Tj [ ], + const double Tx [ ], + const double Control [UMFPACK_CONTROL] +) ; + +long umfpack_dl_report_triplet +( + long n_row, + long n_col, + long nz, + const long Ti [ ], + const long Tj [ ], + const double Tx [ ], + const double Control [UMFPACK_CONTROL] +) ; + +int umfpack_zi_report_triplet +( + int n_row, + int n_col, + int nz, + const int Ti [ ], + const int Tj [ ], + const double Tx [ ], const double Tz [ ], + const double Control [UMFPACK_CONTROL] +) ; + +long umfpack_zl_report_triplet +( + long n_row, + long n_col, + long nz, + const long Ti [ ], + const long Tj [ ], + const double Tx [ ], const double Tz [ ], + const double Control [UMFPACK_CONTROL] +) ; + +/* +double int Syntax: + + #include "umfpack.h" + int n_row, n_col, nz, *Ti, *Tj, status ; + double *Tx, Control [UMFPACK_CONTROL] ; + status = umfpack_di_report_triplet (n_row, n_col, nz, Ti, Tj, Tx, Control) ; + +double long Syntax: + + #include "umfpack.h" + long n_row, n_col, nz, *Ti, *Tj, status ; + double *Tx, Control [UMFPACK_CONTROL] ; + status = umfpack_dl_report_triplet (n_row, n_col, nz, Ti, Tj, Tx, Control) ; + +complex int Syntax: + + #include "umfpack.h" + int n_row, n_col, nz, *Ti, *Tj, status ; + double *Tx, *Tz, Control [UMFPACK_CONTROL] ; + status = umfpack_zi_report_triplet (n_row, n_col, nz, Ti, Tj, Tx, Tz, + Control) ; + +complex long Syntax: + + #include "umfpack.h" + long n_row, n_col, nz, *Ti, *Tj, status ; + double *Tx, *Tz, Control [UMFPACK_CONTROL] ; + status = umfpack_zl_report_triplet (n_row, n_col, nz, Ti, Tj, Tx, Tz, + Control) ; + +packed complex Syntax: + + Same as above, except Tz is NULL. + +Purpose: + + Verifies and prints a matrix in triplet form. + +Returns: + + UMFPACK_OK if Control [UMFPACK_PRL] <= 2 (the input is not checked). + + Otherwise: + + UMFPACK_OK if the Triplet matrix is OK. + UMFPACK_ERROR_argument_missing if Ti and/or Tj are missing. + UMFPACK_ERROR_n_nonpositive if n_row <= 0 or n_col <= 0. + UMFPACK_ERROR_invalid_matrix if nz < 0, or + if any row or column index in Ti and/or Tj + is not in the range 0 to n_row-1 or 0 to n_col-1, respectively. + +Arguments: + + Int n_row ; Input argument, not modified. + Int n_col ; Input argument, not modified. + + A is an n_row-by-n_col matrix. + + Int nz ; Input argument, not modified. + + The number of entries in the triplet form of the matrix. + + Int Ti [nz] ; Input argument, not modified. + Int Tj [nz] ; Input argument, not modified. + double Tx [nz] ; Input argument, not modified. + Size 2*nz for packed complex case. + double Tz [nz] ; Input argument, not modified, for complex versions. + + Ti, Tj, Tx (and Tz for complex versions) hold the "triplet" form of a + sparse matrix. The kth nonzero entry is in row i = Ti [k], column + j = Tj [k], the real numerical value of a_ij is Tx [k], and the + imaginary part of a_ij is Tz [k] (for complex versions). The row and + column indices i and j must be in the range 0 to n_row-1 or 0 to + n_col-1, respectively. Duplicate entries may be present. The + "triplets" may be in any order. Tx and Tz are optional; if Tx is + not present ((double *) NULL), then the numerical values are + not printed. + + If Tx is present and Tz is NULL, then both real + and imaginary parts are contained in Tx[0..2*nz-1], with Tx[2*k] + and Tx[2*k+1] being the real and imaginary part of the kth entry. + + double Control [UMFPACK_CONTROL] ; Input argument, not modified. + + If a (double *) NULL pointer is passed, then the default control + settings are used. Otherwise, the settings are determined from the + Control array. See umfpack_*_defaults on how to fill the Control + array with the default settings. If Control contains NaN's, the + defaults are used. The following Control parameters are used: + + Control [UMFPACK_PRL]: printing level. + + 2 or less: no output. returns silently without checking anything. + 3: fully check input, and print a short summary of its status + 4: as 3, but print first few entries of the input + 5: as 3, but print all of the input + Default: 1 +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Include/umfpack_report_vector.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_report_vector.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,133 @@ +/* ========================================================================== */ +/* === umfpack_report_vector ================================================ */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +int umfpack_di_report_vector +( + int n, + const double X [ ], + const double Control [UMFPACK_CONTROL] +) ; + +long umfpack_dl_report_vector +( + long n, + const double X [ ], + const double Control [UMFPACK_CONTROL] +) ; + +int umfpack_zi_report_vector +( + int n, + const double Xx [ ], const double Xz [ ], + const double Control [UMFPACK_CONTROL] +) ; + +long umfpack_zl_report_vector +( + long n, + const double Xx [ ], const double Xz [ ], + const double Control [UMFPACK_CONTROL] +) ; + +/* +double int Syntax: + + #include "umfpack.h" + int n, status ; + double *X, Control [UMFPACK_CONTROL] ; + status = umfpack_di_report_vector (n, X, Control) ; + +double long Syntax: + + #include "umfpack.h" + long n, status ; + double *X, Control [UMFPACK_CONTROL] ; + status = umfpack_dl_report_vector (n, X, Control) ; + +complex int Syntax: + + #include "umfpack.h" + int n, status ; + double *Xx, *Xz, Control [UMFPACK_CONTROL] ; + status = umfpack_zi_report_vector (n, Xx, Xz, Control) ; + +complex long Syntax: + + #include "umfpack.h" + long n, status ; + double *Xx, *Xz, Control [UMFPACK_CONTROL] ; + status = umfpack_zl_report_vector (n, Xx, Xz, Control) ; + +Purpose: + + Verifies and prints a dense vector. + +Returns: + + UMFPACK_OK if Control [UMFPACK_PRL] <= 2 (the input is not checked). + + Otherwise: + + UMFPACK_OK if the vector is valid. + UMFPACK_ERROR_argument_missing if X or Xx is missing. + UMFPACK_ERROR_n_nonpositive if n <= 0. + +Arguments: + + Int n ; Input argument, not modified. + + X is a real or complex vector of size n. Restriction: n > 0. + + double X [n] ; Input argument, not modified. For real versions. + + A real vector of size n. X must not be (double *) NULL. + + double Xx [n or 2*n] ; Input argument, not modified. For complex versions. + double Xz [n or 0] ; Input argument, not modified. For complex versions. + + A complex vector of size n, in one of two storage formats. + Xx must not be (double *) NULL. + + If Xz is not (double *) NULL, then Xx [i] is the real part of X (i) and + Xz [i] is the imaginary part of X (i). Both vectors are of length n. + This is the "split" form of the complex vector X. + + If Xz is (double *) NULL, then Xx holds both real and imaginary parts, + where Xx [2*i] is the real part of X (i) and Xx [2*i+1] is the imaginary + part of X (i). Xx is of length 2*n doubles. If you have an ANSI C99 + compiler with the intrinsic double _Complex type, then Xx can be of + type double _Complex in the calling routine and typecast to (double *) + when passed to umfpack_*_report_vector (this is untested, however). + This is the "merged" form of the complex vector X. + + Note that all complex routines in UMFPACK V4.4 use this same + strategy for their complex arguments. The split format is useful for + MATLAB, which holds its real and imaginary parts in seperate arrays. + The packed format is compatible with the intrinsic double _Complex + type in ANSI C99, and is also compatible with SuperLU's method of + storing complex matrices. In Version 4.3, this routine was the only + one that allowed for packed complex arguments. + + double Control [UMFPACK_CONTROL] ; Input argument, not modified. + + If a (double *) NULL pointer is passed, then the default control + settings are used. Otherwise, the settings are determined from the + Control array. See umfpack_*_defaults on how to fill the Control + array with the default settings. If Control contains NaN's, the + defaults are used. The following Control parameters are used: + + Control [UMFPACK_PRL]: printing level. + + 2 or less: no output. returns silently without checking anything. + 3: fully check input, and print a short summary of its status + 4: as 3, but print first few entries of the input + 5: as 3, but print all of the input + Default: 1 +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Include/umfpack_save_numeric.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_save_numeric.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,90 @@ +/* ========================================================================== */ +/* === umfpack_save_numeric ================================================= */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +int umfpack_di_save_numeric +( + void *Numeric, + char *filename +) ; + +long umfpack_dl_save_numeric +( + void *Numeric, + char *filename +) ; + +int umfpack_zi_save_numeric +( + void *Numeric, + char *filename +) ; + +long umfpack_zl_save_numeric +( + void *Numeric, + char *filename +) ; + +/* +double int Syntax: + + #include "umfpack.h" + int status ; + char *filename ; + void *Numeric ; + status = umfpack_di_save_numeric (Numeric, filename) ; + +double long Syntax: + + #include "umfpack.h" + long status ; + char *filename ; + void *Numeric ; + status = umfpack_dl_save_numeric (Numeric, filename) ; + +complex int Syntax: + + #include "umfpack.h" + int status ; + char *filename ; + void *Numeric ; + status = umfpack_zi_save_numeric (Numeric, filename) ; + +complex long Syntax: + + #include "umfpack.h" + long status ; + char *filename ; + void *Numeric ; + status = umfpack_zl_save_numeric (Numeric, filename) ; + +Purpose: + + Saves a Numeric object to a file, which can later be read by + umfpack_*_load_numeric. The Numeric object is not modified. + +Returns: + + UMFPACK_OK if successful. + UMFPACK_ERROR_invalid_Numeric_object if Numeric is not valid. + UMFPACK_ERROR_file_IO if an I/O error occurred. + +Arguments: + + void *Numeric ; Input argument, not modified. + + Numeric must point to a valid Numeric object, computed by + umfpack_*_numeric or loaded by umfpack_*_load_numeric. + + char *filename ; Input argument, not modified. + + A string that contains the filename to which the Numeric + object is written. +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Include/umfpack_save_symbolic.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_save_symbolic.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,90 @@ +/* ========================================================================== */ +/* === umfpack_save_symbolic================================================= */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +int umfpack_di_save_symbolic +( + void *Symbolic, + char *filename +) ; + +long umfpack_dl_save_symbolic +( + void *Symbolic, + char *filename +) ; + +int umfpack_zi_save_symbolic +( + void *Symbolic, + char *filename +) ; + +long umfpack_zl_save_symbolic +( + void *Symbolic, + char *filename +) ; + +/* +double int Syntax: + + #include "umfpack.h" + int status ; + char *filename ; + void *Symbolic ; + status = umfpack_di_save_symbolic (Symbolic, filename) ; + +double long Syntax: + + #include "umfpack.h" + long status ; + char *filename ; + void *Symbolic ; + status = umfpack_dl_save_symbolic (Symbolic, filename) ; + +complex int Syntax: + + #include "umfpack.h" + int status ; + char *filename ; + void *Symbolic ; + status = umfpack_zi_save_symbolic (Symbolic, filename) ; + +complex long Syntax: + + #include "umfpack.h" + long status ; + char *filename ; + void *Symbolic ; + status = umfpack_zl_save_symbolic (Symbolic, filename) ; + +Purpose: + + Saves a Symbolic object to a file, which can later be read by + umfpack_*_load_symbolic. The Symbolic object is not modified. + +Returns: + + UMFPACK_OK if successful. + UMFPACK_ERROR_invalid_Symbolic_object if Symbolic is not valid. + UMFPACK_ERROR_file_IO if an I/O error occurred. + +Arguments: + + void *Symbolic ; Input argument, not modified. + + Symbolic must point to a valid Symbolic object, computed by + umfpack_*_symbolic or loaded by umfpack_*_load_symbolic. + + char *filename ; Input argument, not modified. + + A string that contains the filename to which the Symbolic + object is written. +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Include/umfpack_scale.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_scale.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,112 @@ +/* ========================================================================== */ +/* === umfpack_scale ======================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +int umfpack_di_scale +( + double X [ ], + const double B [ ], + void *Numeric +) ; + +long umfpack_dl_scale +( + double X [ ], + const double B [ ], + void *Numeric +) ; + +int umfpack_zi_scale +( + double Xx [ ], double Xz [ ], + const double Bx [ ], const double Bz [ ], + void *Numeric +) ; + +long umfpack_zl_scale +( + double Xx [ ], double Xz [ ], + const double Bx [ ], const double Bz [ ], + void *Numeric +) ; + +/* +double int Syntax: + + #include "umfpack.h" + void *Numeric ; + double *B, *X ; + status = umfpack_di_scale (X, B, Numeric) ; + +double long Syntax: + + #include "umfpack.h" + void *Numeric ; + double *B, *X ; + status = umfpack_dl_scale (X, B, Numeric) ; + +complex int Syntax: + + #include "umfpack.h" + void *Numeric ; + double *Bx, *Bz, *Xx, *Xz ; + status = umfpack_zi_scale (Xx, Xz, Bx, Bz, Numeric) ; + +complex long Syntax: + + #include "umfpack.h" + void *Numeric ; + double *Bx, *Bz, *Xx, *Xz ; + status = umfpack_zl_scale (Xx, Xz, Bx, Bz, Numeric) ; + +packed complex Syntax: + + Same as above, except both Xz and Bz are NULL. + +Purpose: + + Given LU factors computed by umfpack_*_numeric (PAQ=LU, PRAQ=LU, or + P(R\A)Q=LU), and a vector B, this routine computes X = B, X = R*B, or + X = R\B, as appropriate. X and B must be vectors equal in length to the + number of rows of A. + +Returns: + + The status code is returned. UMFPACK_OK is returned if successful. + UMFPACK_ERROR_invalid_Numeric_object is returned in the Numeric + object is invalid. UMFPACK_ERROR_argument_missing is returned if + any of the input vectors are missing (X and B for the real version, + and Xx and Bx for the complex version). + +Arguments: + + double X [n_row] ; Output argument. + or: + double Xx [n_row] ; Output argument, real part. + Size 2*n_row for packed complex case. + double Xz [n_row] ; Output argument, imaginary part. + + The output vector X. If either Xz or Bz are NULL, the vector + X is in packed complex form, with the kth entry in Xx [2*k] and + Xx [2*k+1], and likewise for B. + + double B [n_row] ; Input argument, not modified. + or: + double Bx [n_row] ; Input argument, not modified, real part. + Size 2*n_row for packed complex case. + double Bz [n_row] ; Input argument, not modified, imaginary part. + + The input vector B. See above if either Xz or Bz are NULL. + + void *Numeric ; Input argument, not modified. + + Numeric must point to a valid Numeric object, computed by + umfpack_*_numeric. + +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Include/umfpack_solve.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_solve.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,301 @@ +/* ========================================================================== */ +/* === umfpack_solve ======================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +int umfpack_di_solve +( + int sys, + const int Ap [ ], + const int Ai [ ], + const double Ax [ ], + double X [ ], + const double B [ ], + void *Numeric, + const double Control [UMFPACK_CONTROL], + double Info [UMFPACK_INFO] +) ; + +long umfpack_dl_solve +( + long sys, + const long Ap [ ], + const long Ai [ ], + const double Ax [ ], + double X [ ], + const double B [ ], + void *Numeric, + const double Control [UMFPACK_CONTROL], + double Info [UMFPACK_INFO] +) ; + +int umfpack_zi_solve +( + int sys, + const int Ap [ ], + const int Ai [ ], + const double Ax [ ], const double Az [ ], + double Xx [ ], double Xz [ ], + const double Bx [ ], const double Bz [ ], + void *Numeric, + const double Control [UMFPACK_CONTROL], + double Info [UMFPACK_INFO] +) ; + +long umfpack_zl_solve +( + long sys, + const long Ap [ ], + const long Ai [ ], + const double Ax [ ], const double Az [ ], + double Xx [ ], double Xz [ ], + const double Bx [ ], const double Bz [ ], + void *Numeric, + const double Control [UMFPACK_CONTROL], + double Info [UMFPACK_INFO] +) ; + +/* +double int Syntax: + + #include "umfpack.h" + void *Numeric ; + int status, *Ap, *Ai, sys ; + double *B, *X, *Ax, Info [UMFPACK_INFO], Control [UMFPACK_CONTROL] ; + status = umfpack_di_solve (sys, Ap, Ai, Ax, X, B, Numeric, Control, Info) ; + +double long Syntax: + + #include "umfpack.h" + void *Numeric ; + long status, *Ap, *Ai, sys ; + double *B, *X, *Ax, Info [UMFPACK_INFO], Control [UMFPACK_CONTROL] ; + status = umfpack_dl_solve (sys, Ap, Ai, Ax, X, B, Numeric, Control, Info) ; + +complex int Syntax: + + #include "umfpack.h" + void *Numeric ; + int status, *Ap, *Ai, sys ; + double *Bx, *Bz, *Xx, *Xz, *Ax, *Az, Info [UMFPACK_INFO], + Control [UMFPACK_CONTROL] ; + status = umfpack_zi_solve (sys, Ap, Ai, Ax, Az, Xx, Xz, Bx, Bz, Numeric, + Control, Info) ; + +complex long Syntax: + + #include "umfpack.h" + void *Numeric ; + long status, *Ap, *Ai, sys ; + double *Bx, *Bz, *Xx, *Xz, *Ax, *Az, Info [UMFPACK_INFO], + Control [UMFPACK_CONTROL] ; + status = umfpack_zl_solve (sys, Ap, Ai, Ax, Az, Xx, Xz, Bx, Bz, Numeric, + Control, Info) ; + +packed complex Syntax: + + Same as above, Xz, Bz, and Az are NULL. + +Purpose: + + Given LU factors computed by umfpack_*_numeric (PAQ=LU, PRAQ=LU, or + P(R\A)Q=LU) and the right-hand-side, B, solve a linear system for the + solution X. Iterative refinement is optionally performed. Only square + systems are handled. Singular matrices result in a divide-by-zero for all + systems except those involving just the matrix L. Iterative refinement is + not performed for singular matrices. In the discussion below, n is equal + to n_row and n_col, because only square systems are handled. + +Returns: + + The status code is returned. See Info [UMFPACK_STATUS], below. + +Arguments: + + Int sys ; Input argument, not modified. + + Defines which system to solve. (') is the linear algebraic transpose + (complex conjugate if A is complex), and (.') is the array transpose. + + sys value system solved + UMFPACK_A Ax=b + UMFPACK_At A'x=b + UMFPACK_Aat A.'x=b + UMFPACK_Pt_L P'Lx=b + UMFPACK_L Lx=b + UMFPACK_Lt_P L'Px=b + UMFPACK_Lat_P L.'Px=b + UMFPACK_Lt L'x=b + UMFPACK_U_Qt UQ'x=b + UMFPACK_U Ux=b + UMFPACK_Q_Ut QU'x=b + UMFPACK_Q_Uat QU.'x=b + UMFPACK_Ut U'x=b + UMFPACK_Uat U.'x=b + + Iterative refinement can be optionally performed when sys is any of + the following: + + UMFPACK_A Ax=b + UMFPACK_At A'x=b + UMFPACK_Aat A.'x=b + + For the other values of the sys argument, iterative refinement is not + performed (Control [UMFPACK_IRSTEP], Ap, Ai, Ax, and Az are ignored). + + Int Ap [n+1] ; Input argument, not modified. + Int Ai [nz] ; Input argument, not modified. + double Ax [nz] ; Input argument, not modified. + Size 2*nz for packed complex case. + double Az [nz] ; Input argument, not modified, for complex versions. + + If iterative refinement is requested (Control [UMFPACK_IRSTEP] >= 1, + Ax=b, A'x=b, or A.'x=b is being solved, and A is nonsingular), then + these arrays must be identical to the same ones passed to + umfpack_*_numeric. The umfpack_*_solve routine does not check the + contents of these arguments, so the results are undefined if Ap, Ai, Ax, + and/or Az are modified between the calls the umfpack_*_numeric and + umfpack_*_solve. These three arrays do not need to be present (NULL + pointers can be passed) if Control [UMFPACK_IRSTEP] is zero, or if a + system other than Ax=b, A'x=b, or A.'x=b is being solved, or if A is + singular, since in each of these cases A is not accessed. + + If Az, Xz, or Bz are NULL, then both real + and imaginary parts are contained in Ax[0..2*nz-1], with Ax[2*k] + and Ax[2*k+1] being the real and imaginary part of the kth entry. + + double X [n] ; Output argument. + or: + double Xx [n] ; Output argument, real part + Size 2*n for packed complex case. + double Xz [n] ; Output argument, imaginary part. + + The solution to the linear system, where n = n_row = n_col is the + dimension of the matrices A, L, and U. + + If Az, Xz, or Bz are NULL, then both real + and imaginary parts are returned in Xx[0..2*n-1], with Xx[2*k] and + Xx[2*k+1] being the real and imaginary part of the kth entry. + + double B [n] ; Input argument, not modified. + or: + double Bx [n] ; Input argument, not modified, real part. + Size 2*n for packed complex case. + double Bz [n] ; Input argument, not modified, imaginary part. + + The right-hand side vector, b, stored as a conventional array of size n + (or two arrays of size n for complex versions). This routine does not + solve for multiple right-hand-sides, nor does it allow b to be stored in + a sparse-column form. + + If Az, Xz, or Bz are NULL, then both real + and imaginary parts are contained in Bx[0..2*n-1], with Bx[2*k] + and Bx[2*k+1] being the real and imaginary part of the kth entry. + + void *Numeric ; Input argument, not modified. + + Numeric must point to a valid Numeric object, computed by + umfpack_*_numeric. + + double Control [UMFPACK_CONTROL] ; Input argument, not modified. + + If a (double *) NULL pointer is passed, then the default control + settings are used. Otherwise, the settings are determined from the + Control array. See umfpack_*_defaults on how to fill the Control + array with the default settings. If Control contains NaN's, the + defaults are used. The following Control parameters are used: + + Control [UMFPACK_IRSTEP]: The maximum number of iterative refinement + steps to attempt. A value less than zero is treated as zero. If + less than 1, or if Ax=b, A'x=b, or A.'x=b is not being solved, or + if A is singular, then the Ap, Ai, Ax, and Az arguments are not + accessed. Default: 2. + + double Info [UMFPACK_INFO] ; Output argument. + + Contains statistics about the solution factorization. If a + (double *) NULL pointer is passed, then no statistics are returned in + Info (this is not an error condition). The following statistics are + computed in umfpack_*_solve: + + Info [UMFPACK_STATUS]: status code. This is also the return value, + whether or not Info is present. + + UMFPACK_OK + + The linear system was successfully solved. + + UMFPACK_WARNING_singular_matrix + + A divide-by-zero occurred. Your solution will contain Inf's + and/or NaN's. Some parts of the solution may be valid. For + example, solving Ax=b with + + A = [2 0] b = [ 1 ] returns x = [ 0.5 ] + [0 0] [ 0 ] [ Inf ] + + UMFPACK_ERROR_out_of_memory + + Insufficient memory to solve the linear system. + + UMFPACK_ERROR_argument_missing + + One or more required arguments are missing. The B, X, (or + Bx and Xx for the complex versions) arguments + are always required. Info and Control are not required. Ap, + Ai, Ax are required if Ax=b, + A'x=b, A.'x=b is to be solved, the (default) iterative + refinement is requested, and the matrix A is nonsingular. + + UMFPACK_ERROR_invalid_system + + The sys argument is not valid, or the matrix A is not square. + + UMFPACK_ERROR_invalid_Numeric_object + + The Numeric object is not valid. + + Info [UMFPACK_NROW], Info [UMFPACK_NCOL]: + The dimensions of the matrix A (L is n_row-by-n_inner and + U is n_inner-by-n_col, with n_inner = min(n_row,n_col)). + + Info [UMFPACK_NZ]: the number of entries in the input matrix, Ap [n], + if iterative refinement is requested (Ax=b, A'x=b, or A.'x=b is + being solved, Control [UMFPACK_IRSTEP] >= 1, and A is nonsingular). + + Info [UMFPACK_IR_TAKEN]: The number of iterative refinement steps + effectively taken. The number of steps attempted may be one more + than this; the refinement algorithm backtracks if the last + refinement step worsens the solution. + + Info [UMFPACK_IR_ATTEMPTED]: The number of iterative refinement steps + attempted. The number of times a linear system was solved is one + more than this (once for the initial Ax=b, and once for each Ay=r + solved for each iterative refinement step attempted). + + Info [UMFPACK_OMEGA1]: sparse backward error estimate, omega1, if + iterative refinement was performed, or -1 if iterative refinement + not performed. + + Info [UMFPACK_OMEGA2]: sparse backward error estimate, omega2, if + iterative refinement was performed, or -1 if iterative refinement + not performed. + + Info [UMFPACK_SOLVE_FLOPS]: the number of floating point operations + performed to solve the linear system. This includes the work + taken for all iterative refinement steps, including the backtrack + (if any). + + Info [UMFPACK_SOLVE_TIME]: The time taken, in seconds. + + Info [UMFPACK_SOLVE_WALLTIME]: The wallclock time taken, in seconds. + + Only the above listed Info [...] entries are accessed. The remaining + entries of Info are not accessed or modified by umfpack_*_solve. + Future versions might modify different parts of Info. +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Include/umfpack_symbolic.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_symbolic.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,536 @@ +/* ========================================================================== */ +/* === umfpack_symbolic ===================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +int umfpack_di_symbolic +( + int n_row, + int n_col, + const int Ap [ ], + const int Ai [ ], + const double Ax [ ], + void **Symbolic, + const double Control [UMFPACK_CONTROL], + double Info [UMFPACK_INFO] +) ; + +long umfpack_dl_symbolic +( + long n_row, + long n_col, + const long Ap [ ], + const long Ai [ ], + const double Ax [ ], + void **Symbolic, + const double Control [UMFPACK_CONTROL], + double Info [UMFPACK_INFO] +) ; + +int umfpack_zi_symbolic +( + int n_row, + int n_col, + const int Ap [ ], + const int Ai [ ], + const double Ax [ ], const double Az [ ], + void **Symbolic, + const double Control [UMFPACK_CONTROL], + double Info [UMFPACK_INFO] +) ; + +long umfpack_zl_symbolic +( + long n_row, + long n_col, + const long Ap [ ], + const long Ai [ ], + const double Ax [ ], const double Az [ ], + void **Symbolic, + const double Control [UMFPACK_CONTROL], + double Info [UMFPACK_INFO] +) ; + +/* +double int Syntax: + + #include "umfpack.h" + void *Symbolic ; + int n_row, n_col, *Ap, *Ai, status ; + double Control [UMFPACK_CONTROL], Info [UMFPACK_INFO], *Ax ; + status = umfpack_di_symbolic (n_row, n_col, Ap, Ai, Ax, + &Symbolic, Control, Info) ; + +double long Syntax: + + #include "umfpack.h" + void *Symbolic ; + long n_row, n_col, *Ap, *Ai, status ; + double Control [UMFPACK_CONTROL], Info [UMFPACK_INFO], *Ax ; + status = umfpack_dl_symbolic (n_row, n_col, Ap, Ai, Ax, + &Symbolic, Control, Info) ; + +complex int Syntax: + + #include "umfpack.h" + void *Symbolic ; + int n_row, n_col, *Ap, *Ai, status ; + double Control [UMFPACK_CONTROL], Info [UMFPACK_INFO], *Ax, *Az ; + status = umfpack_zi_symbolic (n_row, n_col, Ap, Ai, Ax, Az, + &Symbolic, Control, Info) ; + +complex long Syntax: + + #include "umfpack.h" + void *Symbolic ; + long n_row, n_col, *Ap, *Ai, status ; + double Control [UMFPACK_CONTROL], Info [UMFPACK_INFO], *Ax, *Az ; + status = umfpack_zl_symbolic (n_row, n_col, Ap, Ai, Ax, Az, + &Symbolic, Control, Info) ; + +packed complex Syntax: + + Same as above, except Az is NULL. + +Purpose: + + Given nonzero pattern of a sparse matrix A in column-oriented form, + umfpack_*_symbolic performs a column pre-ordering to reduce fill-in + (using COLAMD or AMD) and a symbolic factorization. This is required + before the matrix can be numerically factorized with umfpack_*_numeric. + If you wish to bypass the COLAMD or AMD pre-ordering and provide your own + ordering, use umfpack_*_qsymbolic instead. + + Since umfpack_*_symbolic and umfpack_*_qsymbolic are very similar, options + for both routines are discussed below. + + For the following discussion, let S be the submatrix of A obtained after + eliminating all pivots of zero Markowitz cost. S has dimension + (n_row-n1-nempty_row) -by- (n_col-n1-nempty_col), where + n1 = Info [UMFPACK_COL_SINGLETONS] + Info [UMFPACK_ROW_SINGLETONS], + nempty_row = Info [UMFPACK_NEMPTY_ROW] and + nempty_col = Info [UMFPACK_NEMPTY_COL]. + +Returns: + + The status code is returned. See Info [UMFPACK_STATUS], below. + +Arguments: + + Int n_row ; Input argument, not modified. + Int n_col ; Input argument, not modified. + + A is an n_row-by-n_col matrix. Restriction: n_row > 0 and n_col > 0. + + Int Ap [n_col+1] ; Input argument, not modified. + + Ap is an integer array of size n_col+1. On input, it holds the + "pointers" for the column form of the sparse matrix A. Column j of + the matrix A is held in Ai [(Ap [j]) ... (Ap [j+1]-1)]. The first + entry, Ap [0], must be zero, and Ap [j] <= Ap [j+1] must hold for all + j in the range 0 to n_col-1. The value nz = Ap [n_col] is thus the + total number of entries in the pattern of the matrix A. nz must be + greater than or equal to zero. + + Int Ai [nz] ; Input argument, not modified, of size nz = Ap [n_col]. + + The nonzero pattern (row indices) for column j is stored in + Ai [(Ap [j]) ... (Ap [j+1]-1)]. The row indices in a given column j + must be in ascending order, and no duplicate row indices may be present. + Row indices must be in the range 0 to n_row-1 (the matrix is 0-based). + See umfpack_*_triplet_to_col for how to sort the columns of a matrix + and sum up the duplicate entries. See umfpack_*_report_matrix for how + to print the matrix A. + + double Ax [nz] ; Optional input argument, not modified. + Size 2*nz for packed complex case. + + The numerical values of the sparse matrix A. The nonzero pattern (row + indices) for column j is stored in Ai [(Ap [j]) ... (Ap [j+1]-1)], and + the corresponding numerical values are stored in + Ax [(Ap [j]) ... (Ap [j+1]-1)]. Used only by the 2-by-2 strategy to + determine whether entries are "large" or "small". You do not have to + pass the same numerical values to umfpack_*_numeric. If Ax is not + present (a (double *) NULL pointer), then any entry in A is assumed to + be "large". + + double Az [nz] ; Optional input argument, not modified, for complex + versions. + + For the complex versions, this holds the imaginary part of A. The + imaginary part of column j is held in Az [(Ap [j]) ... (Ap [j+1]-1)]. + + If Az is NULL, then both real + and imaginary parts are contained in Ax[0..2*nz-1], with Ax[2*k] + and Ax[2*k+1] being the real and imaginary part of the kth entry. + + Used by the 2-by-2 strategy only. See the description of Ax, above. + + void **Symbolic ; Output argument. + + **Symbolic is the address of a (void *) pointer variable in the user's + calling routine (see Syntax, above). On input, the contents of this + variable are not defined. On output, this variable holds a (void *) + pointer to the Symbolic object (if successful), or (void *) NULL if + a failure occurred. + + double Control [UMFPACK_CONTROL] ; Input argument, not modified. + + If a (double *) NULL pointer is passed, then the default control + settings are used (the defaults are suitable for all matrices, + ranging from those with highly unsymmetric nonzero pattern, to + symmetric matrices). Otherwise, the settings are determined from the + Control array. See umfpack_*_defaults on how to fill the Control + array with the default settings. If Control contains NaN's, the + defaults are used. The following Control parameters are used: + + Control [UMFPACK_STRATEGY]: This is the most important control + parameter. It determines what kind of ordering and pivoting + strategy that UMFPACK should use. There are 4 options: + + UMFPACK_STRATEGY_AUTO: This is the default. The input matrix is + analyzed to determine how symmetric the nonzero pattern is, and + how many entries there are on the diagonal. It then selects one + of the following strategies. Refer to the User Guide for a + description of how the strategy is automatically selected. + + UMFPACK_STRATEGY_UNSYMMETRIC: Use the unsymmetric strategy. COLAMD + is used to order the columns of A, followed by a postorder of + the column elimination tree. No attempt is made to perform + diagonal pivoting. The column ordering is refined during + factorization. + + In the numerical factorization, the + Control [UMFPACK_SYM_PIVOT_TOLERANCE] parameter is ignored. A + pivot is selected if its magnitude is >= + Control [UMFPACK_PIVOT_TOLERANCE] (default 0.1) times the + largest entry in its column. + + UMFPACK_STRATEGY_SYMMETRIC: Use the symmetric strategy + In this method, the approximate minimum degree + ordering (AMD) is applied to A+A', followed by a postorder of + the elimination tree of A+A'. UMFPACK attempts to perform + diagonal pivoting during numerical factorization. No refinement + of the column pre-ordering is performed during factorization. + + In the numerical factorization, a nonzero entry on the diagonal + is selected as the pivot if its magnitude is >= Control + [UMFPACK_SYM_PIVOT_TOLERANCE] (default 0.001) times the largest + entry in its column. If this is not acceptable, then an + off-diagonal pivot is selected with magnitude >= Control + [UMFPACK_PIVOT_TOLERANCE] (default 0.1) times the largest entry + in its column. + + UMFPACK_STRATEGY_2BY2: a row permutation P2 is found that places + large entries on the diagonal. The matrix P2*A is then + factorized using the symmetric strategy, described above. + Refer to the User Guide for more information. + + Control [UMFPACK_DENSE_COL]: + If COLAMD is used, columns with more than + max (16, Control [UMFPACK_DENSE_COL] * 16 * sqrt (n_row)) entries + are placed placed last in the column pre-ordering. Default: 0.2. + + Control [UMFPACK_DENSE_ROW]: + Rows with more than max (16, Control [UMFPACK_DENSE_ROW] * 16 * + sqrt (n_col)) entries are treated differently in the COLAMD + pre-ordering, and in the internal data structures during the + subsequent numeric factorization. Default: 0.2. + + Control [UMFPACK_AMD_DENSE]: rows/columns in A+A' with more than + max (16, Control [UMFPACK_AMD_DENSE] * sqrt (n)) entries + (where n = n_row = n_col) are ignored in the AMD pre-ordering. + Default: 10. + + Control [UMFPACK_BLOCK_SIZE]: the block size to use for Level-3 BLAS + in the subsequent numerical factorization (umfpack_*_numeric). + A value less than 1 is treated as 1. Default: 32. Modifying this + parameter affects when updates are applied to the working frontal + matrix, and can indirectly affect fill-in and operation count. + As long as the block size is large enough (8 or so), this parameter + has a modest effect on performance. + + Control [UMFPACK_2BY2_TOLERANCE]: a diagonal entry S (k,k) is + considered "small" if it is < tol * max (abs (S (:,k))), where S a + submatrix of the scaled input matrix, with pivots of zero Markowitz + cost removed. + + Control [UMFPACK_SCALE]: See umfpack_numeric.h for a description. + Only affects the 2-by-2 strategy. Default: UMFPACK_SCALE_SUM. + + Control [UMFPACK_FIXQ]: If > 0, then the pre-ordering Q is not modified + during numeric factorization. If < 0, then Q may be modified. If + zero, then this is controlled automatically (the unsymmetric + strategy modifies Q, the others do not). Default: 0. + + Control [UMFPACK_AGGRESSIVE]: If nonzero, aggressive absorption is used + in COLAMD and AMD. Default: 1. + + double Info [UMFPACK_INFO] ; Output argument, not defined on input. + + Contains statistics about the symbolic analysis. If a (double *) NULL + pointer is passed, then no statistics are returned in Info (this is not + an error condition). The entire Info array is cleared (all entries set + to -1) and then the following statistics are computed: + + Info [UMFPACK_STATUS]: status code. This is also the return value, + whether or not Info is present. + + UMFPACK_OK + + Each column of the input matrix contained row indices + in increasing order, with no duplicates. Only in this case + does umfpack_*_symbolic compute a valid symbolic factorization. + For the other cases below, no Symbolic object is created + (*Symbolic is (void *) NULL). + + UMFPACK_ERROR_n_nonpositive + + n is less than or equal to zero. + + UMFPACK_ERROR_invalid_matrix + + Number of entries in the matrix is negative, Ap [0] is nonzero, + a column has a negative number of entries, a row index is out of + bounds, or the columns of input matrix were jumbled (unsorted + columns or duplicate entries). + + UMFPACK_ERROR_out_of_memory + + Insufficient memory to perform the symbolic analysis. If the + analysis requires more than 2GB of memory and you are using + the 32-bit ("int") version of UMFPACK, then you are guaranteed + to run out of memory. Try using the 64-bit version of UMFPACK. + + UMFPACK_ERROR_argument_missing + + One or more required arguments is missing. + + UMFPACK_ERROR_internal_error + + Something very serious went wrong. This is a bug. + Please contact the author (davis@cise.ufl.edu). + + Info [UMFPACK_NROW]: the value of the input argument n_row. + + Info [UMFPACK_NCOL]: the value of the input argument n_col. + + Info [UMFPACK_NZ]: the number of entries in the input matrix + (Ap [n_col]). + + Info [UMFPACK_SIZE_OF_UNIT]: the number of bytes in a Unit, + for memory usage statistics below. + + Info [UMFPACK_SIZE_OF_INT]: the number of bytes in an int. + + Info [UMFPACK_SIZE_OF_LONG]: the number of bytes in a long. + + Info [UMFPACK_SIZE_OF_POINTER]: the number of bytes in a void * + pointer. + + Info [UMFPACK_SIZE_OF_ENTRY]: the number of bytes in a numerical entry. + + Info [UMFPACK_NDENSE_ROW]: number of "dense" rows in A. These rows are + ignored when the column pre-ordering is computed in COLAMD. They + are also treated differently during numeric factorization. If > 0, + then the matrix had to be re-analyzed by UMF_analyze, which does + not ignore these rows. + + Info [UMFPACK_NEMPTY_ROW]: number of "empty" rows in A, as determined + These are rows that either have no entries, or whose entries are + all in pivot columns of zero-Markowitz-cost pivots. + + Info [UMFPACK_NDENSE_COL]: number of "dense" columns in A. COLAMD + orders these columns are ordered last in the factorization, but + before "empty" columns. + + Info [UMFPACK_NEMPTY_COL]: number of "empty" columns in A. These are + columns that either have no entries, or whose entries are all in + pivot rows of zero-Markowitz-cost pivots. These columns are + ordered last in the factorization, to the right of "dense" columns. + + Info [UMFPACK_SYMBOLIC_DEFRAG]: number of garbage collections + performed during ordering and symbolic pre-analysis. + + Info [UMFPACK_SYMBOLIC_PEAK_MEMORY]: the amount of memory (in Units) + required for umfpack_*_symbolic to complete. This count includes + the size of the Symbolic object itself, which is also reported in + Info [UMFPACK_SYMBOLIC_SIZE]. + + Info [UMFPACK_SYMBOLIC_SIZE]: the final size of the Symbolic object (in + Units). This is fairly small, roughly 2*n to 13*n integers, + depending on the matrix. + + Info [UMFPACK_VARIABLE_INIT_ESTIMATE]: the Numeric object contains two + parts. The first is fixed in size (O (n_row+n_col)). The + second part holds the sparse LU factors and the contribution blocks + from factorized frontal matrices. This part changes in size during + factorization. Info [UMFPACK_VARIABLE_INIT_ESTIMATE] is the exact + size (in Units) required for this second variable-sized part in + order for the numerical factorization to start. + + Info [UMFPACK_VARIABLE_PEAK_ESTIMATE]: the estimated peak size (in + Units) of the variable-sized part of the Numeric object. This is + usually an upper bound, but that is not guaranteed. + + Info [UMFPACK_VARIABLE_FINAL_ESTIMATE]: the estimated final size (in + Units) of the variable-sized part of the Numeric object. This is + usually an upper bound, but that is not guaranteed. It holds just + the sparse LU factors. + + Info [UMFPACK_NUMERIC_SIZE_ESTIMATE]: an estimate of the final size (in + Units) of the entire Numeric object (both fixed-size and variable- + sized parts), which holds the LU factorization (including the L, U, + P and Q matrices). + + Info [UMFPACK_PEAK_MEMORY_ESTIMATE]: an estimate of the total amount of + memory (in Units) required by umfpack_*_symbolic and + umfpack_*_numeric to perform both the symbolic and numeric + factorization. This is the larger of the amount of memory needed + in umfpack_*_numeric itself, and the amount of memory needed in + umfpack_*_symbolic (Info [UMFPACK_SYMBOLIC_PEAK_MEMORY]). The + count includes the size of both the Symbolic and Numeric objects + themselves. It can be a very loose upper bound, particularly when + the symmetric or 2-by-2 strategies are used. + + Info [UMFPACK_FLOPS_ESTIMATE]: an estimate of the total floating-point + operations required to factorize the matrix. This is a "true" + theoretical estimate of the number of flops that would be performed + by a flop-parsimonious sparse LU algorithm. It assumes that no + extra flops are performed except for what is strictly required to + compute the LU factorization. It ignores, for example, the flops + performed by umfpack_di_numeric to add contribution blocks of + frontal matrices together. If L and U are the upper bound on the + pattern of the factors, then this flop count estimate can be + represented in MATLAB (for real matrices, not complex) as: + + Lnz = full (sum (spones (L))) - 1 ; % nz in each col of L + Unz = full (sum (spones (U')))' - 1 ; % nz in each row of U + flops = 2*Lnz*Unz + sum (Lnz) ; + + The actual "true flop" count found by umfpack_*_numeric will be + less than this estimate. + + For the real version, only (+ - * /) are counted. For the complex + version, the following counts are used: + + operation flops + c = 1/b 6 + c = a*b 6 + c -= a*b 8 + + Info [UMFPACK_LNZ_ESTIMATE]: an estimate of the number of nonzeros in + L, including the diagonal. Since L is unit-diagonal, the diagonal + of L is not stored. This estimate is a strict upper bound on the + actual nonzeros in L to be computed by umfpack_*_numeric. + + Info [UMFPACK_UNZ_ESTIMATE]: an estimate of the number of nonzeros in + U, including the diagonal. This estimate is a strict upper bound on + the actual nonzeros in U to be computed by umfpack_*_numeric. + + Info [UMFPACK_MAX_FRONT_SIZE_ESTIMATE]: estimate of the size of the + largest frontal matrix (# of entries), for arbitrary partial + pivoting during numerical factorization. + + Info [UMFPACK_SYMBOLIC_TIME]: The CPU time taken, in seconds. + + Info [UMFPACK_SYMBOLIC_WALLTIME]: The wallclock time taken, in seconds. + + Info [UMFPACK_STRATEGY_USED]: The ordering strategy used: + UMFPACK_STRATEGY_SYMMETRIC, UMFPACK_STRATEGY_UNSYMMETRIC, or + UMFPACK_STRATEGY_2BY2. + + Info [UMFPACK_ORDERING_USED]: The ordering method used: + UMFPACK_ORDERING_COLAMD or UMFPACK_ORDERING_AMD. It can be + UMFPACK_ORDERING_GIVEN for umfpack_*_qsymbolic. + + Info [UMFPACK_QFIXED]: 1 if the column pre-ordering will be refined + during numerical factorization, 0 if not. + + Info [UMFPACK_DIAG_PREFERED]: 1 if diagonal pivoting will be attempted, + 0 if not. + + Info [UMFPACK_COL_SINGLETONS]: the matrix A is analyzed by first + eliminating all pivots with zero Markowitz cost. This count is the + number of these pivots with exactly one nonzero in their pivot + column. + + Info [UMFPACK_ROW_SINGLETONS]: the number of zero-Markowitz-cost + pivots with exactly one nonzero in their pivot row. + + Info [UMFPACK_PATTERN_SYMMETRY]: the symmetry of the pattern of S. + + Info [UMFPACK_NZ_A_PLUS_AT]: the number of off-diagonal entries in S+S'. + + Info [UMFPACK_NZDIAG]: the number of entries on the diagonal of S. + + Info [UMFPACK_N2]: if S is square, and nempty_row = nempty_col, this + is equal to n_row - n1 - nempty_row. + + Info [UMFPACK_S_SYMMETRIC]: 1 if S is square and its diagonal has been + preserved, 0 otherwise. + + + Info [UMFPACK_MAX_FRONT_NROWS_ESTIMATE]: estimate of the max number of + rows in any frontal matrix, for arbitrary partial pivoting. + + Info [UMFPACK_MAX_FRONT_NCOLS_ESTIMATE]: estimate of the max number of + columns in any frontal matrix, for arbitrary partial pivoting. + + ------------------------------------------------------------------------ + The next four statistics are computed only if AMD is used: + ------------------------------------------------------------------------ + + Info [UMFPACK_SYMMETRIC_LUNZ]: The number of nonzeros in L and U, + assuming no pivoting during numerical factorization, and assuming a + zero-free diagonal of U. Excludes the entries on the diagonal of + L. If the matrix has a purely symmetric nonzero pattern, this is + often a lower bound on the nonzeros in the actual L and U computed + in the numerical factorization, for matrices that fit the criteria + for the "symmetric" strategy. + + Info [UMFPACK_SYMMETRIC_FLOPS]: The floating-point operation count in + the numerical factorization phase, assuming no pivoting. If the + pattern of the matrix is symmetric, this is normally a lower bound + on the floating-point operation count in the actual numerical + factorization, for matrices that fit the criteria for the symmetric + or 2-by-2 strategies + + Info [UMFPACK_SYMMETRIC_NDENSE]: The number of "dense" rows/columns of + S+S' that were ignored during the AMD ordering. These are placed + last in the output order. If > 0, then the + Info [UMFPACK_SYMMETRIC_*] statistics, above are rough upper bounds. + + Info [UMFPACK_SYMMETRIC_DMAX]: The maximum number of nonzeros in any + column of L, if no pivoting is performed during numerical + factorization. Excludes the part of the LU factorization for + pivots with zero Markowitz cost. + + ------------------------------------------------------------------------ + The following statistics are computed only if the 2-by-2 strategy is + used or attempted: + ------------------------------------------------------------------------ + + Info [UMFPACK_2BY2_NWEAK]: the number of small diagonal entries in S. + + Info [UMFPACK_2BY2_UNMATCHED]: the number of small diagonal entries + in P2*S. + + Info [UMFPACK_2BY2_PATTERN_SYMMETRY]: the symmetry of P2*S. + + Info [UMFPACK_2BY2_NZ_PA_PLUS_AT]: the number of off-diagonal entries + in (P2*S)+(P2*S)'. + + Info [UMFPACK_2BY2_NZDIAG]: the number of nonzero entries on the + diagonal of P2*S. + + + At the start of umfpack_*_symbolic, all of Info is set of -1, and then + after that only the above listed Info [...] entries are accessed. + Future versions might modify different parts of Info. +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Include/umfpack_tictoc.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_tictoc.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,60 @@ +/* ========================================================================== */ +/* === umfpack_tictoc ======================================================= */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +void umfpack_tic (double stats [2]) ; + +void umfpack_toc (double stats [2]) ; + + +/* +Syntax (for all versions: di, dl, zi, and zl): + + #include "umfpack.h" + double stats [2] ; + umfpack_tic (stats) ; + ... + umfpack_toc (stats) ; + +Purpose: + + umfpack_tic returns the CPU time and wall clock time used by the process. + The CPU time includes both "user" and "system" time (the latter is time + spent by the system on behalf of the process, and is thus charged to the + process). umfpack_toc returns the CPU time and wall clock time since the + last call to umfpack_tic with the same stats array. + + Typical usage: + + umfpack_tic (stats) ; + ... do some work ... + umfpack_toc (stats) ; + + then stats [1] contains the time in seconds used by the code between + umfpack_tic and umfpack_toc, and stats [0] contains the wall clock time + elapsed between the umfpack_tic and umfpack_toc. These two routines act + just like tic and toc in MATLAB, except that the both process time and + wall clock time are returned. + + This routine normally uses the sysconf and times routines in the POSIX + standard. If -DNPOSIX is defined at compile time, then the ANSI C clock + routine is used instead, and only the CPU time is returned (stats [0] + is set to zero). + + umfpack_tic and umfpack_toc are the routines used internally in UMFPACK + to time the symbolic analysis, numerical factorization, and the forward/ + backward solve. + +Arguments: + + double stats [2]: + + stats [0]: wall clock time, in seconds + stats [1]: CPU time, in seconds +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Include/umfpack_timer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_timer.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,39 @@ +/* ========================================================================== */ +/* === umfpack_timer ======================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +double umfpack_timer ( void ) ; + +/* +Syntax (for all versions: di, dl, zi, and zl): + + #include "umfpack.h" + double t ; + t = umfpack_timer ( ) ; + +Purpose: + + Returns the CPU time used by the process. Includes both "user" and "system" + time (the latter is time spent by the system on behalf of the process, and + is thus charged to the process). It does not return the wall clock time. + See umfpack_tic and umfpack_toc (the file umfpack_tictoc.h) for the timer + used internally by UMFPACK. + + This routine uses the Unix getrusage routine, if available. It is less + subject to overflow than the ANSI C clock routine. If getrusage is not + available, the portable ANSI C clock routine is used instead. + Unfortunately, clock ( ) overflows if the CPU time exceeds 2147 seconds + (about 36 minutes) when sizeof (clock_t) is 4 bytes. If you have getrusage, + be sure to compile UMFPACK with the -DGETRUSAGE flag set; see umf_config.h + and the User Guide for details. Even the getrusage routine can overlow. + +Arguments: + + None. +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Include/umfpack_transpose.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_transpose.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,216 @@ +/* ========================================================================== */ +/* === umfpack_transpose ==================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +int umfpack_di_transpose +( + int n_row, + int n_col, + const int Ap [ ], + const int Ai [ ], + const double Ax [ ], + const int P [ ], + const int Q [ ], + int Rp [ ], + int Ri [ ], + double Rx [ ] +) ; + +long umfpack_dl_transpose +( + long n_row, + long n_col, + const long Ap [ ], + const long Ai [ ], + const double Ax [ ], + const long P [ ], + const long Q [ ], + long Rp [ ], + long Ri [ ], + double Rx [ ] +) ; + +int umfpack_zi_transpose +( + int n_row, + int n_col, + const int Ap [ ], + const int Ai [ ], + const double Ax [ ], const double Az [ ], + const int P [ ], + const int Q [ ], + int Rp [ ], + int Ri [ ], + double Rx [ ], double Rz [ ], + int do_conjugate +) ; + +long umfpack_zl_transpose +( + long n_row, + long n_col, + const long Ap [ ], + const long Ai [ ], + const double Ax [ ], const double Az [ ], + const long P [ ], + const long Q [ ], + long Rp [ ], + long Ri [ ], + double Rx [ ], double Rz [ ], + long do_conjugate +) ; + +/* +double int Syntax: + + #include "umfpack.h" + int n_row, n_col, status, *Ap, *Ai, *P, *Q, *Rp, *Ri ; + double *Ax, *Rx ; + status = umfpack_di_transpose (n_row, n_col, Ap, Ai, Ax, P, Q, Rp, Ri, Rx) ; + +double long Syntax: + + #include "umfpack.h" + long n_row, n_col, status, *Ap, *Ai, *P, *Q, *Rp, *Ri ; + double *Ax, *Rx ; + status = umfpack_dl_transpose (n_row, n_col, Ap, Ai, Ax, P, Q, Rp, Ri, Rx) ; + +complex int Syntax: + + #include "umfpack.h" + int n_row, n_col, status, *Ap, *Ai, *P, *Q, *Rp, *Ri, do_conjugate ; + double *Ax, *Az, *Rx, *Rz ; + status = umfpack_zi_transpose (n_row, n_col, Ap, Ai, Ax, Az, P, Q, + Rp, Ri, Rx, Rz, do_conjugate) ; + +complex long Syntax: + + #include "umfpack.h" + long n_row, n_col, status, *Ap, *Ai, *P, *Q, *Rp, *Ri, do_conjugate ; + double *Ax, *Az, *Rx, *Rz ; + status = umfpack_zl_transpose (n_row, n_col, Ap, Ai, Ax, Az, P, Q, + Rp, Ri, Rx, Rz, do_conjugate) ; + +packed complex Syntax: + + Same as above, except Az are Rz are NULL. + +Purpose: + + Transposes and optionally permutes a sparse matrix in row or column-form, + R = (PAQ)'. In MATLAB notation, R = (A (P,Q))' or R = (A (P,Q)).' doing + either the linear algebraic transpose or the array transpose. Alternatively, + this routine can be viewed as converting A (P,Q) from column-form to + row-form, or visa versa (for the array transpose). Empty rows and columns + may exist. The matrix A may be singular and/or rectangular. + + umfpack_*_transpose is useful if you want to factorize A' or A.' instead of + A. Factorizing A' or A.' instead of A can be much better, particularly if + AA' is much sparser than A'A. You can still solve Ax=b if you factorize + A' or A.', by solving with the sys argument UMFPACK_At or UMFPACK_Aat, + respectively, in umfpack_*_*solve. + +Returns: + + UMFPACK_OK if successful. + UMFPACK_ERROR_out_of_memory if umfpack_*_transpose fails to allocate a + size-max (n_row,n_col) workspace. + UMFPACK_ERROR_argument_missing if Ai, Ap, Ri, and/or Rp are missing. + UMFPACK_ERROR_n_nonpositive if n_row <= 0 or n_col <= 0 + UMFPACK_ERROR_invalid_permutation if P and/or Q are invalid. + UMFPACK_ERROR_invalid_matrix if Ap [n_col] < 0, if Ap [0] != 0, + if Ap [j] > Ap [j+1] for any j in the range 0 to n_col-1, + if any row index i is < 0 or >= n_row, or if the row indices + in any column are not in ascending order. + +Arguments: + + Int n_row ; Input argument, not modified. + Int n_col ; Input argument, not modified. + + A is an n_row-by-n_col matrix. Restriction: n_row > 0 and n_col > 0. + + Int Ap [n_col+1] ; Input argument, not modified. + + The column pointers of the column-oriented form of the matrix A. See + umfpack_*_symbolic for a description. The number of entries in + the matrix is nz = Ap [n_col]. Ap [0] must be zero, Ap [n_col] must be + => 0, and Ap [j] <= Ap [j+1] and Ap [j] <= Ap [n_col] must be true for + all j in the range 0 to n_col-1. Empty columns are OK (that is, Ap [j] + may equal Ap [j+1] for any j in the range 0 to n_col-1). + + Int Ai [nz] ; Input argument, not modified, of size nz = Ap [n_col]. + + The nonzero pattern (row indices) for column j is stored in + Ai [(Ap [j]) ... (Ap [j+1]-1)]. The row indices in a given column j + must be in ascending order, and no duplicate row indices may be present. + Row indices must be in the range 0 to n_row-1 (the matrix is 0-based). + + double Ax [nz] ; Input argument, not modified, of size nz = Ap [n_col]. + Size 2*nz if Az or Rz are NULL. + double Az [nz] ; Input argument, not modified, for complex versions. + + If present, these are the numerical values of the sparse matrix A. + The nonzero pattern (row indices) for column j is stored in + Ai [(Ap [j]) ... (Ap [j+1]-1)], and the corresponding real numerical + values are stored in Ax [(Ap [j]) ... (Ap [j+1]-1)]. The imaginary + values are stored in Az [(Ap [j]) ... (Ap [j+1]-1)]. The values are + transposed only if Ax and Rx are present. + This is not an error conditions; you are able to transpose + and permute just the pattern of a matrix. + + If Az or Rz are NULL, then both real + and imaginary parts are contained in Ax[0..2*nz-1], with Ax[2*k] + and Ax[2*k+1] being the real and imaginary part of the kth entry. + + Int P [n_row] ; Input argument, not modified. + + The permutation vector P is defined as P [k] = i, where the original + row i of A is the kth row of PAQ. If you want to use the identity + permutation for P, simply pass (Int *) NULL for P. This is not an error + condition. P is a complete permutation of all the rows of A; this + routine does not support the creation of a transposed submatrix of A + (R = A (1:3,:)' where A has more than 3 rows, for example, cannot be + done; a future version might support this operation). + + Int Q [n_col] ; Input argument, not modified. + + The permutation vector Q is defined as Q [k] = j, where the original + column j of A is the kth column of PAQ. If you want to use the identity + permutation for Q, simply pass (Int *) NULL for Q. This is not an error + condition. Q is a complete permutation of all the columns of A; this + routine does not support the creation of a transposed submatrix of A. + + Int Rp [n_row+1] ; Output argument. + + The column pointers of the matrix R = (A (P,Q))' or (A (P,Q)).', in the + same form as the column pointers Ap for the matrix A. + + Int Ri [nz] ; Output argument. + + The row indices of the matrix R = (A (P,Q))' or (A (P,Q)).' , in the + same form as the row indices Ai for the matrix A. + + double Rx [nz] ; Output argument. + Size 2*nz if Az or Rz are NULL. + double Rz [nz] ; Output argument, imaginary part for complex versions. + + If present, these are the numerical values of the sparse matrix R, + in the same form as the values Ax and Az of the matrix A. + + If Az or Rz are NULL, then both real + and imaginary parts are contained in Rx[0..2*nz-1], with Rx[2*k] + and Rx[2*k+1] being the real and imaginary part of the kth entry. + + Int do_conjugate ; Input argument for complex versions only. + + If true, and if Ax and Rx are present, then the linear + algebraic transpose is computed (complex conjugate). If false, the + array transpose is computed instead. +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Include/umfpack_triplet_to_col.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_triplet_to_col.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,263 @@ +/* ========================================================================== */ +/* === umfpack_triplet_to_col =============================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +int umfpack_di_triplet_to_col +( + int n_row, + int n_col, + int nz, + const int Ti [ ], + const int Tj [ ], + const double Tx [ ], + int Ap [ ], + int Ai [ ], + double Ax [ ], + int Map [ ] +) ; + +long umfpack_dl_triplet_to_col +( + long n_row, + long n_col, + long nz, + const long Ti [ ], + const long Tj [ ], + const double Tx [ ], + long Ap [ ], + long Ai [ ], + double Ax [ ], + long Map [ ] +) ; + +int umfpack_zi_triplet_to_col +( + int n_row, + int n_col, + int nz, + const int Ti [ ], + const int Tj [ ], + const double Tx [ ], const double Tz [ ], + int Ap [ ], + int Ai [ ], + double Ax [ ], double Az [ ], + int Map [ ] +) ; + +long umfpack_zl_triplet_to_col +( + long n_row, + long n_col, + long nz, + const long Ti [ ], + const long Tj [ ], + const double Tx [ ], const double Tz [ ], + long Ap [ ], + long Ai [ ], + double Ax [ ], double Az [ ], + long Map [ ] +) ; + +/* +double int Syntax: + + #include "umfpack.h" + int n_row, n_col, nz, *Ti, *Tj, *Ap, *Ai, status, *Map ; + double *Tx, *Ax ; + status = umfpack_di_triplet_to_col (n_row, n_col, nz, Ti, Tj, Tx, + Ap, Ai, Ax, Map) ; + +double long Syntax: + + #include "umfpack.h" + long n_row, n_col, nz, *Ti, *Tj, *Ap, *Ai, status, *Map ; + double *Tx, *Ax ; + status = umfpack_dl_triplet_to_col (n_row, n_col, nz, Ti, Tj, Tx, + Ap, Ai, Ax, Map) ; + +complex int Syntax: + + #include "umfpack.h" + int n_row, n_col, nz, *Ti, *Tj, *Ap, *Ai, status, *Map ; + double *Tx, *Tz, *Ax, *Az ; + status = umfpack_zi_triplet_to_col (n_row, n_col, nz, Ti, Tj, Tx, Tz, + Ap, Ai, Ax, Az, Map) ; + +long Syntax: + + #include "umfpack.h" + long n_row, n_col, nz, *Ti, *Tj, *Ap, *Ai, status, *Map ; + double *Tx, *Tz, *Ax, *Az ; + status = umfpack_zl_triplet_to_col (n_row, n_col, nz, Ti, Tj, Tx, Tz, + Ap, Ai, Ax, Az, Map) ; + +packed complex Syntax: + + Same as above, except Tz and Az are NULL. + +Purpose: + + Converts a sparse matrix from "triplet" form to compressed-column form. + Analogous to A = spconvert (Ti, Tj, Tx + Tz*1i) in MATLAB, except that + zero entries present in the triplet form are present in A. + + The triplet form of a matrix is a very simple data structure for basic + sparse matrix operations. For example, suppose you wish to factorize a + matrix A coming from a finite element method, in which A is a sum of + dense submatrices, A = E1 + E2 + E3 + ... . The entries in each element + matrix Ei can be concatenated together in the three triplet arrays, and + any overlap between the elements will be correctly summed by + umfpack_*_triplet_to_col. + + Transposing a matrix in triplet form is simple; just interchange the + use of Ti and Tj. You can construct the complex conjugate transpose by + negating Tz, for the complex versions. + + Permuting a matrix in triplet form is also simple. If you want the matrix + PAQ, or A (P,Q) in MATLAB notation, where P [k] = i means that row i of + A is the kth row of PAQ and Q [k] = j means that column j of A is the kth + column of PAQ, then do the following. First, create inverse permutations + Pinv and Qinv such that Pinv [i] = k if P [k] = i and Qinv [j] = k if + Q [k] = j. Next, for the mth triplet (Ti [m], Tj [m], Tx [m], Tz [m]), + replace Ti [m] with Pinv [Ti [m]] and replace Tj [m] with Qinv [Tj [m]]. + + If you have a column-form matrix with duplicate entries or unsorted + columns, you can sort it and sum up the duplicates by first converting it + to triplet form with umfpack_*_col_to_triplet, and then converting it back + with umfpack_*_triplet_to_col. + + Constructing a submatrix is also easy. Just scan the triplets and remove + those entries outside the desired subset of 0...n_row-1 and 0...n_col-1, + and renumber the indices according to their position in the subset. + + You can do all these operations on a column-form matrix by first + converting it to triplet form with umfpack_*_col_to_triplet, doing the + operation on the triplet form, and then converting it back with + umfpack_*_triplet_to_col. + + The only operation not supported easily in the triplet form is the + multiplication of two sparse matrices (UMFPACK does not provide this + operation). + + You can print the input triplet form with umfpack_*_report_triplet, and + the output matrix with umfpack_*_report_matrix. + + The matrix may be singular (nz can be zero, and empty rows and/or columns + may exist). It may also be rectangular and/or complex. + +Returns: + + UMFPACK_OK if successful. + UMFPACK_ERROR_argument_missing if Ap, Ai, Ti, and/or Tj are missing. + UMFPACK_ERROR_n_nonpositive if n_row <= 0 or n_col <= 0. + UMFPACK_ERROR_invalid_matrix if nz < 0, or if for any k, Ti [k] and/or + Tj [k] are not in the range 0 to n_row-1 or 0 to n_col-1, respectively. + UMFPACK_ERROR_out_of_memory if unable to allocate sufficient workspace. + +Arguments: + + Int n_row ; Input argument, not modified. + Int n_col ; Input argument, not modified. + + A is an n_row-by-n_col matrix. Restriction: n_row > 0 and n_col > 0. + All row and column indices in the triplet form must be in the range + 0 to n_row-1 and 0 to n_col-1, respectively. + + Int nz ; Input argument, not modified. + + The number of entries in the triplet form of the matrix. Restriction: + nz >= 0. + + Int Ti [nz] ; Input argument, not modified. + Int Tj [nz] ; Input argument, not modified. + double Tx [nz] ; Input argument, not modified. + Size 2*nz if Tz or Az are NULL. + double Tz [nz] ; Input argument, not modified, for complex versions. + + Ti, Tj, Tx, and Tz hold the "triplet" form of a sparse matrix. The kth + nonzero entry is in row i = Ti [k], column j = Tj [k], and the real part + of a_ij is Tx [k]. The imaginary part of a_ij is Tz [k], for complex + versions. The row and column indices i and j must be in the range 0 to + n_row-1 and 0 to n_col-1, respectively. Duplicate entries may be + present; they are summed in the output matrix. This is not an error + condition. The "triplets" may be in any order. Tx, Tz, Ax, and Az + are optional. Ax is computed only if both Ax and Tx are present + (not (double *) NULL). This is not error condition; the routine can + create just the pattern of the output matrix from the pattern of the + triplets. + + If Az or Tz are NULL, then both real + and imaginary parts are contained in Tx[0..2*nz-1], with Tx[2*k] + and Tx[2*k+1] being the real and imaginary part of the kth entry. + + Int Ap [n_col+1] ; Output argument. + + Ap is an integer array of size n_col+1 on input. On output, Ap holds + the "pointers" for the column form of the sparse matrix A. Column j of + the matrix A is held in Ai [(Ap [j]) ... (Ap [j+1]-1)]. The first + entry, Ap [0], is zero, and Ap [j] <= Ap [j+1] holds for all j in the + range 0 to n_col-1. The value nz2 = Ap [n_col] is thus the total + number of entries in the pattern of the matrix A. Equivalently, the + number of duplicate triplets is nz - Ap [n_col]. + + Int Ai [nz] ; Output argument. + + Ai is an integer array of size nz on input. Note that only the first + Ap [n_col] entries are used. + + The nonzero pattern (row indices) for column j is stored in + Ai [(Ap [j]) ... (Ap [j+1]-1)]. The row indices in a given column j + are in ascending order, and no duplicate row indices are present. + Row indices are in the range 0 to n_col-1 (the matrix is 0-based). + + double Ax [nz] ; Output argument. Size 2*nz if Tz or Az are NULL. + double Az [nz] ; Output argument for complex versions. + + Ax and Az (for the complex versions) are double arrays of size nz on + input. Note that only the first Ap [n_col] entries are used + in both arrays. + + Ax is optional; if Tx and/or Ax are not present (a (double *) NULL + pointer), then Ax is not computed. If present, Ax holds the + numerical values of the the real part of the sparse matrix A and Az + holds the imaginary parts. The nonzero pattern (row indices) for + column j is stored in Ai [(Ap [j]) ... (Ap [j+1]-1)], and the + corresponding numerical values are stored in + Ax [(Ap [j]) ... (Ap [j+1]-1)]. The imaginary parts are stored in + Az [(Ap [j]) ... (Ap [j+1]-1)], for the complex versions. + + If Az or Tz are NULL, then both real + and imaginary parts are returned in Ax[0..2*nz2-1], with Ax[2*k] + and Ax[2*k+1] being the real and imaginary part of the kth entry. + + int Map [nz] ; Optional output argument. + + If Map is present (a non-NULL pointer to an Int array of size nz), then + on output it holds the position of the triplets in the column-form + matrix. That is, suppose p = Map [k], and the k-th triplet is i=Ti[k], + j=Tj[k], and aij=Tx[k]. Then i=Ai[p], and aij will have been summed + into Ax[p] (or simply aij=Ax[p] if there were no duplicate entries also + in row i and column j). Also, Ap[j] <= p < Ap[j+1]. The Map array is + not computed if it is (Int *) NULL. The Map array is useful for + converting a subsequent triplet form matrix with the same pattern as the + first one, without calling this routine. If Ti and Tj do not change, + then Ap, and Ai can be reused from the prior call to + umfpack_*_triplet_to_col. You only need to recompute Ax (and Az for the + split complex version). This code excerpt properly sums up all + duplicate values (for the real version): + + for (p = 0 ; p < Ap [n_col] ; p++) Ax [p] = 0 ; + for (k = 0 ; k < nz ; k++) Ax [Map [k]] += Tx [k] ; + + This feature is useful (along with the reuse of the Symbolic object) if + you need to factorize a sequence of triplet matrices with identical + nonzero pattern (the order of the triplets in the Ti,Tj,Tx arrays must + also remain unchanged). It is faster than calling this routine for + each matrix, and requires no workspace. +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Include/umfpack_wsolve.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_wsolve.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,172 @@ +/* ========================================================================== */ +/* === umfpack_wsolve ======================================================= */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +int umfpack_di_wsolve +( + int sys, + const int Ap [ ], + const int Ai [ ], + const double Ax [ ], + double X [ ], + const double B [ ], + void *Numeric, + const double Control [UMFPACK_CONTROL], + double Info [UMFPACK_INFO], + int Wi [ ], + double W [ ] +) ; + +long umfpack_dl_wsolve +( + long sys, + const long Ap [ ], + const long Ai [ ], + const double Ax [ ], + double X [ ], + const double B [ ], + void *Numeric, + const double Control [UMFPACK_CONTROL], + double Info [UMFPACK_INFO], + long Wi [ ], + double W [ ] +) ; + +int umfpack_zi_wsolve +( + int sys, + const int Ap [ ], + const int Ai [ ], + const double Ax [ ], const double Az [ ], + double Xx [ ], double Xz [ ], + const double Bx [ ], const double Bz [ ], + void *Numeric, + const double Control [UMFPACK_CONTROL], + double Info [UMFPACK_INFO], + int Wi [ ], + double W [ ] +) ; + +long umfpack_zl_wsolve +( + long sys, + const long Ap [ ], + const long Ai [ ], + const double Ax [ ], const double Az [ ], + double Xx [ ], double Xz [ ], + const double Bx [ ], const double Bz [ ], + void *Numeric, + const double Control [UMFPACK_CONTROL], + double Info [UMFPACK_INFO], + long Wi [ ], + double W [ ] +) ; + +/* +double int Syntax: + + #include "umfpack.h" + void *Numeric ; + int status, *Ap, *Ai, *Wi, sys ; + double *B, *X, *Ax, *W, Info [UMFPACK_INFO], Control [UMFPACK_CONTROL] ; + status = umfpack_di_wsolve (sys, Ap, Ai, Ax, X, B, Numeric, + Control, Info, Wi, W) ; + +double long Syntax: + + #include "umfpack.h" + void *Numeric ; + long status, *Ap, *Ai, *Wi, sys ; + double *B, *X, *Ax, *W, Info [UMFPACK_INFO], Control [UMFPACK_CONTROL] ; + status = umfpack_dl_wsolve (sys, Ap, Ai, Ax, X, B, Numeric, + Control, Info, Wi, W) ; + +complex int Syntax: + + #include "umfpack.h" + void *Numeric ; + int status, *Ap, *Ai, *Wi, sys ; + double *Bx, *Bz, *Xx, *Xz, *Ax, *Az, *W, + Info [UMFPACK_INFO], Control [UMFPACK_CONTROL] ; + status = umfpack_zi_wsolve (sys, Ap, Ai, Ax, Az, Xx, Xz, Bx, Bz, Numeric, + Control, Info, Wi, W) ; + +complex long Syntax: + + #include "umfpack.h" + void *Numeric ; + long status, *Ap, *Ai, *Wi, sys ; + double *Bx, *Bz, *Xx, *Xz, *Ax, *Az, *W, + Info [UMFPACK_INFO], Control [UMFPACK_CONTROL] ; + status = umfpack_zl_wsolve (sys, Ap, Ai, Ax, Az, Xx, Xz, Bx, Bz, Numeric, + Control, Info, Wi, W) ; + +packed complex Syntax: + + Same as above, except Az, Xz, and Bz are NULL. + +Purpose: + + Given LU factors computed by umfpack_*_numeric (PAQ=LU) and the + right-hand-side, B, solve a linear system for the solution X. Iterative + refinement is optionally performed. This routine is identical to + umfpack_*_solve, except that it does not dynamically allocate any workspace. + When you have many linear systems to solve, this routine is faster than + umfpack_*_solve, since the workspace (Wi, W) needs to be allocated only + once, prior to calling umfpack_*_wsolve. + +Returns: + + The status code is returned. See Info [UMFPACK_STATUS], below. + +Arguments: + + Int sys ; Input argument, not modified. + Int Ap [n+1] ; Input argument, not modified. + Int Ai [nz] ; Input argument, not modified. + double Ax [nz] ; Input argument, not modified. + Size 2*nz in packed complex case. + double X [n] ; Output argument. + double B [n] ; Input argument, not modified. + void *Numeric ; Input argument, not modified. + double Control [UMFPACK_CONTROL] ; Input argument, not modified. + double Info [UMFPACK_INFO] ; Output argument. + + for complex versions: + double Az [nz] ; Input argument, not modified, imaginary part + double Xx [n] ; Output argument, real part. + Size 2*n in packed complex case. + double Xz [n] ; Output argument, imaginary part + double Bx [n] ; Input argument, not modified, real part. + Size 2*n in packed complex case. + double Bz [n] ; Input argument, not modified, imaginary part + + The above arguments are identical to umfpack_*_solve, except that the + error code UMFPACK_ERROR_out_of_memory will not be returned in + Info [UMFPACK_STATUS], since umfpack_*_wsolve does not allocate any + memory. + + Int Wi [n] ; Workspace. + double W [c*n] ; Workspace, where c is defined below. + + The Wi and W arguments are workspace used by umfpack_*_wsolve. They + need not be initialized on input, and their contents are undefined on + output. The size of W depends on whether or not iterative refinement is + used, and which version (real or complex) is called. Iterative + refinement is performed if Ax=b, A'x=b, or A.'x=b is being solved, + Control [UMFPACK_IRSTEP] > 0, and A is nonsingular. The size of W is + given below: + + no iter. with iter. + refinement refinement + umfpack_di_wsolve n 5*n + umfpack_dl_wsolve n 5*n + umfpack_zi_wsolve 4*n 10*n + umfpack_zl_wsolve 4*n 10*n +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Lib/libumfpack.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Lib/libumfpack.def Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,105 @@ +LIBRARY libumfpack.dll +EXPORTS +umfpack_di_col_to_triplet +umfpack_di_defaults +umfpack_di_free_numeric +umfpack_di_free_symbolic +umfpack_di_get_numeric +umfpack_di_get_lunz +umfpack_di_get_symbolic +umfpack_di_get_determinant +umfpack_di_numeric +umfpack_di_qsymbolic +umfpack_di_report_control +umfpack_di_report_info +umfpack_di_report_matrix +umfpack_di_report_numeric +umfpack_di_report_perm +umfpack_di_report_status +umfpack_di_report_symbolic +umfpack_di_report_triplet +umfpack_di_report_vector +umfpack_di_solve +umfpack_di_wsolve +umfpack_di_symbolic +umfpack_di_transpose +umfpack_di_triplet_to_col +umfpack_di_scale +umfpack_dl_col_to_triplet +umfpack_dl_defaults +umfpack_dl_free_numeric +umfpack_dl_free_symbolic +umfpack_dl_get_numeric +umfpack_dl_get_lunz +umfpack_dl_get_symbolic +umfpack_dl_get_determinant +umfpack_dl_numeric +umfpack_dl_qsymbolic +umfpack_dl_report_control +umfpack_dl_report_info +umfpack_dl_report_matrix +umfpack_dl_report_numeric +umfpack_dl_report_perm +umfpack_dl_report_status +umfpack_dl_report_symbolic +umfpack_dl_report_triplet +umfpack_dl_report_vector +umfpack_dl_solve +umfpack_dl_wsolve +umfpack_dl_symbolic +umfpack_dl_transpose +umfpack_dl_triplet_to_col +umfpack_dl_scale +umfpack_zi_col_to_triplet +umfpack_zi_defaults +umfpack_zi_free_numeric +umfpack_zi_free_symbolic +umfpack_zi_get_numeric +umfpack_zi_get_lunz +umfpack_zi_get_symbolic +umfpack_zi_get_determinant +umfpack_zi_numeric +umfpack_zi_qsymbolic +umfpack_zi_report_control +umfpack_zi_report_info +umfpack_zi_report_matrix +umfpack_zi_report_numeric +umfpack_zi_report_perm +umfpack_zi_report_status +umfpack_zi_report_symbolic +umfpack_zi_report_triplet +umfpack_zi_report_vector +umfpack_zi_solve +umfpack_zi_wsolve +umfpack_zi_symbolic +umfpack_zi_transpose +umfpack_zi_triplet_to_col +umfpack_zi_scale +umfpack_zl_col_to_triplet +umfpack_zl_defaults +umfpack_zl_free_numeric +umfpack_zl_free_symbolic +umfpack_zl_get_numeric +umfpack_zl_get_lunz +umfpack_zl_get_symbolic +umfpack_zl_get_determinant +umfpack_zl_numeric +umfpack_zl_qsymbolic +umfpack_zl_report_control +umfpack_zl_report_info +umfpack_zl_report_matrix +umfpack_zl_report_numeric +umfpack_zl_report_perm +umfpack_zl_report_status +umfpack_zl_report_symbolic +umfpack_zl_report_triplet +umfpack_zl_report_vector +umfpack_zl_solve +umfpack_zl_wsolve +umfpack_zl_symbolic +umfpack_zl_transpose +umfpack_zl_triplet_to_col +umfpack_zl_scale +umfpack_timer +umfpack_tic +umfpack_toc diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/MATLAB/Contents.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/MATLAB/Contents.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,24 @@ +%Contents of the UMFPACK sparse matrix toolbox: +% +% umfpack computes x=A\b, x=A/b, or lu (A) for a sparse matrix A +% umfpack_make to compile umfpack for use in MATLAB +% umfpack_details details on all the options for using umfpack in MATLAB +% umfpack_report prints optional control settings and statistics +% umfpack_demo a long demo +% umfpack_simple a simple demo +% umfpack_btf factorize A using a block triangular form +% umfpack_solve x = A\b or x = b/A +% lu_normest estimates norm (L*U-A, 1) without forming L*U-A +% luflop given L and U, computes # of flops required to compute them +% umfpack_test for testing umfpack (requires UFget interface to UF sparse +% matrix collection) +% +% See also: +% amd symmetric minimum degree ordering +% colamd unsymmetric column approx minimum degree ordering +% symamd symmetric approx minimum degree ordering, based on colamd +% +% UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. +% All Rights Reserved. Type umfpack_details for License. + +help Contents diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/MATLAB/GNUmakefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/MATLAB/GNUmakefile Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,229 @@ +#------------------------------------------------------------------------------- +# UMFPACK GNUmakefile for the UMFPACK MATLAB mexFunction (GNU "make" only) +#------------------------------------------------------------------------------- + +all: umfpack luflop + +include ../Make/Make.include + +MX = $(MEX) -I../Include -I../Source -I../../AMD/Include -I../../AMD/Source + +#------------------------------------------------------------------------------- +# source files +#------------------------------------------------------------------------------- + +# non-user-callable umf_*.[ch] files: +UMFCH = umf_assemble umf_blas3_update \ + umf_build_tuples umf_create_element \ + umf_dump umf_extend_front umf_garbage_collection \ + umf_get_memory umf_init_front umf_kernel \ + umf_kernel_init umf_kernel_wrapup \ + umf_local_search umf_lsolve umf_ltsolve \ + umf_mem_alloc_element umf_mem_alloc_head_block \ + umf_mem_alloc_tail_block umf_mem_free_tail_block \ + umf_mem_init_memoryspace \ + umf_report_vector umf_row_search umf_scale_column \ + umf_set_stats umf_solve umf_symbolic_usage umf_transpose \ + umf_tuple_lengths umf_usolve umf_utsolve umf_valid_numeric \ + umf_valid_symbolic umf_grow_front umf_start_front umf_2by2 \ + umf_store_lu umf_scale + +# non-user-callable umf_*.[ch] files, int/long versions only (no real/complex): +UMFINT = umf_analyze umf_apply_order umf_colamd umf_free umf_fsize \ + umf_is_permutation umf_malloc umf_realloc umf_report_perm \ + umf_singletons + +# non-user-callable and user-callable amd_*.[ch] files (int/long versions only): +AMD = amd_aat amd_1 amd_2 amd_dump amd_postorder amd_post_tree amd_defaults \ + amd_order amd_control amd_info amd_valid amd_preprocess + +# non-user-callable, created from umf_ltsolve.c, umf_utsolve.c, +# umf_triplet.c, and umf_assemble.c , with int/long and real/complex versions: +UMF_CREATED = umf_lhsolve umf_uhsolve umf_triplet_map_nox \ + umf_triplet_nomap_x umf_triplet_nomap_nox umf_triplet_map_x \ + umf_assemble_fixq umf_store_lu_drop + +# non-user-callable, int/long and real/complex versions: +UMF = $(UMF_CREATED) $(UMFCH) + +# user-callable umfpack_*.[ch] files (int/long and real/complex): +UMFPACK = umfpack_col_to_triplet umfpack_defaults umfpack_free_numeric \ + umfpack_free_symbolic umfpack_get_numeric umfpack_get_lunz \ + umfpack_get_symbolic umfpack_get_determinant umfpack_numeric \ + umfpack_qsymbolic umfpack_report_control umfpack_report_info \ + umfpack_report_matrix umfpack_report_numeric umfpack_report_perm \ + umfpack_report_status umfpack_report_symbolic umfpack_report_triplet \ + umfpack_report_vector umfpack_solve umfpack_symbolic \ + umfpack_transpose umfpack_triplet_to_col umfpack_scale \ + umfpack_load_numeric umfpack_save_numeric \ + umfpack_load_symbolic umfpack_save_symbolic + +# user-callable, created from umfpack_solve.c (umfpack_wsolve.h exists, though): +# with int/long and real/complex versions: +UMFPACKW = umfpack_wsolve + +USER = $(UMFPACKW) $(UMFPACK) + +# user-callable, only one version for int/long, real/complex, *.[ch] files: +GENERIC = umfpack_timer umfpack_tictoc + +#------------------------------------------------------------------------------- +# include files: +#------------------------------------------------------------------------------- + +AMDH = ../../AMD/Source/amd_internal.h ../../AMD/Include/amd.h + +INC1 = umf_config.h umf_version.h umf_internal.h umf_triplet.h + +INC = ../Include/umfpack.h \ + $(addprefix ../Source/, $(INC1)) \ + $(addprefix ../Source/, $(addsuffix .h,$(UMFCH))) \ + $(addprefix ../Source/, $(addsuffix .h,$(UMFINT))) \ + $(addprefix ../Include/, $(addsuffix .h,$(USER))) \ + $(addprefix ../Include/, $(addsuffix .h,$(GENERIC))) \ + $(AMDH) + +#------------------------------------------------------------------------------- +# Create the umfpack and amd mexFunctions for MATLAB (int versions only) +#------------------------------------------------------------------------------- + +MEXI = $(addsuffix .o, $(subst umf_,umf_m_,$(UMFINT))) +MEXDI = $(addsuffix .o, $(subst umf_,umf_md_,$(UMF)) $(subst umfpack_,umfpack_md_,$(USER))) +MEXZI = $(addsuffix .o, $(subst umf_,umf_mz_,$(UMF)) $(subst umfpack_,umfpack_mz_,$(USER)) ) +MEXAMD = $(addsuffix .o, $(subst amd_,amd_m_,$(AMD))) +MEXGN = $(addsuffix .o, $(subst umfpack_,umfpack_m_,$(GENERIC))) + +MEXUMFPACK = $(MEXI) $(MEXDI) $(MEXZI) $(MEXGN) + +# Note that mex has no "-o" option, thus the need for $(MV) commands. +# If it did, then the rules would be much simpler: +# $(MX) -DDINT -c $< -o $@ + +#---------------------------------------- +# integer-only routines (no real/complex): +#---------------------------------------- + +amd_m_%.o: ../../AMD/Source/amd_%.c $(AMDH) + $(MX) -DDINT -c $< + - $(MV) amd_$*.o $@ + +umf_m_%.o: ../Source/umf_%.c $(INC) + $(MX) -DDINT -c $< + - $(MV) umf_$*.o $@ + +#---------------------------------------- +# Double precision, int version, for MATLAB +#---------------------------------------- + +umf_md_%.o: ../Source/umf_%.c $(INC) + $(MX) -DDINT -c $< + - $(MV) umf_$*.o $@ + +umf_md_%hsolve.o: ../Source/umf_%tsolve.c $(INC) + $(MX) -DDINT -DCONJUGATE_SOLVE -c $< + - $(MV) umf_$*tsolve.o $@ + +umf_md_triplet_map_x.o: ../Source/umf_triplet.c $(INC) + $(MX) -DDINT -DDO_MAP -DDO_VALUES -c $< + - $(MV) umf_triplet.o $@ + +umf_md_triplet_map_nox.o: ../Source/umf_triplet.c $(INC) + $(MX) -DDINT -DDO_MAP -c $< + - $(MV) umf_triplet.o $@ + +umf_md_triplet_nomap_x.o: ../Source/umf_triplet.c $(INC) + $(MX) -DDINT -DDO_VALUES -c $< + - $(MV) umf_triplet.o $@ + +umf_md_triplet_nomap_nox.o: ../Source/umf_triplet.c $(INC) + $(MX) -DDINT -c $< + - $(MV) umf_triplet.o $@ + +umf_md_assemble_fixq.o: ../Source/umf_assemble.c $(INC) + $(MX) -DDINT -DFIXQ -c $< + - $(MV) umf_assemble.o $@ + +umf_md_store_lu_drop.o: ../Source/umf_store_lu.c $(INC) + $(MX) -DDINT -DDROP -c $< + - $(MV) umf_store_lu.o $@ + +umfpack_md_wsolve.o: ../Source/umfpack_solve.c $(INC) + $(MX) -DDINT -DWSOLVE -c $< + - $(MV) umfpack_solve.o $@ + +umfpack_md_%.o: ../Source/umfpack_%.c $(INC) + $(MX) -DDINT -c $< + - $(MV) umfpack_$*.o $@ + +#---------------------------------------- +# Complex double precision, int version, for MATLAB +#---------------------------------------- + +umf_mz_%.o: ../Source/umf_%.c $(INC) + $(MX) -DZINT -c $< + - $(MV) umf_$*.o $@ + +umf_mz_%hsolve.o: ../Source/umf_%tsolve.c $(INC) + $(MX) -DZINT -DCONJUGATE_SOLVE -c $< + - $(MV) umf_$*tsolve.o $@ + +umf_mz_triplet_map_x.o: ../Source/umf_triplet.c $(INC) + $(MX) -DZINT -DDO_MAP -DDO_VALUES -c $< + - $(MV) umf_triplet.o $@ + +umf_mz_triplet_map_nox.o: ../Source/umf_triplet.c $(INC) + $(MX) -DZINT -DDO_MAP -c $< + - $(MV) umf_triplet.o $@ + +umf_mz_triplet_nomap_x.o: ../Source/umf_triplet.c $(INC) + $(MX) -DZINT -DDO_VALUES -c $< + - $(MV) umf_triplet.o $@ + +umf_mz_triplet_nomap_nox.o: ../Source/umf_triplet.c $(INC) + $(MX) -DZINT -c $< + - $(MV) umf_triplet.o $@ + +umf_mz_assemble_fixq.o: ../Source/umf_assemble.c $(INC) + $(MX) -DZINT -DFIXQ -c $< + - $(MV) umf_assemble.o $@ + +umf_mz_store_lu_drop.o: ../Source/umf_store_lu.c $(INC) + $(MX) -DZINT -DDROP -c $< + - $(MV) umf_store_lu.o $@ + +umfpack_mz_wsolve.o: ../Source/umfpack_solve.c $(INC) + $(MX) -DZINT -DWSOLVE -c $< + - $(MV) umfpack_solve.o $@ + +umfpack_mz_%.o: ../Source/umfpack_%.c $(INC) + $(MX) -DZINT -c $< + - $(MV) umfpack_$*.o $@ + +#---------------------------------------- +# Generic routines for MATLAB +#---------------------------------------- + +umfpack_m_timer.o: ../Source/umfpack_timer.c $(INC) + $(MX) -c $< + - $(MV) umfpack_timer.o $@ + +umfpack_m_tictoc.o: ../Source/umfpack_tictoc.c $(INC) + $(MX) -c $< + - $(MV) umfpack_tictoc.o $@ + +#---------------------------------------- +# umfpack mexFunction +#---------------------------------------- + +umfpack: umfpackmex.c $(MEXUMFPACK) $(MEXAMD) + $(MX) -output umfpack umfpackmex.c $(MEXUMFPACK) $(MEXAMD) + +luflop: luflopmex.c + $(MX) -output luflop luflopmex.c + +#------------------------------------------------------------------------------- +# Remove all but the files in the original distribution +#------------------------------------------------------------------------------- + +purge: clean + - $(RM) *.mex* *.dll diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/MATLAB/Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/MATLAB/Makefile Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,439 @@ +#------------------------------------------------------------------------------- +# UMFPACK Makefile for the UMFPACK MATLAB mexFunction (old "make" only) +#------------------------------------------------------------------------------- + +# This is a very ugly Makefile, and is only provided for those who do not +# have GNU make. Note that it is not used if you have GNU make. It ignores +# dependency checking and just compiles everything. It was created +# automatically, via make -n using the GNUmakefile. That way, I don't have +# maintain two Makefiles. + +all: umfpack luflop + +include ../Make/Make.include + +MX = $(MEX) -I../Include -I../Source -I../../AMD/Include -I../../AMD/Source + +umfpack: + $(MX) -DDINT -c ../Source/umf_analyze.c + $(MV) -f umf_analyze.o umf_m_analyze.o + $(MX) -DDINT -c ../Source/umf_apply_order.c + $(MV) -f umf_apply_order.o umf_m_apply_order.o + $(MX) -DDINT -c ../Source/umf_colamd.c + $(MV) -f umf_colamd.o umf_m_colamd.o + $(MX) -DDINT -c ../Source/umf_free.c + $(MV) -f umf_free.o umf_m_free.o + $(MX) -DDINT -c ../Source/umf_fsize.c + $(MV) -f umf_fsize.o umf_m_fsize.o + $(MX) -DDINT -c ../Source/umf_is_permutation.c + $(MV) -f umf_is_permutation.o umf_m_is_permutation.o + $(MX) -DDINT -c ../Source/umf_malloc.c + $(MV) -f umf_malloc.o umf_m_malloc.o + $(MX) -DDINT -c ../Source/umf_realloc.c + $(MV) -f umf_realloc.o umf_m_realloc.o + $(MX) -DDINT -c ../Source/umf_report_perm.c + $(MV) -f umf_report_perm.o umf_m_report_perm.o + $(MX) -DDINT -c ../Source/umf_singletons.c + $(MV) -f umf_singletons.o umf_m_singletons.o + $(MX) -DDINT -DCONJUGATE_SOLVE -c ../Source/umf_ltsolve.c + $(MV) -f umf_ltsolve.o umf_md_lhsolve.o + $(MX) -DDINT -DCONJUGATE_SOLVE -c ../Source/umf_utsolve.c + $(MV) -f umf_utsolve.o umf_md_uhsolve.o + $(MX) -DDINT -DDO_MAP -c ../Source/umf_triplet.c + $(MV) -f umf_triplet.o umf_md_triplet_map_nox.o + $(MX) -DDINT -DDO_VALUES -c ../Source/umf_triplet.c + $(MV) -f umf_triplet.o umf_md_triplet_nomap_x.o + $(MX) -DDINT -c ../Source/umf_triplet.c + $(MV) -f umf_triplet.o umf_md_triplet_nomap_nox.o + $(MX) -DDINT -DDO_MAP -DDO_VALUES -c ../Source/umf_triplet.c + $(MV) -f umf_triplet.o umf_md_triplet_map_x.o + $(MX) -DDINT -DFIXQ -c ../Source/umf_assemble.c + $(MV) -f umf_assemble.o umf_md_assemble_fixq.o + $(MX) -DDINT -DDROP -c ../Source/umf_store_lu.c + $(MV) -f umf_store_lu.o umf_md_store_lu_drop.o + $(MX) -DDINT -c ../Source/umf_assemble.c + $(MV) -f umf_assemble.o umf_md_assemble.o + $(MX) -DDINT -c ../Source/umf_blas3_update.c + $(MV) -f umf_blas3_update.o umf_md_blas3_update.o + $(MX) -DDINT -c ../Source/umf_build_tuples.c + $(MV) -f umf_build_tuples.o umf_md_build_tuples.o + $(MX) -DDINT -c ../Source/umf_create_element.c + $(MV) -f umf_create_element.o umf_md_create_element.o + $(MX) -DDINT -c ../Source/umf_dump.c + $(MV) -f umf_dump.o umf_md_dump.o + $(MX) -DDINT -c ../Source/umf_extend_front.c + $(MV) -f umf_extend_front.o umf_md_extend_front.o + $(MX) -DDINT -c ../Source/umf_garbage_collection.c + $(MV) -f umf_garbage_collection.o umf_md_garbage_collection.o + $(MX) -DDINT -c ../Source/umf_get_memory.c + $(MV) -f umf_get_memory.o umf_md_get_memory.o + $(MX) -DDINT -c ../Source/umf_init_front.c + $(MV) -f umf_init_front.o umf_md_init_front.o + $(MX) -DDINT -c ../Source/umf_kernel.c + $(MV) -f umf_kernel.o umf_md_kernel.o + $(MX) -DDINT -c ../Source/umf_kernel_init.c + $(MV) -f umf_kernel_init.o umf_md_kernel_init.o + $(MX) -DDINT -c ../Source/umf_kernel_wrapup.c + $(MV) -f umf_kernel_wrapup.o umf_md_kernel_wrapup.o + $(MX) -DDINT -c ../Source/umf_local_search.c + $(MV) -f umf_local_search.o umf_md_local_search.o + $(MX) -DDINT -c ../Source/umf_lsolve.c + $(MV) -f umf_lsolve.o umf_md_lsolve.o + $(MX) -DDINT -c ../Source/umf_ltsolve.c + $(MV) -f umf_ltsolve.o umf_md_ltsolve.o + $(MX) -DDINT -c ../Source/umf_mem_alloc_element.c + $(MV) -f umf_mem_alloc_element.o umf_md_mem_alloc_element.o + $(MX) -DDINT -c ../Source/umf_mem_alloc_head_block.c + $(MV) -f umf_mem_alloc_head_block.o umf_md_mem_alloc_head_block.o + $(MX) -DDINT -c ../Source/umf_mem_alloc_tail_block.c + $(MV) -f umf_mem_alloc_tail_block.o umf_md_mem_alloc_tail_block.o + $(MX) -DDINT -c ../Source/umf_mem_free_tail_block.c + $(MV) -f umf_mem_free_tail_block.o umf_md_mem_free_tail_block.o + $(MX) -DDINT -c ../Source/umf_mem_init_memoryspace.c + $(MV) -f umf_mem_init_memoryspace.o umf_md_mem_init_memoryspace.o + $(MX) -DDINT -c ../Source/umf_report_vector.c + $(MV) -f umf_report_vector.o umf_md_report_vector.o + $(MX) -DDINT -c ../Source/umf_row_search.c + $(MV) -f umf_row_search.o umf_md_row_search.o + $(MX) -DDINT -c ../Source/umf_scale_column.c + $(MV) -f umf_scale_column.o umf_md_scale_column.o + $(MX) -DDINT -c ../Source/umf_set_stats.c + $(MV) -f umf_set_stats.o umf_md_set_stats.o + $(MX) -DDINT -c ../Source/umf_solve.c + $(MV) -f umf_solve.o umf_md_solve.o + $(MX) -DDINT -c ../Source/umf_symbolic_usage.c + $(MV) -f umf_symbolic_usage.o umf_md_symbolic_usage.o + $(MX) -DDINT -c ../Source/umf_transpose.c + $(MV) -f umf_transpose.o umf_md_transpose.o + $(MX) -DDINT -c ../Source/umf_tuple_lengths.c + $(MV) -f umf_tuple_lengths.o umf_md_tuple_lengths.o + $(MX) -DDINT -c ../Source/umf_usolve.c + $(MV) -f umf_usolve.o umf_md_usolve.o + $(MX) -DDINT -c ../Source/umf_utsolve.c + $(MV) -f umf_utsolve.o umf_md_utsolve.o + $(MX) -DDINT -c ../Source/umf_valid_numeric.c + $(MV) -f umf_valid_numeric.o umf_md_valid_numeric.o + $(MX) -DDINT -c ../Source/umf_valid_symbolic.c + $(MV) -f umf_valid_symbolic.o umf_md_valid_symbolic.o + $(MX) -DDINT -c ../Source/umf_grow_front.c + $(MV) -f umf_grow_front.o umf_md_grow_front.o + $(MX) -DDINT -c ../Source/umf_start_front.c + $(MV) -f umf_start_front.o umf_md_start_front.o + $(MX) -DDINT -c ../Source/umf_2by2.c + $(MV) -f umf_2by2.o umf_md_2by2.o + $(MX) -DDINT -c ../Source/umf_store_lu.c + $(MV) -f umf_store_lu.o umf_md_store_lu.o + $(MX) -DDINT -c ../Source/umf_scale.c + $(MV) -f umf_scale.o umf_md_scale.o + $(MX) -DDINT -DWSOLVE -c ../Source/umfpack_solve.c + $(MV) -f umfpack_solve.o umfpack_md_wsolve.o + $(MX) -DDINT -c ../Source/umfpack_col_to_triplet.c + $(MV) -f umfpack_col_to_triplet.o umfpack_md_col_to_triplet.o + $(MX) -DDINT -c ../Source/umfpack_defaults.c + $(MV) -f umfpack_defaults.o umfpack_md_defaults.o + $(MX) -DDINT -c ../Source/umfpack_free_numeric.c + $(MV) -f umfpack_free_numeric.o umfpack_md_free_numeric.o + $(MX) -DDINT -c ../Source/umfpack_free_symbolic.c + $(MV) -f umfpack_free_symbolic.o umfpack_md_free_symbolic.o + $(MX) -DDINT -c ../Source/umfpack_get_numeric.c + $(MV) -f umfpack_get_numeric.o umfpack_md_get_numeric.o + $(MX) -DDINT -c ../Source/umfpack_get_lunz.c + $(MV) -f umfpack_get_lunz.o umfpack_md_get_lunz.o + $(MX) -DDINT -c ../Source/umfpack_get_symbolic.c + $(MV) -f umfpack_get_symbolic.o umfpack_md_get_symbolic.o + $(MX) -DDINT -c ../Source/umfpack_get_determinant.c + $(MV) -f umfpack_get_determinant.o umfpack_md_get_determinant.o + $(MX) -DDINT -c ../Source/umfpack_numeric.c + $(MV) -f umfpack_numeric.o umfpack_md_numeric.o + $(MX) -DDINT -c ../Source/umfpack_qsymbolic.c + $(MV) -f umfpack_qsymbolic.o umfpack_md_qsymbolic.o + $(MX) -DDINT -c ../Source/umfpack_report_control.c + $(MV) -f umfpack_report_control.o umfpack_md_report_control.o + $(MX) -DDINT -c ../Source/umfpack_report_info.c + $(MV) -f umfpack_report_info.o umfpack_md_report_info.o + $(MX) -DDINT -c ../Source/umfpack_report_matrix.c + $(MV) -f umfpack_report_matrix.o umfpack_md_report_matrix.o + $(MX) -DDINT -c ../Source/umfpack_report_numeric.c + $(MV) -f umfpack_report_numeric.o umfpack_md_report_numeric.o + $(MX) -DDINT -c ../Source/umfpack_report_perm.c + $(MV) -f umfpack_report_perm.o umfpack_md_report_perm.o + $(MX) -DDINT -c ../Source/umfpack_report_status.c + $(MV) -f umfpack_report_status.o umfpack_md_report_status.o + $(MX) -DDINT -c ../Source/umfpack_report_symbolic.c + $(MV) -f umfpack_report_symbolic.o umfpack_md_report_symbolic.o + $(MX) -DDINT -c ../Source/umfpack_report_triplet.c + $(MV) -f umfpack_report_triplet.o umfpack_md_report_triplet.o + $(MX) -DDINT -c ../Source/umfpack_report_vector.c + $(MV) -f umfpack_report_vector.o umfpack_md_report_vector.o + $(MX) -DDINT -c ../Source/umfpack_solve.c + $(MV) -f umfpack_solve.o umfpack_md_solve.o + $(MX) -DDINT -c ../Source/umfpack_symbolic.c + $(MV) -f umfpack_symbolic.o umfpack_md_symbolic.o + $(MX) -DDINT -c ../Source/umfpack_transpose.c + $(MV) -f umfpack_transpose.o umfpack_md_transpose.o + $(MX) -DDINT -c ../Source/umfpack_triplet_to_col.c + $(MV) -f umfpack_triplet_to_col.o umfpack_md_triplet_to_col.o + $(MX) -DDINT -c ../Source/umfpack_scale.c + $(MV) -f umfpack_scale.o umfpack_md_scale.o + $(MX) -DDINT -c ../Source/umfpack_load_numeric.c + $(MV) -f umfpack_load_numeric.o umfpack_md_load_numeric.o + $(MX) -DDINT -c ../Source/umfpack_save_numeric.c + $(MV) -f umfpack_save_numeric.o umfpack_md_save_numeric.o + $(MX) -DDINT -c ../Source/umfpack_load_symbolic.c + $(MV) -f umfpack_load_symbolic.o umfpack_md_load_symbolic.o + $(MX) -DDINT -c ../Source/umfpack_save_symbolic.c + $(MV) -f umfpack_save_symbolic.o umfpack_md_save_symbolic.o + $(MX) -DZINT -DCONJUGATE_SOLVE -c ../Source/umf_ltsolve.c + $(MV) -f umf_ltsolve.o umf_mz_lhsolve.o + $(MX) -DZINT -DCONJUGATE_SOLVE -c ../Source/umf_utsolve.c + $(MV) -f umf_utsolve.o umf_mz_uhsolve.o + $(MX) -DZINT -DDO_MAP -c ../Source/umf_triplet.c + $(MV) -f umf_triplet.o umf_mz_triplet_map_nox.o + $(MX) -DZINT -DDO_VALUES -c ../Source/umf_triplet.c + $(MV) -f umf_triplet.o umf_mz_triplet_nomap_x.o + $(MX) -DZINT -c ../Source/umf_triplet.c + $(MV) -f umf_triplet.o umf_mz_triplet_nomap_nox.o + $(MX) -DZINT -DDO_MAP -DDO_VALUES -c ../Source/umf_triplet.c + $(MV) -f umf_triplet.o umf_mz_triplet_map_x.o + $(MX) -DZINT -DFIXQ -c ../Source/umf_assemble.c + $(MV) -f umf_assemble.o umf_mz_assemble_fixq.o + $(MX) -DZINT -DDROP -c ../Source/umf_store_lu.c + $(MV) -f umf_store_lu.o umf_mz_store_lu_drop.o + $(MX) -DZINT -c ../Source/umf_assemble.c + $(MV) -f umf_assemble.o umf_mz_assemble.o + $(MX) -DZINT -c ../Source/umf_blas3_update.c + $(MV) -f umf_blas3_update.o umf_mz_blas3_update.o + $(MX) -DZINT -c ../Source/umf_build_tuples.c + $(MV) -f umf_build_tuples.o umf_mz_build_tuples.o + $(MX) -DZINT -c ../Source/umf_create_element.c + $(MV) -f umf_create_element.o umf_mz_create_element.o + $(MX) -DZINT -c ../Source/umf_dump.c + $(MV) -f umf_dump.o umf_mz_dump.o + $(MX) -DZINT -c ../Source/umf_extend_front.c + $(MV) -f umf_extend_front.o umf_mz_extend_front.o + $(MX) -DZINT -c ../Source/umf_garbage_collection.c + $(MV) -f umf_garbage_collection.o umf_mz_garbage_collection.o + $(MX) -DZINT -c ../Source/umf_get_memory.c + $(MV) -f umf_get_memory.o umf_mz_get_memory.o + $(MX) -DZINT -c ../Source/umf_init_front.c + $(MV) -f umf_init_front.o umf_mz_init_front.o + $(MX) -DZINT -c ../Source/umf_kernel.c + $(MV) -f umf_kernel.o umf_mz_kernel.o + $(MX) -DZINT -c ../Source/umf_kernel_init.c + $(MV) -f umf_kernel_init.o umf_mz_kernel_init.o + $(MX) -DZINT -c ../Source/umf_kernel_wrapup.c + $(MV) -f umf_kernel_wrapup.o umf_mz_kernel_wrapup.o + $(MX) -DZINT -c ../Source/umf_local_search.c + $(MV) -f umf_local_search.o umf_mz_local_search.o + $(MX) -DZINT -c ../Source/umf_lsolve.c + $(MV) -f umf_lsolve.o umf_mz_lsolve.o + $(MX) -DZINT -c ../Source/umf_ltsolve.c + $(MV) -f umf_ltsolve.o umf_mz_ltsolve.o + $(MX) -DZINT -c ../Source/umf_mem_alloc_element.c + $(MV) -f umf_mem_alloc_element.o umf_mz_mem_alloc_element.o + $(MX) -DZINT -c ../Source/umf_mem_alloc_head_block.c + $(MV) -f umf_mem_alloc_head_block.o umf_mz_mem_alloc_head_block.o + $(MX) -DZINT -c ../Source/umf_mem_alloc_tail_block.c + $(MV) -f umf_mem_alloc_tail_block.o umf_mz_mem_alloc_tail_block.o + $(MX) -DZINT -c ../Source/umf_mem_free_tail_block.c + $(MV) -f umf_mem_free_tail_block.o umf_mz_mem_free_tail_block.o + $(MX) -DZINT -c ../Source/umf_mem_init_memoryspace.c + $(MV) -f umf_mem_init_memoryspace.o umf_mz_mem_init_memoryspace.o + $(MX) -DZINT -c ../Source/umf_report_vector.c + $(MV) -f umf_report_vector.o umf_mz_report_vector.o + $(MX) -DZINT -c ../Source/umf_row_search.c + $(MV) -f umf_row_search.o umf_mz_row_search.o + $(MX) -DZINT -c ../Source/umf_scale_column.c + $(MV) -f umf_scale_column.o umf_mz_scale_column.o + $(MX) -DZINT -c ../Source/umf_set_stats.c + $(MV) -f umf_set_stats.o umf_mz_set_stats.o + $(MX) -DZINT -c ../Source/umf_solve.c + $(MV) -f umf_solve.o umf_mz_solve.o + $(MX) -DZINT -c ../Source/umf_symbolic_usage.c + $(MV) -f umf_symbolic_usage.o umf_mz_symbolic_usage.o + $(MX) -DZINT -c ../Source/umf_transpose.c + $(MV) -f umf_transpose.o umf_mz_transpose.o + $(MX) -DZINT -c ../Source/umf_tuple_lengths.c + $(MV) -f umf_tuple_lengths.o umf_mz_tuple_lengths.o + $(MX) -DZINT -c ../Source/umf_usolve.c + $(MV) -f umf_usolve.o umf_mz_usolve.o + $(MX) -DZINT -c ../Source/umf_utsolve.c + $(MV) -f umf_utsolve.o umf_mz_utsolve.o + $(MX) -DZINT -c ../Source/umf_valid_numeric.c + $(MV) -f umf_valid_numeric.o umf_mz_valid_numeric.o + $(MX) -DZINT -c ../Source/umf_valid_symbolic.c + $(MV) -f umf_valid_symbolic.o umf_mz_valid_symbolic.o + $(MX) -DZINT -c ../Source/umf_grow_front.c + $(MV) -f umf_grow_front.o umf_mz_grow_front.o + $(MX) -DZINT -c ../Source/umf_start_front.c + $(MV) -f umf_start_front.o umf_mz_start_front.o + $(MX) -DZINT -c ../Source/umf_2by2.c + $(MV) -f umf_2by2.o umf_mz_2by2.o + $(MX) -DZINT -c ../Source/umf_store_lu.c + $(MV) -f umf_store_lu.o umf_mz_store_lu.o + $(MX) -DZINT -c ../Source/umf_scale.c + $(MV) -f umf_scale.o umf_mz_scale.o + $(MX) -DZINT -DWSOLVE -c ../Source/umfpack_solve.c + $(MV) -f umfpack_solve.o umfpack_mz_wsolve.o + $(MX) -DZINT -c ../Source/umfpack_col_to_triplet.c + $(MV) -f umfpack_col_to_triplet.o umfpack_mz_col_to_triplet.o + $(MX) -DZINT -c ../Source/umfpack_defaults.c + $(MV) -f umfpack_defaults.o umfpack_mz_defaults.o + $(MX) -DZINT -c ../Source/umfpack_free_numeric.c + $(MV) -f umfpack_free_numeric.o umfpack_mz_free_numeric.o + $(MX) -DZINT -c ../Source/umfpack_free_symbolic.c + $(MV) -f umfpack_free_symbolic.o umfpack_mz_free_symbolic.o + $(MX) -DZINT -c ../Source/umfpack_get_numeric.c + $(MV) -f umfpack_get_numeric.o umfpack_mz_get_numeric.o + $(MX) -DZINT -c ../Source/umfpack_get_lunz.c + $(MV) -f umfpack_get_lunz.o umfpack_mz_get_lunz.o + $(MX) -DZINT -c ../Source/umfpack_get_symbolic.c + $(MV) -f umfpack_get_symbolic.o umfpack_mz_get_symbolic.o + $(MX) -DZINT -c ../Source/umfpack_get_determinant.c + $(MV) -f umfpack_get_determinant.o umfpack_mz_get_determinant.o + $(MX) -DZINT -c ../Source/umfpack_numeric.c + $(MV) -f umfpack_numeric.o umfpack_mz_numeric.o + $(MX) -DZINT -c ../Source/umfpack_qsymbolic.c + $(MV) -f umfpack_qsymbolic.o umfpack_mz_qsymbolic.o + $(MX) -DZINT -c ../Source/umfpack_report_control.c + $(MV) -f umfpack_report_control.o umfpack_mz_report_control.o + $(MX) -DZINT -c ../Source/umfpack_report_info.c + $(MV) -f umfpack_report_info.o umfpack_mz_report_info.o + $(MX) -DZINT -c ../Source/umfpack_report_matrix.c + $(MV) -f umfpack_report_matrix.o umfpack_mz_report_matrix.o + $(MX) -DZINT -c ../Source/umfpack_report_numeric.c + $(MV) -f umfpack_report_numeric.o umfpack_mz_report_numeric.o + $(MX) -DZINT -c ../Source/umfpack_report_perm.c + $(MV) -f umfpack_report_perm.o umfpack_mz_report_perm.o + $(MX) -DZINT -c ../Source/umfpack_report_status.c + $(MV) -f umfpack_report_status.o umfpack_mz_report_status.o + $(MX) -DZINT -c ../Source/umfpack_report_symbolic.c + $(MV) -f umfpack_report_symbolic.o umfpack_mz_report_symbolic.o + $(MX) -DZINT -c ../Source/umfpack_report_triplet.c + $(MV) -f umfpack_report_triplet.o umfpack_mz_report_triplet.o + $(MX) -DZINT -c ../Source/umfpack_report_vector.c + $(MV) -f umfpack_report_vector.o umfpack_mz_report_vector.o + $(MX) -DZINT -c ../Source/umfpack_solve.c + $(MV) -f umfpack_solve.o umfpack_mz_solve.o + $(MX) -DZINT -c ../Source/umfpack_symbolic.c + $(MV) -f umfpack_symbolic.o umfpack_mz_symbolic.o + $(MX) -DZINT -c ../Source/umfpack_transpose.c + $(MV) -f umfpack_transpose.o umfpack_mz_transpose.o + $(MX) -DZINT -c ../Source/umfpack_triplet_to_col.c + $(MV) -f umfpack_triplet_to_col.o umfpack_mz_triplet_to_col.o + $(MX) -DZINT -c ../Source/umfpack_scale.c + $(MV) -f umfpack_scale.o umfpack_mz_scale.o + $(MX) -DZINT -c ../Source/umfpack_load_numeric.c + $(MV) -f umfpack_load_numeric.o umfpack_mz_load_numeric.o + $(MX) -DZINT -c ../Source/umfpack_save_numeric.c + $(MV) -f umfpack_save_numeric.o umfpack_mz_save_numeric.o + $(MX) -DZINT -c ../Source/umfpack_load_symbolic.c + $(MV) -f umfpack_load_symbolic.o umfpack_mz_load_symbolic.o + $(MX) -DZINT -c ../Source/umfpack_save_symbolic.c + $(MV) -f umfpack_save_symbolic.o umfpack_mz_save_symbolic.o + $(MX) -c ../Source/umfpack_timer.c + $(MV) -f umfpack_timer.o umfpack_m_timer.o + $(MX) -c ../Source/umfpack_tictoc.c + $(MV) -f umfpack_tictoc.o umfpack_m_tictoc.o + $(MX) -DDINT -c ../../AMD/Source/amd_aat.c + $(MV) -f amd_aat.o amd_m_aat.o + $(MX) -DDINT -c ../../AMD/Source/amd_1.c + $(MV) -f amd_1.o amd_m_1.o + $(MX) -DDINT -c ../../AMD/Source/amd_2.c + $(MV) -f amd_2.o amd_m_2.o + $(MX) -DDINT -c ../../AMD/Source/amd_dump.c + $(MV) -f amd_dump.o amd_m_dump.o + $(MX) -DDINT -c ../../AMD/Source/amd_postorder.c + $(MV) -f amd_postorder.o amd_m_postorder.o + $(MX) -DDINT -c ../../AMD/Source/amd_post_tree.c + $(MV) -f amd_post_tree.o amd_m_post_tree.o + $(MX) -DDINT -c ../../AMD/Source/amd_defaults.c + $(MV) -f amd_defaults.o amd_m_defaults.o + $(MX) -DDINT -c ../../AMD/Source/amd_order.c + $(MV) -f amd_order.o amd_m_order.o + $(MX) -DDINT -c ../../AMD/Source/amd_control.c + $(MV) -f amd_control.o amd_m_control.o + $(MX) -DDINT -c ../../AMD/Source/amd_info.c + $(MV) -f amd_info.o amd_m_info.o + $(MX) -DDINT -c ../../AMD/Source/amd_valid.c + $(MV) -f amd_valid.o amd_m_valid.o + $(MX) -output umfpack umfpackmex.c \ + umf_m_analyze.o umf_m_apply_order.o umf_m_colamd.o umf_m_free.o \ + umf_m_fsize.o umf_m_is_permutation.o umf_m_malloc.o \ + umf_m_realloc.o umf_m_report_perm.o umf_m_singletons.o \ + umf_md_lhsolve.o umf_md_uhsolve.o umf_md_triplet_map_nox.o \ + umf_md_triplet_nomap_x.o umf_md_triplet_nomap_nox.o \ + umf_md_triplet_map_x.o umf_md_assemble_fixq.o \ + umf_md_store_lu_drop.o umf_md_assemble.o umf_md_blas3_update.o \ + umf_md_build_tuples.o umf_md_create_element.o umf_md_dump.o \ + umf_md_extend_front.o umf_md_garbage_collection.o \ + umf_md_get_memory.o umf_md_init_front.o umf_md_kernel.o \ + umf_md_kernel_init.o umf_md_kernel_wrapup.o umf_md_local_search.o \ + umf_md_lsolve.o umf_md_ltsolve.o umf_md_mem_alloc_element.o \ + umf_md_mem_alloc_head_block.o umf_md_mem_alloc_tail_block.o \ + umf_md_mem_free_tail_block.o umf_md_mem_init_memoryspace.o \ + umf_md_report_vector.o umf_md_row_search.o umf_md_scale_column.o \ + umf_md_set_stats.o umf_md_solve.o umf_md_symbolic_usage.o \ + umf_md_transpose.o umf_md_tuple_lengths.o umf_md_usolve.o \ + umf_md_utsolve.o umf_md_valid_numeric.o umf_md_valid_symbolic.o \ + umf_md_grow_front.o umf_md_start_front.o umf_md_2by2.o \ + umf_md_store_lu.o umf_md_scale.o umfpack_md_wsolve.o \ + umfpack_md_col_to_triplet.o umfpack_md_defaults.o \ + umfpack_md_free_numeric.o umfpack_md_free_symbolic.o \ + umfpack_md_get_numeric.o umfpack_md_get_lunz.o \ + umfpack_md_get_symbolic.o umfpack_md_get_determinant.o \ + umfpack_md_numeric.o \ + umfpack_md_qsymbolic.o umfpack_md_report_control.o \ + umfpack_md_report_info.o umfpack_md_report_matrix.o \ + umfpack_md_report_numeric.o umfpack_md_report_perm.o \ + umfpack_md_report_status.o umfpack_md_report_symbolic.o \ + umfpack_md_report_triplet.o umfpack_md_report_vector.o \ + umfpack_md_solve.o umfpack_md_symbolic.o umfpack_md_transpose.o \ + umfpack_md_triplet_to_col.o umfpack_md_scale.o \ + umfpack_md_load_numeric.o umfpack_md_save_numeric.o \ + umfpack_md_load_symbolic.o umfpack_md_save_symbolic.o \ + umf_mz_lhsolve.o umf_mz_uhsolve.o umf_mz_triplet_map_nox.o \ + umf_mz_triplet_nomap_x.o umf_mz_triplet_nomap_nox.o \ + umf_mz_triplet_map_x.o umf_mz_assemble_fixq.o \ + umf_mz_store_lu_drop.o umf_mz_assemble.o umf_mz_blas3_update.o \ + umf_mz_build_tuples.o umf_mz_create_element.o umf_mz_dump.o \ + umf_mz_extend_front.o umf_mz_garbage_collection.o \ + umf_mz_get_memory.o umf_mz_init_front.o umf_mz_kernel.o \ + umf_mz_kernel_init.o umf_mz_kernel_wrapup.o umf_mz_local_search.o \ + umf_mz_lsolve.o umf_mz_ltsolve.o umf_mz_mem_alloc_element.o \ + umf_mz_mem_alloc_head_block.o umf_mz_mem_alloc_tail_block.o \ + umf_mz_mem_free_tail_block.o umf_mz_mem_init_memoryspace.o \ + umf_mz_report_vector.o umf_mz_row_search.o umf_mz_scale_column.o \ + umf_mz_set_stats.o umf_mz_solve.o umf_mz_symbolic_usage.o \ + umf_mz_transpose.o umf_mz_tuple_lengths.o umf_mz_usolve.o \ + umf_mz_utsolve.o umf_mz_valid_numeric.o umf_mz_valid_symbolic.o \ + umf_mz_grow_front.o umf_mz_start_front.o umf_mz_2by2.o \ + umf_mz_store_lu.o umf_mz_scale.o umfpack_mz_wsolve.o \ + umfpack_mz_col_to_triplet.o umfpack_mz_defaults.o \ + umfpack_mz_free_numeric.o umfpack_mz_free_symbolic.o \ + umfpack_mz_get_numeric.o umfpack_mz_get_lunz.o \ + umfpack_mz_get_symbolic.o umfpack_mz_get_determinant.o \ + umfpack_mz_numeric.o \ + umfpack_mz_qsymbolic.o umfpack_mz_report_control.o \ + umfpack_mz_report_info.o umfpack_mz_report_matrix.o \ + umfpack_mz_report_numeric.o umfpack_mz_report_perm.o \ + umfpack_mz_report_status.o umfpack_mz_report_symbolic.o \ + umfpack_mz_report_triplet.o umfpack_mz_report_vector.o \ + umfpack_mz_solve.o umfpack_mz_symbolic.o umfpack_mz_transpose.o \ + umfpack_mz_triplet_to_col.o umfpack_mz_scale.o \ + umfpack_mz_load_numeric.o umfpack_mz_save_numeric.o \ + umfpack_mz_load_symbolic.o umfpack_mz_save_symbolic.o \ + umfpack_m_timer.o umfpack_m_tictoc.o \ + amd_m_aat.o amd_m_1.o amd_m_2.o amd_m_dump.o \ + amd_m_postorder.o amd_m_post_tree.o amd_m_defaults.o amd_m_order.o \ + amd_m_control.o amd_m_info.o amd_m_valid.o + +luflop: luflopmex.c + $(MX) -output luflop luflopmex.c + +#------------------------------------------------------------------------------- +# Remove all but the files in the original distribution +#------------------------------------------------------------------------------- + +purge: clean + - $(RM) *.mex* *.dll diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/MATLAB/lcc_lib/lapacksyms.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/MATLAB/lcc_lib/lapacksyms.def Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,718 @@ +LIBRARY liblapack.dll +EXPORTS +dasum +daxpy +dbdsdc +dbdsqr +dcopy +ddisna +ddot +dgbbrd +dgbcon +dgbequ +dgbmv +dgbrfs +dgbsv +dgbsvx +dgbtf2 +dgbtrf +dgbtrs +dgebak +dgebal +dgebd2 +dgebrd +dgecon +dgeequ +dgees +dgeesx +dgeev +dgeevx +dgegs +dgegv +dgehd2 +dgehrd +dgelq2 +dgelqf +dgels +dgelsd +dgelss +dgelsx +dgelsy +dgemm +dgemv +dgeql2 +dgeqlf +dgeqp3 +dgeqpf +dgeqr2 +dgeqrf +dger +dgerfs +dgerq2 +dgerqf +dgesc2 +dgesdd +dgesv +dgesvd +dgesvx +dgetc2 +dgetf2 +dgetrf +dgetri +dgetrs +dggbak +dggbal +dgges +dggesx +dggev +dggevx +dggglm +dgghrd +dgglse +dggqrf +dggrqf +dggsvd +dggsvp +dgtcon +dgtrfs +dgtsv +dgtsvx +dgttrf +dgttrs +dgtts2 +dhgeqz +dhsein +dhseqr +dlabad +dlabrd +dlacon +dlacpy +dladiv +dlae2 +dlaebz +dlaed0 +dlaed1 +dlaed2 +dlaed3 +dlaed4 +dlaed5 +dlaed6 +dlaed7 +dlaed8 +dlaed9 +dlaeda +dlaein +dlaev2 +dlaexc +dlag2 +dlags2 +dlagtf +dlagtm +dlagts +dlagv2 +dlahqr +dlahrd +dlaic1 +dlaln2 +dlals0 +dlalsa +dlalsd +dlamch +dlamrg +dlangb +dlange +dlangt +dlanhs +dlansb +dlansp +dlanst +dlansy +dlantb +dlantp +dlantr +dlanv2 +dlapll +dlapmt +dlapy2 +dlapy3 +dlaqgb +dlaqge +dlaqp2 +dlaqps +dlaqsb +dlaqsp +dlaqsy +dlaqtr +dlar1v +dlar2v +dlarf +dlarfb +dlarfg +dlarft +dlarfx +dlargv +dlarnv +dlarrb +dlarre +dlarrf +dlarrv +dlartg +dlartv +dlaruv +dlarz +dlarzb +dlarzt +dlas2 +dlascl +dlasd0 +dlasd1 +dlasd2 +dlasd3 +dlasd4 +dlasd5 +dlasd6 +dlasd7 +dlasd8 +dlasd9 +dlasda +dlasdq +dlasdt +dlaset +dlasq1 +dlasq2 +dlasq3 +dlasq4 +dlasq5 +dlasq6 +dlasr +dlasrt +dlassq +dlasv2 +dlaswp +dlasy2 +dlasyf +dlatbs +dlatdf +dlatps +dlatrd +dlatrs +dlatrz +dlatzm +dlauu2 +dlauum +dnrm2 +dopgtr +dopmtr +dorg2l +dorg2r +dorgbr +dorghr +dorgl2 +dorglq +dorgql +dorgqr +dorgr2 +dorgrq +dorgtr +dorm2l +dorm2r +dormbr +dormhr +dorml2 +dormlq +dormql +dormqr +dormr2 +dormr3 +dormrq +dormrz +dormtr +dpbcon +dpbequ +dpbrfs +dpbstf +dpbsv +dpbsvx +dpbtf2 +dpbtrf +dpbtrs +dpocon +dpoequ +dporfs +dposv +dposvx +dpotf2 +dpotrf +dpotri +dpotrs +dppcon +dppequ +dpprfs +dppsv +dppsvx +dpptrf +dpptri +dpptrs +dptcon +dpteqr +dptrfs +dptsv +dptsvx +dpttrf +dpttrs +dptts2 +drot +drotg +drscl +dsbev +dsbevd +dsbevx +dsbgst +dsbgv +dsbgvd +dsbgvx +dsbmv +dsbtrd +dscal +dspcon +dspev +dspevd +dspevx +dspgst +dspgv +dspgvd +dspgvx +dspmv +dspr +dspr2 +dsprfs +dspsv +dspsvx +dsptrd +dsptrf +dsptri +dsptrs +dstebz +dstedc +dstegr +dstein +dsteqr +dsterf +dstev +dstevd +dstevr +dstevx +dswap +dsycon +dsyev +dsyevd +dsyevr +dsyevx +dsygs2 +dsygst +dsygv +dsygvd +dsygvx +dsymm +dsymv +dsyr +dsyr2 +dsyr2k +dsyrfs +dsyrk +dsysv +dsysvx +dsytd2 +dsytf2 +dsytrd +dsytrf +dsytri +dsytrs +dtbcon +dtbmv +dtbrfs +dtbsv +dtbtrs +dtgevc +dtgex2 +dtgexc +dtgsen +dtgsja +dtgsna +dtgsy2 +dtgsyl +dtpcon +dtpmv +dtprfs +dtpsv +dtptri +dtptrs +dtrcon +dtrevc +dtrexc +dtrmm +dtrmv +dtrrfs +dtrsen +dtrsm +dtrsna +dtrsv +dtrsyl +dtrti2 +dtrtri +dtrtrs +dtzrqf +dtzrzf +dzasum +dznrm2 +dzsum1 +idamax +ieeeck +ilaenv +izamax +izmax1 +lsame +lsamen +xerbla +zaxpy +zbdsqr +zcopy +zdotc +zdotu +zdrot +zdrscl +zdscal +zgbbrd +zgbcon +zgbequ +zgbmv +zgbrfs +zgbsv +zgbsvx +zgbtf2 +zgbtrf +zgbtrs +zgebak +zgebal +zgebd2 +zgebrd +zgecon +zgeequ +zgees +zgeesx +zgeev +zgeevx +zgegs +zgegv +zgehd2 +zgehrd +zgelq2 +zgelqf +zgels +zgelsd +zgelss +zgelsx +zgelsy +zgemm +zgemv +zgeql2 +zgeqlf +zgeqp3 +zgeqpf +zgeqr2 +zgeqrf +zgerc +zgerfs +zgerq2 +zgerqf +zgeru +zgesc2 +zgesdd +zgesv +zgesvd +zgesvx +zgetc2 +zgetf2 +zgetrf +zgetri +zgetrs +zggbak +zggbal +zgges +zggesx +zggev +zggevx +zggglm +zgghrd +zgglse +zggqrf +zggrqf +zggsvd +zggsvp +zgtcon +zgtrfs +zgtsv +zgtsvx +zgttrf +zgttrs +zgtts2 +zhbev +zhbevd +zhbevx +zhbgst +zhbgv +zhbgvd +zhbgvx +zhbmv +zhbtrd +zhecon +zheev +zheevd +zheevr +zheevx +zhegs2 +zhegst +zhegv +zhegvd +zhegvx +zhemm +zhemv +zher +zher2 +zher2k +zherfs +zherk +zhesv +zhesvx +zhetd2 +zhetf2 +zhetrd +zhetrf +zhetri +zhetrs +zhgeqz +zhpcon +zhpev +zhpevd +zhpevx +zhpgst +zhpgv +zhpgvd +zhpgvx +zhpmv +zhpr +zhpr2 +zhprfs +zhpsv +zhpsvx +zhptrd +zhptrf +zhptri +zhptrs +zhsein +zhseqr +zlabrd +zlacgv +zlacon +zlacp2 +zlacpy +zlacrm +zlacrt +zladiv +zlaed0 +zlaed7 +zlaed8 +zlaein +zlaesy +zlaev2 +zlags2 +zlagtm +zlahef +zlahqr +zlahrd +zlaic1 +zlals0 +zlalsa +zlalsd +zlangb +zlange +zlangt +zlanhb +zlanhe +zlanhp +zlanhs +zlanht +zlansb +zlansp +zlansy +zlantb +zlantp +zlantr +zlapll +zlapmt +zlaqgb +zlaqge +zlaqhb +zlaqhe +zlaqhp +zlaqp2 +zlaqps +zlaqsb +zlaqsp +zlaqsy +zlar1v +zlar2v +zlarcm +zlarf +zlarfb +zlarfg +zlarft +zlarfx +zlargv +zlarnv +zlarrv +zlartg +zlartv +zlarz +zlarzb +zlarzt +zlascl +zlaset +zlasr +zlassq +zlaswp +zlasyf +zlatbs +zlatdf +zlatps +zlatrd +zlatrs +zlatrz +zlatzm +zlauu2 +zlauum +zpbcon +zpbequ +zpbrfs +zpbstf +zpbsv +zpbsvx +zpbtf2 +zpbtrf +zpbtrs +zpocon +zpoequ +zporfs +zposv +zposvx +zpotf2 +zpotrf +zpotri +zpotrs +zppcon +zppequ +zpprfs +zppsv +zppsvx +zpptrf +zpptri +zpptrs +zptcon +zpteqr +zptrfs +zptsv +zptsvx +zpttrf +zpttrs +zptts2 +zrot +zrotg +zscal +zspcon +zspmv +zspr +zsprfs +zspsv +zspsvx +zsptrf +zsptri +zsptrs +zstedc +zstegr +zstein +zsteqr +zswap +zsycon +zsymm +zsymv +zsyr +zsyr2k +zsyrfs +zsyrk +zsysv +zsysvx +zsytf2 +zsytrf +zsytri +zsytrs +ztbcon +ztbmv +ztbrfs +ztbsv +ztbtrs +ztgevc +ztgex2 +ztgexc +ztgsen +ztgsja +ztgsna +ztgsy2 +ztgsyl +ztpcon +ztpmv +ztprfs +ztpsv +ztptri +ztptrs +ztrcon +ztrevc +ztrexc +ztrmm +ztrmv +ztrrfs +ztrsen +ztrsm +ztrsna +ztrsv +ztrsyl +ztrti2 +ztrtri +ztrtrs +ztzrqf +ztzrzf +zung2l +zung2r +zungbr +zunghr +zungl2 +zunglq +zungql +zungqr +zungr2 +zungrq +zungtr +zunm2l +zunm2r +zunmbr +zunmhr +zunml2 +zunmlq +zunmql +zunmqr +zunmr2 +zunmr3 +zunmrq +zunmrz +zunmtr +zupgtr +zupmtr diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/MATLAB/lcc_lib/libmwlapack.lib Binary file liboctave/UMFPACK/UMFPACK/MATLAB/lcc_lib/libmwlapack.lib has changed diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/MATLAB/lu_normest.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/MATLAB/lu_normest.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,106 @@ +function rho = lu_normest (A, L, U) +% LU_NORMEST: estimate the 1-norm of A-L*U without computing L*U +% +% Usage: +% +% rho = lu_normest (A, L, U) +% +% which estimates the computation of the 1-norm: +% +% rho = norm (A-L*U, 1) +% +% Authors: William W. Hager, Math Dept., Univ. of Florida +% Timothy A. Davis, CISE Dept., Univ. of Florida +% Gainesville, FL, 32611, USA. +% based on normest1, contributed on November, 1997 +% +% This code can be quite easily adapted to estimate the 1-norm of any +% matrix E, where E itself is dense or not explicitly represented, but the +% computation of E (and E') times a vector is easy. In this case, our matrix +% of interest is: +% +% E = A-L*U +% +% That is, L*U is the LU factorization of A, where A, L and U +% are sparse. This code works for dense matrices A and L too, +% but it would not be needed in that case, since E is easy to compute +% explicitly. For sparse A, L, and U, computing E explicitly would be quite +% expensive, and thus normest (A-L*U) would be prohibitive. +% +% For a detailed description, see Davis, T. A. and Hager, W. W., +% Modifying a sparse Cholesky factorization, SIAM J. Matrix Analysis and +% Applications, 1999, vol. 20, no. 3, 606-627. + +% The three places that the matrix-vector multiply E*x is used are highlighted. +% Note that E is never formed explicity. + +[m n] = size (A) ; + +if (m ~= n) + % pad A, L, and U with zeros so that they are all square + if (m < n) + U = [ U ; (sparse (n-m,n)) ] ; + L = [ L , (sparse (m,n-m)) ; (sparse (n-m,n)) ] ; + A = [ A ; (sparse (n-m,n)) ] ; + else + U = [ U , (sparse (n,m-n)) ; (sparse (m-n,m)) ] ; + L = [ L , (sparse (m,m-n)) ] ; + A = [ A , (sparse (m,m-n)) ] ; + end +end + +[m n] = size (A) ; + +notvisited = ones (m, 1) ; % nonvisited(j) is zero if j is visited, 1 otherwise +rho = 0 ; % the global rho + +At = A' ; +Lt = L' ; + +for trial = 1:3 % { + + x = notvisited ./ sum (notvisited) ; + rho1 = 0 ; % the current rho for this trial + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %%% COMPUTE Ex1 = E*x EFFICIENTLY: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + Ex1 = (A*x) - L*(U*x) ; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + rho2 = norm (Ex1, 1) ; + + while rho2 > rho1 % { + + rho1 = rho2 ; + y = 2*(Ex1 >= 0) - 1 ; + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %%% COMPUTE z = E'*y EFFICIENTLY: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + z = (A'*y) - U'*(L'*y) ; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + [zj, j] = max (abs (z .* notvisited)) ; + j = j (1) ; + if (abs (z (j)) > z'*x) % { + x = zeros (m, 1) ; + x (j) = 1 ; + notvisited (j) = 0 ; + else % } { + break ; + end % } + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %%% COMPUTE Ex1 = E*x EFFICIENTLY: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + Ex1 = (A*x) - L*(U*x) ; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + rho2 = norm (Ex1, 1) ; + + end % } + + rho = max (rho, rho1) ; + +end % } diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/MATLAB/luflop.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/MATLAB/luflop.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,24 @@ +function f = luflop (L, U) +%LUFLOP +% +% f = luflop (L, U) +% +% Given an LU factorization, compute how many flops took to compute it. This +% is the same as (assuming U has a zero-free diagonal): +% +% Lnz = full (sum (spones (L))) - 1 ; +% Unz = full (sum (spones (U')))' - 1 ; +% f = 2*Lnz*Unz + sum (Lnz) ; +% +% except that no extra workspace is allocated for spones (L) and spones (U). +% L and U must be sparse. +% +% Note: the above expression has a subtle undercount when exact numerical +% cancelation occurs. Try [L,U,P] = lu (sparse (ones (10))) and then +% luflop (L,U). + +% UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. +% All Rights Reserved. Type umfpack_details for License. + +help luflop +error ('luflop mexFunction not found! Use umfpack_make to compile luflop.') ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/MATLAB/luflopmex.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/MATLAB/luflopmex.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,121 @@ +/* ========================================================================== */ +/* === luflop mexFunction ================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + f = luflop (L, U) ; + + Given L and U, compute: + + Lnz = full (sum (spones (L))) - 1 ; + Unz = full (sum (spones (U')))' - 1 ; + f = 2*Lnz*Unz + sum (Lnz) ; + + without allocating O (lunz) space. + +*/ + +#include "mex.h" +#include "matrix.h" + +#ifndef TRUE +#define TRUE (1) +#endif +#ifndef FALSE +#define FALSE (0) +#endif + +void mexFunction +( + int nlhs, /* number of left-hand sides */ + mxArray *plhs [ ], /* left-hand side matrices */ + int nrhs, /* number of right--hand sides */ + const mxArray *prhs [ ] /* right-hand side matrices */ +) +{ + + /* ---------------------------------------------------------------------- */ + /* local variables */ + /* ---------------------------------------------------------------------- */ + + double flop_count ; + double *pflop ; + int *Lp, *Li, *Up, *Ui, *Unz, n, k, row, col, p, Lnz_k, Unz_k ; + mxArray *Lmatrix, *Umatrix ; + + /* ---------------------------------------------------------------------- */ + /* get inputs L, U */ + /* ---------------------------------------------------------------------- */ + + if (nrhs != 2) + { + mexErrMsgTxt ("Usage: f = luflop (L, U)") ; + } + + Lmatrix = (mxArray *) prhs [0] ; + Umatrix = (mxArray *) prhs [1] ; + + n = mxGetM (Lmatrix) ; + if (n != mxGetN (Lmatrix) || n != mxGetM (Umatrix) || n != mxGetN (Umatrix)) + { + mexErrMsgTxt ("Usage: f = luflop (L, U) ; L and U must be square") ; + } + + if (!mxIsSparse (Lmatrix) || !mxIsSparse (Umatrix)) + { + mexErrMsgTxt ("Usage: f = luflop (L, U) ; L and U must be sparse") ; + } + + Lp = mxGetJc (Lmatrix) ; + Li = mxGetIr (Lmatrix) ; + + Up = mxGetJc (Umatrix) ; + Ui = mxGetIr (Umatrix) ; + + Unz = (int *) mxMalloc (n * sizeof (int)) ; + + /* ---------------------------------------------------------------------- */ + /* count the nonzeros in each row of U */ + /* ---------------------------------------------------------------------- */ + + for (row = 0 ; row < n ; row++) + { + Unz [row] = 0 ; + } + for (col = 0 ; col < n ; col++) + { + for (p = Up [col] ; p < Up [col+1] ; p++) + { + row = Ui [p] ; + Unz [row]++ ; + } + } + + /* ---------------------------------------------------------------------- */ + /* count the flops */ + /* ---------------------------------------------------------------------- */ + + flop_count = 0.0 ; + for (k = 0 ; k < n ; k++) + { + /* off-diagonal nonzeros in column k of L: */ + Lnz_k = Lp [k+1] - Lp [k] - 1 ; + Unz_k = Unz [k] - 1 ; + flop_count += (2 * Lnz_k * Unz_k) + Lnz_k ; + } + + /* ---------------------------------------------------------------------- */ + /* return the result */ + /* ---------------------------------------------------------------------- */ + + plhs [0] = mxCreateDoubleMatrix (1, 1, mxREAL) ; + pflop = mxGetPr (plhs [0]) ; + pflop [0] = flop_count ; +} + diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/MATLAB/umfpack.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/MATLAB/umfpack.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,44 @@ +function [out1, out2, out3, out4, out5] = umfpack (in1, in2, in3, in4, in5) +% UMFPACK v4.4 is a MATLAB mexFunction for solving sparse linear systems. +% +% UMFPACK v4.4: | MATLAB approximate equivalent: +% --------------------------------------------------------------------- +% x = umfpack (A, '\', b) ; | x = A \ b +% | +% x = umfpack (b, '/', A) ; | x = b / A +% | +% [L,U,P,Q] = umfpack (A) ; | [m,n] = size (A) ; +% | I = speye (n) ; +% | Q = I (:, colamd (A)) ; +% | [L,U,P] = lu (A*Q) ; +% | +% [L,U,P,Q,R] = umfpack (A) ; | [m,n] = size (A) ; +% | I = speye (n) ; +% | Q = I (:, colamd (A)) ; +% | r = full (sum (abs (A), 2)) ; +% | r (find (r == 0)) = 1 ; +% | R = spdiags (r, 0, m, m) ; +% | [L,U,P] = lu ((R\A)*Q) ; +% | +% [P,Q,F,C] = umfpack (A, 'symbolic') | [m,n] = size (A) ; +% | I = speye (n) ; +% | Q = I (:, colamd (A)) ; +% | [count,h,parent,post] = ... +% | symbfact (A*Q, 'col') ; +% +% A must be sparse. It can be complex, singular, and/or rectangular. A must be +% square for '/' or '\'. b must be a full real or complex vector. For +% [L,U,P,Q,R] = umfpack (A), the factorization is L*U = P*(R\A)*Q. If A has a +% mostly symmetric nonzero pattern, then replace "colamd" with "amd" in the +% MATLAB-equivalent column in the table above. Type umfpack_details for more +% information. +% +% See also: lu_normest, colamd, amd. +% To use UMFPACK for an arbitrary b, see umfpack_solve. + +% UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. +% All Rights Reserved. Type umfpack_details for License. + +help umfpack +error ('umfpack mexFunction not found! Use umfpack_make to compile umfpack.') ; + diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/MATLAB/umfpack_btf.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/MATLAB/umfpack_btf.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,129 @@ +function x = umfpack_btf (A, b, Control) +% UMFPACK_BTF +% +% x = umfpack_btf (A, b, Control) +% +% solve Ax=b by first permuting the matrix A to block triangular form via dmperm +% and then using UMFPACK to factorize each diagonal block. Adjacent 1-by-1 +% blocks are merged into a single upper triangular block, and solved via +% MATLAB's \ operator. The Control parameter is optional (Type umfpack_details +% and umfpack_report for details on its use). A must be square. +% +% See also: umfpack, umfpack_factorize, umfpack_details, dmperm + +% UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. +% All Rights Reserved. Type umfpack_details for License. + +if (nargin < 2) + help umfpack_btf + error ('Usage: x = umfpack_btf (A, b, Control)') ; +end + +[m n] = size (A) ; +if (m ~= n) + help umfpack_btf + error ('umfpack_btf: A must be square') ; +end +[m1 n1] = size (b) ; +if (m1 ~= n) + help umfpack_btf + error ('umfpack_btf: b has the wrong dimensions') ; +end + +if (nargin < 3) + Control = umfpack ; +end + +%------------------------------------------------------------------------------- +% find the block triangular form +%------------------------------------------------------------------------------- + +[p,q,r] = dmperm (A) ; +nblocks = length (r) - 1 ; + +%------------------------------------------------------------------------------- +% solve the system +%------------------------------------------------------------------------------- + +if (nblocks == 1 | sprank (A) < n) + + %--------------------------------------------------------------------------- + % matrix is irreducible or structurally singular + %--------------------------------------------------------------------------- + + x = umfpack_solve (A, '\', b, Control) ; + +else + + %--------------------------------------------------------------------------- + % A (p,q) is in block triangular form + %--------------------------------------------------------------------------- + + b = b (p,:) ; + A = A (p,q) ; + x = zeros (size (b)) ; + + %--------------------------------------------------------------------------- + % merge adjacent singletons into a single upper triangular block + %--------------------------------------------------------------------------- + + [r, nblocks, is_triangular] = merge_singletons (r) ; + + %--------------------------------------------------------------------------- + % solve the system: x (q) = A\b + %--------------------------------------------------------------------------- + + for k = nblocks:-1:1 + + % get the kth block + k1 = r (k) ; + k2 = r (k+1) - 1 ; + + % solve the system + x (k1:k2,:) = solver (A (k1:k2, k1:k2), b (k1:k2,:), ... + is_triangular (k), Control) ; + + % off-diagonal block back substitution + b (1:k1-1,:) = b (1:k1-1,:) - A (1:k1-1, k1:k2) * x (k1:k2,:) ; + + end + + x (q,:) = x ; + +end + +%------------------------------------------------------------------------------- +% merge_singletons +%------------------------------------------------------------------------------- + +function [r, nblocks, is_triangular] = merge_singletons (r) +% +% Given r from [p,q,r] = dmperm (A), where A is square, return a modified r that +% reflects the merger of adjacent singletons into a single upper triangular +% block. is_triangular (k) is 1 if the kth block is upper triangular. nblocks +% is the number of new blocks. + +nblocks = length (r) - 1 ; +bsize = r (2:nblocks+1) - r (1:nblocks) ; +t = [0 (bsize == 1)] ; +z = (t (1:nblocks) == 0 & t (2:nblocks+1) == 1) | t (2:nblocks+1) == 0 ; +y = [(find (z)) nblocks+1] ; +r = r (y) ; +nblocks = length (y) - 1 ; +is_triangular = y (2:nblocks+1) - y (1:nblocks) > 1 ; + +%------------------------------------------------------------------------------- +% solve Ax=b, but check for small and/or triangular systems +%------------------------------------------------------------------------------- + +function x = solver (A, b, is_triangular, Control) +if (is_triangular) + % back substitution only + x = A \ b ; +elseif (size (A,1) < 4) + % a very small matrix, solve it as a dense linear system + x = full (A) \ b ; +else + % solve it as a sparse linear system + x = umfpack_solve (A, '\', b, Control) ; +end diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/MATLAB/umfpack_demo.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/MATLAB/umfpack_demo.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,202 @@ +function umfpack_demo +% UMFPACK DEMO +% +% A demo of UMFPACK for MATLAB. +% +% See also umfpack, umfpack_make, umfpack_details, umfpack_report, +% and umfpack_simple. + +% UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. +% All Rights Reserved. Type umfpack_details for License. + +%------------------------------------------------------------------------------- +% get default control parameters +%------------------------------------------------------------------------------- + +control = umfpack ; +fprintf ('\nEnter the printing level for UMFPACK''s output statistics:\n') ; +fprintf ('0: none, 1: errors only, 2: statistics, 4: print some of outputs\n') ; +c = input ('5: print all output [default is 1]: ') ; +if (isempty (c)) + c = 1 ; +end +control (1) = c ; + +%------------------------------------------------------------------------------- +% solve a simple system +%------------------------------------------------------------------------------- + +fprintf ('\n--------------------------------------------------------------\n') ; +fprintf ('Factor and solve a small system, Ax=b, using default parameters\n') ; +if (control (1) > 1) + fprintf ('(except for verbose printing enabled)\n') ; +end + +load west0067 +A = Problem.A ; +n = size (A, 1) ; +b = rand (n, 1) ; + +fprintf ('Solving Ax=b via UMFPACK:\n') ; +[xu, info] = umfpack (A, '\', b, control) ; +x = xu ; + +fprintf ('Solving Ax=b via MATLAB:\n') ; +xm = A\b ; +x = xm ; + +fprintf ('Difference between UMFPACK and MATLAB solution: %g\n', ... + norm (xu - xm, Inf)) ; + +%------------------------------------------------------------------------------- +% spy the results +%------------------------------------------------------------------------------- + +figure (1) +clf + +subplot (2,3,1) +spy (A) +title ('The matrix A') ; + +subplot (2,3,2) +[P1, Q1, Fr, Ch, Info] = umfpack (A, 'symbolic') ; +treeplot (Fr (1:end-1,2)') ; +title ('Supernodal column elimination tree') ; + +subplot (2,3,3) +spy (P1 * A * Q1) +title ('A, with initial row and column order') ; + +subplot (2,3,4) +fprintf ('\n--------------------------------------------------------------\n') ; +fprintf ('\nFactorizing [L, U, P, Q, R] = umfpack (A)\n') ; +[L, U, P, Q, R] = umfpack (A) ; +spy (P*A*Q) +title ('A, with final row/column order') ; + +fprintf ('\nP * (R\\A) * Q - L*U should be zero:\n') ; +fprintf ('norm (P*(R\\A)*Q - L*U, 1) = %g (exact) %g (estimated)\n', ... + norm (P * (R\A) * Q - L*U, 1), lu_normest (P * (R\A) * Q, L, U)) ; + +fprintf ('\nSolution to Ax=b via UMFPACK factorization:\n') ; +fprintf ('x = Q * (U \\ (L \\ (P * (R \\ b))))\n') ; +xu = Q * (U \ (L \ (P * (R \ b)))) ; +x = xu ; + +fprintf ('\nUMFPACK flop count: %d\n', luflop (L, U)) ; + +subplot (2,3,5) +spy (spones (L) + spones (U)) +title ('UMFPACK LU factors') ; + +subplot (2,3,6) +fprintf ('\nFactorizing [L, U, P] = lu (A (:, q))\n') ; +fprintf ('If you are using a version of MATLAB prior to V6.0, then the\n') ; +fprintf ('following statement (q = colamd (A)) may fail. Either download\n'); +fprintf ('colamd from http://www.cise.ufl.edu/research/sparse, upgrade to\n') ; +fprintf ('MATLAB V6.0 or later, or replace the statement with\n') ; +fprintf ('q = colmmd (A) ;\n') ; +try + q = colamd (A) ; +catch + fprintf ('\n *** colamd not found, using colmmd instead *** \n') ; + q = colmmd (A) ; +end +[L, U, P] = lu (A (:,q)) ; +spy (spones (L) + spones (U)) +title ('MATLAB LU factors') ; + +fprintf ('\nSolution to Ax=b via MATLAB factorization:\n') ; +fprintf ('x = U \\ (L \\ (P * b)) ; x (q) = x ;\n') ; +xm = U \ (L \ (P * b)) ; +xm (q) = xm ; + +fprintf ('Difference between UMFPACK and MATLAB solution: %g\n', ... + norm (xu - xm, Inf)) ; + +fprintf ('\nMATLAB LU flop count: %d\n', luflop (L, U)) ; + +%------------------------------------------------------------------------------- +% solve A'x=b +%------------------------------------------------------------------------------- + +fprintf ('\n--------------------------------------------------------------\n') ; +fprintf ('Solve A''x=b:\n') ; + +fprintf ('Solving A''x=b via UMFPACK:\n') ; +[xu, info] = umfpack (b', '/', A, control) ; +xu = xu' ; + +fprintf ('Solving A''x=b via MATLAB:\n') ; +xm = (b'/A)' ; +x = xm ; + +fprintf ('Difference between UMFPACK and MATLAB solution: %g\n', ... + norm (xu - xm, Inf)) ; + +%------------------------------------------------------------------------------- +% factor A' and then solve Ax=b using the factors of A' +%------------------------------------------------------------------------------- + +fprintf ('\n--------------------------------------------------------------\n') ; +fprintf ('Compute C = A'', and compute the LU factorization of C.\n') ; +fprintf ('Factorizing A'' can sometimes be better than factorizing A itself\n'); +fprintf ('(less work and memory usage). Solve C''x=b; the solution is the\n') ; +fprintf ('same as the solution to Ax=b for the original A.\n'); + +C = A' ; + +% factorize C (P,Q) = L*U +[L, U, P, Q, R, info] = umfpack (C, control) ; + +fprintf ('\nP * (R\\C) * Q - L*U should be zero:\n') ; +fprintf ('norm (P*(R\\C)*Q - L*U, 1) = %g (exact) %g (estimated)\n', ... + norm (P * (R\C) * Q - L*U, 1), lu_normest (P * (R\C) * Q, L, U)) ; + +fprintf ('\nSolution to Ax=b via UMFPACK, using the factors of C:\n') ; +fprintf ('x = R \\ (P'' * (L'' \\ (U'' \\ (Q'' * b)))) ;\n') ; +xu = R \ (P' * (L' \ (U' \ (Q' * b)))) ; +x = xu ; + +fprintf ('Solution to Ax=b via MATLAB:\n') ; +xm = A\b ; +x = xm ; + +fprintf ('Difference between UMFPACK and MATLAB solution: %g\n', ... + norm (xu - xm, Inf)) ; + +%------------------------------------------------------------------------------- +% solve Ax=B +%------------------------------------------------------------------------------- + +fprintf ('\n--------------------------------------------------------------\n') ; +fprintf ('\nSolve AX=B, where B is n-by-10, and sparse\n') ; +B = sprandn (n, 10, 0.05) ; +XU = umfpack_solve (A, '\', B, control) ; +XM = A\B ; + +fprintf ('Difference between UMFPACK and MATLAB solution: %g\n', ... + norm (XU - XM, Inf)) ; + +fprintf ('\n--------------------------------------------------------------\n') ; +fprintf ('\nSolve AX=B, where B is n-by-10, and sparse, using umfpack_btf\n') ; +XU = umfpack_btf (A, B, control) ; + +fprintf ('Difference between UMFPACK and MATLAB solution: %g\n', ... + norm (XU - XM, Inf)) ; + +fprintf ('\n--------------------------------------------------------------\n') ; +fprintf ('\nSolve A''X=B, where B is n-by-10, and sparse\n') ; +XU = umfpack_solve (B', '/', A, control) ; +XM = B'/A ; + +fprintf ('Difference between UMFPACK and MATLAB solution: %g\n', ... + norm (XU - XM, Inf)) ; + +%------------------------------------------------------------------------------- +% compute the determinant +%------------------------------------------------------------------------------- + +fprintf ('\n--------------------------------------------------------------\n') ; +fprintf ('det(A): %g UMFPACK determinant: %g\n', det (A), umfpack (A, 'det')) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/MATLAB/umfpack_demo.m.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/MATLAB/umfpack_demo.m.out Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,76 @@ +>> umfpack_demo + +Enter the printing level for UMFPACK's output statistics: +0: none, 1: errors only, 2: statistics, 4: print some of outputs +5: print all output [default is 1]: + +-------------------------------------------------------------- +Factor and solve a small system, Ax=b, using default parameters +Solving Ax=b via UMFPACK: +Solving Ax=b via MATLAB: +Difference between UMFPACK and MATLAB solution: 0 + +-------------------------------------------------------------- + +Factorizing [L, U, P, Q, R] = umfpack (A) + +P * (R\A) * Q - L*U should be zero: +norm (P*(R\A)*Q - L*U, 1) = 6.80012e-16 (exact) 6.80012e-16 (estimated) + +Solution to Ax=b via UMFPACK factorization: +x = Q * (U \ (L \ (P * (R \ b)))) + +UMFPACK flop count: 2354 + +Factorizing [L, U, P] = lu (A (:, q)) +If you are using a version of MATLAB prior to V6.0, then the +following statement (q = colamd (A)) may fail. Either download +colamd from http://www.cise.ufl.edu/research/sparse, upgrade to +MATLAB V6.0 or later, or replace the statement with +q = colmmd (A) ; + +Solution to Ax=b via MATLAB factorization: +x = U \ (L \ (P * b)) ; x (q) = x ; +Difference between UMFPACK and MATLAB solution: 7.10543e-15 + +MATLAB LU flop count: 3164 + +-------------------------------------------------------------- +Solve A'x=b: +Solving A'x=b via UMFPACK: +Solving A'x=b via MATLAB: +Difference between UMFPACK and MATLAB solution: 2.66454e-15 + +-------------------------------------------------------------- +Compute C = A', and compute the LU factorization of C. +Factorizing A' can sometimes be better than factorizing A itself +(less work and memory usage). Solve C'x=b; the solution is the +same as the solution to Ax=b for the original A. + +P * (R\C) * Q - L*U should be zero: +norm (P*(R\C)*Q - L*U, 1) = 1.94289e-16 (exact) 5.55112e-17 (estimated) + +Solution to Ax=b via UMFPACK, using the factors of C: +x = R \ (P' * (L' \ (U' \ (Q' * b)))) ; +Solution to Ax=b via MATLAB: +Difference between UMFPACK and MATLAB solution: 7.10543e-15 + +-------------------------------------------------------------- + +Solve AX=B, where B is n-by-10, and sparse +Difference between UMFPACK and MATLAB solution: 6.72949e-14 + +-------------------------------------------------------------- + +Solve AX=B, where B is n-by-10, and sparse, using umfpack_btf +Difference between UMFPACK and MATLAB solution: 8.51541e-14 + +-------------------------------------------------------------- + +Solve A'X=B, where B is n-by-10, and sparse +Difference between UMFPACK and MATLAB solution: 7.99291e-14 + +-------------------------------------------------------------- +det(A): -4.07453e-05 UMFPACK determinant: -4.07453e-05 +>> +>> diary off diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/MATLAB/umfpack_details.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/MATLAB/umfpack_details.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,164 @@ +function [out1, out2, out3, out4, out5] = umfpack (in1, in2, in3, in4, in5) +% UMFPACK v4.4: details on each usage. +% +% Factor or solve a sparse linear system, returning either the solution x to +% Ax=b or A'x'=b', the factorization LU=PAQ, or LU=P(R\A)Q. A must be sparse. +% For the solve, A must be square and b must be a dense n-by-1 vector. For LU +% factorization, A can be rectangular. In both cases, A and/or b can be real +% or complex. +% +% UMFPACK analyzes the matrix and selects one of three strategies to factorize +% the matrix. It first finds a set of k initial pivot entries of zero Markowitz +% cost. This forms the first k rows and columns of L and U. The remaining +% submatrix S is then analyzed, based on the symmetry of the nonzero pattern of +% the submatrix and the values on the diagaonal. The strategies include: +% +% (1) unsymmetric: use a COLAMD pre-ordering, a column elimination tree +% post-ordering, refine the column ordering during factorization, +% and make no effort at selecting pivots on the diagonal. +% (2) 2-by-2: like the symmetric strategy (see below), except that local +% row permutations are first made to attempt to place large entries +% on the diagonal. +% (3) symmetric: use an AMD pre-ordering on the matrix S+S', an +% elimination tree post-ordering, do not refine the column ordering +% during factorization, and attempt to select pivots on the diagonal. +% +% Each of the following uses of umfpack (except for "Control = umfpack") is +% stand-alone. That is, no call to umfpack is required for any subsequent +% call. In each usage, the Info output argument is optional. +% +% Usage: +% +% [x, Info] = umfpack (A, '\', b) ; +% [x, Info] = umfpack (A, '\', b, Control) ; +% [x, Info] = umfpack (A, Qinit, '\', b, Control) ; +% [x, Info] = umfpack (A, Qinit, '\', b) ; +% +% Solves Ax=b (similar to x = A\b in MATLAB). +% +% [x, Info] = umfpack (b, '/', A) ; +% [x, Info] = umfpack (b, '/', A, Control) ; +% [x, Info] = umfpack (b, '/', A, Qinit) ; +% [x, Info] = umfpack (b, '/', A, Qinit, Control) ; +% +% Solves A'x'=b' (similar to x = b/A in MATLAB). +% +% [L, U, P, Q, R, Info] = umfpack (A) ; +% [L, U, P, Q, R, Info] = umfpack (A, Control) ; +% [L, U, P, Q, R, Info] = umfpack (A, Qinit) ; +% [L, U, P, Q, R, Info] = umfpack (A, Qinit, Control) ; +% +% Returns the LU factorization of A. P and Q are returned as permutation +% matrices. R is a diagonal sparse matrix of scale factors for the rows +% of A, L is lower triangular, and U is upper triangular. The +% factorization is L*U = P*(R\A)*Q. You can turn off scaling by setting +% Control (17) to zero (in which case R = speye (m)), or by using the +% following syntaxes (in which case Control (17) is ignored): +% +% [L, U, P, Q] = umfpack (A) ; +% [L, U, P, Q] = umfpack (A, Control) ; +% [L, U, P, Q] = umfpack (A, Qinit) ; +% [L, U, P, Q] = umfpack (A, Qinit, Control) ; +% +% Same as above, except that no row scaling is performed. The Info array +% is not returned, either. +% +% [P1, Q1, Fr, Ch, Info] = umfpack (A, 'symbolic') ; +% [P1, Q1, Fr, Ch, Info] = umfpack (A, 'symbolic', Control) ; +% [P1, Q1, Fr, Ch, Info] = umfpack (A, Qinit, 'symbolic') ; +% [P1, Q1, Fr, Ch, Info] = umfpack (A, Qinit, 'symbolic', Control); +% +% Performs only the fill-reducing column pre-ordering (including the +% elimination tree post-ordering) and symbolic factorization. Q1 is the +% initial column permutation (either from colamd, amd, or the input +% ordering Qinit), possibly followed by a column elimination tree post- +% ordering or a symmetric elimination tree post-ordering, depending on +% the strategy used. +% +% For the unsymmetric strategy, P1 is the row ordering induced by Q1 +% (row-merge order). For the 2-by-2 strategy, P1 is the row ordering that +% places large entries on the diagonal of P1*A*Q1. For the symmetric +% strategy, P1 = Q1. +% +% Fr is a (nfr+1)-by-4 array containing information about each frontal +% matrix, where nfr <= n is the number of frontal matrices. Fr (:,1) is +% the number of pivot columns in each front, and Fr (:,2) is the parent +% of each front in the supercolumn elimination tree. Fr (k,2) is zero if +% k is a root. The first Fr (1,1) columns of P1*A*Q1 are the pivot +% columns for the first front, the next Fr (2,1) columns of P1*A*Q1 +% are the pivot columns for the second front, and so on. +% +% For the unsymmetric strategy, Fr (:,3) is the row index of the first +% row in P1*A*Q1 whose leftmost nonzero entry is in a pivot column for +% the kth front. Fr (:,4) is the leftmost descendent of the kth front. +% Rows in the range Fr (Fr (k,4),3) to Fr (k+1,3)-1 form the entire set +% of candidate pivot rows for the kth front (some of these will typically +% have been selected as pivot rows of fronts Fr (k,3) to k-1, before the +% factorization reaches the kth front. If front k is a leaf node, then +% Fr (k,4) is k. +% +% Ch is a (nchains+1)-by-3 array containing information about each "chain" +% (unifrontal sequence) of frontal matrices, and where nchains <= nfr +% is the number of chains. The ith chain consists of frontal matrices. +% Chain (i,1) to Chain (i+1,1)-1, and the largest front in chain i is +% Chain (i,2)-by-Chain (i,3). +% +% This use of umfpack is not required to factor or solve a linear system +% in MATLAB. It analyzes the matrix A and provides information only. +% The MATLAB statement "treeplot (Fr (:,2)')" plots the column elimination +% tree. +% +% Control = umfpack ; +% +% Returns a 20-by-1 vector of default parameter settings for umfpack. +% +% umfpack_report (Control, Info) ; +% +% Prints the current Control settings, and Info +% +% det = umfpack (A, 'det') ; +% [det dexp] = umfpack (A, 'det') ; +% +% Computes the determinant of A. The 2nd form returns the determinant +% in the form det*10^dexp, where det is in the range +/- 1 to 10, +% which helps to avoid overflow/underflow when dexp is out of range of +% normal floating-point numbers. +% +% If present, Qinit is a user-supplied 1-by-n permutation vector. It is an +% initial fill-reducing column pre-ordering for A; if not present, then colamd +% or amd are used instead. If present, Control is a user-supplied 20-by-1 +% array. Control and Info are optional; if Control is not present, defaults +% are used. If a Control entry is NaN, then the default is used for that entry. +% +% +% UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. +% All Rights Reserved. Type umfpack_details for License. +% +% UMFPACK License: +% +% Your use or distribution of UMFPACK or any modified version of +% UMFPACK implies that you agree to this License. +% +% THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY +% EXPRESSED OR IMPLIED. ANY USE IS AT YOUR OWN RISK. +% +% Permission is hereby granted to use or copy this program, 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 UMFPACK or any modified version of UMFPACK 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. This +% software was developed with support from the National Science Foundation, +% and is provided to you free of charge. +% +% Availability: http://www.cise.ufl.edu/research/sparse/umfpack +% +% See also umfpack, umfpack_make, umfpack_report, +% umfpack_demo, and umfpack_simple. + +more on +help umfpack_details +more off + diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/MATLAB/umfpack_make.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/MATLAB/umfpack_make.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,356 @@ +function umfpack_make +% UMFPACK_MAKE +% +% Compiles the UMFPACK mexFunction and then runs a simple demo. +% +% See also: umfpack, umfpack_details, umfpack_report, umfpack_demo, and +% umfpack_simple. +% +% UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. +% All Rights Reserved. Type umfpack_details for License. + +help umfpack_make + +fprintf ('\n--------------------------------------------------------------\n') ; +fprintf ('Now compiling the UMFPACK and AMD mexFunctions.\n') ; +fprintf ('--------------------------------------------------------------\n') ; + +try + % ispc does not appear in MATLAB 5.3 + pc = ispc ; +catch + % if ispc fails, assume we aren't on a Windows PC. + pc = 0 ; +end + +obj = 'o' ; +blas_lib = '' ; +if (pc) + obj = 'obj' ; +end + +%------------------------------------------------------------------------------- +% BLAS option +%------------------------------------------------------------------------------- + +msg = [ ... + '\nUsing the BLAS is faster, but might not compile correctly.\n', ... + 'If you get an error stating that dgemm, dgemv, dger, zgemm,\n', ... + 'zgemv, and/or zger are not defined, then recompile without the\n', ... + 'BLAS. You can ignore warnings that these routines are implicitly\n', ... + 'declared.\n\nPlease select one of the following options: \n', ... + ' 1: attempt to compile with the BLAS (default)\n', ... + ' 2: do not use the BLAS\n'] ; +fprintf (msg) ; +blas = input (': ') ; +if (isempty (blas)) + blas = 1 ; +end +if (blas == 1) + % try to link to MATLAB's built-in BLAS + blas = '' ; + if (pc) + % the default lcc compiler needs this library to access the BLAS + blas_lib = ' libmwlapack.lib' ; + msg = [ ... + '\nCheck to see if you have a file called libmwlapack.lib in the\n', ... + '\\extern\\lib\\win32\\lcc\\ directory, where is ', ... + 'the\ndirectory where MATLAB is installed. If a file of that ', ... + 'name is already\nthere, then you don''t have to do anything. ', ... + 'Otherwise, you must first\ncopy the libmwlapack.lib file from ', ... + 'the umfpack\\lcc_lib\\ directory to the\n', ... + '\\extern\\lib\\win32\\lcc\\ directory. Next, type\n\n', ... + ' mex -setup\n\n', ... + 'at the MATLAB prompt, and ask MATLAB to select the lcc compiler. ',... + 'You can skip\nall of this if you have already done it, or have ', ... + 'configured mex to use\na different compiler. If you are using ', ... + 'Norton anti-virus software on Windows\n98SE, then you need to ', ... + 'exit MATLAB, turn off virus checking, and restart MATLAB\n', ... + 'before you can use the mex command or compile UMFPACK.\n', ... + 'You may also need to turn off virus checking in other cases.\n', ... + '\nHit enter to continue, or type control-C if you do not wish to '] ; + fprintf (msg) ; + input ('proceed: ') ; + end + fprintf ('\nUsing the BLAS (recommended).\n') ; +else + % No BLAS + fprintf ('\nNot using the BLAS. UMFPACK will be slow.\n') ; + blas = ' -DNBLAS' ; +end + +%------------------------------------------------------------------------------- +% -DNUTIL option (using utMalloc or mxMalloc) +%------------------------------------------------------------------------------- + +utils = '' ; + +if (~pc) + msg = [ ... + '--------------------------------------------------------------\n', ... + '\nUMFPACK uses MATLAB''s memory allocation routines. The internal', ... + '\nutMalloc, utFree, and utRealloc allow for better use of memory,', ... + '\nbut they are internal utility routines that are not documented.\n', ... + 'Thus, they might not always work. Using mxMalloc, mxFree, and\n', ... + 'mxRealloc works, but UMFPACK might run out of memory when solving\n', ... + 'problems that it could otherwise solve. Try using the default.\n', ... + 'If you get an error stating that utMalloc, utFree, and/or\n', ... + 'utRealloc are not defined, then recompile with the mx* routines.\n', ... + '\nPlease select one of the following options:\n', ... + ' 1: attempt to use the ut* routines (default)\n', ... + ' 2: use the standard mx* routines\n'] ; + fprintf (msg) ; + utils = input (': ') ; + if (isempty (utils)) + utils = 1 ; + end + if (utils == 2) + fprintf ('\nNot using utMalloc, utFree, or utRealloc\n') ; + utils = ' -DNUTIL' ; + else + fprintf ('\nUsing utMalloc, utFree, and utRealloc\n') ; + utils = '' ; + end +end + +%------------------------------------------------------------------------------- +% -DNPOSIX option (for sysconf and times timer routines) +%------------------------------------------------------------------------------- + +posix = '' ; + +if (~pc) + msg = [ ... + '--------------------------------------------------------------\n', ... + '\nUMFPACK can use the POSIX routines sysconf () and times ()\n', ... + 'to provide CPU time and wallclock time statistics. If you do not\n', ... + 'have a POSIX-compliant operating system, then UMFPACK won''t\n', ... + 'compile. If you don''t know which option to pick, try the\n', ... + 'default. If you get an error saying that sysconf and/or times\n', ... + 'are not defined, then recompile with the non-POSIX option.\n', ... + '\nPlease select one of the following options:\n', ... + ' 1: use POSIX sysconf and times routines (default)\n', ... + ' 2: do not use POSIX routines\n'] ; + fprintf (msg) ; + posix = input (': ') ; + if (isempty (posix)) + posix = 1 ; + end + if (posix == 2) + fprintf ('\nNot using POSIX sysconf and times routines.\n') ; + posix = ' -DNPOSIX' ; + else + fprintf ('\nUsing POSIX sysconf and times routines.\n') ; + posix = '' ; + end +end + +%------------------------------------------------------------------------------- +% mex command +%------------------------------------------------------------------------------- + +umfdir = sprintf ('..%sSource%s', filesep, filesep) ; +amddir = sprintf ('..%s..%sAMD%sSource%s', filesep, filesep, filesep, filesep) ; +incdir = sprintf ( ... +' -I..%sInclude -I..%sSource -I..%s..%sAMD%sInclude -I..%s..%sAMD%sSource', ... +filesep,filesep, filesep, filesep, filesep, filesep, filesep, filesep) ; + +mx = sprintf ('mex -inline -O%s%s%s%s', blas, utils, posix, incdir) ; +msg = [ ... + '--------------------------------------------------------------\n', ... + '\nCompile options:\n%s\nNow compiling. Please wait.\n'] ; +fprintf (msg, mx) ; + +% The following is adapted from GNUmakefile + +%------------------------------------------------------------------------------- +% source files +%------------------------------------------------------------------------------- + +% non-user-callable umf_*.[ch] files: +umfch = { 'assemble', 'blas3_update', ... + 'build_tuples', 'create_element', ... + 'dump', 'extend_front', 'garbage_collection', ... + 'get_memory', 'init_front', 'kernel', ... + 'kernel_init', 'kernel_wrapup', ... + 'local_search', 'lsolve', 'ltsolve', ... + 'mem_alloc_element', 'mem_alloc_head_block', ... + 'mem_alloc_tail_block', 'mem_free_tail_block', ... + 'mem_init_memoryspace', ... + 'report_vector', 'row_search', 'scale_column', ... + 'set_stats', 'solve', 'symbolic_usage', 'transpose', ... + 'tuple_lengths', 'usolve', 'utsolve', 'valid_numeric', ... + 'valid_symbolic', 'grow_front', 'start_front', '2by2', ... + 'store_lu', 'scale' } ; + +% non-user-callable umf_*.[ch] files, int versions only (no real/complex): +umfint = { 'analyze', 'apply_order', 'colamd', 'free', 'fsize', ... + 'is_permutation', 'malloc', 'realloc', 'report_perm', ... + 'singletons' } ; + +% non-user-callable and user-callable amd_*.[ch] files (int versions only): +amd = { 'aat', '1', '2', 'dump', 'postorder', 'post_tree', 'defaults', ... + 'order', 'control', 'info', 'valid', 'preprocess' } ; + +% user-callable umfpack_*.[ch] files (real/complex): +user = { 'col_to_triplet', 'defaults', 'free_numeric', ... + 'free_symbolic', 'get_numeric', 'get_lunz', ... + 'get_symbolic', 'get_determinant', 'numeric', 'qsymbolic', ... + 'report_control', 'report_info', 'report_matrix', ... + 'report_numeric', 'report_perm', 'report_status', ... + 'report_symbolic', 'report_triplet', ... + 'report_vector', 'solve', 'symbolic', ... + 'transpose', 'triplet_to_col', 'scale' ... + 'load_numeric', 'save_numeric', 'load_symbolic', 'save_symbolic' } ; + +% user-callable umfpack_*.[ch], only one version +generic = { 'timer', 'tictoc' } ; + +M = cell (0) ; + +%------------------------------------------------------------------------------- +% Create the umfpack and amd mexFunctions for MATLAB (int versions only) +%------------------------------------------------------------------------------- + +for k = 1:length(umfint) + M = make (M, '%s -DDINT -c %sumf_%s.c', 'umf_%s.%s', 'umf_%s_%s.%s', ... + mx, umfint {k}, umfint {k}, 'm', obj, umfdir) ; +end + +rules = { [mx ' -DDINT'] , [mx ' -DZINT'] } ; +kinds = { 'md', 'mz' } ; + +for what = 1:2 + + rule = rules {what} ; + kind = kinds {what} ; + + M = make (M, '%s -DCONJUGATE_SOLVE -c %sumf_%s.c', 'umf_%s.%s', ... + 'umf_%s_%s.%s', rule, 'ltsolve', 'lhsolve', kind, obj, umfdir) ; + + M = make (M, '%s -DCONJUGATE_SOLVE -c %sumf_%s.c', 'umf_%s.%s', ... + 'umf_%s_%s.%s', rule, 'utsolve', 'uhsolve', kind, obj, umfdir) ; + + M = make (M, '%s -DDO_MAP -c %sumf_%s.c', 'umf_%s.%s', ... + 'umf_%s_%s_map_nox.%s', rule, 'triplet', 'triplet', kind, obj, umfdir) ; + + M = make (M, '%s -DDO_VALUES -c %sumf_%s.c', 'umf_%s.%s', ... + 'umf_%s_%s_nomap_x.%s', rule, 'triplet', 'triplet', kind, obj, umfdir) ; + + M = make (M, '%s -c %sumf_%s.c', 'umf_%s.%s', ... + 'umf_%s_%s_nomap_nox.%s', rule, 'triplet', 'triplet', kind, obj, ... + umfdir) ; + + M = make (M, '%s -DDO_MAP -DDO_VALUES -c %sumf_%s.c', 'umf_%s.%s', ... + 'umf_%s_%s_map_x.%s', rule, 'triplet', 'triplet', kind, obj, umfdir) ; + + M = make (M, '%s -DFIXQ -c %sumf_%s.c', 'umf_%s.%s', ... + 'umf_%s_%s_fixq.%s', rule, 'assemble', 'assemble', kind, obj, umfdir) ; + + M = make (M, '%s -DDROP -c %sumf_%s.c', 'umf_%s.%s', ... + 'umf_%s_%s_drop.%s', rule, 'store_lu', 'store_lu', kind, obj, umfdir) ; + + for k = 1:length(umfch) + M = make (M, '%s -c %sumf_%s.c', 'umf_%s.%s', 'umf_%s_%s.%s', ... + rule, umfch {k}, umfch {k}, kind, obj, umfdir) ; + end + + M = make (M, '%s -DWSOLVE -c %sumfpack_%s.c', 'umfpack_%s.%s', ... + 'umfpack_%s_w%s.%s', rule, 'solve', 'solve', kind, obj, umfdir) ; + + for k = 1:length(user) + M = make (M, '%s -c %sumfpack_%s.c', 'umfpack_%s.%s', ... + 'umfpack_%s_%s.%s', rule, user {k}, user {k}, kind, obj, umfdir) ; + end +end + +for k = 1:length(generic) + M = make (M, '%s -c %sumfpack_%s.c', 'umfpack_%s.%s', ... + 'umfpack_%s_%s.%s', mx, generic {k}, generic {k}, 'm', obj, umfdir) ; +end + +%---------------------------------------- +% AMD routines (int only) +%---------------------------------------- + +for k = 1:length(amd) + M = make (M, '%s -DDINT -c %samd_%s.c', 'amd_%s.%s', 'amd_%s_%s.%s', ... + mx, amd {k}, amd {k}, 'm', obj, amddir) ; +end + +%---------------------------------------- +% compile the umfpack mexFunction +%---------------------------------------- + +C = sprintf ('%s -output umfpack umfpackmex.c', mx) ; +for i = 1:length (M) + C = [C ' ' (M {i})] ; +end +C = [C ' ' blas_lib] ; +cmd (C) ; + +%---------------------------------------- +% delete the object files +%---------------------------------------- + +for i = 1:length (M) + rmfile (M {i}) ; +end + +%---------------------------------------- +% compile the luflop mexFunction +%---------------------------------------- + +cmd (sprintf ('%s -output luflop luflopmex.c', mx)) ; + +fprintf ('\n\nCompilation has completed. Now trying the umfpack_simple demo.\n'); +umfpack_simple + +%------------------------------------------------------------------------------- +% rmfile: delete a file, but only if it exists +%------------------------------------------------------------------------------- + +function rmfile (file) +if (length (dir (file)) > 0) + delete (file) ; +end + +%------------------------------------------------------------------------------- +% cpfile: copy the src file to the filename dst, overwriting dst if it exists +%------------------------------------------------------------------------------- + +function cpfile (src, dst) +rmfile (dst) +if (length (dir (src)) == 0) + help umfpack_make + error (sprintf ('File does not exist: %s\n', src)) ; +end +copyfile (src, dst) ; + +%------------------------------------------------------------------------------- +% mvfile: move the src file to the filename dst, overwriting dst if it exists +%------------------------------------------------------------------------------- + +function mvfile (src, dst) +cpfile (src, dst) ; +rmfile (src) ; + +%------------------------------------------------------------------------------- +% cmd: display and execute a command +%------------------------------------------------------------------------------- + +function cmd (s) +fprintf ('.') ; +eval (s) ; + +%------------------------------------------------------------------------------- +% make: execute a "make" command for a source file +%------------------------------------------------------------------------------- + +function M = make (M, s, src, dst, rule, file1, file2, kind, obj, srcdir) +cmd (sprintf (s, rule, srcdir, file1)) ; +src = sprintf (src, file1, obj) ; +dst = sprintf (dst, kind, file2, obj) ; +mvfile (src, dst) ; +M {end + 1} = dst ; + diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/MATLAB/umfpack_report.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/MATLAB/umfpack_report.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,346 @@ +function umfpack_report (Control, Info) +% UMFPACK_REPORT +% +% umfpack_report (Control, Info) ; +% +% Prints the current Control settings for umfpack, and the statistical +% information returned by umfpack in the Info array. If Control is +% an empty matrix, then the default control settings are printed. +% +% Control is 20-by-1, and Info is 90-by-1. Not all entries are used. +% +% Alternative usages: +% +% umfpack_report ([ ], Info) ; print the default control parameters +% and the Info array. +% umfpack_report (Control) ; print the control parameters only. +% umfpack_report ; print the default control parameters +% and an empty Info array. +% +% See also umfpack, umfpack_make, umfpack_details, +% umfpack_demo, and umfpack_simple. + +% UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. +% All Rights Reserved. Type umfpack_details for License. + +%------------------------------------------------------------------------------- +% get inputs, use defaults if input arguments not present +%------------------------------------------------------------------------------- + +% The contents of Control and Info are defined in umfpack.h +if (nargin < 1) + Control = [] ; +end +if (nargin < 2) + Info = [] ; +end +if (isempty (Control)) + Control = umfpack ; +end +if (isempty (Info)) + Info = [ 0 (-ones (1, 89)) ] ; +end + +%------------------------------------------------------------------------------- +% control settings +%------------------------------------------------------------------------------- + +fprintf ('\nUMFPACK Version 4.4: Control settings:\n\n') ; +fprintf (' Control (1): print level: %d\n', Control (1)) ; +fprintf (' Control (2): dense row parameter: %g\n', Control (2)) ; +fprintf (' "dense" rows have > max (16, (%g)*16*sqrt(n_col)) entries\n', Control (2)) ; +fprintf (' Control (3): dense column parameter: %g\n', Control (3)) ; +fprintf (' "dense" columns have > max (16, (%g)*16*sqrt(n_row)) entries\n', Control (3)) ; +fprintf (' Control (4): pivot tolerance: %g\n', Control (4)) ; +fprintf (' Control (5): max block size for dense matrix kernels: %d\n', Control (5)) ; +prstrat (' Control (6): strategy: %g ', Control (6)) ; +fprintf (' Control (7): initial allocation ratio: %g\n', Control (7)) ; +fprintf (' Control (8): max iterative refinement steps: %d\n', Control (8)) ; +fprintf (' Control (13): 2-by-2 pivot tolerance: %g\n', Control (13)) ; +fprintf (' Control (14): Q fixed during numeric factorization: %g ', Control (14)) ; +if (Control (14) > 0) + fprintf ('(yes)\n') ; +elseif (Control (14) < 0) + fprintf ('(no)\n') ; +else + fprintf ('(auto)\n') ; +end +fprintf (' Control (15): AMD dense row/column parameter: %g\n', Control (15)) ; +fprintf (' "dense" rows/columns in A+A'' have > max (16, (%g)*sqrt(n)) entries.\n', Control (15)) ; +fprintf (' Only used if the AMD ordering is used.\n') ; +fprintf (' Control (16): diagonal pivot tolerance: %g\n', Control (16)) ; +fprintf (' Only used if diagonal pivoting is attempted.\n') ; + +fprintf (' Control (17): scaling option: %g ', Control (17)) ; +if (Control (17) == 0) + fprintf ('(none)\n') ; +elseif (Control (17) == 2) + fprintf ('(scale the matrix by\n') ; + fprintf (' dividing each row by max. abs. value in each row)\n') ; +else + fprintf ('(scale the matrix by\n') ; + fprintf (' dividing each row by sum of abs. values in each row)\n') ; +end + +fprintf (' Control (18): frontal matrix allocation ratio: %g\n', Control (18)) ; +fprintf (' Control (19): drop tolerance: %g\n', Control (19)) ; +fprintf (' Control (20): AMD and COLAMD aggressive absorption: %g ', Control (20)) ; +yes_no (Control (20)) ; + +% compile-time options: + +fprintf ('\n The following options can only be changed at compile-time:\n') ; + +if (Control (9) == 1) + fprintf (' Control (9): compiled to use the BLAS\n') ; +else + fprintf (' Control (9): compiled without the BLAS\n') ; + fprintf (' (you will not get the best possible performance)\n') ; +end + +if (Control (10) == 1) + fprintf (' Control (10): compiled for MATLAB\n') ; +elseif (Control (10) == 2) + fprintf (' Control (10): compiled for MATLAB\n') ; + fprintf (' Uses internal utMalloc, utFree, utRealloc, utPrintf\n') ; + fprintf (' utDivideComplex, and utFdlibm_hypot routines.\n') ; +else + fprintf (' Control (10): not compiled for MATLAB\n') ; + fprintf (' Uses ANSI C malloc, free, realloc, and printf\n') ; + fprintf (' instead of mxMalloc, mxFree, mxRealloc, and mexPrintf.\n') ; + fprintf (' Printing will be in terms of 0-based matrix indexing,\n') ; + fprintf (' not 1-based as is expected in MATLAB. Diary output may\n') ; + fprintf (' not be properly recorded.\n') ; +end + +if (Control (11) == 2) + fprintf (' Control (11): uses POSIX times ( ) to get CPU time and wallclock time.\n') ; +elseif (Control (11) == 1) + fprintf (' Control (11): uses getrusage to get CPU time.\n') ; +else + fprintf (' Control (11): uses ANSI C clock to get CPU time.\n') ; + fprintf (' The CPU time may wrap around, type "help cputime".\n') ; +end + +if (Control (12) == 1) + fprintf (' Control (12): compiled with debugging enabled\n') ; + fprintf (' ###########################################\n') ; + fprintf (' ### This will be exceedingly slow! ########\n') ; + fprintf (' ###########################################\n') ; + if (Control (10) == 1) + fprintf (' Uses mxAssert.\n') ; + elseif (Control (10) == 2) + fprintf (' Uses utAssert.\n') ; + else + fprintf (' Uses ANSI C assert instead of mxAssert.\n') ; + end +else + fprintf (' Control (12): compiled for normal operation (no debugging)\n') ; +end + +%------------------------------------------------------------------------------- +% Info: +%------------------------------------------------------------------------------- + +if (nargin == 1) + return +end + +status = Info (1) ; +fprintf ('\nUMFPACK status: Info (1): %d, ', status) ; + +if (status == 0) + fprintf ('OK\n') ; +elseif (status == 1) + fprintf ('WARNING matrix is singular\n') ; +elseif (status == -1) + fprintf ('ERROR out of memory\n') ; +elseif (status == -3) + fprintf ('ERROR numeric LU factorization is invalid\n') ; +elseif (status == -4) + fprintf ('ERROR symbolic LU factorization is invalid\n') ; +elseif (status == -5) + fprintf ('ERROR required argument is missing\n') ; +elseif (status == -6) + fprintf ('ERROR n <= 0\n') ; +elseif (status <= -7 & status >= -12 | status == -14) + fprintf ('ERROR matrix A is corrupted\n') ; +elseif (status == -13) + fprintf ('ERROR invalid system\n') ; +elseif (status == -15) + fprintf ('ERROR invalid permutation\n') ; +elseif (status == -911) + fprintf ('ERROR internal error!\n') ; + fprintf ('Please report this error to Tim Davis (davis@cise.ufl.edu)\n') ; +else + fprintf ('ERROR unrecognized error. Info array corrupted\n') ; +end + +fprintf (' (a -1 means the entry has not been computed):\n') ; + +fprintf ('\n Basic statistics:\n') ; +fprintf (' Info (2): %d, # of rows of A\n', Info (2)) ; +fprintf (' Info (17): %d, # of columns of A\n', Info (17)) ; +fprintf (' Info (3): %d, nnz (A)\n', Info (3)) ; +fprintf (' Info (4): %d, Unit size, in bytes, for memory usage reported below\n', Info (4)) ; +fprintf (' Info (5): %d, size of int (in bytes)\n', Info (5)) ; +fprintf (' Info (6): %d, size of long (in bytes)\n', Info (6)) ; +fprintf (' Info (7): %d, size of pointer (in bytes)\n', Info (7)) ; +fprintf (' Info (8): %d, size of numerical entry (in bytes)\n', Info (8)) ; + +fprintf ('\n Pivots with zero Markowitz cost removed to obtain submatrix S:\n') ; +fprintf (' Info (57): %d, # of pivots with one entry in pivot column\n', Info (57)) ; +fprintf (' Info (58): %d, # of pivots with one entry in pivot row\n', Info (58)) ; +fprintf (' Info (59): %d, # of rows/columns in submatrix S (if square)\n', Info (59)) ; +fprintf (' Info (60): %d ') ; +if (Info (60) > 0) + fprintf ('submatrix S square and diagonal preserved\n') ; +elseif (Info (60) == 0) + fprintf ('submatrix S not square or diagonal not preserved\n') ; +else + fprintf ('\n') ; +end +fprintf (' Info (9): %d, # of "dense" rows in S\n', Info (9)) ; +fprintf (' Info (10): %d, # of empty rows in S\n', Info (10)) ; +fprintf (' Info (11): %d, # of "dense" columns in S\n', Info (11)) ; +fprintf (' Info (12): %d, # of empty columns in S\n', Info (12)) ; +fprintf (' Info (34): %g, symmetry of pattern of S\n', Info (34)) ; +fprintf (' Info (35): %d, # of off-diagonal nonzeros in S+S''\n', Info (35)) ; +fprintf (' Info (36): %d, nnz (diag (S))\n', Info (36)) ; + +fprintf ('\n 2-by-2 pivoting to place large entries on diagonal:\n') ; +fprintf (' Info (52): %d, # of small diagonal entries of S\n', Info (52)) ; +fprintf (' Info (53): %d, # of unmatched small diagonal entries\n', Info (53)) ; +fprintf (' Info (54): %g, symmetry of P2*S\n', Info (54)) ; +fprintf (' Info (55): %d, # of off-diagonal entries in (P2*S)+(P2*S)''\n', Info (55)) ; +fprintf (' Info (56): %d, nnz (diag (P2*S))\n', Info (56)) ; + +fprintf ('\n AMD results, for strict diagonal pivoting:\n') ; +fprintf (' Info (37): %d, est. nz in L and U\n', Info (37)) ; +fprintf (' Info (38): %g, est. flop count\n', Info (38)) ; +fprintf (' Info (39): %g, # of "dense" rows in S+S''\n', Info (39)) ; +fprintf (' Info (40): %g, est. max. nz in any column of L\n', Info (40)) ; + +fprintf ('\n Final strategy selection, based on the analysis above:\n') ; +prstrat (' Info (19): %d, strategy used ', Info (19)) ; +fprintf (' Info (20): %d, ordering used ', Info (20)) ; +if (Info (20) == 0) + fprintf ('(COLAMD on A)\n') ; +elseif (Info (20) == 1) + fprintf ('(AMD on A+A'')\n') ; +elseif (Info (20) == 2) + fprintf ('(provided by user)\n') ; +else + fprintf ('(undefined ordering option)\n') ; +end +fprintf (' Info (32): %d, Q fixed during numeric factorization: ', Info (32)) ; +yes_no (Info (32)) ; +fprintf (' Info (33): %d, prefer diagonal pivoting: ', Info (33)) ; +yes_no (Info (33)) ; + +fprintf ('\n symbolic analysis time and memory usage:\n') ; +fprintf (' Info (13): %d, defragmentations during symbolic analysis\n', Info (13)) ; +fprintf (' Info (14): %d, memory used during symbolic analysis (Units)\n', Info (14)) ; +fprintf (' Info (15): %d, final size of symbolic factors (Units)\n', Info (15)) ; +fprintf (' Info (16): %.2f, symbolic analysis CPU time (seconds)\n', Info (16)) ; +fprintf (' Info (18): %.2f, symbolic analysis wall clock time (seconds)\n', Info (18)) ; + +fprintf ('\n Estimates computed in the symbolic analysis:\n') ; +fprintf (' Info (21): %d, est. size of LU factors (Units)\n', Info (21)) ; +fprintf (' Info (22): %d, est. total peak memory usage (Units)\n', Info (22)) ; +fprintf (' Info (23): %d, est. factorization flop count\n', Info (23)) ; +fprintf (' Info (24): %d, est. nnz (L)\n', Info (24)) ; +fprintf (' Info (25): %d, est. nnz (U)\n', Info (25)) ; +fprintf (' Info (26): %d, est. initial size, variable-part of LU (Units)\n', Info (26)) ; +fprintf (' Info (27): %d, est. peak size, of variable-part of LU (Units)\n', Info (27)) ; +fprintf (' Info (28): %d, est. final size, of variable-part of LU (Units)\n', Info (28)) ; +fprintf (' Info (29): %d, est. max frontal matrix size (# of entries)\n', Info (29)) ; +fprintf (' Info (30): %d, est. max # of rows in frontal matrix\n', Info (30)) ; +fprintf (' Info (31): %d, est. max # of columns in frontal matrix\n', Info (31)) ; + +fprintf ('\n Computed in the numeric factorization (estimates shown above):\n') ; +fprintf (' Info (41): %d, size of LU factors (Units)\n', Info (41)) ; +fprintf (' Info (42): %d, total peak memory usage (Units)\n', Info (42)) ; +fprintf (' Info (43): %d, factorization flop count\n', Info (43)) ; +fprintf (' Info (44): %d, nnz (L)\n', Info (44)) ; +fprintf (' Info (45): %d, nnz (U)\n', Info (45)) ; +fprintf (' Info (46): %d, initial size of variable-part of LU (Units)\n', Info (46)) ; +fprintf (' Info (47): %d, peak size of variable-part of LU (Units)\n', Info (47)) ; +fprintf (' Info (48): %d, final size of variable-part of LU (Units)\n', Info (48)) ; +fprintf (' Info (49): %d, max frontal matrix size (# of numerical entries)\n', Info (49)) ; +fprintf (' Info (50): %d, max # of rows in frontal matrix\n', Info (50)) ; +fprintf (' Info (51): %d, max # of columns in frontal matrix\n', Info (51)) ; + +fprintf ('\n Computed in the numeric factorization (no estimates computed a priori):\n') ; +fprintf (' Info (61): %d, defragmentations during numeric factorization\n', Info (61)) ; +fprintf (' Info (62): %d, reallocations during numeric factorization\n', Info (62)) ; +fprintf (' Info (63): %d, costly reallocations during numeric factorization\n', Info (63)) ; +fprintf (' Info (64): %d, integer indices in compressed pattern of L and U\n', Info (64)) ; +fprintf (' Info (65): %d, numerical values stored in L and U\n', Info (65)) ; +fprintf (' Info (66): %.2f, numeric factorization CPU time (seconds)\n', Info (66)) ; +fprintf (' Info (76): %.2f, numeric factorization wall clock time (seconds)\n', Info (76)) ; +if (Info (66) > 0.05 & Info (43) > 0) +fprintf (' mflops in numeric factorization phase: %.2f\n', 1e-6 * Info (43) / Info (66)) ; +end +fprintf (' Info (67): %d, nnz (diag (U))\n', Info (67)) ; +fprintf (' Info (68): %g, reciprocal condition number estimate\n', Info (68)) ; +fprintf (' Info (69): %g, matrix was ', Info (69)) ; +if (Info (69) == 0) + fprintf ('not scaled\n') ; +elseif (Info (69) == 2) + fprintf ('scaled (row max)\n') ; +else + fprintf ('scaled (row sum)\n') ; +end +fprintf (' Info (70): %g, min. scale factor of rows of A\n', Info (70)) ; +fprintf (' Info (71): %g, max. scale factor of rows of A\n', Info (71)) ; +fprintf (' Info (72): %g, min. abs. on diagonal of U\n', Info (72)) ; +fprintf (' Info (73): %g, max. abs. on diagonal of U\n', Info (73)) ; +fprintf (' Info (74): %g, initial allocation parameter used\n', Info (74)) ; +fprintf (' Info (75): %g, # of forced updates due to frontal growth\n', Info (75)) ; +fprintf (' Info (77): %d, # of off-diaogonal pivots\n', Info (77)) ; +fprintf (' Info (78): %d, nnz (L), if no small entries dropped\n', Info (78)) ; +fprintf (' Info (79): %d, nnz (U), if no small entries dropped\n', Info (79)) ; +fprintf (' Info (80): %d, # of small entries dropped\n', Info (80)) ; + +fprintf ('\n Computed in the solve step:\n') ; +fprintf (' Info (81): %d, iterative refinement steps taken\n', Info (81)) ; +fprintf (' Info (82): %d, iterative refinement steps attempted\n', Info (82)) ; +fprintf (' Info (83): %g, omega(1), sparse-backward error estimate\n', Info (83)) ; +fprintf (' Info (84): %g, omega(2), sparse-backward error estimate\n', Info (84)) ; +fprintf (' Info (85): %d, solve flop count\n', Info (85)) ; +fprintf (' Info (86): %.2f, solve CPU time (seconds)\n', Info (86)) ; +fprintf (' Info (87): %.2f, solve wall clock time (seconds)\n', Info (87)) ; + +fprintf ('\n Info (88:90): unused\n\n') ; + +%------------------------------------------------------------------------------- + +function prstrat (fmt, strategy) +fprintf (fmt, strategy) ; +if (strategy == 1) + fprintf ('(unsymmetric)\n') ; + fprintf (' Q = COLAMD (A), Q refined during numerical\n') ; + fprintf (' factorization, and no attempt at diagonal pivoting.\n') ; +elseif (strategy == 2) + fprintf ('(symmetric, with 2-by-2 pivoting)\n') ; + fprintf (' P2 = row permutation to place large values on the diagonal\n') ; + fprintf (' Q = AMD (P2*A+(P2*A)''), Q not refined during numeric factorization,\n') ; + fprintf (' and diagonal pivoting attempted.\n') ; +elseif (strategy == 3) + fprintf ('(symmetric)\n') ; + fprintf (' Q = AMD (A+A''), Q not refined during numeric factorization,\n') ; + fprintf (' and diagonal pivoting (P=Q'') attempted.\n') ; +else + strategy = 0 ; + fprintf ('(auto)\n') ; +end + +%------------------------------------------------------------------------------- + +function yes_no (s) +if (s == 0) + fprintf ('(no)\n') ; +else + fprintf ('(yes)\n') ; +end diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/MATLAB/umfpack_simple.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/MATLAB/umfpack_simple.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,61 @@ +% umfpack_simple: a simple demo of UMFPACK +% +% UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. +% All Rights Reserved. Type umfpack_details for License. +% +% UMFPACK License: +% +% Your use or distribution of UMFPACK or any modified version of +% UMFPACK implies that you agree to this License. +% +% THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY +% EXPRESSED OR IMPLIED. ANY USE IS AT YOUR OWN RISK. +% +% Permission is hereby granted to use or copy this program, 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 UMFPACK or any modified version of UMFPACK 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. This +% software was developed with support from the National Science Foundation, +% and is provided to you free of charge. +% +% Availability: http://www.cise.ufl.edu/research/sparse/umfpack +% +% See also: umfpack, umfpack_details + +help umfpack_simple +i = input ('Hit enter to agree to the above License: ', 's') ; +if (~isempty (i)) + error ('terminating') ; +end + +format short + +A = [ + 2 3 0 0 0 + 3 0 4 0 6 + 0 -1 -3 2 0 + 0 0 1 0 0 + 0 4 2 0 1 +] + +A = sparse (A) ; + +b = [8 45 -3 3 19]' + +fprintf ('Solution to Ax=b via UMFPACK:\n') ; +fprintf ('x1 = umfpack (A, ''\\'', b)\n') ; + +x1 = umfpack (A, '\', b) + +fprintf ('Solution to Ax=b via MATLAB:\n') ; +fprintf ('x2 = A\\b\n') ; + +x2 = A\b + +fprintf ('norm (x1-x2) should be small: %g\n', norm (x1-x2)) ; + +fprintf ('Type ''umfpack_demo'' for a full demo of UMFPACK\n') ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/MATLAB/umfpack_simple.m.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/MATLAB/umfpack_simple.m.out Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,75 @@ +>> umfpack_simple + umfpack_simple: a simple demo of UMFPACK + + UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. + All Rights Reserved. Type umfpack_details for License. + + UMFPACK License: + + Your use or distribution of UMFPACK or any modified version of + UMFPACK implies that you agree to this License. + + THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY + EXPRESSED OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + + Permission is hereby granted to use or copy this program, 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 UMFPACK or any modified version of UMFPACK 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. This + software was developed with support from the National Science Foundation, + and is provided to you free of charge. + + Availability: http://www.cise.ufl.edu/research/sparse/umfpack + + See also: umfpack, umfpack_details + + + +Hit enter to agree to the above License: + +A = + + 2 3 0 0 0 + 3 0 4 0 6 + 0 -1 -3 2 0 + 0 0 1 0 0 + 0 4 2 0 1 + + +b = + + 8 + 45 + -3 + 3 + 19 + +Solution to Ax=b via UMFPACK: +x1 = umfpack (A, '\', b) + +x1 = + + 1.0000 + 2.0000 + 3.0000 + 4.0000 + 5.0000 + +Solution to Ax=b via MATLAB: +x2 = A\b + +x2 = + + 1.0000 + 2.0000 + 3.0000 + 4.0000 + 5.0000 + +norm (x1-x2) should be small: 1.28037e-15 +Type 'umfpack_demo' for a full demo of UMFPACK +>> diary off diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/MATLAB/umfpack_solve.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/MATLAB/umfpack_solve.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,96 @@ +function x = umfpack_solve (arg1, op, arg2, Control) +% UMFPACK_SOLVE +% +% x = umfpack_solve (A, '\', b, Control) +% x = umfpack_solve (b, '/', A, Control) +% +% Computes x = A\b, or b/A, where A is square. Uses UMFPACK if A is sparse. +% The Control argument is optional. +% +% See also umfpack, umfpack_make, umfpack_details, umfpack_report, +% and umfpack_simple. + +% UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. +% All Rights Reserved. Type umfpack_details for License. + +%------------------------------------------------------------------------------- +% check inputs and get default control parameters +%------------------------------------------------------------------------------- + +if (op == '\') + A = arg1 ; + b = arg2 ; +elseif (op == '/') + A = arg2 ; + b = arg1 ; +else + help umfack_solve + error ('umfpack_solve: unrecognized operator') ; +end + +[m n] = size (A) ; +if (m ~= n) + help umfpack_solve + error ('umfpack_solve: A must be square') ; +end + +[m1 n1] = size (b) ; +if ((op == '\' & n ~= m1) | (op == '/' & n1 ~= m)) + help umfpack_solve + error ('umfpack_solve: b has the wrong dimensions') ; +end + +if (nargin < 4) + Control = umfpack ; +end + +%------------------------------------------------------------------------------- +% solve the system +%------------------------------------------------------------------------------- + +if (op == '\') + + if (~issparse (A)) + + % A is not sparse, so just use MATLAB + x = A\b ; + + elseif (n1 == 1 & ~issparse (b)) + + % the UMFPACK '\' requires b to be a dense column vector + x = umfpack (A, '\', b, Control) ; + + else + + % factorize with UMFPACK and do the forward/back solves in MATLAB + [L, U, P, Q, R] = umfpack (A, Control) ; + x = Q * (U \ (L \ (P * (R \ b)))) ; + + end + +else + + if (~issparse (A)) + + % A is not sparse, so just use MATLAB + x = b/A ; + + elseif (m1 == 1 & ~issparse (b)) + + % the UMFPACK '\' requires b to be a dense column vector + x = umfpack (b, '/', A, Control) ; + + else + + % factorize with UMFPACK and do the forward/back solves in MATLAB + % this mimics the behavior of x = b/A, except for the row scaling + [L, U, P, Q, R] = umfpack (A.', Control) ; + x = (Q * (U \ (L \ (P * (R \ (b.')))))).' ; + + % an alternative method: + % [L, U, P, Q, r] = umfpack (A, Control) ; + % x = (R \ (P' * (L.' \ (U.' \ (Q' * b.'))))).' ; + + end + +end diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/MATLAB/umfpack_test.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/MATLAB/umfpack_test.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,152 @@ +% UMFPACK_TEST: test UMFPACK solve: b/A, A\b with iterative refinement +% Requires the UFsparse package for downloading matrices from the UF +% sparse matrix library. +% +% UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. +% All Rights Reserved. Type umfpack_details for License. + +index = UFget ; + +f = find (index.nrows == index.ncols) ; +[ignore, i] = sort (index.nrows (f)) ; +f = f (i) ; + +Control = umfpack ; +Control (1) = 0 ; + +warning ('off', 'all') ; +figure (1) +clf + + +for i = f + + fprintf ('\nmatrix: %s %s %d\n', index.Group{i}, index.Name{i}, index.nrows(i)) ; + + Prob = UFget (i) ; + A = Prob.A ; + n = size (A,1) ; + + b = rand (1,n) ; + c = b' ; + + try + + %----------------------------------------------------------------------- + % symbolic factorization + %----------------------------------------------------------------------- + + [P1, Q1, Fr, Ch, Info] = umfpack (A, 'symbolic') ; + subplot (2,2,1) + spy (A) + title ('A') + + subplot (2,2,2) + treeplot (Fr (1:end-1,2)') ; + title ('supercolumn etree') + + %----------------------------------------------------------------------- + % P(R\A)Q = LU + %----------------------------------------------------------------------- + + [L,U,P,Q,R,Info] = umfpack (A) ; + err = lu_normest (P*(R\A)*Q, L, U) ; + fprintf ('norm est PR\\AQ-LU: %g relative: %g\n', ... + err, err / norm (A,1)) ; + + subplot (2,2,3) + spy (P*A*Q) + title ('PAQ') ; + + cs = Info (57) ; + rs = Info (58) ; + + subplot (2,2,4) + hold off + spy (L|U) + hold on + if (cs > 0) + plot ([0 cs n n 0] + .5, [0 cs cs 0 0]+.5, 'c') ; + end + if (rs > 0) + plot ([0 rs rs 0 0] + cs +.5, [cs cs+rs n n cs]+.5, 'r') ; + end + + title ('LU factors') + drawnow + + %----------------------------------------------------------------------- + % PAQ = LU + %----------------------------------------------------------------------- + + [L,U,P,Q] = umfpack (A) ; + err = lu_normest (P*A*Q, L, U) ; + fprintf ('norm est PAQ-LU: %g relative: %g\n', ... + err, err / norm (A,1)) ; + + %----------------------------------------------------------------------- + % solve + %----------------------------------------------------------------------- + + x1 = b/A ; + y1 = A\c ; + m1 = norm (b-x1*A) ; + m2 = norm (A*y1-c) ; + + % factor the transpose + Control (8) = 2 ; + [x, info] = umfpack (A', '\', c, Control) ; + lunz0 = info (44) + info (45) - info (67) ; + r = norm (A'*x-c) ; + + fprintf (':: %8.2e matlab: %8.2e %8.2e\n', r, m1, m2) ; + + % factor the original matrix and solve xA=b + for ir = 0:4 + Control (8) = ir ; + [x, info] = umfpack (b, '/', A, Control) ; + r = norm (b-x*A) ; + if (ir == 0) + lunz1 = info (44) + info (45) - info (67) ; + end + fprintf ('%d: %8.2e %d %d\n', ir, r, info (81), info (82)) ; + end + + % factor the original matrix and solve Ax=b + for ir = 0:4 + Control (8) = ir ; + [x, info] = umfpack (A, '\', c, Control) ; + r = norm (A*x-c) ; + fprintf ('%d: %8.2e %d %d\n', ir, r, info (81), info (82)) ; + end + + fprintf ('lunz trans %12d no trans: %12d trans/notrans: %10.4f\n', ... + lunz0, lunz1, lunz0 / lunz1) ; + + %----------------------------------------------------------------------- + % get the determinant + %----------------------------------------------------------------------- + + det1 = det (A) ; + det2 = umfpack (A, 'det') ; + [det3 dexp3] = umfpack (A, 'det') ; + err = abs (det1-det2) ; + err3 = abs (det1 - (det3 * 10^dexp3)) ; + denom = det1 ; + if (denom == 0) + denom = 1 ; + end + err = err / denom ; + err3 = err3 / denom ; + fprintf ('det: %24.16e + (%24.16e)i MATLAB\n', real(det1), imag(det1)) ; + fprintf ('det: %24.16e + (%24.16e)i umfpack\n',real(det2), imag(det2)) ; + fprintf ('det: (%24.16e + (%24.16e)i) * 10^(%g) umfpack\n', real(det3), imag(det3), dexp3) ; + fprintf ('diff %g %g\n', err, err3) ; + + catch + fprintf ('failed\n') ; + end + +% pause + +end diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/MATLAB/umfpackmex.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/MATLAB/umfpackmex.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,1364 @@ +/* ========================================================================== */ +/* === UMFPACK mexFunction ================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + MATLAB interface for umfpack. + + Factor or solve a sparse linear system, returning either the solution + x to Ax=b or A'x'=b', or the factorization LU=P(R\A)Q or LU=PAQ. A must be + sparse, with nonzero dimensions, but it may be complex, singular, and/or + rectangular. b must be a dense n-by-1 vector (real or complex). + L is unit lower triangular, U is upper triangular, and R is diagonal. + P and Q are permutation matrices (permutations of an identity matrix). + + The matrix A is scaled, by default. Each row i is divided by r (i), where + r (i) is the sum of the absolute values of the entries in that row. The + scaled matrix has an infinity norm of 1. The scale factors r (i) are + returned in a diagonal sparse matrix. If the factorization is: + + [L, U, P, Q, R] = umfpack (A) ; + + then the factorization is + + L*U = P * (R \ A) * Q + + This is safer than returning a matrix R such that L*U = P*R*A*Q, because + it avoids the division by small entries. If r(i) is subnormal, multiplying + by 1/r(i) would result in an IEEE Infinity, but dividing by r(i) is safe. + + The factorization + + [L, U, P, Q] = umfpack (A) ; + + returns LU factors such that L*U = P*A*Q, with no scaling. + + See umfpack.m, umfpack_details.m, and umfpack.h for details. + + Note that this mexFunction accesses only the user-callable UMFPACK routines. + Thus, is also provides another example of how user C code can access + UMFPACK. + + If NO_TRANSPOSE_FORWARD_SLASH is not defined at compile time, then the + forward slash (/) operator acts almost like x = b/A in MATLAB 6.1. It is + solved by factorizing the array transpose, and then x = (A.'\b.').' is + solved. This is the default behavior (for historical reasons), since + factorizing A can behave perform much differently than factorizing its + transpose. + + If NO_TRANSPOSE_FORWARD_SLASH is defined at compile time, then the forward + slash operator does not act like x=b/A in MATLAB 6.1. It is solved by + factorizing A, and then solving via the transposed L and U matrices. + The solution is still x = (A.'\b.').', except that A is factorized instead + of A.'. + + Modified for v4.3.1, Jan 10, 2005: default has been changed to + NO_TRANSPOSE_FORWARD_SLASH, to test iterative refinement for b/A. + v4.4: added method for computing the determinant. +*/ +#define NO_TRANSPOSE_FORWARD_SLASH /* default has changed for v4.3.1 */ + +#include "umfpack.h" +#include "mex.h" +#include "matrix.h" +#include +#include +#include + +#define MIN(a,b) (((a) < (b)) ? (a) : (b)) +#define MAX(a,b) (((a) > (b)) ? (a) : (b)) +#define STRING_MATCH(s1,s2) (strcmp ((s1), (s2)) == 0) +#ifndef TRUE +#define TRUE (1) +#endif +#ifndef FALSE +#define FALSE (0) +#endif + +/* ========================================================================== */ +/* === error ================================================================ */ +/* ========================================================================== */ + +/* Return an error message */ + +static void error +( + char *s, + int A_is_complex, + int nargout, + mxArray *pargout [ ], + double Control [UMFPACK_CONTROL], + double Info [UMFPACK_INFO], + int status, + int do_info +) +{ + int i ; + double *OutInfo ; + if (A_is_complex) + { + umfpack_zi_report_status (Control, status) ; + umfpack_zi_report_info (Control, Info) ; + } + else + { + umfpack_di_report_status (Control, status) ; + umfpack_di_report_info (Control, Info) ; + } + if (do_info > 0) + { + /* return Info */ + pargout [do_info] = mxCreateDoubleMatrix (1, UMFPACK_INFO, mxREAL) ; + OutInfo = mxGetPr (pargout [do_info]) ; + for (i = 0 ; i < UMFPACK_INFO ; i++) + { + OutInfo [i] = Info [i] ; + } + } + mexErrMsgTxt (s) ; +} + + +/* ========================================================================== */ +/* === UMFPACK ============================================================== */ +/* ========================================================================== */ + +void mexFunction +( + int nargout, /* number of outputs */ + mxArray *pargout [ ], /* output arguments */ + int nargin, /* number of inputs */ + const mxArray *pargin [ ] /* input arguments */ +) +{ + + /* ---------------------------------------------------------------------- */ + /* local variables */ + /* ---------------------------------------------------------------------- */ + + double Info [UMFPACK_INFO], Control [UMFPACK_CONTROL], dx, dz, dexp ; + double *Lx, *Lz, *Ux, *Uz, *Ax, *Az, *Bx, *Bz, *Xx, *Xz, *User_Control, + *p, *q, *OutInfo, *p1, *p2, *p3, *p4, *Ltx, *Ltz, *Rs, *Px, *Qx ; + void *Symbolic, *Numeric ; + int *Lp, *Li, *Up, *Ui, *Ap, *Ai, *P, *Q, do_solve, lnz, unz, nn, i, + transpose, size, do_info, do_numeric, *Front_npivcol, op, k, *Rp, *Ri, + *Front_parent, *Chain_start, *Chain_maxrows, *Chain_maxcols, nz, status, + nfronts, nchains, *Ltp, *Ltj, *Qinit, print_level, status2, no_scale, + *Front_1strow, *Front_leftmostdesc, n_row, n_col, n_inner, sys, + ignore1, ignore2, ignore3, A_is_complex, B_is_complex, X_is_complex, + *Pp, *Pi, *Qp, *Qi, do_recip, do_det ; + mxArray *Amatrix, *Bmatrix, *User_Control_matrix, *User_Qinit ; + char *operator, *operation ; + mxComplexity Atype, Xtype ; + char warning [200] ; + +#ifndef NO_TRANSPOSE_FORWARD_SLASH + int *Cp, *Ci ; + double *Cx, *Cz ; +#endif + + /* ---------------------------------------------------------------------- */ + /* get inputs A, b, and the operation to perform */ + /* ---------------------------------------------------------------------- */ + + User_Control_matrix = (mxArray *) NULL ; + User_Qinit = (mxArray *) NULL ; + + do_info = 0 ; + do_solve = FALSE ; + do_numeric = TRUE ; + transpose = FALSE ; + no_scale = FALSE ; + do_det = FALSE ; + + /* find the operator */ + op = 0 ; + for (i = 0 ; i < nargin ; i++) + { + if (mxIsChar (pargin [i])) + { + op = i ; + break ; + } + } + + if (op > 0) + { + operator = mxArrayToString (pargin [op]) ; + + if (STRING_MATCH (operator, "\\")) + { + + /* -------------------------------------------------------------- */ + /* matrix left divide, x = A\b */ + /* -------------------------------------------------------------- */ + + /* + [x, Info] = umfpack (A, '\', b) ; + [x, Info] = umfpack (A, '\', b, Control) ; + [x, Info] = umfpack (A, Qinit, '\', b, Control) ; + [x, Info] = umfpack (A, Qinit, '\', b) ; + */ + + operation = "x = A\\b" ; + do_solve = TRUE ; + Amatrix = (mxArray *) pargin [0] ; + Bmatrix = (mxArray *) pargin [op+1] ; + + if (nargout == 2) + { + do_info = 1 ; + } + if (op == 2) + { + User_Qinit = (mxArray *) pargin [1] ; + } + if ((op == 1 && nargin == 4) || (op == 2 && nargin == 5)) + { + User_Control_matrix = (mxArray *) pargin [nargin-1] ; + } + if (nargin < 3 || nargin > 5 || nargout > 2) + { + mexErrMsgTxt ("wrong number of arguments") ; + } + + } + else if (STRING_MATCH (operator, "/")) + { + + /* -------------------------------------------------------------- */ + /* matrix right divide, x = b/A */ + /* -------------------------------------------------------------- */ + + /* + [x, Info] = umfpack (b, '/', A) ; + [x, Info] = umfpack (b, '/', A, Control) ; + [x, Info] = umfpack (b, '/', A, Qinit) ; + [x, Info] = umfpack (b, '/', A, Qinit, Control) ; + */ + + operation = "x = b/A" ; + do_solve = TRUE ; + transpose = TRUE ; + Amatrix = (mxArray *) pargin [2] ; + Bmatrix = (mxArray *) pargin [0] ; + + if (nargout == 2) + { + do_info = 1 ; + } + if (nargin == 5) + { + User_Qinit = (mxArray *) pargin [3] ; + User_Control_matrix = (mxArray *) pargin [4] ; + } + else if (nargin == 4) + { + /* Control is k-by-1 where k > 1, Qinit is 1-by-n */ + if (mxGetM (pargin [3]) == 1) + { + User_Qinit = (mxArray *) pargin [3] ; + } + else + { + User_Control_matrix = (mxArray *) pargin [3] ; + } + } + else if (nargin < 3 || nargin > 5 || nargout > 2) + { + mexErrMsgTxt ("wrong number of arguments") ; + } + + } + else if (STRING_MATCH (operator, "symbolic")) + { + + /* -------------------------------------------------------------- */ + /* symbolic factorization only */ + /* -------------------------------------------------------------- */ + + /* + [P Q Fr Ch Info] = umfpack (A, 'symbolic') ; + [P Q Fr Ch Info] = umfpack (A, 'symbolic', Control) ; + [P Q Fr Ch Info] = umfpack (A, Qinit, 'symbolic') ; + [P Q Fr Ch Info] = umfpack (A, Qinit, 'symbolic', Control) ; + */ + + operation = "symbolic factorization" ; + do_numeric = FALSE ; + Amatrix = (mxArray *) pargin [0] ; + + if (nargout == 5) + { + do_info = 4 ; + } + if (op == 2) + { + User_Qinit = (mxArray *) pargin [1] ; + } + if ((op == 1 && nargin == 3) || (op == 2 && nargin == 4)) + { + User_Control_matrix = (mxArray *) pargin [nargin-1] ; + } + if (nargin < 2 || nargin > 4 || nargout > 5 || nargout < 4) + { + mexErrMsgTxt ("wrong number of arguments") ; + } + + } + else if (STRING_MATCH (operator, "det")) + { + + /* -------------------------------------------------------------- */ + /* compute the determinant */ + /* -------------------------------------------------------------- */ + + /* + * [det] = umfpack (A, 'det') ; + * [dmantissa dexp] = umfpack (A, 'det') ; + */ + + operation = "determinant" ; + do_det = TRUE ; + Amatrix = (mxArray *) pargin [0] ; + if (nargin > 2 || nargout > 2) + { + mexErrMsgTxt ("wrong number of arguments") ; + } + + } + else + { + mexErrMsgTxt ("operator must be '/', '\\', or 'symbolic'") ; + } + mxFree (operator) ; + + } + else if (nargin > 0) + { + + /* ------------------------------------------------------------------ */ + /* LU factorization */ + /* ------------------------------------------------------------------ */ + + /* + with scaling: + [L, U, P, Q, R, Info] = umfpack (A) ; + [L, U, P, Q, R, Info] = umfpack (A, Qinit) ; + + scaling determined by Control settings: + [L, U, P, Q, R, Info] = umfpack (A, Control) ; + [L, U, P, Q, R, Info] = umfpack (A, Qinit, Control) ; + + with no scaling: + [L, U, P, Q] = umfpack (A) ; + [L, U, P, Q] = umfpack (A, Control) ; + [L, U, P, Q] = umfpack (A, Qinit) ; + [L, U, P, Q] = umfpack (A, Qinit, Control) ; + */ + + operation = "numeric factorization" ; + Amatrix = (mxArray *) pargin [0] ; + + no_scale = nargout <= 4 ; + + if (nargout == 6) + { + do_info = 5 ; + } + if (nargin == 3) + { + User_Qinit = (mxArray *) pargin [1] ; + User_Control_matrix = (mxArray *) pargin [2] ; + } + else if (nargin == 2) + { + /* Control is k-by-1 where k > 1, Qinit is 1-by-n */ + if (mxGetM (pargin [1]) == 1) + { + User_Qinit = (mxArray *) pargin [1] ; + } + else + { + User_Control_matrix = (mxArray *) pargin [1] ; + } + } + else if (nargin > 3 || nargout > 6 || nargout < 4) + { + mexErrMsgTxt ("wrong number of arguments") ; + } + + } + else + { + + /* ------------------------------------------------------------------ */ + /* return default control settings */ + /* ------------------------------------------------------------------ */ + + /* + Control = umfpack ; + umfpack ; + */ + + if (nargout > 1) + { + mexErrMsgTxt ("wrong number of arguments") ; + } + + pargout [0] = mxCreateDoubleMatrix (UMFPACK_CONTROL, 1, mxREAL) ; + User_Control = mxGetPr (pargout [0]) ; + umfpack_di_defaults (User_Control) ; + + return ; + } + + /* ---------------------------------------------------------------------- */ + /* check inputs */ + /* ---------------------------------------------------------------------- */ + + if (mxGetNumberOfDimensions (Amatrix) != 2) + { + mexErrMsgTxt ("input matrix A must be 2-dimensional") ; + } + n_row = mxGetM (Amatrix) ; + n_col = mxGetN (Amatrix) ; + nn = MAX (n_row, n_col) ; + n_inner = MIN (n_row, n_col) ; + if (do_solve && n_row != n_col) + { + mexErrMsgTxt ("input matrix A must square for '\\' or '/'") ; + } + if (!mxIsSparse (Amatrix)) + { + mexErrMsgTxt ("input matrix A must be sparse") ; + } + if (n_row == 0 || n_col == 0) + { + mexErrMsgTxt ("input matrix A cannot have zero rows or zero columns") ; + } + + /* The real/complex status of A determines which version to use, */ + /* (umfpack_di_* or umfpack_zi_*). */ + A_is_complex = mxIsComplex (Amatrix) ; + Atype = A_is_complex ? mxCOMPLEX : mxREAL ; + Ap = mxGetJc (Amatrix) ; + Ai = mxGetIr (Amatrix) ; + Ax = mxGetPr (Amatrix) ; + Az = mxGetPi (Amatrix) ; + + if (do_solve) + { + + if (n_row != n_col) + { + mexErrMsgTxt ("A must be square for \\ or /") ; + } + if (transpose) + { + if (mxGetM (Bmatrix) != 1 || mxGetN (Bmatrix) != nn) + { + mexErrMsgTxt ("b has the wrong dimensions") ; + } + } + else + { + if (mxGetM (Bmatrix) != nn || mxGetN (Bmatrix) != 1) + { + mexErrMsgTxt ("b has the wrong dimensions") ; + } + } + if (mxGetNumberOfDimensions (Bmatrix) != 2) + { + mexErrMsgTxt ("input matrix b must be 2-dimensional") ; + } + if (mxIsSparse (Bmatrix)) + { + mexErrMsgTxt ("input matrix b cannot be sparse") ; + } + if (mxGetClassID (Bmatrix) != mxDOUBLE_CLASS) + { + mexErrMsgTxt ("input matrix b must double precision matrix") ; + } + + B_is_complex = mxIsComplex (Bmatrix) ; + Bx = mxGetPr (Bmatrix) ; + Bz = mxGetPi (Bmatrix) ; + + X_is_complex = A_is_complex || B_is_complex ; + Xtype = X_is_complex ? mxCOMPLEX : mxREAL ; + } + + /* ---------------------------------------------------------------------- */ + /* set the Control parameters */ + /* ---------------------------------------------------------------------- */ + + if (A_is_complex) + { + umfpack_zi_defaults (Control) ; + } + else + { + umfpack_di_defaults (Control) ; + } + if (User_Control_matrix) + { + if (mxGetClassID (User_Control_matrix) != mxDOUBLE_CLASS || + mxIsSparse (User_Control_matrix)) + { + mexErrMsgTxt ("Control must be a dense real matrix") ; + } + size = UMFPACK_CONTROL ; + size = MIN (size, mxGetNumberOfElements (User_Control_matrix)) ; + User_Control = mxGetPr (User_Control_matrix) ; + for (i = 0 ; i < size ; i++) + { + Control [i] = User_Control [i] ; + } + } + + if (no_scale) + { + /* turn off scaling for [L, U, P, Q] = umfpack (A) ; + * ignoring the input value of Control (24) for the usage + * [L, U, P, Q] = umfpack (A, Control) ; */ + Control [UMFPACK_SCALE] = UMFPACK_SCALE_NONE ; + } + + if (mxIsNaN (Control [UMFPACK_PRL])) + { + print_level = UMFPACK_DEFAULT_PRL ; + } + else + { + print_level = (int) Control [UMFPACK_PRL] ; + } + + Control [UMFPACK_PRL] = print_level ; + + /* ---------------------------------------------------------------------- */ + /* get Qinit, if present */ + /* ---------------------------------------------------------------------- */ + + if (User_Qinit) + { + if (mxGetM (User_Qinit) != 1 || mxGetN (User_Qinit) != n_col) + { + mexErrMsgTxt ("Qinit must be 1-by-n_col") ; + } + if (mxGetNumberOfDimensions (User_Qinit) != 2) + { + mexErrMsgTxt ("input Qinit must be 2-dimensional") ; + } + if (mxIsComplex (User_Qinit)) + { + mexErrMsgTxt ("input Qinit must not be complex") ; + } + if (mxGetClassID (User_Qinit) != mxDOUBLE_CLASS) + { + mexErrMsgTxt ("input Qinit must be a double matrix") ; + } + if (mxIsSparse (User_Qinit)) + { + mexErrMsgTxt ("input Qinit must be dense") ; + } + Qinit = (int *) mxMalloc (n_col * sizeof (int)) ; + p = mxGetPr (User_Qinit) ; + for (k = 0 ; k < n_col ; k++) + { + /* convert from 1-based to 0-based indexing */ + Qinit [k] = ((int) (p [k])) - 1 ; + } + + } + else + { + /* umfpack_*_qsymbolic will call colamd to get Qinit. This is the */ + /* same as calling umfpack_*_symbolic with Qinit set to NULL*/ + Qinit = (int *) NULL ; + } + + /* ---------------------------------------------------------------------- */ + /* report the inputs A and Qinit */ + /* ---------------------------------------------------------------------- */ + + if (print_level >= 2) + { + /* print the operation */ + mexPrintf ("\numfpack: %s\n", operation) ; + } + + if (A_is_complex) + { + umfpack_zi_report_control (Control) ; + if (print_level >= 3) mexPrintf ("\nA: ") ; + (void) umfpack_zi_report_matrix (n_row, n_col, Ap, Ai, Ax, Az, + 1, Control) ; + if (Qinit) + { + if (print_level >= 3) mexPrintf ("\nQinit: ") ; + (void) umfpack_zi_report_perm (n_col, Qinit, Control) ; + } + } + else + { + umfpack_di_report_control (Control) ; + if (print_level >= 3) mexPrintf ("\nA: ") ; + (void) umfpack_di_report_matrix (n_row, n_col, Ap, Ai, Ax, + 1, Control) ; + if (Qinit) + { + if (print_level >= 3) mexPrintf ("\nQinit: ") ; + (void) umfpack_di_report_perm (n_col, Qinit, Control) ; + } + } + +#ifndef NO_TRANSPOSE_FORWARD_SLASH + /* ---------------------------------------------------------------------- */ + /* create the array transpose for x = b/A */ + /* ---------------------------------------------------------------------- */ + + if (transpose) + { + /* note that in this case A will be square (nn = n_row = n_col) */ + /* x = (A.'\b.').' will be computed */ + + /* make sure Ci and Cx exist, avoid malloc of zero-sized arrays. */ + nz = MAX (Ap [nn], 1) ; + + Cp = (int *) mxMalloc ((nn+1) * sizeof (int)) ; + Ci = (int *) mxMalloc (nz * sizeof (int)) ; + Cx = (double *) mxMalloc (nz * sizeof (double)) ; + if (A_is_complex) + { + Cz = (double *) mxMalloc (nz * sizeof (double)) ; + status = umfpack_zi_transpose (nn, nn, Ap, Ai, Ax, Az, + (int *) NULL, (int *) NULL, Cp, Ci, Cx, Cz, FALSE) ; + } + else + { + status = umfpack_di_transpose (nn, nn, Ap, Ai, Ax, + (int *) NULL, (int *) NULL, Cp, Ci, Cx) ; + } + + if (status != UMFPACK_OK) + { + error ("transpose of A failed", A_is_complex, nargout, pargout, + Control, Info, status, do_info); + return ; + } + + /* modify pointers so that C will be factorized and solved, not A */ + Ap = Cp ; + Ai = Ci ; + Ax = Cx ; + if (A_is_complex) + { + Az = Cz ; + } + } +#endif + + /* ---------------------------------------------------------------------- */ + /* perform the symbolic factorization */ + /* ---------------------------------------------------------------------- */ + + if (A_is_complex) + { + status = umfpack_zi_qsymbolic (n_row, n_col, Ap, Ai, Ax, Az, + Qinit, &Symbolic, Control, Info) ; + } + else + { + status = umfpack_di_qsymbolic (n_row, n_col, Ap, Ai, Ax, + Qinit, &Symbolic, Control, Info) ; + } + + if (Qinit) + { + mxFree (Qinit) ; + } + + if (status < 0) + { + error ("symbolic factorization failed", A_is_complex, nargout, pargout, + Control, Info, status, do_info) ; + return ; + } + + /* ---------------------------------------------------------------------- */ + /* report the Symbolic object */ + /* ---------------------------------------------------------------------- */ + + if (A_is_complex) + { + (void) umfpack_zi_report_symbolic (Symbolic, Control) ; + } + else + { + (void) umfpack_di_report_symbolic (Symbolic, Control) ; + } + + /* ---------------------------------------------------------------------- */ + /* perform numeric factorization, or just return symbolic factorization */ + /* ---------------------------------------------------------------------- */ + + if (do_numeric) + { + + /* ------------------------------------------------------------------ */ + /* perform the numeric factorization */ + /* ------------------------------------------------------------------ */ + + if (A_is_complex) + { + status = umfpack_zi_numeric (Ap, Ai, Ax, Az, Symbolic, &Numeric, + Control, Info) ; + } + else + { + status = umfpack_di_numeric (Ap, Ai, Ax, Symbolic, &Numeric, + Control, Info) ; + } + + /* ------------------------------------------------------------------ */ + /* free the symbolic factorization */ + /* ------------------------------------------------------------------ */ + + if (A_is_complex) + { + umfpack_zi_free_symbolic (&Symbolic) ; + } + else + { + umfpack_di_free_symbolic (&Symbolic) ; + } + + /* ------------------------------------------------------------------ */ + /* report the Numeric object */ + /* ------------------------------------------------------------------ */ + + if (status < 0) + { + error ("numeric factorization failed", A_is_complex, nargout, + pargout, Control, Info, status, do_info); + return ; + } + + if (A_is_complex) + { + (void) umfpack_zi_report_numeric (Numeric, Control) ; + } + else + { + (void) umfpack_di_report_numeric (Numeric, Control) ; + } + + /* ------------------------------------------------------------------ */ + /* return the solution, determinant, or the factorization */ + /* ------------------------------------------------------------------ */ + + if (do_solve) + { + /* -------------------------------------------------------------- */ + /* solve Ax=b or A'x'=b', and return just the solution x */ + /* -------------------------------------------------------------- */ + +#ifndef NO_TRANSPOSE_FORWARD_SLASH + if (transpose) + { + /* A.'x.'=b.' gives the same x=b/A as solving A'x'=b' */ + /* since C=A.' was factorized, solve with sys = UMFPACK_A */ + /* since x and b are vectors, x.' and b.' are implicit */ + pargout [0] = mxCreateDoubleMatrix (1, nn, Xtype) ; + } + else + { + pargout [0] = mxCreateDoubleMatrix (nn, 1, Xtype) ; + } + sys = UMFPACK_A ; +#else + if (transpose) + { + /* If A is real, A'x=b is the same as A.'x=b. */ + /* x and b are vectors, so x and b are the same as x' and b'. */ + /* If A is complex, then A.'x.'=b.' gives the same solution x */ + /* as the complex conjugate transpose. If we used the A'x=b */ + /* option in umfpack_*_solve, we would have to form b' on */ + /* input and x' on output (negating the imaginary part). */ + /* We can save this work by just using the A.'x=b option in */ + /* umfpack_*_solve. Then, forming x.' and b.' is implicit, */ + /* since x and b are just vectors anyway. */ + /* In both cases, the system to solve is A.'x=b */ + pargout [0] = mxCreateDoubleMatrix (1, nn, Xtype) ; + sys = UMFPACK_Aat ; + } + else + { + pargout [0] = mxCreateDoubleMatrix (nn, 1, Xtype) ; + sys = UMFPACK_A ; + } +#endif + + /* -------------------------------------------------------------- */ + /* print the right-hand-side, B */ + /* -------------------------------------------------------------- */ + + if (print_level >= 3) mexPrintf ("\nright-hand side, b: ") ; + if (B_is_complex) + { + (void) umfpack_zi_report_vector (nn, Bx, Bz, Control) ; + } + else + { + (void) umfpack_di_report_vector (nn, Bx, Control) ; + } + + /* -------------------------------------------------------------- */ + /* solve the system */ + /* -------------------------------------------------------------- */ + + Xx = mxGetPr (pargout [0]) ; + Xz = mxGetPi (pargout [0]) ; + status2 = UMFPACK_OK ; + + if (A_is_complex) + { + if (!B_is_complex) + { + /* umfpack_zi_solve expects a complex B */ + Bz = (double *) mxCalloc (nn, sizeof (double)) ; + } + status = umfpack_zi_solve (sys, Ap, Ai, Ax, Az, Xx, Xz, Bx, Bz, + Numeric, Control, Info) ; + if (!B_is_complex) + { + mxFree (Bz) ; + } + } + else + { + if (B_is_complex) + { + /* Ax=b when b is complex and A is sparse can be split */ + /* into two systems, A*xr=br and A*xi=bi, where r denotes */ + /* the real part and i the imaginary part of x and b. */ + status2 = umfpack_di_solve (sys, Ap, Ai, Ax, Xz, Bz, + Numeric, Control, Info) ; + } + status = umfpack_di_solve (sys, Ap, Ai, Ax, Xx, Bx, + Numeric, Control, Info) ; + } + +#ifndef NO_TRANSPOSE_FORWARD_SLASH + /* -------------------------------------------------------------- */ + /* free the transposed matrix C */ + /* -------------------------------------------------------------- */ + + if (transpose) + { + mxFree (Cp) ; + mxFree (Ci) ; + mxFree (Cx) ; + if (A_is_complex) + { + mxFree (Cz) ; + } + } +#endif + + /* -------------------------------------------------------------- */ + /* free the Numeric object */ + /* -------------------------------------------------------------- */ + + if (A_is_complex) + { + umfpack_zi_free_numeric (&Numeric) ; + } + else + { + umfpack_di_free_numeric (&Numeric) ; + } + + /* -------------------------------------------------------------- */ + /* check error status */ + /* -------------------------------------------------------------- */ + + if (status < 0 || status2 < 0) + { + mxDestroyArray (pargout [0]) ; + error ("solve failed", A_is_complex, nargout, pargout, Control, + Info, status, do_info) ; + return ; + } + + /* -------------------------------------------------------------- */ + /* print the solution, X */ + /* -------------------------------------------------------------- */ + + if (print_level >= 3) mexPrintf ("\nsolution, x: ") ; + if (X_is_complex) + { + (void) umfpack_zi_report_vector (nn, Xx, Xz, Control) ; + } + else + { + (void) umfpack_di_report_vector (nn, Xx, Control) ; + } + + /* -------------------------------------------------------------- */ + /* warn about singular or near-singular matrices */ + /* -------------------------------------------------------------- */ + + /* no warning is given if Control (1) is zero */ + + if (Control [UMFPACK_PRL] >= 1) + { + if (status == UMFPACK_WARNING_singular_matrix) + { + sprintf (warning, "matrix is singular\n" + "Try increasing Control (%d) and Control (%d).\n" + "(Suppress this warning with Control (%d) = 0.)\n", + 1+UMFPACK_PIVOT_TOLERANCE, + 1+UMFPACK_SYM_PIVOT_TOLERANCE, + 1+UMFPACK_PRL) ; + mexWarnMsgTxt (warning) ; + } + else if (Info [UMFPACK_RCOND] < DBL_EPSILON) + { + sprintf (warning, "matrix is nearly singular, rcond = %g\n" + "Try increasing Control (%d) and Control (%d).\n" + "(Suppress this warning with Control (%d) = 0.)\n", + Info [UMFPACK_RCOND], + 1+UMFPACK_PIVOT_TOLERANCE, + 1+UMFPACK_SYM_PIVOT_TOLERANCE, + 1+UMFPACK_PRL) ; + mexWarnMsgTxt (warning) ; + } + } + + } + else if (do_det) + { + + /* -------------------------------------------------------------- */ + /* get the determinant */ + /* -------------------------------------------------------------- */ + + if (nargout == 2) + { + /* [det dexp] = umfpack (A, 'det') ; + * return determinant in the form det * 10^dexp */ + p = &dexp ; + } + else + { + /* [det] = umfpack (A, 'det') ; + * return determinant as a single scalar (overflow or + * underflow is much more likely) */ + p = (double *) NULL ; + } + if (A_is_complex) + { + status = umfpack_zi_get_determinant (&dx, &dz, p, + Numeric, Info) ; + umfpack_zi_free_numeric (&Numeric) ; + } + else + { + status = umfpack_di_get_determinant (&dx, p, + Numeric, Info) ; + umfpack_di_free_numeric (&Numeric) ; + dz = 0 ; + } + if (status < 0) + { + error ("extracting LU factors failed", A_is_complex, nargout, + pargout, Control, Info, status, do_info) ; + } + if (A_is_complex) + { + pargout [0] = mxCreateDoubleMatrix (1, 1, mxCOMPLEX) ; + p = mxGetPr (pargout [0]) ; + *p = dx ; + p = mxGetPi (pargout [0]) ; + *p = dz ; + } + else + { + pargout [0] = mxCreateDoubleMatrix (1, 1, mxREAL) ; + p = mxGetPr (pargout [0]) ; + *p = dx ; + } + if (nargout == 2) + { + pargout [1] = mxCreateDoubleMatrix (1, 1, mxREAL) ; + p = mxGetPr (pargout [1]) ; + *p = dexp ; + } + + } + else + { + + /* -------------------------------------------------------------- */ + /* get L, U, P, Q, and r */ + /* -------------------------------------------------------------- */ + + if (A_is_complex) + { + status = umfpack_zi_get_lunz (&lnz, &unz, &ignore1, &ignore2, + &ignore3, Numeric) ; + } + else + { + status = umfpack_di_get_lunz (&lnz, &unz, &ignore1, &ignore2, + &ignore3, Numeric) ; + } + + if (status < 0) + { + if (A_is_complex) + { + umfpack_zi_free_numeric (&Numeric) ; + } + else + { + umfpack_di_free_numeric (&Numeric) ; + } + error ("extracting LU factors failed", A_is_complex, nargout, + pargout, Control, Info, status, do_info) ; + return ; + } + + /* avoid malloc of zero-sized arrays */ + lnz = MAX (lnz, 1) ; + unz = MAX (unz, 1) ; + + /* get temporary space, for the *** ROW *** form of L */ + Ltp = (int *) mxMalloc ((n_row+1) * sizeof (int)) ; + Ltj = (int *) mxMalloc (lnz * sizeof (int)) ; + Ltx = (double *) mxMalloc (lnz * sizeof (double)) ; + if (A_is_complex) + { + Ltz = (double *) mxMalloc (lnz * sizeof (double)) ; + } + else + { + Ltz = (double *) NULL ; + } + + /* create permanent copy of the output matrix U */ + pargout [1] = mxCreateSparse (n_inner, n_col, unz, Atype) ; + Up = mxGetJc (pargout [1]) ; + Ui = mxGetIr (pargout [1]) ; + Ux = mxGetPr (pargout [1]) ; + Uz = mxGetPi (pargout [1]) ; + + /* temporary space for the integer permutation vectors */ + P = (int *) mxMalloc (n_row * sizeof (int)) ; + Q = (int *) mxMalloc (n_col * sizeof (int)) ; + + /* get scale factors, if requested */ + status2 = UMFPACK_OK ; + if (!no_scale) + { + /* create a diagonal sparse matrix for the scale factors */ + pargout [4] = mxCreateSparse (n_row, n_row, n_row, mxREAL) ; + Rp = mxGetJc (pargout [4]) ; + Ri = mxGetIr (pargout [4]) ; + for (i = 0 ; i < n_row ; i++) + { + Rp [i] = i ; + Ri [i] = i ; + } + Rp [n_row] = n_row ; + Rs = mxGetPr (pargout [4]) ; + } + else + { + Rs = (double *) NULL ; + } + + /* get Lt, U, P, Q, and Rs from the numeric object */ + if (A_is_complex) + { + status = umfpack_zi_get_numeric (Ltp, Ltj, Ltx, Ltz, Up, Ui, Ux, + Uz, P, Q, (double *) NULL, (double *) NULL, + &do_recip, Rs, Numeric) ; + umfpack_zi_free_numeric (&Numeric) ; + } + else + { + status = umfpack_di_get_numeric (Ltp, Ltj, Ltx, Up, Ui, + Ux, P, Q, (double *) NULL, + &do_recip, Rs, Numeric) ; + umfpack_di_free_numeric (&Numeric) ; + } + + /* for the mexFunction, -DNRECIPROCAL must be set, + * so do_recip must be FALSE */ + + if (status < 0 || status2 < 0 || do_recip) + { + mxFree (Ltp) ; + mxFree (Ltj) ; + mxFree (Ltx) ; + if (Ltz) mxFree (Ltz) ; + mxFree (P) ; + mxFree (Q) ; + mxDestroyArray (pargout [1]) ; + error ("extracting LU factors failed", A_is_complex, nargout, + pargout, Control, Info, status, do_info) ; + return ; + } + + /* create sparse permutation matrix for P */ + pargout [2] = mxCreateSparse (n_row, n_row, n_row, mxREAL) ; + Pp = mxGetJc (pargout [2]) ; + Pi = mxGetIr (pargout [2]) ; + Px = mxGetPr (pargout [2]) ; + for (k = 0 ; k < n_row ; k++) + { + Pp [k] = k ; + Px [k] = 1 ; + Pi [P [k]] = k ; + } + Pp [n_row] = n_row ; + + /* create sparse permutation matrix for Q */ + pargout [3] = mxCreateSparse (n_col, n_col, n_col, mxREAL) ; + Qp = mxGetJc (pargout [3]) ; + Qi = mxGetIr (pargout [3]) ; + Qx = mxGetPr (pargout [3]) ; + for (k = 0 ; k < n_col ; k++) + { + Qp [k] = k ; + Qx [k] = 1 ; + Qi [k] = Q [k] ; + } + Qp [n_col] = n_col ; + + /* permanent copy of L */ + pargout [0] = mxCreateSparse (n_row, n_inner, lnz, Atype) ; + Lp = mxGetJc (pargout [0]) ; + Li = mxGetIr (pargout [0]) ; + Lx = mxGetPr (pargout [0]) ; + Lz = mxGetPi (pargout [0]) ; + + /* convert L from row form to column form */ + if (A_is_complex) + { + /* non-conjugate array transpose */ + status = umfpack_zi_transpose (n_inner, n_row, Ltp, Ltj, Ltx, + Ltz, (int *) NULL, (int *) NULL, Lp, Li, Lx, Lz, FALSE) ; + } + else + { + status = umfpack_di_transpose (n_inner, n_row, Ltp, Ltj, Ltx, + (int *) NULL, (int *) NULL, Lp, Li, Lx) ; + } + + mxFree (Ltp) ; + mxFree (Ltj) ; + mxFree (Ltx) ; + if (Ltz) mxFree (Ltz) ; + + if (status < 0) + { + mxFree (P) ; + mxFree (Q) ; + mxDestroyArray (pargout [0]) ; + mxDestroyArray (pargout [1]) ; + mxDestroyArray (pargout [2]) ; + mxDestroyArray (pargout [3]) ; + error ("constructing L failed", A_is_complex, nargout, pargout, + Control, Info, status, do_info) ; + return ; + } + + /* -------------------------------------------------------------- */ + /* print L, U, P, and Q */ + /* -------------------------------------------------------------- */ + + if (A_is_complex) + { + if (print_level >= 3) mexPrintf ("\nL: ") ; + (void) umfpack_zi_report_matrix (n_row, n_inner, Lp, Li, + Lx, Lz, 1, Control) ; + if (print_level >= 3) mexPrintf ("\nU: ") ; + (void) umfpack_zi_report_matrix (n_inner, n_col, Up, Ui, + Ux, Uz, 1, Control) ; + if (print_level >= 3) mexPrintf ("\nP: ") ; + (void) umfpack_zi_report_perm (n_row, P, Control) ; + if (print_level >= 3) mexPrintf ("\nQ: ") ; + (void) umfpack_zi_report_perm (n_col, Q, Control) ; + } + else + { + if (print_level >= 3) mexPrintf ("\nL: ") ; + (void) umfpack_di_report_matrix (n_row, n_inner, Lp, Li, + Lx, 1, Control) ; + if (print_level >= 3) mexPrintf ("\nU: ") ; + (void) umfpack_di_report_matrix (n_inner, n_col, Up, Ui, + Ux, 1, Control) ; + if (print_level >= 3) mexPrintf ("\nP: ") ; + (void) umfpack_di_report_perm (n_row, P, Control) ; + if (print_level >= 3) mexPrintf ("\nQ: ") ; + (void) umfpack_di_report_perm (n_col, Q, Control) ; + } + + mxFree (P) ; + mxFree (Q) ; + + } + + } + else + { + + /* ------------------------------------------------------------------ */ + /* return the symbolic factorization */ + /* ------------------------------------------------------------------ */ + + Q = (int *) mxMalloc (n_col * sizeof (int)) ; + P = (int *) mxMalloc (n_row * sizeof (int)) ; + Front_npivcol = (int *) mxMalloc ((nn+1) * sizeof (int)) ; + Front_parent = (int *) mxMalloc ((nn+1) * sizeof (int)) ; + Front_1strow = (int *) mxMalloc ((nn+1) * sizeof (int)) ; + Front_leftmostdesc = (int *) mxMalloc ((nn+1) * sizeof (int)) ; + Chain_start = (int *) mxMalloc ((nn+1) * sizeof (int)) ; + Chain_maxrows = (int *) mxMalloc ((nn+1) * sizeof (int)) ; + Chain_maxcols = (int *) mxMalloc ((nn+1) * sizeof (int)) ; + + if (A_is_complex) + { + status = umfpack_zi_get_symbolic (&ignore1, &ignore2, &ignore3, + &nz, &nfronts, &nchains, P, Q, Front_npivcol, + Front_parent, Front_1strow, Front_leftmostdesc, + Chain_start, Chain_maxrows, Chain_maxcols, Symbolic) ; + umfpack_zi_free_symbolic (&Symbolic) ; + } + else + { + status = umfpack_di_get_symbolic (&ignore1, &ignore2, &ignore3, + &nz, &nfronts, &nchains, P, Q, Front_npivcol, + Front_parent, Front_1strow, Front_leftmostdesc, + Chain_start, Chain_maxrows, Chain_maxcols, Symbolic) ; + umfpack_di_free_symbolic (&Symbolic) ; + } + + if (status < 0) + { + mxFree (P) ; + mxFree (Q) ; + mxFree (Front_npivcol) ; + mxFree (Front_parent) ; + mxFree (Front_1strow) ; + mxFree (Front_leftmostdesc) ; + mxFree (Chain_start) ; + mxFree (Chain_maxrows) ; + mxFree (Chain_maxcols) ; + error ("extracting symbolic factors failed", A_is_complex, nargout, + pargout, Control, Info, status, do_info) ; + return ; + } + + /* create sparse permutation matrix for P */ + pargout [0] = mxCreateSparse (n_row, n_row, n_row, mxREAL) ; + Pp = mxGetJc (pargout [0]) ; + Pi = mxGetIr (pargout [0]) ; + Px = mxGetPr (pargout [0]) ; + for (k = 0 ; k < n_row ; k++) + { + Pp [k] = k ; + Px [k] = 1 ; + Pi [P [k]] = k ; + } + Pp [n_row] = n_row ; + + /* create sparse permutation matrix for Q */ + pargout [1] = mxCreateSparse (n_col, n_col, n_col, mxREAL) ; + Qp = mxGetJc (pargout [1]) ; + Qi = mxGetIr (pargout [1]) ; + Qx = mxGetPr (pargout [1]) ; + for (k = 0 ; k < n_col ; k++) + { + Qp [k] = k ; + Qx [k] = 1 ; + Qi [k] = Q [k] ; + } + Qp [n_col] = n_col ; + + /* create Fr */ + pargout [2] = mxCreateDoubleMatrix (nfronts+1, 4, mxREAL) ; + + p1 = mxGetPr (pargout [2]) ; + p2 = p1 + nfronts + 1 ; + p3 = p2 + nfronts + 1 ; + p4 = p3 + nfronts + 1 ; + for (i = 0 ; i <= nfronts ; i++) + { + /* convert parent, 1strow, and leftmostdesc to 1-based */ + p1 [i] = (double) (Front_npivcol [i]) ; + p2 [i] = (double) (Front_parent [i] + 1) ; + p3 [i] = (double) (Front_1strow [i] + 1) ; + p4 [i] = (double) (Front_leftmostdesc [i] + 1) ; + } + + /* create Ch */ + pargout [3] = mxCreateDoubleMatrix (nchains+1, 3, mxREAL) ; + p1 = mxGetPr (pargout [3]) ; + p2 = p1 + nchains + 1 ; + p3 = p2 + nchains + 1 ; + for (i = 0 ; i < nchains ; i++) + { + p1 [i] = (double) (Chain_start [i] + 1) ; /* convert to 1-based */ + p2 [i] = (double) (Chain_maxrows [i]) ; + p3 [i] = (double) (Chain_maxcols [i]) ; + } + p1 [nchains] = Chain_start [nchains] + 1 ; + p2 [nchains] = 0 ; + p3 [nchains] = 0 ; + + mxFree (P) ; + mxFree (Q) ; + mxFree (Front_npivcol) ; + mxFree (Front_parent) ; + mxFree (Front_1strow) ; + mxFree (Front_leftmostdesc) ; + mxFree (Chain_start) ; + mxFree (Chain_maxrows) ; + mxFree (Chain_maxcols) ; + } + + /* ---------------------------------------------------------------------- */ + /* report Info */ + /* ---------------------------------------------------------------------- */ + + if (A_is_complex) + { + umfpack_zi_report_info (Control, Info) ; + } + else + { + umfpack_di_report_info (Control, Info) ; + } + + if (do_info > 0) + { + /* return Info */ + pargout [do_info] = mxCreateDoubleMatrix (1, UMFPACK_INFO, mxREAL) ; + OutInfo = mxGetPr (pargout [do_info]) ; + for (i = 0 ; i < UMFPACK_INFO ; i++) + { + OutInfo [i] = Info [i] ; + } + } +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/MATLAB/west0067.mat Binary file liboctave/UMFPACK/UMFPACK/MATLAB/west0067.mat has changed diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Makefile Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,68 @@ +#------------------------------------------------------------------------------- +# UMFPACK makefile (for GNU make or original make) +#------------------------------------------------------------------------------- + +# UMFPACK requires the AMD package to be in ../AMD + +# compile everything (except hb, fortran, and fortran64), including AMD and the +# MATLAB mexFunctions +all: + ( cd ../AMD ; make ) + ( cd Source ; make ) + ( cd Demo ; make ) + ( cd MATLAB ; make ) + - cat Doc/License + +# compile just the C-callable libraries and demo programs (not mexFunctions) +lib: + ( cd ../AMD ; make lib ) + ( cd Source ; make ) + ( cd Demo ; make ) + - cat Doc/License + +# compile the FORTRAN interface and demo program +fortran: + ( cd Demo ; make fortran ) + +# compile the 64-bit FORTRAN interface and demo program +fortran64: + ( cd Demo ; make fortran64 ) + +# compile the Harwell/Boeing demo program +hb: + ( cd Demo ; make hb ) + +# compile a Octave version +# (not compiled by "make all") +octave: + ( cd OCTAVE ; make ) + - cat Doc/License + +# remove object files, but keep the compiled programs and library archives +clean: + ( cd ../AMD ; make clean ) + ( cd Source ; make clean ) + ( cd Demo ; make clean ) + ( cd MATLAB ; make clean ) + ( cd OCTAVE ; make clean ) + ( cd Doc ; make clean ) + +# clean, and then remove compiled programs and library archives +purge: + ( cd ../AMD ; make purge ) + ( cd Source ; make purge ) + ( cd Demo ; make purge ) + ( cd MATLAB ; make purge ) + ( cd OCTAVE ; make purge ) + ( cd Doc ; make purge ) + +# create PDF documents for the original distribution +doc: + ( cd ../AMD ; make doc ) + ( cd Doc ; make ) + +# get ready for distribution +dist: purge + ( cd ../AMD ; make dist ) + ( cd Demo ; make dist ) + ( cd Doc ; make ) diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/OCTAVE/Contents.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/OCTAVE/Contents.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,21 @@ +%Contents of the UMFPACK sparse matrix toolbox: +% +% umfpack computes x=A\b, x=A/b, or lu (A) for a sparse matrix A +% umfpack_make to compile umfpack for use in MATLAB +% umfpack_report prints optional control settings and statistics +% umfpack_demo a long demo +% umfpack_simple a simple demo +% umfpack_btf factorize A using a block triangular form +% umfpack_solve x = A\b or x = b/A +% lu_normest estimates norm (L*U-A, 1) without forming L*U-A +% luflop given L and U, computes # of flops required to compute them +% +% See also: +% amd symmetric minimum degree ordering +% colamd unsymmetric column approx minimum degree ordering +% symamd symmetric approx minimum degree ordering, based on colamd +% +% UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A. +% Davis. All Rights Reserved. Type umfpack_details for License. + +help Contents diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/OCTAVE/GNUmakefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/OCTAVE/GNUmakefile Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,248 @@ +#------------------------------------------------------------------------------- +# UMFPACK GNUmakefile for the UMFPACK OCTAVE oct-file (GNU "make" only) +#------------------------------------------------------------------------------- + +.PRECIOUS: %.o + +# UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A. +# Davis. All Rights Reserved. See ../README for License. + +all: umfpack luflop + +include ../Make/Make.include + +MKOCT = mkoctfile $(CONFIG) -DNRECIPROCAL -I/usr/include/atlas -I../Include -I../Source -I../../AMD/Include -I../../AMD/Source + +OCT_SPARSE_INC = -I../../../ + + +#------------------------------------------------------------------------------- +# source files +#------------------------------------------------------------------------------- + +# non-user-callable umf_*.[ch] files: +UMFCH = umf_assemble umf_blas3_update \ + umf_build_tuples umf_create_element \ + umf_dump umf_extend_front umf_garbage_collection \ + umf_get_memory umf_init_front umf_kernel \ + umf_kernel_init umf_kernel_wrapup \ + umf_local_search umf_lsolve umf_ltsolve \ + umf_mem_alloc_element umf_mem_alloc_head_block \ + umf_mem_alloc_tail_block umf_mem_free_tail_block \ + umf_mem_init_memoryspace \ + umf_report_vector umf_row_search umf_scale_column \ + umf_set_stats umf_solve umf_symbolic_usage umf_transpose \ + umf_tuple_lengths umf_usolve umf_utsolve umf_valid_numeric \ + umf_valid_symbolic umf_grow_front umf_start_front umf_2by2 \ + umf_store_lu umf_scale + +# non-user-callable umf_*.[ch] files, int/long versions only (no real/complex): +UMFINT = umf_analyze umf_apply_order umf_colamd umf_free umf_fsize \ + umf_is_permutation umf_malloc umf_realloc umf_report_perm \ + umf_singletons + +# non-user-callable and user-callable amd_*.[ch] files (int/long versions only): +AMD = amd_aat amd_1 amd_2 amd_dump amd_postorder amd_post_tree amd_defaults \ + amd_order amd_control amd_info amd_valid + +# non-user-callable, created from umf_ltsolve.c, umf_utsolve.c, +# umf_triplet.c, and umf_assemble.c , with int/long and real/complex versions: +UMF_CREATED = umf_lhsolve umf_uhsolve umf_triplet_map_nox \ + umf_triplet_nomap_x umf_triplet_nomap_nox umf_triplet_map_x \ + umf_assemble_fixq umf_store_lu_drop + +# non-user-callable, int/long and real/complex versions: +UMF = $(UMF_CREATED) $(UMFCH) + +# user-callable umfpack_*.[ch] files (int/long and real/complex): +UMFPACK = umfpack_col_to_triplet umfpack_defaults umfpack_free_numeric \ + umfpack_free_symbolic umfpack_get_numeric umfpack_get_lunz \ + umfpack_get_symbolic umfpack_get_determinant umfpack_numeric \ + umfpack_qsymbolic umfpack_report_control umfpack_report_info \ + umfpack_report_matrix umfpack_report_numeric umfpack_report_perm \ + umfpack_report_status umfpack_report_symbolic umfpack_report_triplet \ + umfpack_report_vector umfpack_solve umfpack_symbolic \ + umfpack_transpose umfpack_triplet_to_col umfpack_scale \ + umfpack_load_numeric umfpack_save_numeric \ + umfpack_load_symbolic umfpack_save_symbolic + +# user-callable, created from umfpack_solve.c (umfpack_wsolve.h exists, though): +# with int/long and real/complex versions: +UMFPACKW = umfpack_wsolve + +USER = $(UMFPACKW) $(UMFPACK) + +# user-callable, only one version for int/long, real/complex, *.[ch] files: +GENERIC = umfpack_timer umfpack_tictoc + +#------------------------------------------------------------------------------- +# include files: +#------------------------------------------------------------------------------- + +AMDH = ../../AMD/Source/amd_internal.h ../../AMD/Include/amd.h + +INC1 = umf_config.h umf_version.h umf_internal.h umf_triplet.h + +INC = ../Include/umfpack.h \ + $(addprefix ../Source/, $(INC1)) \ + $(addprefix ../Source/, $(addsuffix .h,$(UMFCH))) \ + $(addprefix ../Source/, $(addsuffix .h,$(UMFINT))) \ + $(addprefix ../Include/, $(addsuffix .h,$(USER))) \ + $(addprefix ../Include/, $(addsuffix .h,$(GENERIC))) \ + $(AMDH) + +#------------------------------------------------------------------------------- +# Create the umfpack and amd oct-file for OCTAVE (int versions only) +#------------------------------------------------------------------------------- + +OCTI = $(addsuffix .o, $(subst umf_,umf_o_,$(UMFINT))) +OCTDI = $(addsuffix .o, $(subst umf_,umf_od_,$(UMF)) $(subst umfpack_,umfpack_od_,$(USER))) +OCTZI = $(addsuffix .o, $(subst umf_,umf_oz_,$(UMF)) $(subst umfpack_,umfpack_oz_,$(USER)) ) +OCTAMD = $(addsuffix .o, $(subst amd_,amd_o_,$(AMD))) +OCTGN = $(addsuffix .o, $(subst umfpack_,umfpack_o_,$(GENERIC))) + +OCTUMFPACK = $(OCTI) $(OCTDI) $(OCTZI) $(OCTGN) + +OCTUMFPACK_LIB = umfpack_octave.o + +# Note that mkoctfile has an "-o" option, but it doesn't work in conjunction +# with the "-c" option, thus the need for $(MV) commands. +# If it did, then the rules would be much simpler: +# $(MKOCT) -DDINT -c $< -o $@ + +#---------------------------------------- +# integer-only routines (no real/complex): +#---------------------------------------- + +amd_o_%.o: ../../AMD/Source/amd_%.c $(AMDH) + $(MKOCT) -DDINT -c $< + - $(MV) ../../AMD/Source/amd_$*.o $@ + + +umf_o_%.o: ../Source/umf_%.c $(INC) + $(MKOCT) -DDINT -c $< + - $(MV) ../Source/umf_$*.o $@ + +#---------------------------------------- +# Double precision, int version, for OCTAVE +#---------------------------------------- + +umf_od_%.o: ../Source/umf_%.c $(INC) + $(MKOCT) -DDINT -c $< + - $(MV) ../Source/umf_$*.o $@ + +umf_od_%hsolve.o: ../Source/umf_%tsolve.c $(INC) + $(MKOCT) -DDINT -DCONJUGATE_SOLVE -c $< + - $(MV) ../Source/umf_$*tsolve.o $@ + +umf_od_triplet_map_x.o: ../Source/umf_triplet.c $(INC) + $(MKOCT) -DDINT -DDO_MAP -DDO_VALUES -c $< + - $(MV) ../Source/umf_triplet.o $@ + +umf_od_triplet_map_nox.o: ../Source/umf_triplet.c $(INC) + $(MKOCT) -DDINT -DDO_MAP -c $< + - $(MV) ../Source/umf_triplet.o $@ + +umf_od_triplet_nomap_x.o: ../Source/umf_triplet.c $(INC) + $(MKOCT) -DDINT -DDO_VALUES -c $< + - $(MV) ../Source/umf_triplet.o $@ + +umf_od_triplet_nomap_nox.o: ../Source/umf_triplet.c $(INC) + $(MKOCT) -DDINT -c $< + - $(MV) ../Source/umf_triplet.o $@ + +umf_od_assemble_fixq.o: ../Source/umf_assemble.c $(INC) + $(MKOCT) -DDINT -DFIXQ -c $< + - $(MV) ../Source/umf_assemble.o $@ + +umf_od_store_lu_drop.o: ../Source/umf_store_lu.c $(INC) + $(MKOCT) -DDINT -DDROP -c $< + - $(MV) ../Source/umf_store_lu.o $@ + +umfpack_od_wsolve.o: ../Source/umfpack_solve.c $(INC) + $(MKOCT) -DDINT -DWSOLVE -c $< + - $(MV) ../Source/umfpack_solve.o $@ + +umfpack_od_%.o: ../Source/umfpack_%.c $(INC) + $(MKOCT) -DDINT -c $< + - $(MV) ../Source/umfpack_$*.o $@ + +#---------------------------------------- +# Complex double precision, int version, for OCTAVE +#---------------------------------------- + +umf_oz_%.o: ../Source/umf_%.c $(INC) + $(MKOCT) -DZINT -c $< + - $(MV) ../Source/umf_$*.o $@ + +umf_oz_%hsolve.o: ../Source/umf_%tsolve.c $(INC) + $(MKOCT) -DZINT -DCONJUGATE_SOLVE -c $< + - $(MV) ../Source/umf_$*tsolve.o $@ + +umf_oz_triplet_map_x.o: ../Source/umf_triplet.c $(INC) + $(MKOCT) -DZINT -DDO_MAP -DDO_VALUES -c $< + - $(MV) ../Source/umf_triplet.o $@ + +umf_oz_triplet_map_nox.o: ../Source/umf_triplet.c $(INC) + $(MKOCT) -DZINT -DDO_MAP -c $< + - $(MV) ../Source/umf_triplet.o $@ + +umf_oz_triplet_nomap_x.o: ../Source/umf_triplet.c $(INC) + $(MKOCT) -DZINT -DDO_VALUES -c $< + - $(MV) ../Source/umf_triplet.o $@ + +umf_oz_triplet_nomap_nox.o: ../Source/umf_triplet.c $(INC) + $(MKOCT) -DZINT -c $< + - $(MV) ../Source/umf_triplet.o $@ + +umf_oz_assemble_fixq.o: ../Source/umf_assemble.c $(INC) + $(MKOCT) -DZINT -DFIXQ -c $< + - $(MV) ../Source/umf_assemble.o $@ + +umf_oz_store_lu_drop.o: ../Source/umf_store_lu.c $(INC) + $(MKOCT) -DZINT -DDROP -c $< + - $(MV) ../Source/umf_store_lu.o $@ + +umfpack_oz_wsolve.o: ../Source/umfpack_solve.c $(INC) + $(MKOCT) -DZINT -DWSOLVE -c $< + - $(MV) ../Source/umfpack_solve.o $@ + +umfpack_oz_%.o: ../Source/umfpack_%.c $(INC) + $(MKOCT) -DZINT -c $< + - $(MV) ../Source/umfpack_$*.o $@ + +#---------------------------------------- +# Generic routines for OCTAVE +#---------------------------------------- + +umfpack_o_timer.o: ../Source/umfpack_timer.c $(INC) + $(MKOCT) -c $< + - $(MV) ../Source/umfpack_timer.o $@ + +umfpack_o_tictoc.o: ../Source/umfpack_tictoc.c $(INC) + $(MKOCT) -c $< + - $(MV) ../Source/umfpack_tictoc.o $@ + +#---------------------------------------- +# umfpack oct-files +#---------------------------------------- + +umfpack: umfpack.cc $(OCTUMFPACK) $(OCTAMD) + $(MKOCT) $(OCT_SPARSE_INC) umfpack.cc $(OCTUMFPACK) $(OCTAMD) -o umfpack.oct + +luflop: luflop.cc + $(MKOCT) $(OCT_SPARSE_INC) luflop.cc -o luflop.oct + +#---------------------------------------- +# umfpack library to link with octave +#---------------------------------------- + +octave: $(OCTUMFPACK) $(OCTAMD) + ld -r $(OCTUMFPACK) $(OCTAMD) -o ../../../$(OCTUMFPACK_LIB) + +#------------------------------------------------------------------------------- +# Remove all but the files in the original distribution +#------------------------------------------------------------------------------- + +purge: clean + - $(RM) *.oct *.so diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/OCTAVE/Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/OCTAVE/Makefile Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,517 @@ +#------------------------------------------------------------------------------- +# UMFPACK Makefile for the UMFPACK MATLAB mexFunction (old "make" only) +#------------------------------------------------------------------------------- + +# UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A. +# Davis. All Rights Reserved. See ../README for License. + +# This is a very ugly Makefile, and is only provided for those who do not +# have GNU make. Note that it is not used if you have GNU make. It ignores +# dependency checking and just compiles everything. It was created +# automatically, via make -n using the GNUmakefile. That way, I don't have +# maintain two Makefiles. + +all: umfpack luflop + +include ../Make/Make.include + +MKOCT = mkoctfile $(CONFIG) -DNRECIPROCAL -I/usr/include/atlas -I../Include -I../Source -I../../AMD/Include -I../../AMD/Source + +OCT_SPARSE_INC = -I../../../ +OCTUMFPACK_LIB = umfpack_octave.o + +umfpack: + $(MKOCT) -DDINT -c ../Source/umf_analyze.c + $(MV) -f ../Source/umf_analyze.o umf_m_analyze.o + $(MKOCT) -DDINT -c ../Source/umf_apply_order.c + $(MV) -f ../Source/umf_apply_order.o umf_m_apply_order.o + $(MKOCT) -DDINT -c ../Source/umf_colamd.c + $(MV) -f ../Source/umf_colamd.o umf_m_colamd.o + $(MKOCT) -DDINT -c ../Source/umf_free.c + $(MV) -f ../Source/umf_free.o umf_m_free.o + $(MKOCT) -DDINT -c ../Source/umf_fsize.c + $(MV) -f ../Source/umf_fsize.o umf_m_fsize.o + $(MKOCT) -DDINT -c ../Source/umf_is_permutation.c + $(MV) -f ../Source/umf_is_permutation.o umf_m_is_permutation.o + $(MKOCT) -DDINT -c ../Source/umf_malloc.c + $(MV) -f ../Source/umf_malloc.o umf_m_malloc.o + $(MKOCT) -DDINT -c ../Source/umf_realloc.c + $(MV) -f ../Source/umf_realloc.o umf_m_realloc.o + $(MKOCT) -DDINT -c ../Source/umf_report_perm.c + $(MV) -f ../Source/umf_report_perm.o umf_m_report_perm.o + $(MKOCT) -DDINT -c ../Source/umf_singletons.c + $(MV) -f ../Source/umf_singletons.o umf_m_singletons.o + $(MKOCT) -DDINT -DCONJUGATE_SOLVE -c ../Source/umf_ltsolve.c + $(MV) -f ../Source/umf_ltsolve.o umf_od_lhsolve.o + $(MKOCT) -DDINT -DCONJUGATE_SOLVE -c ../Source/umf_utsolve.c + $(MV) -f ../Source/umf_utsolve.o umf_od_uhsolve.o + $(MKOCT) -DDINT -DDO_MAP -c ../Source/umf_triplet.c + $(MV) -f ../Source/umf_triplet.o umf_od_triplet_map_nox.o + $(MKOCT) -DDINT -DDO_VALUES -c ../Source/umf_triplet.c + $(MV) -f ../Source/umf_triplet.o umf_od_triplet_nomap_x.o + $(MKOCT) -DDINT -c ../Source/umf_triplet.c + $(MV) -f ../Source/umf_triplet.o umf_od_triplet_nomap_nox.o + $(MKOCT) -DDINT -DDO_MAP -DDO_VALUES -c ../Source/umf_triplet.c + $(MV) -f ../Source/umf_triplet.o umf_od_triplet_map_x.o + $(MKOCT) -DDINT -DFIXQ -c ../Source/umf_assemble.c + $(MV) -f ../Source/umf_assemble.o umf_od_assemble_fixq.o + $(MKOCT) -DDINT -DDROP -c ../Source/umf_store_lu.c + $(MV) -f ../Source/umf_store_lu.o umf_od_store_lu_drop.o + $(MKOCT) -DDINT -c ../Source/umf_assemble.c + $(MV) -f ../Source/umf_assemble.o umf_od_assemble.o + $(MKOCT) -DDINT -c ../Source/umf_blas3_update.c + $(MV) -f ../Source/umf_blas3_update.o umf_od_blas3_update.o + $(MKOCT) -DDINT -c ../Source/umf_build_tuples.c + $(MV) -f ../Source/umf_build_tuples.o umf_od_build_tuples.o + $(MKOCT) -DDINT -c ../Source/umf_create_element.c + $(MV) -f ../Source/umf_create_element.o umf_od_create_element.o + $(MKOCT) -DDINT -c ../Source/umf_dump.c + $(MV) -f ../Source/umf_dump.o umf_od_dump.o + $(MKOCT) -DDINT -c ../Source/umf_extend_front.c + $(MV) -f ../Source/umf_extend_front.o umf_od_extend_front.o + $(MKOCT) -DDINT -c ../Source/umf_garbage_collection.c + $(MV) -f ../Source/umf_garbage_collection.o umf_od_garbage_collection.o + $(MKOCT) -DDINT -c ../Source/umf_get_memory.c + $(MV) -f ../Source/umf_get_memory.o umf_od_get_memory.o + $(MKOCT) -DDINT -c ../Source/umf_init_front.c + $(MV) -f ../Source/umf_init_front.o umf_od_init_front.o + $(MKOCT) -DDINT -c ../Source/umf_kernel.c + $(MV) -f ../Source/umf_kernel.o umf_od_kernel.o + $(MKOCT) -DDINT -c ../Source/umf_kernel_init.c + $(MV) -f ../Source/umf_kernel_init.o umf_od_kernel_init.o + $(MKOCT) -DDINT -c ../Source/umf_kernel_wrapup.c + $(MV) -f ../Source/umf_kernel_wrapup.o umf_od_kernel_wrapup.o + $(MKOCT) -DDINT -c ../Source/umf_local_search.c + $(MV) -f ../Source/umf_local_search.o umf_od_local_search.o + $(MKOCT) -DDINT -c ../Source/umf_lsolve.c + $(MV) -f ../Source/umf_lsolve.o umf_od_lsolve.o + $(MKOCT) -DDINT -c ../Source/umf_ltsolve.c + $(MV) -f ../Source/umf_ltsolve.o umf_od_ltsolve.o + $(MKOCT) -DDINT -c ../Source/umf_mem_alloc_element.c + $(MV) -f ../Source/umf_mem_alloc_element.o umf_od_mem_alloc_element.o + $(MKOCT) -DDINT -c ../Source/umf_mem_alloc_head_block.c + $(MV) -f ../Source/umf_mem_alloc_head_block.o umf_od_mem_alloc_head_block.o + $(MKOCT) -DDINT -c ../Source/umf_mem_alloc_tail_block.c + $(MV) -f ../Source/umf_mem_alloc_tail_block.o umf_od_mem_alloc_tail_block.o + $(MKOCT) -DDINT -c ../Source/umf_mem_free_tail_block.c + $(MV) -f ../Source/umf_mem_free_tail_block.o umf_od_mem_free_tail_block.o + $(MKOCT) -DDINT -c ../Source/umf_mem_init_memoryspace.c + $(MV) -f ../Source/umf_mem_init_memoryspace.o umf_od_mem_init_memoryspace.o + $(MKOCT) -DDINT -c ../Source/umf_report_vector.c + $(MV) -f ../Source/umf_report_vector.o umf_od_report_vector.o + $(MKOCT) -DDINT -c ../Source/umf_row_search.c + $(MV) -f ../Source/umf_row_search.o umf_od_row_search.o + $(MKOCT) -DDINT -c ../Source/umf_scale_column.c + $(MV) -f ../Source/umf_scale_column.o umf_od_scale_column.o + $(MKOCT) -DDINT -c ../Source/umf_set_stats.c + $(MV) -f ../Source/umf_set_stats.o umf_od_set_stats.o + $(MKOCT) -DDINT -c ../Source/umf_solve.c + $(MV) -f ../Source/umf_solve.o umf_od_solve.o + $(MKOCT) -DDINT -c ../Source/umf_symbolic_usage.c + $(MV) -f ../Source/umf_symbolic_usage.o umf_od_symbolic_usage.o + $(MKOCT) -DDINT -c ../Source/umf_transpose.c + $(MV) -f ../Source/umf_transpose.o umf_od_transpose.o + $(MKOCT) -DDINT -c ../Source/umf_tuple_lengths.c + $(MV) -f ../Source/umf_tuple_lengths.o umf_od_tuple_lengths.o + $(MKOCT) -DDINT -c ../Source/umf_usolve.c + $(MV) -f ../Source/umf_usolve.o umf_od_usolve.o + $(MKOCT) -DDINT -c ../Source/umf_utsolve.c + $(MV) -f ../Source/umf_utsolve.o umf_od_utsolve.o + $(MKOCT) -DDINT -c ../Source/umf_valid_numeric.c + $(MV) -f ../Source/umf_valid_numeric.o umf_od_valid_numeric.o + $(MKOCT) -DDINT -c ../Source/umf_valid_symbolic.c + $(MV) -f ../Source/umf_valid_symbolic.o umf_od_valid_symbolic.o + $(MKOCT) -DDINT -c ../Source/umf_grow_front.c + $(MV) -f ../Source/umf_grow_front.o umf_od_grow_front.o + $(MKOCT) -DDINT -c ../Source/umf_start_front.c + $(MV) -f ../Source/umf_start_front.o umf_od_start_front.o + $(MKOCT) -DDINT -c ../Source/umf_2by2.c + $(MV) -f ../Source/umf_2by2.o umf_od_2by2.o + $(MKOCT) -DDINT -c ../Source/umf_store_lu.c + $(MV) -f ../Source/umf_store_lu.o umf_od_store_lu.o + $(MKOCT) -DDINT -c ../Source/umf_scale.c + $(MV) -f ../Source/umf_scale.o umf_od_scale.o + $(MKOCT) -DDINT -DWSOLVE -c ../Source/umfpack_solve.c + $(MV) -f ../Source/umfpack_solve.o umfpack_od_wsolve.o + $(MKOCT) -DDINT -c ../Source/umfpack_col_to_triplet.c + $(MV) -f ../Source/umfpack_col_to_triplet.o umfpack_od_col_to_triplet.o + $(MKOCT) -DDINT -c ../Source/umfpack_defaults.c + $(MV) -f ../Source/umfpack_defaults.o umfpack_od_defaults.o + $(MKOCT) -DDINT -c ../Source/umfpack_free_numeric.c + $(MV) -f ../Source/umfpack_free_numeric.o umfpack_od_free_numeric.o + $(MKOCT) -DDINT -c ../Source/umfpack_free_symbolic.c + $(MV) -f ../Source/umfpack_free_symbolic.o umfpack_od_free_symbolic.o + $(MKOCT) -DDINT -c ../Source/umfpack_get_numeric.c + $(MV) -f ../Source/umfpack_get_numeric.o umfpack_od_get_numeric.o + $(MKOCT) -DDINT -c ../Source/umfpack_get_lunz.c + $(MV) -f ../Source/umfpack_get_lunz.o umfpack_od_get_lunz.o + $(MKOCT) -DDINT -c ../Source/umfpack_get_symbolic.c + $(MV) -f ../Source/umfpack_get_symbolic.o umfpack_od_get_symbolic.o + $(MKOCT) -DDINT -c ../Source/umfpack_get_determinant.c + $(MV) -f ../Source/umfpack_get_determinant.o umfpack_od_get_determinant.o + $(MKOCT) -DDINT -c ../Source/umfpack_numeric.c + $(MV) -f ../Source/umfpack_numeric.o umfpack_od_numeric.o + $(MKOCT) -DDINT -c ../Source/umfpack_qsymbolic.c + $(MV) -f ../Source/umfpack_qsymbolic.o umfpack_od_qsymbolic.o + $(MKOCT) -DDINT -c ../Source/umfpack_report_control.c + $(MV) -f ../Source/umfpack_report_control.o umfpack_od_report_control.o + $(MKOCT) -DDINT -c ../Source/umfpack_report_info.c + $(MV) -f ../Source/umfpack_report_info.o umfpack_od_report_info.o + $(MKOCT) -DDINT -c ../Source/umfpack_report_matrix.c + $(MV) -f ../Source/umfpack_report_matrix.o umfpack_od_report_matrix.o + $(MKOCT) -DDINT -c ../Source/umfpack_report_numeric.c + $(MV) -f ../Source/umfpack_report_numeric.o umfpack_od_report_numeric.o + $(MKOCT) -DDINT -c ../Source/umfpack_report_perm.c + $(MV) -f ../Source/umfpack_report_perm.o umfpack_od_report_perm.o + $(MKOCT) -DDINT -c ../Source/umfpack_report_status.c + $(MV) -f ../Source/umfpack_report_status.o umfpack_od_report_status.o + $(MKOCT) -DDINT -c ../Source/umfpack_report_symbolic.c + $(MV) -f ../Source/umfpack_report_symbolic.o umfpack_od_report_symbolic.o + $(MKOCT) -DDINT -c ../Source/umfpack_report_triplet.c + $(MV) -f ../Source/umfpack_report_triplet.o umfpack_od_report_triplet.o + $(MKOCT) -DDINT -c ../Source/umfpack_report_vector.c + $(MV) -f ../Source/umfpack_report_vector.o umfpack_od_report_vector.o + $(MKOCT) -DDINT -c ../Source/umfpack_solve.c + $(MV) -f ../Source/umfpack_solve.o umfpack_od_solve.o + $(MKOCT) -DDINT -c ../Source/umfpack_symbolic.c + $(MV) -f ../Source/umfpack_symbolic.o umfpack_od_symbolic.o + $(MKOCT) -DDINT -c ../Source/umfpack_transpose.c + $(MV) -f ../Source/umfpack_transpose.o umfpack_od_transpose.o + $(MKOCT) -DDINT -c ../Source/umfpack_triplet_to_col.c + $(MV) -f ../Source/umfpack_triplet_to_col.o umfpack_od_triplet_to_col.o + $(MKOCT) -DDINT -c ../Source/umfpack_scale.c + $(MV) -f ../Source/umfpack_scale.o umfpack_od_scale.o + $(MKOCT) -DDINT -c ../Source/umfpack_load_numeric.c + $(MV) -f ../Source/umfpack_load_numeric.o umfpack_od_load_numeric.o + $(MKOCT) -DDINT -c ../Source/umfpack_save_numeric.c + $(MV) -f ../Source/umfpack_save_numeric.o umfpack_od_save_numeric.o + $(MKOCT) -DDINT -c ../Source/umfpack_load_symbolic.c + $(MV) -f ../Source/umfpack_load_symbolic.o umfpack_od_load_symbolic.o + $(MKOCT) -DDINT -c ../Source/umfpack_save_symbolic.c + $(MV) -f ../Source/umfpack_save_symbolic.o umfpack_od_save_symbolic.o + $(MKOCT) -DZINT -DCONJUGATE_SOLVE -c ../Source/umf_ltsolve.c + $(MV) -f ../Source/umf_ltsolve.o umf_oz_lhsolve.o + $(MKOCT) -DZINT -DCONJUGATE_SOLVE -c ../Source/umf_utsolve.c + $(MV) -f ../Source/umf_utsolve.o umf_oz_uhsolve.o + $(MKOCT) -DZINT -DDO_MAP -c ../Source/umf_triplet.c + $(MV) -f ../Source/umf_triplet.o umf_oz_triplet_map_nox.o + $(MKOCT) -DZINT -DDO_VALUES -c ../Source/umf_triplet.c + $(MV) -f ../Source/umf_triplet.o umf_oz_triplet_nomap_x.o + $(MKOCT) -DZINT -c ../Source/umf_triplet.c + $(MV) -f ../Source/umf_triplet.o umf_oz_triplet_nomap_nox.o + $(MKOCT) -DZINT -DDO_MAP -DDO_VALUES -c ../Source/umf_triplet.c + $(MV) -f ../Source/umf_triplet.o umf_oz_triplet_map_x.o + $(MKOCT) -DZINT -DFIXQ -c ../Source/umf_assemble.c + $(MV) -f ../Source/umf_assemble.o umf_oz_assemble_fixq.o + $(MKOCT) -DZINT -DDROP -c ../Source/umf_store_lu.c + $(MV) -f ../Source/umf_store_lu.o umf_oz_store_lu_drop.o + $(MKOCT) -DZINT -c ../Source/umf_assemble.c + $(MV) -f ../Source/umf_assemble.o umf_oz_assemble.o + $(MKOCT) -DZINT -c ../Source/umf_blas3_update.c + $(MV) -f ../Source/umf_blas3_update.o umf_oz_blas3_update.o + $(MKOCT) -DZINT -c ../Source/umf_build_tuples.c + $(MV) -f ../Source/umf_build_tuples.o umf_oz_build_tuples.o + $(MKOCT) -DZINT -c ../Source/umf_create_element.c + $(MV) -f ../Source/umf_create_element.o umf_oz_create_element.o + $(MKOCT) -DZINT -c ../Source/umf_dump.c + $(MV) -f ../Source/umf_dump.o umf_oz_dump.o + $(MKOCT) -DZINT -c ../Source/umf_extend_front.c + $(MV) -f ../Source/umf_extend_front.o umf_oz_extend_front.o + $(MKOCT) -DZINT -c ../Source/umf_garbage_collection.c + $(MV) -f ../Source/umf_garbage_collection.o umf_oz_garbage_collection.o + $(MKOCT) -DZINT -c ../Source/umf_get_memory.c + $(MV) -f ../Source/umf_get_memory.o umf_oz_get_memory.o + $(MKOCT) -DZINT -c ../Source/umf_init_front.c + $(MV) -f ../Source/umf_init_front.o umf_oz_init_front.o + $(MKOCT) -DZINT -c ../Source/umf_kernel.c + $(MV) -f ../Source/umf_kernel.o umf_oz_kernel.o + $(MKOCT) -DZINT -c ../Source/umf_kernel_init.c + $(MV) -f ../Source/umf_kernel_init.o umf_oz_kernel_init.o + $(MKOCT) -DZINT -c ../Source/umf_kernel_wrapup.c + $(MV) -f ../Source/umf_kernel_wrapup.o umf_oz_kernel_wrapup.o + $(MKOCT) -DZINT -c ../Source/umf_local_search.c + $(MV) -f ../Source/umf_local_search.o umf_oz_local_search.o + $(MKOCT) -DZINT -c ../Source/umf_lsolve.c + $(MV) -f ../Source/umf_lsolve.o umf_oz_lsolve.o + $(MKOCT) -DZINT -c ../Source/umf_ltsolve.c + $(MV) -f ../Source/umf_ltsolve.o umf_oz_ltsolve.o + $(MKOCT) -DZINT -c ../Source/umf_mem_alloc_element.c + $(MV) -f ../Source/umf_mem_alloc_element.o umf_oz_mem_alloc_element.o + $(MKOCT) -DZINT -c ../Source/umf_mem_alloc_head_block.c + $(MV) -f ../Source/umf_mem_alloc_head_block.o umf_oz_mem_alloc_head_block.o + $(MKOCT) -DZINT -c ../Source/umf_mem_alloc_tail_block.c + $(MV) -f ../Source/umf_mem_alloc_tail_block.o umf_oz_mem_alloc_tail_block.o + $(MKOCT) -DZINT -c ../Source/umf_mem_free_tail_block.c + $(MV) -f ../Source/umf_mem_free_tail_block.o umf_oz_mem_free_tail_block.o + $(MKOCT) -DZINT -c ../Source/umf_mem_init_memoryspace.c + $(MV) -f ../Source/umf_mem_init_memoryspace.o umf_oz_mem_init_memoryspace.o + $(MKOCT) -DZINT -c ../Source/umf_report_vector.c + $(MV) -f ../Source/umf_report_vector.o umf_oz_report_vector.o + $(MKOCT) -DZINT -c ../Source/umf_row_search.c + $(MV) -f ../Source/umf_row_search.o umf_oz_row_search.o + $(MKOCT) -DZINT -c ../Source/umf_scale_column.c + $(MV) -f ../Source/umf_scale_column.o umf_oz_scale_column.o + $(MKOCT) -DZINT -c ../Source/umf_set_stats.c + $(MV) -f ../Source/umf_set_stats.o umf_oz_set_stats.o + $(MKOCT) -DZINT -c ../Source/umf_solve.c + $(MV) -f ../Source/umf_solve.o umf_oz_solve.o + $(MKOCT) -DZINT -c ../Source/umf_symbolic_usage.c + $(MV) -f ../Source/umf_symbolic_usage.o umf_oz_symbolic_usage.o + $(MKOCT) -DZINT -c ../Source/umf_transpose.c + $(MV) -f ../Source/umf_transpose.o umf_oz_transpose.o + $(MKOCT) -DZINT -c ../Source/umf_tuple_lengths.c + $(MV) -f ../Source/umf_tuple_lengths.o umf_oz_tuple_lengths.o + $(MKOCT) -DZINT -c ../Source/umf_usolve.c + $(MV) -f ../Source/umf_usolve.o umf_oz_usolve.o + $(MKOCT) -DZINT -c ../Source/umf_utsolve.c + $(MV) -f ../Source/umf_utsolve.o umf_oz_utsolve.o + $(MKOCT) -DZINT -c ../Source/umf_valid_numeric.c + $(MV) -f ../Source/umf_valid_numeric.o umf_oz_valid_numeric.o + $(MKOCT) -DZINT -c ../Source/umf_valid_symbolic.c + $(MV) -f ../Source/umf_valid_symbolic.o umf_oz_valid_symbolic.o + $(MKOCT) -DZINT -c ../Source/umf_grow_front.c + $(MV) -f ../Source/umf_grow_front.o umf_oz_grow_front.o + $(MKOCT) -DZINT -c ../Source/umf_start_front.c + $(MV) -f ../Source/umf_start_front.o umf_oz_start_front.o + $(MKOCT) -DZINT -c ../Source/umf_2by2.c + $(MV) -f ../Source/umf_2by2.o umf_oz_2by2.o + $(MKOCT) -DZINT -c ../Source/umf_store_lu.c + $(MV) -f ../Source/umf_store_lu.o umf_oz_store_lu.o + $(MKOCT) -DZINT -c ../Source/umf_scale.c + $(MV) -f ../Source/umf_scale.o umf_oz_scale.o + $(MKOCT) -DZINT -DWSOLVE -c ../Source/umfpack_solve.c + $(MV) -f ../Source/umfpack_solve.o umfpack_oz_wsolve.o + $(MKOCT) -DZINT -c ../Source/umfpack_col_to_triplet.c + $(MV) -f ../Source/umfpack_col_to_triplet.o umfpack_oz_col_to_triplet.o + $(MKOCT) -DZINT -c ../Source/umfpack_defaults.c + $(MV) -f ../Source/umfpack_defaults.o umfpack_oz_defaults.o + $(MKOCT) -DZINT -c ../Source/umfpack_free_numeric.c + $(MV) -f ../Source/umfpack_free_numeric.o umfpack_oz_free_numeric.o + $(MKOCT) -DZINT -c ../Source/umfpack_free_symbolic.c + $(MV) -f ../Source/umfpack_free_symbolic.o umfpack_oz_free_symbolic.o + $(MKOCT) -DZINT -c ../Source/umfpack_get_numeric.c + $(MV) -f ../Source/umfpack_get_numeric.o umfpack_oz_get_numeric.o + $(MKOCT) -DZINT -c ../Source/umfpack_get_lunz.c + $(MV) -f ../Source/umfpack_get_lunz.o umfpack_oz_get_lunz.o + $(MKOCT) -DZINT -c ../Source/umfpack_get_symbolic.c + $(MV) -f ../Source/umfpack_get_symbolic.o umfpack_oz_get_symbolic.o + $(MKOCT) -DZINT -c ../Source/umfpack_get_determinant.c + $(MV) -f ../Source/umfpack_get_determinant.o umfpack_oz_get_determinant.o + $(MKOCT) -DZINT -c ../Source/umfpack_numeric.c + $(MV) -f ../Source/umfpack_numeric.o umfpack_oz_numeric.o + $(MKOCT) -DZINT -c ../Source/umfpack_qsymbolic.c + $(MV) -f ../Source/umfpack_qsymbolic.o umfpack_oz_qsymbolic.o + $(MKOCT) -DZINT -c ../Source/umfpack_report_control.c + $(MV) -f ../Source/umfpack_report_control.o umfpack_oz_report_control.o + $(MKOCT) -DZINT -c ../Source/umfpack_report_info.c + $(MV) -f ../Source/umfpack_report_info.o umfpack_oz_report_info.o + $(MKOCT) -DZINT -c ../Source/umfpack_report_matrix.c + $(MV) -f ../Source/umfpack_report_matrix.o umfpack_oz_report_matrix.o + $(MKOCT) -DZINT -c ../Source/umfpack_report_numeric.c + $(MV) -f ../Source/umfpack_report_numeric.o umfpack_oz_report_numeric.o + $(MKOCT) -DZINT -c ../Source/umfpack_report_perm.c + $(MV) -f ../Source/umfpack_report_perm.o umfpack_oz_report_perm.o + $(MKOCT) -DZINT -c ../Source/umfpack_report_status.c + $(MV) -f ../Source/umfpack_report_status.o umfpack_oz_report_status.o + $(MKOCT) -DZINT -c ../Source/umfpack_report_symbolic.c + $(MV) -f ../Source/umfpack_report_symbolic.o umfpack_oz_report_symbolic.o + $(MKOCT) -DZINT -c ../Source/umfpack_report_triplet.c + $(MV) -f ../Source/umfpack_report_triplet.o umfpack_oz_report_triplet.o + $(MKOCT) -DZINT -c ../Source/umfpack_report_vector.c + $(MV) -f ../Source/umfpack_report_vector.o umfpack_oz_report_vector.o + $(MKOCT) -DZINT -c ../Source/umfpack_solve.c + $(MV) -f ../Source/umfpack_solve.o umfpack_oz_solve.o + $(MKOCT) -DZINT -c ../Source/umfpack_symbolic.c + $(MV) -f ../Source/umfpack_symbolic.o umfpack_oz_symbolic.o + $(MKOCT) -DZINT -c ../Source/umfpack_transpose.c + $(MV) -f ../Source/umfpack_transpose.o umfpack_oz_transpose.o + $(MKOCT) -DZINT -c ../Source/umfpack_triplet_to_col.c + $(MV) -f ../Source/umfpack_triplet_to_col.o umfpack_oz_triplet_to_col.o + $(MKOCT) -DZINT -c ../Source/umfpack_scale.c + $(MV) -f ../Source/umfpack_scale.o umfpack_oz_scale.o + $(MKOCT) -DZINT -c ../Source/umfpack_load_numeric.c + $(MV) -f ../Source/umfpack_load_numeric.o umfpack_oz_load_numeric.o + $(MKOCT) -DZINT -c ../Source/umfpack_save_numeric.c + $(MV) -f ../Source/umfpack_save_numeric.o umfpack_oz_save_numeric.o + $(MKOCT) -DZINT -c ../Source/umfpack_load_symbolic.c + $(MV) -f ../Source/umfpack_load_symbolic.o umfpack_oz_load_symbolic.o + $(MKOCT) -DZINT -c ../Source/umfpack_save_symbolic.c + $(MV) -f ../Source/umfpack_save_symbolic.o umfpack_oz_save_symbolic.o + $(MKOCT) -c ../Source/umfpack_timer.c + $(MV) -f ../Source/umfpack_timer.o umfpack_m_timer.o + $(MKOCT) -c ../Source/umfpack_tictoc.c + $(MV) -f ../Source/umfpack_tictoc.o umfpack_m_tictoc.o + $(MKOCT) -DDINT -c ../../AMD/Source/amd_aat.c + $(MV) -f ../../AMD/Source/amd_aat.o amd_m_aat.o + $(MKOCT) -DDINT -c ../../AMD/Source/amd_1.c + $(MV) -f ../../AMD/Source/amd_1.o amd_m_1.o + $(MKOCT) -DDINT -c ../../AMD/Source/amd_2.c + $(MV) -f ../../AMD/Source/amd_2.o amd_m_2.o + $(MKOCT) -DDINT -c ../../AMD/Source/amd_dump.c + $(MV) -f ../../AMD/Source/amd_dump.o amd_m_dump.o + $(MKOCT) -DDINT -c ../../AMD/Source/amd_postorder.c + $(MV) -f ../../AMD/Source/amd_postorder.o amd_m_postorder.o + $(MKOCT) -DDINT -c ../../AMD/Source/amd_post_tree.c + $(MV) -f ../../AMD/Source/amd_post_tree.o amd_m_post_tree.o + $(MKOCT) -DDINT -c ../../AMD/Source/amd_defaults.c + $(MV) -f ../../AMD/Source/amd_defaults.o amd_m_defaults.o + $(MKOCT) -DDINT -c ../../AMD/Source/amd_order.c + $(MV) -f ../../AMD/Source/amd_order.o amd_m_order.o + $(MKOCT) -DDINT -c ../../AMD/Source/amd_control.c + $(MV) -f ../../AMD/Source/amd_control.o amd_m_control.o + $(MKOCT) -DDINT -c ../../AMD/Source/amd_info.c + $(MV) -f ../../AMD/Source/amd_info.o amd_m_info.o + $(MKOCT) -DDINT -c ../../AMD/Source/amd_valid.c + $(MV) -f ../../AMD/Source/amd_valid.o amd_m_valid.o + $(MKOCT) -o umfpack.oct $(OCT_SPARSE_INC) umfpack.cc \ + umf_o_analyze.o umf_o_apply_order.o umf_o_colamd.o umf_o_free.o \ + umf_o_fsize.o umf_o_is_permutation.o umf_o_malloc.o \ + umf_o_realloc.o umf_o_report_perm.o umf_o_singletons.o \ + umf_od_lhsolve.o umf_od_uhsolve.o umf_od_triplet_map_nox.o \ + umf_od_triplet_nomap_x.o umf_od_triplet_nomap_nox.o \ + umf_od_triplet_map_x.o umf_od_assemble_fixq.o \ + umf_od_store_lu_drop.o umf_od_assemble.o umf_od_blas3_update.o \ + umf_od_build_tuples.o umf_od_create_element.o umf_od_dump.o \ + umf_od_extend_front.o umf_od_garbage_collection.o \ + umf_od_get_memory.o umf_od_init_front.o umf_od_kernel.o \ + umf_od_kernel_init.o umf_od_kernel_wrapup.o umf_od_local_search.o \ + umf_od_lsolve.o umf_od_ltsolve.o umf_od_mem_alloc_element.o \ + umf_od_mem_alloc_head_block.o umf_od_mem_alloc_tail_block.o \ + umf_od_mem_free_tail_block.o umf_od_mem_init_memoryspace.o \ + umf_od_report_vector.o umf_od_row_search.o umf_od_scale_column.o \ + umf_od_set_stats.o umf_od_solve.o umf_od_symbolic_usage.o \ + umf_od_transpose.o umf_od_tuple_lengths.o umf_od_usolve.o \ + umf_od_utsolve.o umf_od_valid_numeric.o umf_od_valid_symbolic.o \ + umf_od_grow_front.o umf_od_start_front.o umf_od_2by2.o \ + umf_od_store_lu.o umf_od_scale.o umfpack_od_wsolve.o \ + umfpack_od_col_to_triplet.o umfpack_od_defaults.o \ + umfpack_od_free_numeric.o umfpack_od_free_symbolic.o \ + umfpack_od_get_numeric.o umfpack_od_get_lunz.o \ + umfpack_od_get_symbolic.o umfpack_od_numeric.o \ + umfpack_od_qsymbolic.o umfpack_od_report_control.o \ + umfpack_od_report_info.o umfpack_od_report_matrix.o \ + umfpack_od_report_numeric.o umfpack_od_report_perm.o \ + umfpack_od_report_status.o umfpack_od_report_symbolic.o \ + umfpack_od_report_triplet.o umfpack_od_report_vector.o \ + umfpack_od_solve.o umfpack_od_symbolic.o umfpack_od_transpose.o \ + umfpack_od_triplet_to_col.o umfpack_od_scale.o \ + umfpack_od_load_numeric.o umfpack_od_save_numeric.o \ + umfpack_od_load_symbolic.o umfpack_od_save_symbolic.o \ + umf_oz_lhsolve.o umf_oz_uhsolve.o umf_oz_triplet_map_nox.o \ + umf_oz_triplet_nomap_x.o umf_oz_triplet_nomap_nox.o \ + umf_oz_triplet_map_x.o umf_oz_assemble_fixq.o \ + umf_oz_store_lu_drop.o umf_oz_assemble.o umf_oz_blas3_update.o \ + umf_oz_build_tuples.o umf_oz_create_element.o umf_oz_dump.o \ + umf_oz_extend_front.o umf_oz_garbage_collection.o \ + umf_oz_get_memory.o umf_oz_init_front.o umf_oz_kernel.o \ + umf_oz_kernel_init.o umf_oz_kernel_wrapup.o umf_oz_local_search.o \ + umf_oz_lsolve.o umf_oz_ltsolve.o umf_oz_mem_alloc_element.o \ + umf_oz_mem_alloc_head_block.o umf_oz_mem_alloc_tail_block.o \ + umf_oz_mem_free_tail_block.o umf_oz_mem_init_memoryspace.o \ + umf_oz_report_vector.o umf_oz_row_search.o umf_oz_scale_column.o \ + umf_oz_set_stats.o umf_oz_solve.o umf_oz_symbolic_usage.o \ + umf_oz_transpose.o umf_oz_tuple_lengths.o umf_oz_usolve.o \ + umf_oz_utsolve.o umf_oz_valid_numeric.o umf_oz_valid_symbolic.o \ + umf_oz_grow_front.o umf_oz_start_front.o umf_oz_2by2.o \ + umf_oz_store_lu.o umf_oz_scale.o umfpack_oz_wsolve.o \ + umfpack_oz_col_to_triplet.o umfpack_oz_defaults.o \ + umfpack_oz_free_numeric.o umfpack_oz_free_symbolic.o \ + umfpack_oz_get_numeric.o umfpack_oz_get_lunz.o \ + umfpack_oz_get_symbolic.o umfpack_oz_numeric.o \ + umfpack_oz_qsymbolic.o umfpack_oz_report_control.o \ + umfpack_oz_report_info.o umfpack_oz_report_matrix.o \ + umfpack_oz_report_numeric.o umfpack_oz_report_perm.o \ + umfpack_oz_report_status.o umfpack_oz_report_symbolic.o \ + umfpack_oz_report_triplet.o umfpack_oz_report_vector.o \ + umfpack_oz_solve.o umfpack_oz_symbolic.o umfpack_oz_transpose.o \ + umfpack_oz_triplet_to_col.o umfpack_oz_scale.o \ + umfpack_oz_load_numeric.o umfpack_oz_save_numeric.o \ + umfpack_oz_load_symbolic.o umfpack_oz_save_symbolic.o \ + umfpack_o_timer.o umfpack_o_tictoc.o \ + amd_o_aat.o amd_o_1.o amd_o_2.o amd_o_dump.o \ + amd_o_postorder.o amd_o_post_tree.o amd_o_defaults.o amd_o_order.o \ + amd_o_control.o amd_o_info.o amd_o_valid.o + +luflop: luflop.cc + $(MKOCT) luflop.cc -I$(OCT_SPARSE_INC) -o luflop.oct + +#---------------------------------------- +# umfpack library to link with octave +#---------------------------------------- + +octave: umfpack + ld -r -o ../../../$(OCTUMFPACK_LIB) \ + umf_o_analyze.o umf_o_apply_order.o umf_o_colamd.o umf_o_free.o \ + umf_o_fsize.o umf_o_is_permutation.o umf_o_malloc.o \ + umf_o_realloc.o umf_o_report_perm.o umf_o_singletons.o \ + umf_od_lhsolve.o umf_od_uhsolve.o umf_od_triplet_map_nox.o \ + umf_od_triplet_nomap_x.o umf_od_triplet_nomap_nox.o \ + umf_od_triplet_map_x.o umf_od_assemble_fixq.o \ + umf_od_store_lu_drop.o umf_od_assemble.o umf_od_blas3_update.o \ + umf_od_build_tuples.o umf_od_create_element.o umf_od_dump.o \ + umf_od_extend_front.o umf_od_garbage_collection.o \ + umf_od_get_memory.o umf_od_init_front.o umf_od_kernel.o \ + umf_od_kernel_init.o umf_od_kernel_wrapup.o umf_od_local_search.o \ + umf_od_lsolve.o umf_od_ltsolve.o umf_od_mem_alloc_element.o \ + umf_od_mem_alloc_head_block.o umf_od_mem_alloc_tail_block.o \ + umf_od_mem_free_tail_block.o umf_od_mem_init_memoryspace.o \ + umf_od_report_vector.o umf_od_row_search.o umf_od_scale_column.o \ + umf_od_set_stats.o umf_od_solve.o umf_od_symbolic_usage.o \ + umf_od_transpose.o umf_od_tuple_lengths.o umf_od_usolve.o \ + umf_od_utsolve.o umf_od_valid_numeric.o umf_od_valid_symbolic.o \ + umf_od_grow_front.o umf_od_start_front.o umf_od_2by2.o \ + umf_od_store_lu.o umf_od_scale.o umfpack_od_wsolve.o \ + umfpack_od_col_to_triplet.o umfpack_od_defaults.o \ + umfpack_od_free_numeric.o umfpack_od_free_symbolic.o \ + umfpack_od_get_numeric.o umfpack_od_get_lunz.o \ + umfpack_od_get_symbolic.o umfpack_od_numeric.o \ + umfpack_od_qsymbolic.o umfpack_od_report_control.o \ + umfpack_od_report_info.o umfpack_od_report_matrix.o \ + umfpack_od_report_numeric.o umfpack_od_report_perm.o \ + umfpack_od_report_status.o umfpack_od_report_symbolic.o \ + umfpack_od_report_triplet.o umfpack_od_report_vector.o \ + umfpack_od_solve.o umfpack_od_symbolic.o umfpack_od_transpose.o \ + umfpack_od_triplet_to_col.o umfpack_od_scale.o \ + umfpack_od_load_numeric.o umfpack_od_save_numeric.o \ + umfpack_od_load_symbolic.o umfpack_od_save_symbolic.o \ + umf_oz_lhsolve.o umf_oz_uhsolve.o umf_oz_triplet_map_nox.o \ + umf_oz_triplet_nomap_x.o umf_oz_triplet_nomap_nox.o \ + umf_oz_triplet_map_x.o umf_oz_assemble_fixq.o \ + umf_oz_store_lu_drop.o umf_oz_assemble.o umf_oz_blas3_update.o \ + umf_oz_build_tuples.o umf_oz_create_element.o umf_oz_dump.o \ + umf_oz_extend_front.o umf_oz_garbage_collection.o \ + umf_oz_get_memory.o umf_oz_init_front.o umf_oz_kernel.o \ + umf_oz_kernel_init.o umf_oz_kernel_wrapup.o umf_oz_local_search.o \ + umf_oz_lsolve.o umf_oz_ltsolve.o umf_oz_mem_alloc_element.o \ + umf_oz_mem_alloc_head_block.o umf_oz_mem_alloc_tail_block.o \ + umf_oz_mem_free_tail_block.o umf_oz_mem_init_memoryspace.o \ + umf_oz_report_vector.o umf_oz_row_search.o umf_oz_scale_column.o \ + umf_oz_set_stats.o umf_oz_solve.o umf_oz_symbolic_usage.o \ + umf_oz_transpose.o umf_oz_tuple_lengths.o umf_oz_usolve.o \ + umf_oz_utsolve.o umf_oz_valid_numeric.o umf_oz_valid_symbolic.o \ + umf_oz_grow_front.o umf_oz_start_front.o umf_oz_2by2.o \ + umf_oz_store_lu.o umf_oz_scale.o umfpack_oz_wsolve.o \ + umfpack_oz_col_to_triplet.o umfpack_oz_defaults.o \ + umfpack_oz_free_numeric.o umfpack_oz_free_symbolic.o \ + umfpack_oz_get_numeric.o umfpack_oz_get_lunz.o \ + umfpack_oz_get_symbolic.o umfpack_oz_numeric.o \ + umfpack_oz_qsymbolic.o umfpack_oz_report_control.o \ + umfpack_oz_report_info.o umfpack_oz_report_matrix.o \ + umfpack_oz_report_numeric.o umfpack_oz_report_perm.o \ + umfpack_oz_report_status.o umfpack_oz_report_symbolic.o \ + umfpack_oz_report_triplet.o umfpack_oz_report_vector.o \ + umfpack_oz_solve.o umfpack_oz_symbolic.o umfpack_oz_transpose.o \ + umfpack_oz_triplet_to_col.o umfpack_oz_scale.o \ + umfpack_oz_load_numeric.o umfpack_oz_save_numeric.o \ + umfpack_oz_load_symbolic.o umfpack_oz_save_symbolic.o \ + umfpack_o_timer.o umfpack_o_tictoc.o \ + amd_o_aat.o amd_o_1.o amd_o_2.o amd_o_dump.o \ + amd_o_postorder.o amd_o_post_tree.o amd_o_defaults.o amd_o_order.o \ + amd_o_control.o amd_o_info.o amd_o_valid.o + +#------------------------------------------------------------------------------- +# Remove all but the files in the original distribution +#------------------------------------------------------------------------------- + +purge: clean + - $(RM) *.oct* *.dll diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/OCTAVE/lu_normest.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/OCTAVE/lu_normest.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,106 @@ +function rho = lu_normest (A, L, U) +% LU_NORMEST: estimate the 1-norm of A-L*U without computing L*U +% +% Usage: +% +% rho = lu_normest (A, L, U) +% +% which estimates the computation of the 1-norm: +% +% rho = norm (A-L*U, 1) +% +% Authors: William W. Hager, Math Dept., Univ. of Florida +% Timothy A. Davis, CISE Dept., Univ. of Florida +% Gainesville, FL, 32611, USA. +% based on normest1, contributed on November, 1997 +% +% This code can be quite easily adapted to estimate the 1-norm of any +% matrix E, where E itself is dense or not explicitly represented, but the +% computation of E (and E') times a vector is easy. In this case, our matrix +% of interest is: +% +% E = A-L*U +% +% That is, L*U is the LU factorization of A, where A, L and U +% are sparse. This code works for dense matrices A and L too, +% but it would not be needed in that case, since E is easy to compute +% explicitly. For sparse A, L, and U, computing E explicitly would be quite +% expensive, and thus normest (A-L*U) would be prohibitive. +% +% For a detailed description, see Davis, T. A. and Hager, W. W., +% Modifying a sparse Cholesky factorization, SIAM J. Matrix Analysis and +% Applications, 1999, vol. 20, no. 3, 606-627. + +% The three places that the matrix-vector multiply E*x is used are highlighted. +% Note that E is never formed explicity. + +[m n] = size (A) ; + +if (m ~= n) + % pad A, L, and U with zeros so that they are all square + if (m < n) + U = [ U ; (sparse (n-m,n)) ] ; + L = [ L , (sparse (m,n-m)) ; (sparse (n-m,n)) ] ; + A = [ A ; (sparse (n-m,n)) ] ; + else + U = [ U , (sparse (n,m-n)) ; (sparse (m-n,m)) ] ; + L = [ L , (sparse (m,m-n)) ] ; + A = [ A , (sparse (m,m-n)) ] ; + end +end + +[m n] = size (A) ; + +notvisited = ones (m, 1) ; % nonvisited(j) is zero if j is visited, 1 otherwise +rho = 0 ; % the global rho + +At = A' ; +Lt = L' ; + +for trial = 1:3 % { + + x = notvisited ./ sum (notvisited) ; + rho1 = 0 ; % the current rho for this trial + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %%% COMPUTE Ex1 = E*x EFFICIENTLY: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + Ex1 = (A*x) - L*(U*x) ; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + rho2 = norm (Ex1, 1) ; + + while rho2 > rho1 % { + + rho1 = rho2 ; + y = 2*(Ex1 >= 0) - 1 ; + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %%% COMPUTE z = E'*y EFFICIENTLY: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + z = (A'*y) - U'*(L'*y) ; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + [zj, j] = max (abs (z .* notvisited)) ; + j = j (1) ; + if (abs (z (j)) > z'*x) % { + x = zeros (m, 1) ; + x (j) = 1 ; + notvisited (j) = 0 ; + else % } { + break ; + end % } + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %%% COMPUTE Ex1 = E*x EFFICIENTLY: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + Ex1 = (A*x) - L*(U*x) ; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + rho2 = norm (Ex1, 1) ; + + end % } + + rho = max (rho, rho1) ; + +end % } diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/OCTAVE/luflop.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/OCTAVE/luflop.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,223 @@ +/* + +Copyright (C) 2004 David Bateman + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +In addition to the terms of the GPL, you are permitted to link +this program with any Open Source program, as defined by the +Open Source Initiative (www.opensource.org) + +*/ + +/* + +This is the Octave interface to the UMFPACK code, which bore the following +copyright + + UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A. + Davis. All Rights Reserved. See ../README for License. + email: davis@cise.ufl.edu CISE Department, Univ. of Florida. + web: http://www.cise.ufl.edu/research/sparse/umfpack + +*/ + + +#include +#include + +#include +#include +#include +#include +#include + +#include "ov-re-sparse.h" +#include "ov-cx-sparse.h" + +DEFUN_DLD (luflop, args, nargout, + "-*- texinfo -*-\n\ +@deftypefn {Loadable Function} {@var{f} =} luflup (@var{l}, @var{u})\n\ +\n\ +Given an LU factorization, compute how many flops took to compute it. This\n\ +is the same as (assuming U has a zero-free diagonal):\n\ +\n\ +@example\n\ +@group\n\ + Lnz = full (sum (spones (L))) - 1 ;\n\ + Unz = full (sum (spones (U')))' - 1 ;\n\ + f = 2*Lnz*Unz + sum (Lnz) ;\n\ +@end group\n\ +@end example\n\ +\n\ +except that no extra workspace is allocated for spones (L) and spones (U).\n\ +L and U must be sparse.\n\ +\n\ +Note: the above expression has a subtle undercount when exact numerical\n\ +cancelation occurs. Try [L,U,P] = lu (sparse (ones (10))) and then\n\ +luflop (L,U).\n\ +@end deftypefn") +{ + int nargin = args.length (); + octave_value retval; + + // These are here only so that the C++ destructors don't prematurally + // remove the underlying data we are interested in + SparseMatrix Lmatrix, Umatrix; + SparseComplexMatrix CLmatrix, CUmatrix; + int *Lp, *Li, *Up, *Ui; + int Lm, Ln, Um, Un; + + if (nargin != 2) + { + usage ("f = luflop (L, U)"); + return retval; + } + + if (args(0).class_name () == "sparse") + { + if (args(0).is_complex_type ()) + { + CLmatrix = + (((const octave_sparse_complex_matrix&) args(0).get_rep ()) + .sparse_complex_matrix_value ()); + Lp = CLmatrix.cidx (); + Li = CLmatrix.ridx (); + Lm = CLmatrix.rows (); + Ln = CLmatrix.cols (); + } + else + { + Lmatrix = (((const octave_sparse_matrix&) args(0).get_rep ()) + .sparse_matrix_value ()); + Lp = Lmatrix.cidx (); + Li = Lmatrix.ridx (); + Lm = Lmatrix.rows (); + Ln = Lmatrix.cols (); + } + } + else + { + if (args(0).is_complex_type ()) + { + CLmatrix = SparseComplexMatrix (args(0).complex_matrix_value ()); + Lp = CLmatrix.cidx (); + Li = CLmatrix.ridx (); + Lm = CLmatrix.rows (); + Ln = CLmatrix.cols (); + } + else + { + Lmatrix = SparseMatrix (args(0).matrix_value ()); + Lp = Lmatrix.cidx (); + Li = Lmatrix.ridx (); + Lm = Lmatrix.rows (); + Ln = Lmatrix.cols (); + } + } + + + if (args(0).class_name () == "sparse") + { + if (args(1).is_complex_type ()) + { + CUmatrix = + (((const octave_sparse_complex_matrix&) args(1).get_rep ()) + .sparse_complex_matrix_value ()); + Up = CUmatrix.cidx (); + Ui = CUmatrix.ridx (); + Um = CUmatrix.rows (); + Un = CUmatrix.cols (); + } + else + { + Umatrix = + (((const octave_sparse_matrix&) args(1).get_rep ()) + .sparse_matrix_value ()); + Up = Umatrix.cidx (); + Ui = Umatrix.ridx (); + Um = Umatrix.rows (); + Un = Umatrix.cols (); + } + } + else + { + if (args(1).is_complex_type ()) + { + CUmatrix = SparseComplexMatrix (args(1).complex_matrix_value ()); + Up = CUmatrix.cidx (); + Ui = CUmatrix.ridx (); + Um = CUmatrix.rows (); + Un = CUmatrix.cols (); + } + else + { + Umatrix = SparseMatrix (args(1).matrix_value ()); + Up = Umatrix.cidx (); + Ui = Umatrix.ridx (); + Um = Umatrix.rows (); + Un = Umatrix.cols (); + } + } + + + if (error_state) + return retval; + + + int n = Lm; + + if (n != Ln || n != Um || n != Un) + error ("luflop: L and U must be square"); + else + { + + OCTAVE_LOCAL_BUFFER (int, Unz, n); + + // count the nonzeros in each row of U + for (int row = 0 ; row < n ; row++) + Unz [row] = 0 ; + + for (int col = 0 ; col < n ; col++) + { + for (int p = Up [col] ; p < Up [col+1] ; p++) + { + int row = Ui [p] ; + Unz [row]++ ; + } + } + + // count the flops + double flop_count = 0.0 ; + for (int k = 0 ; k < n ; k++) + { + /* off-diagonal nonzeros in column k of L: */ + int Lnz_k = Lp [k+1] - Lp [k] - 1 ; + int Unz_k = Unz [k] - 1 ; + flop_count += (2 * Lnz_k * Unz_k) + Lnz_k ; + } + + // return the result + retval = flop_count; + } + + return retval; +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/OCTAVE/umfpack.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/OCTAVE/umfpack.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,1399 @@ +/* + +Copyright (C) 2004 David Bateman + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +In addition to the terms of the GPL, you are permitted to link +this program with any Open Source program, as defined by the +Open Source Initiative (www.opensource.org) + +*/ + +/* + +This is the Octave interface to the UMFPACK code, which bore the following +copyright + + UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A. + Davis. All Rights Reserved. See ../README for License. + email: davis@cise.ufl.edu CISE Department, Univ. of Florida. + web: http://www.cise.ufl.edu/research/sparse/umfpack + +*/ + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "ov-re-sparse.h" +#include "ov-cx-sparse.h" + +// External UMFPACK functions in C +extern "C" { +#include "umfpack.h" +} + +#define MIN(a,b) (((a) < (b)) ? (a) : (b)) +#define MAX(a,b) (((a) > (b)) ? (a) : (b)) + +// Return an error message +static +void umfpack_error (const char *s, int A_is_complex, int nargout, + octave_value_list retval, NDArray Control, + NDArray Info, int status, int do_info) +{ + if (A_is_complex) + { + umfpack_zi_report_status (Control.fortran_vec (), status) ; + umfpack_zi_report_info (Control.fortran_vec (), Info.fortran_vec ()) ; + } + else + { + umfpack_di_report_status (Control.fortran_vec (), status) ; + umfpack_di_report_info (Control.fortran_vec (), Info.fortran_vec ()) ; + } + if (do_info > 0) + // return Info + retval (do_info) = octave_value (Info); + + error (s); +} + +DEFUN_DLD (umfpack, args, nargout, + "-*- texinfo -*-\n\ +@deftypefn {Loadable Function} {[@var{x}, @var{Info}] =} umfpack (@var{a}, '\\', @var{b})\n\ +@deftypefnx {Loadable Function} {[@var{x}, @var{Info}] =} umfpack (@var{a}, '\\', @var{b}, @var{Control})\n\ +@deftypefnx {Loadable Function} {[@var{x}, @var{Info}] =} umfpack (@var{a}, @var{Qinit}, '\\', @var{b}, @var{Control})\n\ +@deftypefnx {Loadable Function} {[@var{x}, @var{Info}] =} umfpack (@var{a}, @var{Qinit}, '\\', b)\n\ +@deftypefnx {Loadable Function} {[@var{x}, @var{Info}] =} umfpack (@var{b}, '/', A) ;\n\ +@deftypefnx {Loadable Function} {[@var{x}, @var{Info}] =} umfpack (@var{b}, '/', @var{a}, @var{Control}) ;\n\ +@deftypefnx {Loadable Function} {[@var{x}, @var{Info}] =} umfpack (@var{b}, '/', @var{a}, @var{Qinit}) ;\n\ +@deftypefnx {Loadable Function} {[@var{x}, @var{Info}] =} umfpack (@var{b}, '/', @var{a}, @var{Qinit}, @var{Control}) ;\n\ +@deftypefnx {Loadable Function} {[@var{l}, @var{u}, @var{p}, @var{q}, @var{r}, @var{Info}] =} umfpack (@var{a}) ;\n\ +@deftypefnx {Loadable Function} {[@var{l}, @var{u}, @var{p}, @var{q}, @var{r}, @var{Info}] =} umfpack (@var{a}, @var{Control}) ;\n\ +@deftypefnx {Loadable Function} {[@var{l}, @var{u}, @var{p}, @var{q}, @var{r}, @var{Info}] =} umfpack (@var{a}, @var{Qinit}) ;\n\ +@deftypefnx {Loadable Function} {[@var{l}, @var{u}, @var{p}, @var{q}, @var{r}, @var{Info}] =} umfpack (@var{a}, @var{Qinit}, @var{Control}) ;\n\ +@deftypefnx {Loadable Function} {[@var{l}, @var{u}, @var{p}, @var{q}] =} umfpack (@var{a}) ;\n\ +@deftypefnx {Loadable Function} {[@var{l}, @var{u}, @var{p}, @var{q}] =} umfpack (@var{a}, @var{Control}) ;\n\ +@deftypefnx {Loadable Function} {[@var{l}, @var{u}, @var{p}, @var{q}] =} umfpack (@var{a}, @var{Qinit}) ;\n\ +@deftypefnx {Loadable Function} {[@var{l}, @var{u}, @var{p}, @var{q}] =} umfpack (@var{a}, @var{Qinit}, @var{Control}) ;\n\ +@deftypefnx {Loadable Function} {[P1, Q1, Fr, Ch, Info] =} umfpack (@var{a}, 'symbolic') ;\n\ +@deftypefnx {Loadable Function} {[P1, Q1, Fr, Ch, Info] =} umfpack (@var{a}, 'symbolic', @var{Control}) ;\n\ +@deftypefnx {Loadable Function} {[P1, Q1, Fr, Ch, Info] =} umfpack (@var{a}, @var{Qinit}, 'symbolic') ;\n\ +@deftypefnx {Loadable Function} {[P1, Q1, Fr, Ch, Info] =} umfpack (@var{a}, @var{Qinit}, 'symbolic', @var{Control});\n\ +@deftypefnx {Loadable Function} {@var{Control} =} umfpack ;\n\ +\n\ +UMFPACK v4.3 is a Octave oct-file for solving sparse linear systems.\n\ +\n\ +@iftex\n\ +@tex\n\ +\\vskip 2ex\n\ +\\hfil\\vbox{\n\ +\\offinterlineskip\n\ +\\tabskip=0pt\n\ +\\halign{\n\ +\\vrule height1.75ex depth1.25ex width 0.6pt #\\tabskip=1em &\n\ +\\hfil #\\hfil &\\vrule # & \n\ +\\hfil #\\hfil &\\vrule # width 0.6pt \\tabskip=0pt\\cr\n\ +\\noalign{\\hrule height 0.6pt}\n\ +& UMFPACK v4.3 && OCTAVE approximate equivalent &\\cr\n\ +\\noalign{\\hrule} \n\ +& x = umfpack (A, '\\', b) ; && x = A \\ b &\\cr\n\ +& && &\\cr\n\ +&x = umfpack (b, '/', A) ; && x = b / A &\\cr\n\ +& && &\\cr\n\ +&[L,U,P,Q] = umfpack (A) ; && [m,n] = size (A) ; &\\cr\n\ +& && I = speye (n) ; &\\cr\n\ +& && Q = I (:, colamd (A)) ; &\\cr\n\ +& && [L,U,P] = lu (A*Q) ; &\\cr\n\ +& && &\\cr\n\ +&[L,U,P,Q,R] = umfpack (A) ; && [m,n] = size (A) ; &\\cr\n\ +& && I = speye (n) ; &\\cr\n\ +& && Q = I (:, colamd (A)) ; &\\cr\n\ +& && r = full (sum (abs (A), 2)) ; &\\cr\n\ +& && r (find (r == 0)) = 1 ; &\\cr\n\ +& && R = spdiags (r, 0, m, m) ; &\\cr\n\ +& && [L,U,P] = lu ((R\\A)*Q) ; &\\cr\n\ +& && &\\cr\n\ +&[P,Q,F,C] = umfpack (A, 'symbolic')&& [m,n] = size (A) ; &\\cr\n\ +& && I = speye (n) ; &\\cr\n\ +& && Q = I (:, colamd (A)) ; &\\cr\n\ +& && [count,h,parent,post] = ... &\\cr\n\ +& && symbfact (A*Q, 'col') ; &\\cr\n\ +\\noalign{\\hrule height 0.6pt}\n\ +}}\\hfil\n\ +\\vskip 1ex\n\ +@end tex\n\ +@end iftex\n\ +@ifinfo\n\ +@multitable @columnfractions 0.43 .02 .43\n\ +@item UMFPACK v4.3: @tab | \n\ +@tab OCTAVE approx. equivalent\n\ +@item ------------------------------- @tab | \n\ +@tab --------------------------------\n\ +@item x = umfpack (A, '\\', b) ; @tab | \n\ +@tab x = A \\ b\n\ +@item @tab | \n\ +@tab\n\ +@item x = umfpack (b, '/', A) ; @tab | \n\ +@tab x = b / A\n\ +@item @tab | \n\ +@tab\n\ +@item [L,U,P,Q] = umfpack (A) ; @tab | \n\ +@tab [m,n] = size (A) ;\n\ +@item @tab | \n\ +@tab I = speye (n) ;\n\ +@item @tab | \n\ +@tab Q = I (:, colamd (A)) ;\n\ +@item @tab | \n\ +@tab [L,U,P] = lu (A*Q) ;\n\ +@item @tab | \n\ +@tab\n\ +@item [L,U,P,Q,R] = umfpack (A) ; @tab | \n\ +@tab [m,n] = size (A) ;\n\ +@item @tab | \n\ +@tab I = speye (n) ;\n\ +@item @tab | \n\ +@tab Q = I (:, colamd (A)) ;\n\ +@item @tab | \n\ +@tab r = full (sum (abs (A), 2)) ;\n\ +@item @tab | \n\ +@tab r (find (r == 0)) = 1 ;\n\ +@item @tab | \n\ +@tab R = spdiags (r, 0, m, m) ;\n\ +@item @tab | \n\ +@tab [L,U,P] = lu ((R\\A)*Q) ;\n\ +@item @tab | \n\ +@tab\n\ +@item [P,Q,F,C] = umfpack (A, 'symbolic') @tab | \n\ +@tab [m,n] = size (A) ; \n\ +@item @tab | \n\ +@tab I = speye (n) ;\n\ +@item @tab | \n\ +@tab Q = I (:, colamd (A)) ;\n\ +@item @tab | \n\ +@tab [count,h,parent,post] = ...\n\ +@item @tab | \n\ +@tab symbfact (A*Q, 'col') ;\n\ +@end multitable\n\ +@end ifinfo\n\ +\n\ +A must be sparse. It can be complex, singular, and/or rectangular.\n\ +A must be square for '/' or '\\'. b must be a full real or complex\n\ +vector. For @code{[@var{l}, @var{u}, @var{p}, @var{q}, @var{r}] =\n\ +umfpack (@var{a})}, the factorization is @code{@var{l} * @var{u} =\n\ +@var{p} * (@var{r} \\ @var{a}) * @var{q}}. If @var{a} has a mostly\n\ +symmetric nonzero pattern, then replace @dfn{colamd} with @dfn{amd}\n\ +in the OCTAVE-equivalent column in the table above.\n\ +\n\ +Factor or solve a sparse linear system, returning either the solution\n\ +@var{x} to @code{@var{A} * @var{x} = @var{b}} or @code{@var{A}' * @var{x}'\n\ += @var{b}'}, the factorization LU=PAQ, or LU=P(R\\A)Q. A must be sparse.\n\ +For the solve, A must be square and b must be a dense n-by-1 vector. For LU\n\ +factorization, A can be rectangular. In both cases, A and/or b can be real\n\ +or complex.\n\ +\n\ +UMFPACK analyzes the matrix and selects one of three strategies to factorize\n\ +the matrix. It first finds a set of k initial pivot entries of zero\n\ +Markowitz cost. This forms the first k rows and columns of L and U. The\n\ +remaining submatrix S is then analyzed, based on the symmetry of the nonzero\n\ +pattern of the submatrix and the values on the diagaonal. The strategies\n\ +include:\n\ +\n\ +@table @asis\n\ +@item unsymmetric\n\ +Use a COLAMD pre-ordering, a column elimination tree\n\ +post-ordering, refine the column ordering during factorization,\n\ +and make no effort at selecting pivots on the diagonal.\n\ +@item 2-by-2\n\ +Like the symmetric strategy (see below), except that local\n\ +row permutations are first made to attempt to place large entries\n\ +on the diagonal.\n\ +@item symmetric\n\ +Use an AMD pre-ordering on the matrix @code{@var{s} + @var{s}'}, an\n\ +elimination tree post-ordering, do not refine the column ordering during\n\ +factorization, and attempt to select pivots on the diagonal.\n\ +@end table\n\ +\n\ +Each of the following uses of umfpack (except for 'Control = umfpack') is\n\ +stand-alone. That is, no call to umfpack is required for any subsequent\n\ +call. In each usage, the Info output argument is optional.\n\ +\n\ +Usage:\n\ +\n\ +[x, Info] = umfpack (A, '\\', b) ;\n\ +[x, Info] = umfpack (A, '\\', b, Control) ;\n\ +[x, Info] = umfpack (A, Qinit, '\\', b, Control) ;\n\ +[x, Info] = umfpack (A, Qinit, '\\', b) ;\n\ +\n\ + Solves Ax=b (similar to x = A\\b in OCTAVE).\n\ +\n\ +[x, Info] = umfpack (b, '/', A) ;\n\ +[x, Info] = umfpack (b, '/', A, Control) ;\n\ +[x, Info] = umfpack (b, '/', A, Qinit) ;\n\ +[x, Info] = umfpack (b, '/', A, Qinit, Control) ;\n\ +\n\ + Solves A'x'=b' (similar to x = b/A in OCTAVE).\n\ +\n\ +[L, U, P, Q, R, Info] = umfpack (A) ;\n\ +[L, U, P, Q, R, Info] = umfpack (A, Control) ;\n\ +[L, U, P, Q, R, Info] = umfpack (A, Qinit) ;\n\ +[L, U, P, Q, R, Info] = umfpack (A, Qinit, Control) ;\n\ +\n\ + Returns the LU factorization of A. P and Q are returned as permutation\n\ + matrices. R is a diagonal sparse matrix of scale factors for the rows\n\ + of A, L is lower triangular, and U is upper triangular. The\n\ + factorization is L*U = P*(R\\A)*Q. You can turn off scaling by setting\n\ + Control (17) to zero (in which case R = speye (m)), or by using the\n\ + following syntaxes (in which case Control (17) is ignored):\n\ +\n\ +[L, U, P, Q] = umfpack (A) ;\n\ +[L, U, P, Q] = umfpack (A, Control) ;\n\ +[L, U, P, Q] = umfpack (A, Qinit) ;\n\ +[L, U, P, Q] = umfpack (A, Qinit, Control) ;\n\ +\n\ + Same as above, except that no row scaling is performed. The Info array\n\ + is not returned, either.\n\ +\n\ +[P1, Q1, Fr, Ch, Info] = umfpack (A, 'symbolic') ;\n\ +[P1, Q1, Fr, Ch, Info] = umfpack (A, 'symbolic', Control) ;\n\ +[P1, Q1, Fr, Ch, Info] = umfpack (A, Qinit, 'symbolic') ;\n\ +[P1, Q1, Fr, Ch, Info] = umfpack (A, Qinit, 'symbolic', Control);\n\ +\n\ + Performs only the fill-reducing column pre-ordering (including the\n\ + elimination tree post-ordering) and symbolic factorization. Q1 is the\n\ + initial column permutation (either from colamd, amd, or the input\n\ + ordering Qinit), possibly followed by a column elimination tree post-\n\ + ordering or a symmetric elimination tree post-ordering, depending on\n\ + the strategy used.\n\ +\n\ + For the unsymmetric strategy, P1 is the row ordering induced by Q1\n\ + (row-merge order). For the 2-by-2 strategy, P1 is the row ordering that\n\ + places large entries on the diagonal of P1*A*Q1. For the symmetric\n\ + strategy, P1 = Q1.\n\ +\n\ + Fr is a (nfr+1)-by-4 array containing information about each frontal\n\ + matrix, where nfr <= n is the number of frontal matrices. Fr (:,1) is\n\ + the number of pivot columns in each front, and Fr (:,2) is the parent\n\ + of each front in the supercolumn elimination tree. Fr (k,2) is zero if\n\ + k is a root. The first Fr (1,1) columns of P1*A*Q1 are the pivot\n\ + columns for the first front, the next Fr (2,1) columns of P1*A*Q1\n\ + are the pivot columns for the second front, and so on.\n\ +\n\ + For the unsymmetric strategy, Fr (:,3) is the row index of the first\n\ + row in P1*A*Q1 whose leftmost nonzero entry is in a pivot column for\n\ + the kth front. Fr (:,4) is the leftmost descendent of the kth front.\n\ + Rows in the range Fr (Fr (k,4),3) to Fr (k+1,3)-1 form the entire set\n\ + of candidate pivot rows for the kth front (some of these will typically\n\ + have been selected as pivot rows of fronts Fr (k,3) to k-1, before the\n\ + factorization reaches the kth front. If front k is a leaf node, then\n\ + Fr (k,4) is k.\n\ +\n\ + Ch is a (nchains+1)-by-3 array containing information about each\n\ + 'chain' (unifrontal sequence) of frontal matrices, and where\n\ + nchains <= nfr is the number of chains. The ith chain consists of\n\ + frontal matrices. Chain (i,1) to Chain (i+1,1)-1, and the largest\n\ + front in chain i is Chain (i,2)-by-Chain (i,3).\n\ +\n\ + This use of umfpack is not required to factor or solve a linear system\n\ + in OCTAVE. It analyzes the matrix A and provides information only.\n\ + The OCTAVE statement @code{treeplot (Fr (:,2)')} plots the column\n\ + elimination tree.\n\ +\n\ +Control = umfpack ;\n\ +\n\ + Returns a 20-by-1 vector of default parameter settings for umfpack.\n\ +\n\ +umfpack_report (Control, Info) ;\n\ +\n\ + Prints the current Control settings, and Info\n\ +\n\ +If present, Qinit is a user-supplied 1-by-n permutation vector. It is an\n\ +initial fill-reducing column pre-ordering for A; if not present, then colamd\n\ +or amd are used instead. If present, Control is a user-supplied 20-by-1\n\ +array. Control and Info are optional; if Control is not present, defaults\n\ +are used. If a Control entry is NaN, then the default is used for that entry.\n\ +\n\ +UMFPACK Version 4.3 (Jan. 16, 2004), Copyright @copyright{} 2004 by\n\ +Timothy A. Davis. All Rights Reserved.\n\ +\n\ +UMFPACK License:\n\ +\n\ +@example\n\ +Your use or distribution of UMFPACK or any modified version of\n\ +UMFPACK implies that you agree to this License.\n\ +\n\ +THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY\n\ +EXPRESSED OR IMPLIED. ANY USE IS AT YOUR OWN RISK.\n\ +\n\ +Permission is hereby granted to use or copy this program, provided\n\ +that the Copyright, this License, and the Availability of the original\n\ +version is retained on all copies. User documentation of any code that\n\ +uses UMFPACK or any modified version of UMFPACK code must cite the\n\ +Copyright, this License, the Availability note, and 'Used by permission.'\n\ +Permission to modify the code and to distribute modified code is granted,\n\ +provided the Copyright, this License, and the Availability note are\n\ +retained, and a notice that the code was modified is included. This\n\ +software was developed with support from the National Science Foundation,\n\ +and is provided to you free of charge.\n\ +@end example\n\ +\n\ +Availability: http://www.cise.ufl.edu/research/sparse/umfpack\n\ +@end deftypefn\n\ +@seealso{lu_normtest, colamd, amd, umfpack_solve}") +{ + octave_value_list retval; + int nargin = args.length (); + int op = 0; + std::string operation; + bool do_solve = false; + int do_info = 0; + + ColumnVector User_Qinit; + SparseComplexMatrix CAmatrix; + ComplexMatrix CBmatrix; + SparseMatrix Amatrix; + Matrix Bmatrix; + NDArray User_Control_matrix; + + bool A_is_complex = false; + bool B_is_complex = false; + bool X_is_complex = false; + bool transpose = false; + bool have_User_Qinit = false; + bool have_User_Control_matrix = false; + bool do_numeric = true; + bool no_scale = false; + + // find the operator + for (int i = 0 ; i < nargin ; i++) + { + if (args(i).is_string ()) + { + op = i; + break; + } + } + + if (op > 0) + { + std::string op_type = args (op).string_value (); + + if (op_type == "\\") + { + + // matrix left divide, x = A\b + + // [x, Info] = umfpack (A, '\', b) ; + // [x, Info] = umfpack (A, '\', b, Control) ; + // [x, Info] = umfpack (A, Qinit, '\', b, Control) ; + // [x, Info] = umfpack (A, Qinit, '\', b) ; + + do_solve = true; + operation = "x = A\\b"; + + if (args(0).class_name () != "sparse") + { + error ("umfpack: input matrix A must be sparse"); + return retval; + } + + if (args(0).is_complex_type ()) + { + CAmatrix = args(0).sparse_complex_matrix_value (); + A_is_complex = true; + } + else + Amatrix = args(0).sparse_matrix_value (); + + + if (args(op+1).is_complex_type ()) + { + CBmatrix = args(op+1).complex_matrix_value (); + B_is_complex = true; + } + else + Bmatrix = args(op+1).matrix_value (); + + if (nargout == 2) + do_info = 1; + + if (op == 2) + { + User_Qinit = args(1).column_vector_value (); + have_User_Qinit = true; + } + + if ((op == 1 && nargin == 4) || (op == 2 && nargin == 5)) + { + User_Control_matrix = args(nargin-1).array_value (); + have_User_Control_matrix = true; + } + + if (error_state) + { + error ("umfpack: incorrect argument type"); + return retval; + } + + if (nargin < 3 || nargin > 5 || nargout > 2) + { + error ("umfpack: wrong number of arguments"); + return retval; + } + + } + else if (op_type == "/") + { + // matrix right divide, x = b/A + + // [x, Info] = umfpack (b, '/', A) ; + // [x, Info] = umfpack (b, '/', A, Control) ; + // [x, Info] = umfpack (b, '/', A, Qinit) ; + // [x, Info] = umfpack (b, '/', A, Qinit, Control) ; + + do_solve = true; + operation = "x = b/A" ; + + transpose = true; + + if (args(2).class_name () != "sparse") + { + error ("umfpack: input matrix A must be sparse"); + return retval; + } + + if (args(2).is_complex_type ()) + { + CAmatrix = args(2).sparse_complex_matrix_value (); + A_is_complex = true; + } + else + Amatrix = args(2).sparse_matrix_value (); + + if (args(0).is_complex_type ()) + { + CBmatrix = args(0).complex_matrix_value (); + B_is_complex = true; + } + else + Bmatrix = args(0).matrix_value (); + + if (nargout == 2) + do_info = 1; + + if (nargin == 5) + { + User_Qinit = args(3).column_vector_value (); + User_Control_matrix = args(4).array_value (); + have_User_Qinit = true; + have_User_Control_matrix = true; + } + else if (nargin == 4) + { + User_Control_matrix = args(3).array_value (); + + if (User_Control_matrix.rows () == 1) + { + User_Qinit = args(3).column_vector_value (); + have_User_Qinit = true; + } + else + have_User_Control_matrix = true; + } + else if (nargin < 3 || nargin > 5 || nargout > 2) + { + error ("umfpack: wrong number of arguments"); + return retval; + } + + if (error_state) + { + error ("umfpack: incorrect argument type"); + return retval; + } + } + else if (op_type == "symbolic") + { + // symbolic factorization only + + // [P Q Fr Ch Info] = umfpack (A, 'symbolic') ; + // [P Q Fr Ch Info] = umfpack (A, 'symbolic', Control) ; + // [P Q Fr Ch Info] = umfpack (A, Qinit, 'symbolic') ; + // [P Q Fr Ch Info] = umfpack (A, Qinit, 'symbolic', Control) ; + + operation = "symbolic factorization"; + do_numeric = false; + + if (args(0).class_name () != "sparse") + { + error ("umfpack: input matrix A must be sparse"); + return retval; + } + + if (args(0).is_complex_type ()) + { + CAmatrix = args(0).sparse_complex_matrix_value (); + A_is_complex = true; + } + else + Amatrix = args(0).sparse_matrix_value (); + + if (nargout == 5) + do_info = 4 ; + + if (op == 2) + { + User_Qinit = args(1).column_vector_value (); + have_User_Qinit = true; + } + if ((op == 1 && nargin == 3) || (op == 2 && nargin == 4)) + { + User_Control_matrix = args(nargin-1).array_value (); + have_User_Control_matrix = true; + } + + if (error_state) + { + error ("umfpack: incorrect argument type"); + return retval; + } + + if (nargin < 2 || nargin > 4 || nargout > 5 || nargout < 4) + { + error ("umfpack: wrong number of arguments") ; + return retval; + } + } + else + { + error ("operator must be '/', '\\', or 'symbolic'") ; + return retval; + } + } + else if (nargin > 0) + { + // LU factorization + + // with scaling: + // [L, U, P, Q, R, Info] = umfpack (A) ; + // [L, U, P, Q, R, Info] = umfpack (A, Qinit) ; + // + // scaling determined by Control settings: + // [L, U, P, Q, R, Info] = umfpack (A, Control) ; + // [L, U, P, Q, R, Info] = umfpack (A, Qinit, Control) ; + // + // with no scaling: + // [L, U, P, Q] = umfpack (A) ; + // [L, U, P, Q] = umfpack (A, Control) ; + // [L, U, P, Q] = umfpack (A, Qinit) ; + // [L, U, P, Q] = umfpack (A, Qinit, Control) ; + + operation = "numeric factorization" ; + + if (args(0).is_complex_type ()) + { + CAmatrix = args(0).sparse_complex_matrix_value (); + A_is_complex = true; + } + else + Amatrix = args(0).sparse_matrix_value (); + + no_scale = nargout <= 4 ; + + if (nargout == 6) + do_info = 5 ; + + if (nargin == 3) + { + User_Qinit = args(1).column_vector_value (); + User_Control_matrix = args(2).array_value (); + have_User_Qinit = true; + have_User_Control_matrix = true; + } + else if (nargin == 2) + { + User_Control_matrix = args(1).array_value (); + + if (User_Control_matrix.rows () == 1) + { + User_Qinit = args(1).column_vector_value (); + have_User_Qinit = true; + } + else + have_User_Control_matrix = true; + } + else if (nargin > 3 || nargout > 6 || nargout < 4) + { + error ("umfpack: wrong number of arguments") ; + return retval; + } + } + else + { + // return default control settings + + // Control = umfpack ; + // umfpack ; + + if (nargout > 1) + { + error ("umfpack: wrong number of arguments") ; + return retval; + } + + NDArray user_control (dim_vector (UMFPACK_CONTROL, 1)); + double *user_control_ptr = user_control.fortran_vec (); + umfpack_di_defaults (user_control_ptr); + retval(0) = user_control; + return retval; + } + + // check inputs + + int n_row = Amatrix.rows (); + int n_col = Amatrix.cols (); + int nn = MAX (n_row, n_col) ; + int n_inner = MIN (n_row, n_col) ; + if (do_solve && n_row != n_col) + { + error ("umfpack: input matrix A must square for '\\' or '/'") ; + return retval; + } + if (n_row == 0 || n_col == 0) + { + error ("umfpack: input matrix A cannot have zero rows or zero columns") ; + return retval; + } + + /* The real/complex status of A determines which version to use, */ + /* (umfpack_di_* or umfpack_zi_*). */ + const int *Ap; + const int *Ai; + const double *Ax; + const double *Bx; + + if (A_is_complex) + { + Ap = CAmatrix.cidx (); + Ai = CAmatrix.ridx (); + Ax = X_CAST (const double *, CAmatrix.data ()); + } + else + { + Ap = Amatrix.cidx (); + Ai = Amatrix.ridx (); + Ax = Amatrix.data (); + } + + if (B_is_complex) + Bx = X_CAST (const double *, CBmatrix.fortran_vec ()); + else + Bx = Bmatrix.fortran_vec (); + + if (do_solve) + { + int b_row = Bmatrix.rows (); + int b_col = Bmatrix.cols (); + + if (!((transpose && b_row == 1 && b_col == nn) || + (!transpose && b_row == nn && b_col == 1))) + { + error ("umfpack: b has the wrong dimensions") ; + return retval; + } + + X_is_complex = A_is_complex || B_is_complex ; + } + + // set the Control parameters + NDArray Control (dim_vector (UMFPACK_CONTROL, 1)); + double *Control_ptr = Control.fortran_vec (); + if (A_is_complex) + umfpack_zi_defaults (Control_ptr) ; + else + umfpack_di_defaults (Control_ptr) ; + + if (have_User_Control_matrix) + { + int size = MIN (UMFPACK_CONTROL, User_Control_matrix.length ()); + for (int i = 0 ; i < size ; i++) + Control (i) = User_Control_matrix (i) ; + } + + if (no_scale) + { + // turn off scaling for [L, U, P, Q] = umfpack (A) ; + // ignoring the input value of Control (24) for the usage + // [L, U, P, Q] = umfpack (A, Control) ; + Control (UMFPACK_SCALE) = UMFPACK_SCALE_NONE ; + } + + int print_level; + if (xisnan (Control (UMFPACK_PRL))) + print_level = UMFPACK_DEFAULT_PRL ; + else + print_level = int (Control (UMFPACK_PRL)) ; + + Control (UMFPACK_PRL) = print_level ; + + // check Qinit, if present + int *Qinit = NULL; + if (have_User_Qinit) + { + if(User_Qinit.rows () != 1 || User_Qinit.cols () != n_col) + { + error ("umfpack: Qinit must be 1-by-n_col") ; + return retval; + } + + Qinit = new int [n_col]; + for (int i = 0; i < n_col; i++) + Qinit[i] = static_cast (User_Qinit (i)); + } + + // report the inputs A and Qinit + + if (print_level >= 2) + // print the operation + octave_stdout << "\numfpack: " << operation; + + if (A_is_complex) + { + umfpack_zi_report_control (Control_ptr) ; + + if (print_level >= 3) + octave_stdout << "\nA: " ; + + umfpack_zi_report_matrix (n_row, n_col, Ap, Ai, Ax, NULL, + 1, Control_ptr) ; + if (have_User_Qinit) + { + if (print_level >= 3) + octave_stdout << "\nQinit: " ; + + umfpack_zi_report_perm (n_col, Qinit, Control_ptr) ; + } + } + else + { + umfpack_di_report_control (Control_ptr) ; + + if (print_level >= 3) + octave_stdout << "\nA: " ; + + umfpack_di_report_matrix (n_row, n_col, Ap, Ai, Ax, + 1, Control_ptr) ; + if (have_User_Qinit) + { + if (print_level >= 3) + octave_stdout << "\nQinit: " ; + + umfpack_di_report_perm (n_col, Qinit, Control_ptr) ; + } + } + +#ifndef NO_TRANSPOSE_FORWARD_SLASH + // create the array transpose for x = b/A + if (transpose) + if (A_is_complex) + { + CAmatrix = CAmatrix.transpose (); + Ap = Amatrix.cidx (); + Ai = Amatrix.ridx (); + Ax = X_CAST (const double *, CAmatrix.data ()); + } + else + { + Amatrix = Amatrix.transpose (); + Ap = Amatrix.cidx (); + Ai = Amatrix.ridx (); + Ax = Amatrix.data (); + } +#endif + + // perform the symbolic factorization + + NDArray InfoOut (dim_vector (1, UMFPACK_INFO)); + double * Info = InfoOut.fortran_vec (); + void *Symbolic; + int status, status2; + if (A_is_complex) + status = umfpack_zi_qsymbolic (n_row, n_col, Ap, Ai, Ax, NULL, + Qinit, &Symbolic, Control_ptr, + Info); + else + status = umfpack_di_qsymbolic (n_row, n_col, Ap, Ai, Ax, + Qinit, &Symbolic, Control_ptr, + Info); + + if (status < 0) + { + umfpack_error ("symbolic factorization failed", A_is_complex, + nargout, retval, Control, InfoOut, status, do_info) ; + return retval; + } + + if (have_User_Qinit) + delete [] Qinit; + + // report the Symbolic object + + if (A_is_complex) + umfpack_zi_report_symbolic (Symbolic, Control_ptr) ; + else + umfpack_di_report_symbolic (Symbolic, Control_ptr) ; + + // perform numeric factorization, or just return symbolic factorization + + if (do_numeric) + { + // perform the numeric factorization + void *Numeric; + + if (A_is_complex) + status = umfpack_zi_numeric (Ap, Ai, Ax, NULL, Symbolic, &Numeric, + Control_ptr, Info) ; + else + status = umfpack_di_numeric (Ap, Ai, Ax, Symbolic, &Numeric, + Control_ptr, Info) ; + + // free the symbolic factorization + if (A_is_complex) + umfpack_zi_free_symbolic (&Symbolic) ; + else + umfpack_di_free_symbolic (&Symbolic) ; + + // report the Numeric object + if (status < 0) + { + umfpack_error ("numeric factorization failed", A_is_complex, + nargout, retval, Control, InfoOut, status, do_info); + return retval; + } + + if (A_is_complex) + (void) umfpack_zi_report_numeric (Numeric, Control_ptr) ; + else + (void) umfpack_di_report_numeric (Numeric, Control_ptr) ; + + // return the solution or the factorization + + if (do_solve) + { + int sys; + ComplexNDArray Xcmplx; + NDArray Xreal; + + // solve Ax=b or A'x'=b', and return just the solution x + +#ifndef NO_TRANSPOSE_FORWARD_SLASH + if (transpose) + { + // A.'x.'=b.' gives the same x=b/A as solving A'x'=b' + // since C=A.' was factorized, solve with sys = UMFPACK_A + // since x and b are vectors, x.' and b.' are implicit + if (X_is_complex) + Xcmplx.resize (dim_vector (1, nn)); + else + Xreal.resize (dim_vector (1, nn)); + } + else + { + if (X_is_complex) + Xcmplx.resize (dim_vector (nn, 1)); + else + Xreal.resize (dim_vector (nn, 1)); + } + + sys = UMFPACK_A ; +#else + if (transpose) + { + // If A is real, A'x=b is the same as A.'x=b. + // x and b are vectors, so x and b are the same as x' and b'. + // If A is complex, then A.'x.'=b.' gives the same solution x + // as the complex conjugate transpose. If we used the A'x=b + // option in umfpack_*_solve, we would have to form b' on + // input and x' on output (negating the imaginary part). + // We can save this work by just using the A.'x=b option in + // umfpack_*_solve. Then, forming x.' and b.' is implicit, + // since x and b are just vectors anyway. + // In both cases, the system to solve is A.'x=b + if (X_is_complex) + Xcmplx.resize (dim_vector (1, nn)); + else + Xreal.resize (dim_vector (1, nn)); + + sys = UMFPACK_Aat ; + } + else + { + if (X_is_complex) + Xcmplx.resize (dim_vector (nn, 1)); + else + Xreal.resize (dim_vector (nn, 1)); + sys = UMFPACK_A ; + } +#endif + + // print the right-hand-side, B + if (print_level >= 3) + octave_stdout << "\nright-hand side, b: "; + + if (B_is_complex) + (void) umfpack_zi_report_vector (nn, Bx, NULL, Control_ptr) ; + else + (void) umfpack_di_report_vector (nn, Bx, Control_ptr) ; + + // solve the system + double * Xx; + if (X_is_complex) + Xx = X_CAST (double *, Xcmplx.fortran_vec ()); + else + Xx = Xreal.fortran_vec (); + status2 = UMFPACK_OK ; + + if (A_is_complex) + { + if (!B_is_complex) + { + OCTAVE_LOCAL_BUFFER (double, Bz, nn); + for (int i = 0; i < nn; i++) + Bz[i] = 0.; + + status = umfpack_zi_solve (sys, Ap, Ai, Ax, NULL, Xx, NULL, + Bx, Bz, Numeric, Control_ptr, + Info); + } + else + status = umfpack_zi_solve (sys, Ap, Ai, Ax, NULL, Xx, NULL, + Bx, NULL, Numeric, Control_ptr, + Info); + } + else + { + if (B_is_complex) + { + // Ax=b when b is complex and A is sparse can be split + // into two systems, A*xr=br and A*xi=bi, where r denotes + // the real part and i the imaginary part of x and b. + OCTAVE_LOCAL_BUFFER (double, Tx, nn); + OCTAVE_LOCAL_BUFFER (double, Tz, nn); + + status = umfpack_di_solve (sys, Ap, Ai, Ax, Tx, Bx, + Numeric, Control_ptr, Info); + status2 = umfpack_di_solve (sys, Ap, Ai, Ax, Tz, Bx, + Numeric, Control_ptr, Info) ; + + for (int i = 0; i < nn; i++) + Xcmplx (i) = Complex (Tx[i], Tz[i]); + } + else + status = umfpack_di_solve (sys, Ap, Ai, Ax, Xx, Bx, + Numeric, Control_ptr, Info); + } + + // free the Numeric object + if (A_is_complex) + umfpack_zi_free_numeric (&Numeric) ; + else + umfpack_di_free_numeric (&Numeric) ; + + // check error status + if (status < 0 || status2 < 0) + { + umfpack_error ("solve failed", A_is_complex, nargout, + retval, Control, InfoOut, status, do_info) ; + return retval; + } + + // print the solution, X + if (print_level >= 3) + octave_stdout << "\nsolution, x: "; + + if (X_is_complex) + (void) umfpack_zi_report_vector (nn, Xx, NULL, Control_ptr); + else + (void) umfpack_di_report_vector (nn, Xx, Control_ptr); + + // warn about singular or near-singular matrices + // no warning is given if Control (1) is zero + if (Control (UMFPACK_PRL) >= 1) + { + if (status == UMFPACK_WARNING_singular_matrix) + { + warning ("matrix is singular"); + warning ("Try increasing Control (%d) and Control (%d).", + 1+UMFPACK_PIVOT_TOLERANCE, + 1+UMFPACK_SYM_PIVOT_TOLERANCE); + warning ("(Suppress this warning with Control (%d) = 0.)", + 1+UMFPACK_PRL); + } + else if (InfoOut (UMFPACK_RCOND) < DBL_EPSILON) + { + warning ("matrix is nearly singular, rcond = %g", + InfoOut (UMFPACK_RCOND)); + warning ("Try increasing Control (%d) and Control (%d).", + 1+UMFPACK_PIVOT_TOLERANCE, + 1+UMFPACK_SYM_PIVOT_TOLERANCE); + warning ("(Suppress this warning with Control (%d) = 0.)", + 1+UMFPACK_PRL); + } + } + + // Setup the return value + if (X_is_complex) + retval (0) = octave_value (Xcmplx); + else + retval (0) = octave_value (Xreal); + } + else + { + // get L, U, P, Q, and r + int lnz, unz, ignore1, ignore2, ignore3; + + if (A_is_complex) + status = umfpack_zi_get_lunz (&lnz, &unz, &ignore1, &ignore2, + &ignore3, Numeric) ; + else + status = umfpack_di_get_lunz (&lnz, &unz, &ignore1, &ignore2, + &ignore3, Numeric) ; + + if (status < 0) + { + if (A_is_complex) + umfpack_zi_free_numeric (&Numeric) ; + else + umfpack_di_free_numeric (&Numeric) ; + + umfpack_error ("extracting LU factors failed", A_is_complex, + nargout, retval, Control, InfoOut, status, + do_info); + return retval; + } + + // avoid malloc of zero-sized arrays + lnz = MAX (lnz, 1) ; + unz = MAX (unz, 1) ; + + // get space for the *** ROW *** form of L + SparseMatrix Lreal; + SparseComplexMatrix Limag; + int *Ltp, *Ltj; + double *Ltx; + if (A_is_complex) + { + Limag = SparseComplexMatrix (n_inner, n_row, lnz); + Ltp = Limag.cidx (); + Ltj = Limag.ridx (); + Ltx = X_CAST (double *, Limag.data ()); + } + else + { + Lreal = SparseMatrix (n_inner, n_row, lnz); + Ltp = Lreal.cidx (); + Ltj = Lreal.ridx (); + Ltx = Lreal.data (); + } + + // create permanent copy of the output matrix U + int *Up, *Ui; + double *Ux; + SparseMatrix Ureal; + SparseComplexMatrix Uimag; + + if (A_is_complex) + { + Uimag = SparseComplexMatrix (n_inner, n_col, unz); + Up = Uimag.cidx (); + Ui = Uimag.ridx (); + Ux = X_CAST (double *, Uimag.data ()); + } + else + { + Ureal = SparseMatrix (n_inner, n_col, unz); + Up = Ureal.cidx (); + Ui = Ureal.ridx (); + Ux = Ureal.data (); + } + + // temporary space for the integer permutation vectors + OCTAVE_LOCAL_BUFFER (int, P, n_row); + OCTAVE_LOCAL_BUFFER (int, Q, n_col); + + // get scale factors, if requested + status2 = UMFPACK_OK ; + SparseMatrix Rsout; + double * Rs; + if (!no_scale) + { + // create a diagonal sparse matrix for the scale factors + Rsout = SparseMatrix (n_row, n_row, n_row); + for (int i = 0 ; i < n_row ; i++) + { + Rsout.cidx (i) = i; + Rsout.ridx (i) = i; + } + Rsout.cidx (n_row) = n_row; + Rs = Rsout.data (); + } + else + Rs = (double *) NULL ; + + // get Lt, U, P, Q, and Rs from the numeric object + int do_recip; + if (A_is_complex) + { + status = umfpack_zi_get_numeric (Ltp, Ltj, Ltx, NULL, Up, Ui, + Ux, NULL, P, Q, + (double *) NULL, + (double *) NULL, + &do_recip, Rs, Numeric) ; + umfpack_zi_free_numeric (&Numeric) ; + } + else + { + status = umfpack_di_get_numeric (Ltp, Ltj, Ltx, Up, Ui, + Ux, P, Q, (double *) NULL, + &do_recip, Rs, Numeric) ; + umfpack_di_free_numeric (&Numeric) ; + } + + if (!no_scale) + retval (4) = octave_vale (Rsout); + + // for the oct-file, -DNRECIPROCAL must be set, + // so do_recip must be FALSE + + if (status < 0 || status2 < 0 || do_recip) + { + umfpack_error ("extracting LU factors failed", A_is_complex, + nargout, retval, Control, InfoOut, status, + do_info); + return retval; + } + + if (A_is_complex) + retval (1) = octave_value (Uimag); + else + retval (1) = octave_valye (Ureal); + + // create sparse permutation matrix for P + SparseMatrix Pout (n_row, n_row, n_row); + for (int k = 0 ; k < n_row ; k++) + { + Pout.cidx (k) = k ; + Pout.ridx (P [k]) = k; + Pout.data (k) = 1; + } + Pout.cidx (n_row) = n_row; + retval (2) = octave_value (Pout); + + // create sparse permutation matrix for Q + SparseMatrix Qout (n_col, n_col, n_col); + for (int k = 0 ; k < n_col ; k++) + { + Qout.cidx (k) = k ; + Qout.ridx (k) = Q[k]; + Qout.data (k) = 1; + } + Qout.cidx (n_col) = n_col; + retval (3) = octave_value (Qout); + + // permanent copy of L + if (A_is_complex) + retval (0) = octave_value (Limag.transpose()); + else + retval (0) = octave_value (Lreal.transpose()); + + if (status < 0) + { + umfpack_error ("constructing L failed", A_is_complex, + nargout, retval, Control, InfoOut, status, + do_info) ; + return octave_value (); + } + + // print L, U, P, and Q + if (A_is_complex) + { + if (print_level >= 3) + { + octave_stdout << "\nL: "; + int *Lp = Limag.cidx (); + int *Li = Limag.ridx (); + double *Lx = X_CAST (double *, Limag.data ()); + + (void) umfpack_zi_report_matrix (n_row, n_inner, Lp, Li, + Lx, NULL, 1, Control_ptr) ; + } + + if (print_level >= 3) + octave_stdout << "\nU: "; + (void) umfpack_zi_report_matrix (n_inner, n_col, Up, Ui, + Ux, NULL, 1, Control_ptr) ; + if (print_level >= 3) + octave_stdout << "\nP: "; + (void) umfpack_zi_report_perm (n_row, P, Control_ptr); + if (print_level >= 3) + octave_stdout << "\nQ: "; + (void) umfpack_zi_report_perm (n_col, Q, Control_ptr); + } + else + { + if (print_level >= 3) + { + int *Lp = Lreal.cidx (); + int *Li = Lreal.ridx (); + double *Lx = Lreal.data (); + octave_stdout << "\nL: "; + (void) umfpack_di_report_matrix (n_row, n_inner, Lp, Li, + Lx, 1, Control_ptr); + } + + if (print_level >= 3) + octave_stdout << "\nU: "; + (void) umfpack_di_report_matrix (n_inner, n_col, Up, Ui, + Ux, 1, Control_ptr); + if (print_level >= 3) + octave_stdout << "\nP: "; + (void) umfpack_di_report_perm (n_row, P, Control_ptr); + if (print_level >= 3) + octave_stdout << "\nQ: "; + (void) umfpack_di_report_perm (n_col, Q, Control_ptr); + } + } + } + else + { + // return the symbolic factorization + int ignore1, ignore2, ignore3; + OCTAVE_LOCAL_BUFFER (int, Q, n_col); + OCTAVE_LOCAL_BUFFER (int, P, n_row); + OCTAVE_LOCAL_BUFFER (int, Front_npivcol, nn + 1); + OCTAVE_LOCAL_BUFFER (int, Front_parent, nn + 1); + OCTAVE_LOCAL_BUFFER (int, Front_1strow, nn + 1); + OCTAVE_LOCAL_BUFFER (int, Front_leftmostdesc, nn + 1); + OCTAVE_LOCAL_BUFFER (int, Chain_start, nn + 1); + OCTAVE_LOCAL_BUFFER (int, Chain_maxrows, nn + 1); + OCTAVE_LOCAL_BUFFER (int, Chain_maxcols, nn + 1); + + int nz, nfronts, nchains; + + if (A_is_complex) + { + status = umfpack_zi_get_symbolic (&ignore1, &ignore2, &ignore3, + &nz, &nfronts, &nchains, P, Q, + Front_npivcol, Front_parent, + Front_1strow, + Front_leftmostdesc, + Chain_start, Chain_maxrows, + Chain_maxcols, Symbolic) ; + umfpack_zi_free_symbolic (&Symbolic) ; + } + else + { + status = umfpack_di_get_symbolic (&ignore1, &ignore2, &ignore3, + &nz, &nfronts, &nchains, P, Q, + Front_npivcol, Front_parent, + Front_1strow, + Front_leftmostdesc, + Chain_start, Chain_maxrows, + Chain_maxcols, Symbolic) ; + umfpack_di_free_symbolic (&Symbolic) ; + } + + if (status < 0) + { + umfpack_error ("extracting symbolic factors failed", + A_is_complex, nargout, retval, Control, + InfoOut, status, do_info) ; + return retval; + } + + // create sparse permutation matrix for P + SparseMatrix Pout (n_row, n_row, n_row); + for (int k = 0 ; k < n_row ; k++) + { + Pout.cidx (k) = k; + Pout.ridx (P [k]) = k; + Pout.data (k) = 1; + } + Pout.cidx (n_row) = n_row; + retval (0) = octave_value (Pout); + + // create sparse permutation matrix for Q + SparseMatrix Qout (n_col, n_col, n_col); + for (int k = 0 ; k < n_col ; k++) + { + Qout.cidx (k) = k; + Qout.ridx (k) = Q[k]; + Qout.data (k) = 1; + } + Qout.cidx (n_col) = n_col; + retval (1) = octave_value (Qout); + + // create Fr + Matrix Frout (nfronts + 1, 4); + for (int i = 0 ; i <= nfronts ; i++) + { + // convert parent, 1strow, and leftmostdesc to 1-based + Frout (i, 0) = (double) (Front_npivcol [i]) ; + Frout (i, 1) = (double) (Front_parent [i] + 1) ; + Frout (i, 2) = (double) (Front_1strow [i] + 1) ; + Frout (i, 3) = (double) (Front_leftmostdesc [i] + 1) ; + } + retval (2) = octave_value (Frout); + + // create Ch + Matrix Chout (nchains + 1, 3); + for (int i = 0 ; i <= nchains ; i++) + { + // convert to 1-based + Chout (i, 0) = (double) (Chain_start [i] + 1) ; + Chout (i, 1) = (double) (Chain_maxrows [i]) ; + Chout (i, 2) = (double) (Chain_maxcols [i]) ; + } + Chout (0, nchains) = (double) Chain_start [nchains] + 1 ; + Chout (1, nchains) = 0.; + Chout (2, nchains) = 0.; + retval (3) = octave_value (Chout); + } + + // report Info + if (A_is_complex) + umfpack_zi_report_info (Control_ptr, Info); + else + umfpack_di_report_info (Control_ptr, Info); + + if (do_info > 0) + retval (do_info) = InfoOut; + + return retval; +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/OCTAVE/umfpack_btf.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/OCTAVE/umfpack_btf.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,129 @@ +function x = umfpack_btf (A, b, Control) +% UMFPACK_BTF +% +% x = umfpack_btf (A, b, Control) +% +% solve Ax=b by first permuting the matrix A to block triangular form via dmperm +% and then using UMFPACK to factorize each diagonal block. Adjacent 1-by-1 +% blocks are merged into a single upper triangular block, and solved via +% MATLAB's \ operator. The Control parameter is optional (Type umfpack_details +% and umfpack_report for details on its use). A must be square. +% +% See also: umfpack, umfpack_factorize, umfpack_details, dmperm + +% UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A. +% Davis. All Rights Reserved. Type umfpack_details for License. + +if (nargin < 2) + help umfpack_btf + error ('Usage: x = umfpack_btf (A, b, Control)') ; +end + +[m n] = size (A) ; +if (m ~= n) + help umfpack_btf + error ('umfpack_btf: A must be square') ; +end +[m1 n1] = size (b) ; +if (m1 ~= n) + help umfpack_btf + error ('umfpack_btf: b has the wrong dimensions') ; +end + +if (nargin < 3) + Control = umfpack ; +end + +%------------------------------------------------------------------------------- +% find the block triangular form +%------------------------------------------------------------------------------- + +[p,q,r] = dmperm (A) ; +nblocks = length (r) - 1 ; + +%------------------------------------------------------------------------------- +% solve the system +%------------------------------------------------------------------------------- + +if (nblocks == 1 | sprank (A) < n) + + %--------------------------------------------------------------------------- + % matrix is irreducible or structurally singular + %--------------------------------------------------------------------------- + + x = umfpack_solve (A, '\\', b, Control) ; + +else + + %--------------------------------------------------------------------------- + % A (p,q) is in block triangular form + %--------------------------------------------------------------------------- + + b = b (p,:) ; + A = A (p,q) ; + x = zeros (size (b)) ; + + %--------------------------------------------------------------------------- + % merge adjacent singletons into a single upper triangular block + %--------------------------------------------------------------------------- + + [r, nblocks, is_triangular] = merge_singletons (r) ; + + %--------------------------------------------------------------------------- + % solve the system: x (q) = A\b + %--------------------------------------------------------------------------- + + for k = nblocks:-1:1 + + % get the kth block + k1 = r (k) ; + k2 = r (k+1) - 1 ; + + % solve the system + x (k1:k2,:) = solver (A (k1:k2, k1:k2), b (k1:k2,:), ... + is_triangular (k), Control) ; + + % off-diagonal block back substitution + b (1:k1-1,:) = b (1:k1-1,:) - A (1:k1-1, k1:k2) * x (k1:k2,:) ; + + end + + x (q,:) = x ; + +end + +%------------------------------------------------------------------------------- +% merge_singletons +%------------------------------------------------------------------------------- + +function [r, nblocks, is_triangular] = merge_singletons (r) +% +% Given r from [p,q,r] = dmperm (A), where A is square, return a modified r that +% reflects the merger of adjacent singletons into a single upper triangular +% block. is_triangular (k) is 1 if the kth block is upper triangular. nblocks +% is the number of new blocks. + +nblocks = length (r) - 1 ; +bsize = r (2:nblocks+1) - r (1:nblocks) ; +t = [0 (bsize == 1)] ; +z = (t (1:nblocks) == 0 & t (2:nblocks+1) == 1) | t (2:nblocks+1) == 0 ; +y = [(find (z)) nblocks+1] ; +r = r (y) ; +nblocks = length (y) - 1 ; +is_triangular = y (2:nblocks+1) - y (1:nblocks) > 1 ; + +%------------------------------------------------------------------------------- +% solve Ax=b, but check for small and/or triangular systems +%------------------------------------------------------------------------------- + +function x = solver (A, b, is_triangular, Control) +if (is_triangular) + % back substitution only + x = A \ b ; +elseif (size (A,1) < 4) + % a very small matrix, solve it as a dense linear system + x = full (A) \ b ; +else + % solve it as a sparse linear system + x = umfpack_solve (A, '\\', b, Control) ; +end diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/OCTAVE/umfpack_demo.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/OCTAVE/umfpack_demo.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,191 @@ +function umfpack_demo +% UMFPACK DEMO +% +% A demo of UMFPACK for OCTAVE. +% +% See also umfpack, umfpack_make, umfpack_details, umfpack_report, +% and umfpack_simple. + +% UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A. +% Davis. All Rights Reserved. Type umfpack_details for License. + +%------------------------------------------------------------------------------- +% get default control parameters +%------------------------------------------------------------------------------- + +control = umfpack ; +fprintf ('\nEnter the printing level for UMFPACK''s output statistics:\n') ; +fprintf ('0: none, 1: errors only, 2: statistics, 4: print some of outputs\n') ; +c = input ('5: print all output [default is 1]: ') ; +if (isempty (c)) + c = 1 ; +end +control (1) = c ; + +%------------------------------------------------------------------------------- +% solve a simple system +%------------------------------------------------------------------------------- + +fprintf ('\n--------------------------------------------------------------\n') ; +fprintf ('Factor and solve a small system, Ax=b, using default parameters\n') ; +if (control (1) > 1) + fprintf ('(except for verbose printing enabled)\n') ; +end + +load west0067 ; +A = Problem.A ; +n = size (A, 1) ; +b = rand (n, 1) ; + +fprintf ('Solving Ax=b via UMFPACK:\n') ; +[xu, info] = umfpack (A, '\\', b, control) ; +x = xu ; + +fprintf ('Solving Ax=b via OCTAVE:\n') ; +xm = A\b ; +x = xm ; + +fprintf ('Difference between UMFPACK and OCTAVE solution: %g\n', ... + norm (xu - xm, Inf)) ; + +%------------------------------------------------------------------------------- +% spy the results +%------------------------------------------------------------------------------- + +figure (1) ; +clf + +subplot (2,3,1) +title ('The matrix A') ; +spy (A) + +subplot (2,3,2) +[P1, Q1, Fr, Ch, Info] = umfpack (A, 'symbolic') ; +title ('Supernodal column elimination tree') ; +%% Disable for now !! +%% treeplot (Fr (1:end-1,2)') ; + +subplot (2,3,3) +title ('A, with initial row and column order') ; +spy (P1 * A * Q1) + +subplot (2,3,4) +fprintf ('\n--------------------------------------------------------------\n') ; +fprintf ('\nFactorizing [L, U, P, Q, R] = umfpack (A)\n') ; +[L, U, P, Q, R] = umfpack (A) ; +title ('A, with final row/column order') ; +spy (P*A*Q) + +fprintf ('\nP * (R\\A) * Q - L*U should be zero:\n') ; +fprintf ('norm (P*(R\\A)*Q - L*U, 1) = %g (exact) %g (estimated)\n', ... + norm (P * (R\A) * Q - L*U, 1), lu_normest (P * (R\A) * Q, L, U)) ; + +fprintf ('\nSolution to Ax=b via UMFPACK factorization:\n') ; +fprintf ('x = Q * (U \\ (L \\ (P * (R \\ b))))\n') ; +xu = Q * (U \ (L \ (P * (R \ b)))) ; +x = xu ; + +fprintf ('\nUMFPACK flop count: %d\n', luflop (L, U)) ; + +subplot (2,3,5) +title ('UMFPACK LU factors') ; +spy (spones (L) + spones (U)) + +subplot (2,3,6) +fprintf ('\nFactorizing [L, U, P] = lu (A (:, q))\n') ; +try + q = colamd (A) ; +catch + fprintf ('\n *** colamd not found, using colmmd instead *** \n') ; + q = colmmd (A) ; +end +[L, U, P] = lu (A (:,q)) ; +title ('OCTAVE LU factors') ; +spy (spones (L) + spones (U)) + +fprintf ('\nSolution to Ax=b via OCTAVE factorization:\n') ; +fprintf ('x = U \\ (L \\ (P * b)) ; x (q) = x ;\n') ; +xm = U \ (L \ (P * b)) ; +xm (q) = xm ; + +fprintf ('Difference between UMFPACK and OCTAVE solution: %g\n', ... + norm (xu - xm, Inf)) ; + +fprintf ('\nOCTAVE LU flop count: %d\n', luflop (L, U)) ; + +%------------------------------------------------------------------------------- +% solve A'x=b +%------------------------------------------------------------------------------- + +fprintf ('\n--------------------------------------------------------------\n') ; +fprintf ('Solve A''x=b:\n') ; + +fprintf ('Solving A''x=b via UMFPACK:\n') ; +[xu, info] = umfpack (b', '/', A, control) ; +xu = xu' ; + +fprintf ('Solving A''x=b via OCTAVE:\n') ; +xm = (b'/A)' ; +x = xm ; + +fprintf ('Difference between UMFPACK and OCTAVE solution: %g\n', ... + norm (xu - xm, Inf)) ; + +%------------------------------------------------------------------------------- +% factor A' and then solve Ax=b using the factors of A' +%------------------------------------------------------------------------------- + +fprintf ('\n--------------------------------------------------------------\n') ; +fprintf ('Compute C = A'', and compute the LU factorization of C.\n') ; +fprintf ('Factorizing A'' can sometimes be better than factorizing A itself\n'); +fprintf ('(less work and memory usage). Solve C''x=b; the solution is the\n') ; +fprintf ('same as the solution to Ax=b for the original A.\n'); + +C = A' ; + +% factorize C (P,Q) = L*U +[L, U, P, Q, R, info] = umfpack (C, control) ; + +fprintf ('\nP * (R\\C) * Q - L*U should be zero:\n') ; +fprintf ('norm (P*(R\\C)*Q - L*U, 1) = %g (exact) %g (estimated)\n', ... + norm (P * (R\C) * Q - L*U, 1), lu_normest (P * (R\C) * Q, L, U)) ; + +fprintf ('\nSolution to Ax=b via UMFPACK, using the factors of C:\n') ; +fprintf ('x = R \\ (P'' * (L'' \\ (U'' \\ (Q'' * b)))) ;\n') ; +xu = R \ (P' * (L' \ (U' \ (Q' * b)))) ; +x = xu ; + +fprintf ('Solution to Ax=b via OCTAVE:\n') ; +xm = A\b ; +x = xm ; + +fprintf ('Difference between UMFPACK and OCTAVE solution: %g\n', ... + norm (xu - xm, Inf)) ; + +%------------------------------------------------------------------------------- +% solve Ax=B +%------------------------------------------------------------------------------- + +fprintf ('\n--------------------------------------------------------------\n') ; +fprintf ('\nSolve AX=B, where B is n-by-10, and sparse\n') ; +B = sprandn (n, 10, 0.05) ; +XU = umfpack_solve (A, '\\', B, control) ; +XM = A\B ; + +fprintf ('Difference between UMFPACK and OCTAVE solution: %g\n', ... + norm (XU - XM, Inf)) ; + +fprintf ('\n--------------------------------------------------------------\n') ; +fprintf ('\nSolve AX=B, where B is n-by-10, and sparse, using umfpack_btf\n') ; +XU = umfpack_btf (A, B, control) ; + +fprintf ('Difference between UMFPACK and OCTAVE solution: %g\n', ... + norm (XU - XM, Inf)) ; + +fprintf ('\n--------------------------------------------------------------\n') ; +fprintf ('\nSolve A''X=B, where B is n-by-10, and sparse\n') ; +XU = umfpack_solve (B', '/', A, control) ; +XM = B'/A ; + +fprintf ('Difference between UMFPACK and OCTAVE solution: %g\n', ... + norm (XU - XM, Inf)) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/OCTAVE/umfpack_demo.m.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/OCTAVE/umfpack_demo.m.out Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,72 @@ +>> umfpack_demo + +Enter the printing level for UMFPACK's output statistics: +0: none, 1: errors only, 2: statistics, 4: print some of outputs +5: print all output [default is 1]: + +-------------------------------------------------------------- +Factor and solve a small system, Ax=b, using default parameters +Solving Ax=b via UMFPACK: +Solving Ax=b via MATLAB: +Difference between UMFPACK and MATLAB solution: 1.24345e-14 + +-------------------------------------------------------------- + +Factorizing [L, U, P, Q, R] = umfpack (A) + +P * (R\A) * Q - L*U should be zero: +norm (P*(R\A)*Q - L*U, 1) = 4.2068e-16 (exact) 3.74627e-16 (estimated) + +Solution to Ax=b via UMFPACK factorization: +x = Q * (U \ (L \ (P * (R \ b)))) + +UMFPACK flop count: 2362 + +Factorizing [L, U, P] = lu (A (:, q)) +If you are using a version of MATLAB prior to V6.0, then the +following statement (q = colamd (A)) may fail. Either download +colamd from http://www.cise.ufl.edu/research/sparse, upgrade to +MATLAB V6.0 or later, or replace the statement with +q = colmmd (A) ; + +Solution to Ax=b via MATLAB factorization: +x = U \ (L \ (P * b)) ; x (q) = x ; +Difference between UMFPACK and MATLAB solution: 1.37668e-14 + +MATLAB LU flop count: 3164 + +-------------------------------------------------------------- +Solve A'x=b: +Solving A'x=b via UMFPACK: +Solving A'x=b via MATLAB: +Difference between UMFPACK and MATLAB solution: 3.10862e-15 + +-------------------------------------------------------------- +Compute C = A', and compute the LU factorization of C. +Factorizing A' can sometimes be better than factorizing A itself +(less work and memory usage). Solve C'x=b; the solution is the +same as the solution to Ax=b for the original A. + +P * (R\C) * Q - L*U should be zero: +norm (P*(R\C)*Q - L*U, 1) = 1.31839e-16 (exact) 6.41848e-17 (estimated) + +Solution to Ax=b via UMFPACK, using the factors of C: +x = R \ (P' * (L' \ (U' \ (Q' * b)))) ; +Solution to Ax=b via MATLAB: +Difference between UMFPACK and MATLAB solution: 1.77636e-14 + +-------------------------------------------------------------- + +Solve AX=B, where B is n-by-10, and sparse +Difference between UMFPACK and MATLAB solution: 2.88198e-14 + +-------------------------------------------------------------- + +Solve AX=B, where B is n-by-10, and sparse, using umfpack_btf +Difference between UMFPACK and MATLAB solution: 9.79736e-14 + +-------------------------------------------------------------- + +Solve A'X=B, where B is n-by-10, and sparse +Difference between UMFPACK and MATLAB solution: 1.05244e-13 +>> diary off diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/OCTAVE/umfpack_make.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/OCTAVE/umfpack_make.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,356 @@ +function umfpack_make +% UMFPACK_MAKE +% +% Compiles the UMFPACK mexFunction and then runs a simple demo. +% +% UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A. +% Davis. All Rights Reserved. Type umfpack_details for License. +% +% See also: umfpack, umfpack_details, umfpack_report, umfpack_demo, and +% umfpack_simple. + +help umfpack_make + +fprintf ('\n--------------------------------------------------------------\n') ; +fprintf ('Now compiling the UMFPACK and AMD mexFunctions.\n') ; +fprintf ('--------------------------------------------------------------\n') ; + +try + % ispc does not appear in MATLAB 5.3 + pc = ispc ; +catch + % if ispc fails, assume we aren't on a Windows PC. + pc = 0 ; +end + +obj = 'o' ; +blas_lib = '' ; +if (pc) + obj = 'obj' ; +end + +%------------------------------------------------------------------------------- +% BLAS option +%------------------------------------------------------------------------------- + +msg = [ ... + '\nUsing the BLAS is faster, but might not compile correctly.\n', ... + 'If you get an error stating that dgemm, dgemv, dger, zgemm,\n', ... + 'zgemv, and/or zger are not defined, then recompile without the\n', ... + 'BLAS. You can ignore warnings that these routines are implicitly\n', ... + 'declared.\n\nPlease select one of the following options: \n', ... + ' 1: attempt to compile with the BLAS (default)\n', ... + ' 2: do not use the BLAS\n'] ; +fprintf (msg) ; +blas = input (': ') ; +if (isempty (blas)) + blas = 1 ; +end +if (blas == 1) + % try to link to MATLAB's built-in BLAS + blas = '' ; + if (pc) + % the default lcc compiler needs this library to access the BLAS + blas_lib = ' libmwlapack.lib' ; + msg = [ ... + '\nCheck to see if you have a file called libmwlapack.lib in the\n', ... + '\\extern\\lib\\win32\\lcc\\ directory, where is ', ... + 'the\ndirectory where MATLAB is installed. If a file of that ', ... + 'name is already\nthere, then you don''t have to do anything. ', ... + 'Otherwise, you must first\ncopy the libmwlapack.lib file from ', ... + 'the umfpack\\lcc_lib\\ directory to the\n', ... + '\\extern\\lib\\win32\\lcc\\ directory. Next, type\n\n', ... + ' mex -setup\n\n', ... + 'at the MATLAB prompt, and ask MATLAB to select the lcc compiler. ',... + 'You can skip\nall of this if you have already done it, or have ', ... + 'configured mex to use\na different compiler. If you are using ', ... + 'Norton anti-virus software on Windows\n98SE, then you need to ', ... + 'exit MATLAB, turn off virus checking, and restart MATLAB\n', ... + 'before you can use the mex command or compile UMFPACK.\n', ... + 'You may also need to turn off virus checking in other cases.\n', ... + '\nHit enter to continue, or type control-C if you do not wish to '] ; + fprintf (msg) ; + input ('proceed: ') ; + end + fprintf ('\nUsing the BLAS (recommended).\n') ; +else + % No BLAS + fprintf ('\nNot using the BLAS. UMFPACK will be slow.\n') ; + blas = ' -DNBLAS' ; +end + +%------------------------------------------------------------------------------- +% -DNUTIL option (using utMalloc or mxMalloc) +%------------------------------------------------------------------------------- + +utils = '' ; + +if (~pc) + msg = [ ... + '--------------------------------------------------------------\n', ... + '\nUMFPACK uses MATLAB''s memory allocation routines. The internal', ... + '\nutMalloc, utFree, and utRealloc allow for better use of memory,', ... + '\nbut they are internal utility routines that are not documented.\n', ... + 'Thus, they might not always work. Using mxMalloc, mxFree, and\n', ... + 'mxRealloc works, but UMFPACK might run out of memory when solving\n', ... + 'problems that it could otherwise solve. Try using the default.\n', ... + 'If you get an error stating that utMalloc, utFree, and/or\n', ... + 'utRealloc are not defined, then recompile with the mx* routines.\n', ... + '\nPlease select one of the following options:\n', ... + ' 1: attempt to use the ut* routines (default)\n', ... + ' 2: use the standard mx* routines\n'] ; + fprintf (msg) ; + utils = input (': ') ; + if (isempty (utils)) + utils = 1 ; + end + if (utils == 2) + fprintf ('\nNot using utMalloc, utFree, or utRealloc\n') ; + utils = ' -DNUTIL' ; + else + fprintf ('\nUsing utMalloc, utFree, and utRealloc\n') ; + utils = '' ; + end +end + +%------------------------------------------------------------------------------- +% -DNPOSIX option (for sysconf and times timer routines) +%------------------------------------------------------------------------------- + +posix = '' ; + +if (~pc) + msg = [ ... + '--------------------------------------------------------------\n', ... + '\nUMFPACK can use the POSIX routines sysconf () and times ()\n', ... + 'to provide CPU time and wallclock time statistics. If you do not\n', ... + 'have a POSIX-compliant operating system, then UMFPACK won''t\n', ... + 'compile. If you don''t know which option to pick, try the\n', ... + 'default. If you get an error saying that sysconf and/or times\n', ... + 'are not defined, then recompile with the non-POSIX option.\n', ... + '\nPlease select one of the following options:\n', ... + ' 1: use POSIX sysconf and times routines (default)\n', ... + ' 2: do not use POSIX routines\n'] ; + fprintf (msg) ; + posix = input (': ') ; + if (isempty (posix)) + posix = 1 ; + end + if (posix == 2) + fprintf ('\nNot using POSIX sysconf and times routines.\n') ; + posix = ' -DNPOSIX' ; + else + fprintf ('\nUsing POSIX sysconf and times routines.\n') ; + posix = '' ; + end +end + +%------------------------------------------------------------------------------- +% mex command +%------------------------------------------------------------------------------- + +umfdir = sprintf ('..%sSource%s', filesep, filesep) ; +amddir = sprintf ('..%s..%sAMD%sSource%s', filesep, filesep, filesep, filesep) ; +incdir = sprintf ( ... +' -I..%sInclude -I..%sSource -I..%s..%sAMD%sInclude -I..%s..%sAMD%sSource', ... +filesep,filesep, filesep, filesep, filesep, filesep, filesep, filesep) ; + +mx = sprintf ('mex -inline -O%s%s%s%s', blas, utils, posix, incdir) ; +msg = [ ... + '--------------------------------------------------------------\n', ... + '\nCompile options:\n%s\nNow compiling. Please wait.\n'] ; +fprintf (msg, mx) ; + +% The following is adapted from GNUmakefile + +%------------------------------------------------------------------------------- +% source files +%------------------------------------------------------------------------------- + +% non-user-callable umf_*.[ch] files: +umfch = { 'assemble', 'blas3_update', ... + 'build_tuples', 'create_element', ... + 'dump', 'extend_front', 'garbage_collection', ... + 'get_memory', 'init_front', 'kernel', ... + 'kernel_init', 'kernel_wrapup', ... + 'local_search', 'lsolve', 'ltsolve', ... + 'mem_alloc_element', 'mem_alloc_head_block', ... + 'mem_alloc_tail_block', 'mem_free_tail_block', ... + 'mem_init_memoryspace', ... + 'report_vector', 'row_search', 'scale_column', ... + 'set_stats', 'solve', 'symbolic_usage', 'transpose', ... + 'tuple_lengths', 'usolve', 'utsolve', 'valid_numeric', ... + 'valid_symbolic', 'grow_front', 'start_front', '2by2', ... + 'store_lu', 'scale' } ; + +% non-user-callable umf_*.[ch] files, int versions only (no real/complex): +umfint = { 'analyze', 'apply_order', 'colamd', 'free', 'fsize', ... + 'is_permutation', 'malloc', 'realloc', 'report_perm', ... + 'singletons' } ; + +% non-user-callable and user-callable amd_*.[ch] files (int versions only): +amd = { 'aat', '1', '2', 'dump', 'postorder', 'post_tree', 'defaults', ... + 'order', 'control', 'info', 'valid' } ; + +% user-callable umfpack_*.[ch] files (real/complex): +user = { 'col_to_triplet', 'defaults', 'free_numeric', ... + 'free_symbolic', 'get_numeric', 'get_lunz', ... + 'get_symbolic', 'numeric', 'qsymbolic', ... + 'report_control', 'report_info', 'report_matrix', ... + 'report_numeric', 'report_perm', 'report_status', ... + 'report_symbolic', 'report_triplet', ... + 'report_vector', 'solve', 'symbolic', ... + 'transpose', 'triplet_to_col', 'scale' ... + 'load_numeric', 'save_numeric', 'load_symbolic', 'save_symbolic' } ; + +% user-callable umfpack_*.[ch], only one version +generic = { 'timer', 'tictoc' } ; + +M = cell (0) ; + +%------------------------------------------------------------------------------- +% Create the umfpack and amd mexFunctions for MATLAB (int versions only) +%------------------------------------------------------------------------------- + +for k = 1:length(umfint) + M = make (M, '%s -DDINT -c %sumf_%s.c', 'umf_%s.%s', 'umf_%s_%s.%s', ... + mx, umfint {k}, umfint {k}, 'm', obj, umfdir) ; +end + +rules = { [mx ' -DDINT'] , [mx ' -DZINT'] } ; +kinds = { 'md', 'mz' } ; + +for what = 1:2 + + rule = rules {what} ; + kind = kinds {what} ; + + M = make (M, '%s -DCONJUGATE_SOLVE -c %sumf_%s.c', 'umf_%s.%s', ... + 'umf_%s_%s.%s', rule, 'ltsolve', 'lhsolve', kind, obj, umfdir) ; + + M = make (M, '%s -DCONJUGATE_SOLVE -c %sumf_%s.c', 'umf_%s.%s', ... + 'umf_%s_%s.%s', rule, 'utsolve', 'uhsolve', kind, obj, umfdir) ; + + M = make (M, '%s -DDO_MAP -c %sumf_%s.c', 'umf_%s.%s', ... + 'umf_%s_%s_map_nox.%s', rule, 'triplet', 'triplet', kind, obj, umfdir) ; + + M = make (M, '%s -DDO_VALUES -c %sumf_%s.c', 'umf_%s.%s', ... + 'umf_%s_%s_nomap_x.%s', rule, 'triplet', 'triplet', kind, obj, umfdir) ; + + M = make (M, '%s -c %sumf_%s.c', 'umf_%s.%s', ... + 'umf_%s_%s_nomap_nox.%s', rule, 'triplet', 'triplet', kind, obj, ... + umfdir) ; + + M = make (M, '%s -DDO_MAP -DDO_VALUES -c %sumf_%s.c', 'umf_%s.%s', ... + 'umf_%s_%s_map_x.%s', rule, 'triplet', 'triplet', kind, obj, umfdir) ; + + M = make (M, '%s -DFIXQ -c %sumf_%s.c', 'umf_%s.%s', ... + 'umf_%s_%s_fixq.%s', rule, 'assemble', 'assemble', kind, obj, umfdir) ; + + M = make (M, '%s -DDROP -c %sumf_%s.c', 'umf_%s.%s', ... + 'umf_%s_%s_drop.%s', rule, 'store_lu', 'store_lu', kind, obj, umfdir) ; + + for k = 1:length(umfch) + M = make (M, '%s -c %sumf_%s.c', 'umf_%s.%s', 'umf_%s_%s.%s', ... + rule, umfch {k}, umfch {k}, kind, obj, umfdir) ; + end + + M = make (M, '%s -DWSOLVE -c %sumfpack_%s.c', 'umfpack_%s.%s', ... + 'umfpack_%s_w%s.%s', rule, 'solve', 'solve', kind, obj, umfdir) ; + + for k = 1:length(user) + M = make (M, '%s -c %sumfpack_%s.c', 'umfpack_%s.%s', ... + 'umfpack_%s_%s.%s', rule, user {k}, user {k}, kind, obj, umfdir) ; + end +end + +for k = 1:length(generic) + M = make (M, '%s -c %sumfpack_%s.c', 'umfpack_%s.%s', ... + 'umfpack_%s_%s.%s', mx, generic {k}, generic {k}, 'm', obj, umfdir) ; +end + +%---------------------------------------- +% AMD routines (int only) +%---------------------------------------- + +for k = 1:length(amd) + M = make (M, '%s -DDINT -c %samd_%s.c', 'amd_%s.%s', 'amd_%s_%s.%s', ... + mx, amd {k}, amd {k}, 'm', obj, amddir) ; +end + +%---------------------------------------- +% compile the umfpack mexFunction +%---------------------------------------- + +C = sprintf ('%s -output umfpack umfpackmex.c', mx) ; +for i = 1:length (M) + C = [C ' ' (M {i})] ; +end +C = [C ' ' blas_lib] ; +cmd (C) ; + +%---------------------------------------- +% delete the object files +%---------------------------------------- + +for i = 1:length (M) + rmfile (M {i}) ; +end + +%---------------------------------------- +% compile the luflop mexFunction +%---------------------------------------- + +cmd (sprintf ('%s -output luflop luflopmex.c', mx)) ; + +fprintf ('\n\nCompilation has completed. Now trying the umfpack_simple demo.\n'); +umfpack_simple + +%------------------------------------------------------------------------------- +% rmfile: delete a file, but only if it exists +%------------------------------------------------------------------------------- + +function rmfile (file) +if (length (dir (file)) > 0) + delete (file) ; +end + +%------------------------------------------------------------------------------- +% cpfile: copy the src file to the filename dst, overwriting dst if it exists +%------------------------------------------------------------------------------- + +function cpfile (src, dst) +rmfile (dst) +if (length (dir (src)) == 0) + help umfpack_make + error (sprintf ('File does not exist: %s\n', src)) ; +end +copyfile (src, dst) ; + +%------------------------------------------------------------------------------- +% mvfile: move the src file to the filename dst, overwriting dst if it exists +%------------------------------------------------------------------------------- + +function mvfile (src, dst) +cpfile (src, dst) ; +rmfile (src) ; + +%------------------------------------------------------------------------------- +% cmd: display and execute a command +%------------------------------------------------------------------------------- + +function cmd (s) +fprintf ('.') ; +eval (s) ; + +%------------------------------------------------------------------------------- +% make: execute a "make" command for a source file +%------------------------------------------------------------------------------- + +function M = make (M, s, src, dst, rule, file1, file2, kind, obj, srcdir) +cmd (sprintf (s, rule, srcdir, file1)) ; +src = sprintf (src, file1, obj) ; +dst = sprintf (dst, kind, file2, obj) ; +mvfile (src, dst) ; +M {end + 1} = dst ; + diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/OCTAVE/umfpack_report.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/OCTAVE/umfpack_report.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,346 @@ +function umfpack_report (Control, Info) +% UMFPACK_REPORT +% +% umfpack_report (Control, Info) ; +% +% Prints the current Control settings for umfpack, and the statistical +% information returned by umfpack in the Info array. If Control is +% an empty matrix, then the default control settings are printed. +% +% Control is 20-by-1, and Info is 90-by-1. Not all entries are used. +% +% Alternative usages: +% +% umfpack_report ([ ], Info) ; print the default control parameters +% and the Info array. +% umfpack_report (Control) ; print the control parameters only. +% umfpack_report ; print the default control parameters +% and an empty Info array. +% +% See also umfpack, umfpack_make, umfpack_details, +% umfpack_demo, and umfpack_simple. + +% UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A. +% Davis. All Rights Reserved. See ../README for License. + +%------------------------------------------------------------------------------- +% get inputs, use defaults if input arguments not present +%------------------------------------------------------------------------------- + +% The contents of Control and Info are defined in umfpack.h +if (nargin < 1) + Control = [] ; +end +if (nargin < 2) + Info = [] ; +end +if (isempty (Control)) + Control = umfpack ; +end +if (isempty (Info)) + Info = [ 0 (-ones (1, 89)) ] ; +end + +%------------------------------------------------------------------------------- +% control settings +%------------------------------------------------------------------------------- + +fprintf ('\nUMFPACK Version 4.3: Control settings:\n\n') ; +fprintf (' Control (1): print level: %d\n', Control (1)) ; +fprintf (' Control (2): dense row parameter: %g\n', Control (2)) ; +fprintf (' "dense" rows have > max (16, (%g)*16*sqrt(n_col)) entries\n', Control (2)) ; +fprintf (' Control (3): dense column parameter: %g\n', Control (3)) ; +fprintf (' "dense" columns have > max (16, (%g)*16*sqrt(n_row)) entries\n', Control (3)) ; +fprintf (' Control (4): pivot tolerance: %g\n', Control (4)) ; +fprintf (' Control (5): max block size for dense matrix kernels: %d\n', Control (5)) ; +prstrat (' Control (6): strategy: %g ', Control (6)) ; +fprintf (' Control (7): initial allocation ratio: %g\n', Control (7)) ; +fprintf (' Control (8): max iterative refinement steps: %d\n', Control (8)) ; +fprintf (' Control (13): 2-by-2 pivot tolerance: %g\n', Control (13)) ; +fprintf (' Control (14): Q fixed during numeric factorization: %g ', Control (14)) ; +if (Control (14) > 0) + fprintf ('(yes)\n') ; +elseif (Control (14) < 0) + fprintf ('(no)\n') ; +else + fprintf ('(auto)\n') ; +end +fprintf (' Control (15): AMD dense row/column parameter: %g\n', Control (15)) ; +fprintf (' "dense" rows/columns in A+A'' have > max (16, (%g)*sqrt(n)) entries.\n', Control (15)) ; +fprintf (' Only used if the AMD ordering is used.\n') ; +fprintf (' Control (16): diagonal pivot tolerance: %g\n', Control (16)) ; +fprintf (' Only used if diagonal pivoting is attempted.\n') ; + +fprintf (' Control (17): scaling option: %g ', Control (17)) ; +if (Control (17) == 0) + fprintf ('(none)\n') ; +elseif (Control (17) == 2) + fprintf ('(scale the matrix by\n') ; + fprintf (' dividing each row by max. abs. value in each row)\n') ; +else + fprintf ('(scale the matrix by\n') ; + fprintf (' dividing each row by sum of abs. values in each row)\n') ; +end + +fprintf (' Control (18): frontal matrix allocation ratio: %g\n', Control (18)) ; +fprintf (' Control (19): drop tolerance: %g\n', Control (19)) ; +fprintf (' Control (20): AMD and COLAMD aggressive absorption: %g ', Control (20)) ; +yes_no (Control (20)) ; + +% compile-time options: + +fprintf ('\n The following options can only be changed at compile-time:\n') ; + +if (Control (9) == 1) + fprintf (' Control (9): compiled to use the BLAS\n') ; +else + fprintf (' Control (9): compiled without the BLAS\n') ; + fprintf (' (you will not get the best possible performance)\n') ; +end + +if (Control (10) == 1) + fprintf (' Control (10): compiled for MATLAB\n') ; +elseif (Control (10) == 2) + fprintf (' Control (10): compiled for MATLAB\n') ; + fprintf (' Uses internal utMalloc, utFree, utRealloc, utPrintf\n') ; + fprintf (' utDivideComplex, and utFdlibm_hypot routines.\n') ; +else + fprintf (' Control (10): not compiled for MATLAB\n') ; + fprintf (' Uses ANSI C malloc, free, realloc, and printf\n') ; + fprintf (' instead of mxMalloc, mxFree, mxRealloc, and mexPrintf.\n') ; + fprintf (' Printing will be in terms of 0-based matrix indexing,\n') ; + fprintf (' not 1-based as is expected in MATLAB. Diary output may\n') ; + fprintf (' not be properly recorded.\n') ; +end + +if (Control (11) == 2) + fprintf (' Control (11): uses POSIX times ( ) to get CPU time and wallclock time.\n') ; +elseif (Control (11) == 1) + fprintf (' Control (11): uses getrusage to get CPU time.\n') ; +else + fprintf (' Control (11): uses ANSI C clock to get CPU time.\n') ; + fprintf (' The CPU time may wrap around, type "help cputime".\n') ; +end + +if (Control (12) == 1) + fprintf (' Control (12): compiled with debugging enabled\n') ; + fprintf (' ###########################################\n') ; + fprintf (' ### This will be exceedingly slow! ########\n') ; + fprintf (' ###########################################\n') ; + if (Control (10) == 1) + fprintf (' Uses mxAssert.\n') ; + elseif (Control (10) == 2) + fprintf (' Uses utAssert.\n') ; + else + fprintf (' Uses ANSI C assert instead of mxAssert.\n') ; + end +else + fprintf (' Control (12): compiled for normal operation (no debugging)\n') ; +end + +%------------------------------------------------------------------------------- +% Info: +%------------------------------------------------------------------------------- + +if (nargin == 1) + return +end + +status = Info (1) ; +fprintf ('\nUMFPACK status: Info (1): %d, ', status) ; + +if (status == 0) + fprintf ('OK\n') ; +elseif (status == 1) + fprintf ('WARNING matrix is singular\n') ; +elseif (status == -1) + fprintf ('ERROR out of memory\n') ; +elseif (status == -3) + fprintf ('ERROR numeric LU factorization is invalid\n') ; +elseif (status == -4) + fprintf ('ERROR symbolic LU factorization is invalid\n') ; +elseif (status == -5) + fprintf ('ERROR required argument is missing\n') ; +elseif (status == -6) + fprintf ('ERROR n <= 0\n') ; +elseif (status <= -7 & status >= -12 | status == -14) + fprintf ('ERROR matrix A is corrupted\n') ; +elseif (status == -13) + fprintf ('ERROR invalid system\n') ; +elseif (status == -15) + fprintf ('ERROR invalid permutation\n') ; +elseif (status == -911) + fprintf ('ERROR internal error!\n') ; + fprintf ('Please report this error to Tim Davis (davis@cise.ufl.edu)\n') ; +else + fprintf ('ERROR unrecognized error. Info array corrupted\n') ; +end + +fprintf (' (a -1 means the entry has not been computed):\n') ; + +fprintf ('\n Basic statistics:\n') ; +fprintf (' Info (2): %d, # of rows of A\n', Info (2)) ; +fprintf (' Info (17): %d, # of columns of A\n', Info (17)) ; +fprintf (' Info (3): %d, nnz (A)\n', Info (3)) ; +fprintf (' Info (4): %d, Unit size, in bytes, for memory usage reported below\n', Info (4)) ; +fprintf (' Info (5): %d, size of int (in bytes)\n', Info (5)) ; +fprintf (' Info (6): %d, size of long (in bytes)\n', Info (6)) ; +fprintf (' Info (7): %d, size of pointer (in bytes)\n', Info (7)) ; +fprintf (' Info (8): %d, size of numerical entry (in bytes)\n', Info (8)) ; + +fprintf ('\n Pivots with zero Markowitz cost removed to obtain submatrix S:\n') ; +fprintf (' Info (57): %d, # of pivots with one entry in pivot column\n', Info (57)) ; +fprintf (' Info (58): %d, # of pivots with one entry in pivot row\n', Info (58)) ; +fprintf (' Info (59): %d, # of rows/columns in submatrix S (if square)\n', Info (59)) ; +fprintf (' Info (60): %d ') ; +if (Info (60) > 0) + fprintf ('submatrix S square and diagonal preserved\n') ; +elseif (Info (60) == 0) + fprintf ('submatrix S not square or diagonal not preserved\n') ; +else + fprintf ('\n') ; +end +fprintf (' Info (9): %d, # of "dense" rows in S\n', Info (9)) ; +fprintf (' Info (10): %d, # of empty rows in S\n', Info (10)) ; +fprintf (' Info (11): %d, # of "dense" columns in S\n', Info (11)) ; +fprintf (' Info (12): %d, # of empty columns in S\n', Info (12)) ; +fprintf (' Info (34): %g, symmetry of pattern of S\n', Info (34)) ; +fprintf (' Info (35): %d, # of off-diagonal nonzeros in S+S''\n', Info (35)) ; +fprintf (' Info (36): %d, nnz (diag (S))\n', Info (36)) ; + +fprintf ('\n 2-by-2 pivoting to place large entries on diagonal:\n') ; +fprintf (' Info (52): %d, # of small diagonal entries of S\n', Info (52)) ; +fprintf (' Info (53): %d, # of unmatched small diagonal entries\n', Info (53)) ; +fprintf (' Info (54): %g, symmetry of P2*S\n', Info (54)) ; +fprintf (' Info (55): %d, # of off-diagonal entries in (P2*S)+(P2*S)''\n', Info (55)) ; +fprintf (' Info (56): %d, nnz (diag (P2*S))\n', Info (56)) ; + +fprintf ('\n AMD results, for strict diagonal pivoting:\n') ; +fprintf (' Info (37): %d, est. nz in L and U\n', Info (37)) ; +fprintf (' Info (38): %g, est. flop count\n', Info (38)) ; +fprintf (' Info (39): %g, # of "dense" rows in S+S''\n', Info (39)) ; +fprintf (' Info (40): %g, est. max. nz in any column of L\n', Info (40)) ; + +fprintf ('\n Final strategy selection, based on the analysis above:\n') ; +prstrat (' Info (19): %d, strategy used ', Info (19)) ; +fprintf (' Info (20): %d, ordering used ', Info (20)) ; +if (Info (20) == 0) + fprintf ('(COLAMD on A)\n') ; +elseif (Info (20) == 1) + fprintf ('(AMD on A+A'')\n') ; +elseif (Info (20) == 2) + fprintf ('(provided by user)\n') ; +else + fprintf ('(undefined ordering option)\n') ; +end +fprintf (' Info (32): %d, Q fixed during numeric factorization: ', Info (32)) ; +yes_no (Info (32)) ; +fprintf (' Info (33): %d, prefer diagonal pivoting: ', Info (33)) ; +yes_no (Info (33)) ; + +fprintf ('\n symbolic analysis time and memory usage:\n') ; +fprintf (' Info (13): %d, defragmentations during symbolic analysis\n', Info (13)) ; +fprintf (' Info (14): %d, memory used during symbolic analysis (Units)\n', Info (14)) ; +fprintf (' Info (15): %d, final size of symbolic factors (Units)\n', Info (15)) ; +fprintf (' Info (16): %.2f, symbolic analysis CPU time (seconds)\n', Info (16)) ; +fprintf (' Info (18): %.2f, symbolic analysis wall clock time (seconds)\n', Info (18)) ; + +fprintf ('\n Estimates computed in the symbolic analysis:\n') ; +fprintf (' Info (21): %d, est. size of LU factors (Units)\n', Info (21)) ; +fprintf (' Info (22): %d, est. total peak memory usage (Units)\n', Info (22)) ; +fprintf (' Info (23): %d, est. factorization flop count\n', Info (23)) ; +fprintf (' Info (24): %d, est. nnz (L)\n', Info (24)) ; +fprintf (' Info (25): %d, est. nnz (U)\n', Info (25)) ; +fprintf (' Info (26): %d, est. initial size, variable-part of LU (Units)\n', Info (26)) ; +fprintf (' Info (27): %d, est. peak size, of variable-part of LU (Units)\n', Info (27)) ; +fprintf (' Info (28): %d, est. final size, of variable-part of LU (Units)\n', Info (28)) ; +fprintf (' Info (29): %d, est. max frontal matrix size (# of entries)\n', Info (29)) ; +fprintf (' Info (30): %d, est. max # of rows in frontal matrix\n', Info (30)) ; +fprintf (' Info (31): %d, est. max # of columns in frontal matrix\n', Info (31)) ; + +fprintf ('\n Computed in the numeric factorization (estimates shown above):\n') ; +fprintf (' Info (41): %d, size of LU factors (Units)\n', Info (41)) ; +fprintf (' Info (42): %d, total peak memory usage (Units)\n', Info (42)) ; +fprintf (' Info (43): %d, factorization flop count\n', Info (43)) ; +fprintf (' Info (44): %d, nnz (L)\n', Info (44)) ; +fprintf (' Info (45): %d, nnz (U)\n', Info (45)) ; +fprintf (' Info (46): %d, initial size of variable-part of LU (Units)\n', Info (46)) ; +fprintf (' Info (47): %d, peak size of variable-part of LU (Units)\n', Info (47)) ; +fprintf (' Info (48): %d, final size of variable-part of LU (Units)\n', Info (48)) ; +fprintf (' Info (49): %d, max frontal matrix size (# of numerical entries)\n', Info (49)) ; +fprintf (' Info (50): %d, max # of rows in frontal matrix\n', Info (50)) ; +fprintf (' Info (51): %d, max # of columns in frontal matrix\n', Info (51)) ; + +fprintf ('\n Computed in the numeric factorization (no estimates computed a priori):\n') ; +fprintf (' Info (61): %d, defragmentations during numeric factorization\n', Info (61)) ; +fprintf (' Info (62): %d, reallocations during numeric factorization\n', Info (62)) ; +fprintf (' Info (63): %d, costly reallocations during numeric factorization\n', Info (63)) ; +fprintf (' Info (64): %d, integer indices in compressed pattern of L and U\n', Info (64)) ; +fprintf (' Info (65): %d, numerical values stored in L and U\n', Info (65)) ; +fprintf (' Info (66): %.2f, numeric factorization CPU time (seconds)\n', Info (66)) ; +fprintf (' Info (76): %.2f, numeric factorization wall clock time (seconds)\n', Info (76)) ; +if (Info (66) > 0.05 & Info (43) > 0) +fprintf (' mflops in numeric factorization phase: %.2f\n', 1e-6 * Info (43) / Info (66)) ; +end +fprintf (' Info (67): %d, nnz (diag (U))\n', Info (67)) ; +fprintf (' Info (68): %g, reciprocal condition number estimate\n', Info (68)) ; +fprintf (' Info (69): %g, matrix was ', Info (69)) ; +if (Info (69) == 0) + fprintf ('not scaled\n') ; +elseif (Info (69) == 2) + fprintf ('scaled (row max)\n') ; +else + fprintf ('scaled (row sum)\n') ; +end +fprintf (' Info (70): %g, min. scale factor of rows of A\n', Info (70)) ; +fprintf (' Info (71): %g, max. scale factor of rows of A\n', Info (71)) ; +fprintf (' Info (72): %g, min. abs. on diagonal of U\n', Info (72)) ; +fprintf (' Info (73): %g, max. abs. on diagonal of U\n', Info (73)) ; +fprintf (' Info (74): %g, initial allocation parameter used\n', Info (74)) ; +fprintf (' Info (75): %g, # of forced updates due to frontal growth\n', Info (75)) ; +fprintf (' Info (77): %d, # of off-diaogonal pivots\n', Info (77)) ; +fprintf (' Info (78): %d, nnz (L), if no small entries dropped\n', Info (78)) ; +fprintf (' Info (79): %d, nnz (U), if no small entries dropped\n', Info (79)) ; +fprintf (' Info (80): %d, # of small entries dropped\n', Info (80)) ; + +fprintf ('\n Computed in the solve step:\n') ; +fprintf (' Info (81): %d, iterative refinement steps taken\n', Info (81)) ; +fprintf (' Info (82): %d, iterative refinement steps attempted\n', Info (82)) ; +fprintf (' Info (83): %g, omega(1), sparse-backward error estimate\n', Info (83)) ; +fprintf (' Info (84): %g, omega(2), sparse-backward error estimate\n', Info (84)) ; +fprintf (' Info (85): %d, solve flop count\n', Info (85)) ; +fprintf (' Info (86): %.2f, solve CPU time (seconds)\n', Info (86)) ; +fprintf (' Info (87): %.2f, solve wall clock time (seconds)\n', Info (87)) ; + +fprintf ('\n Info (88:90): unused\n\n') ; + +%------------------------------------------------------------------------------- + +function prstrat (fmt, strategy) +fprintf (fmt, strategy) ; +if (strategy == 1) + fprintf ('(unsymmetric)\n') ; + fprintf (' Q = COLAMD (A), Q refined during numerical\n') ; + fprintf (' factorization, and no attempt at diagonal pivoting.\n') ; +elseif (strategy == 2) + fprintf ('(symmetric, with 2-by-2 pivoting)\n') ; + fprintf (' P2 = row permutation to place large values on the diagonal\n') ; + fprintf (' Q = AMD (P2*A+(P2*A)''), Q not refined during numeric factorization,\n') ; + fprintf (' and diagonal pivoting attempted.\n') ; +elseif (strategy == 3) + fprintf ('(symmetric)\n') ; + fprintf (' Q = AMD (A+A''), Q not refined during numeric factorization,\n') ; + fprintf (' and diagonal pivoting (P=Q'') attempted.\n') ; +else + strategy = 0 ; + fprintf ('(auto)\n') ; +end + +%------------------------------------------------------------------------------- + +function yes_no (s) +if (s == 0) + fprintf ('(no)\n') ; +else + fprintf ('(yes)\n') ; +end diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/OCTAVE/umfpack_simple.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/OCTAVE/umfpack_simple.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,61 @@ +% umfpack_simple: a simple demo of UMFPACK +% +% UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A. +% Davis. All Rights Reserved. +% +% UMFPACK License: +% +% Your use or distribution of UMFPACK or any modified version of +% UMFPACK implies that you agree to this License. +% +% THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY +% EXPRESSED OR IMPLIED. ANY USE IS AT YOUR OWN RISK. +% +% Permission is hereby granted to use or copy this program, 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 UMFPACK or any modified version of UMFPACK 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. This +% software was developed with support from the National Science Foundation, +% and is provided to you free of charge. +% +% Availability: http://www.cise.ufl.edu/research/sparse/umfpack +% +% See also: umfpack, umfpack_details + +help umfpack_simple +i = input ('Hit enter to agree to the above License: ', 's') ; +if (~isempty (i)) + error ('terminating') ; +end + +format short + +A = [ + 2 3 0 0 0 + 3 0 4 0 6 + 0 -1 -3 2 0 + 0 0 1 0 0 + 0 4 2 0 1 +] + +A = sparse (A) ; + +b = [8 45 -3 3 19]' + +fprintf ('Solution to Ax=b via UMFPACK:\n') ; +fprintf ('x1 = umfpack (A, ''\\'', b)\n') ; + +x1 = umfpack (A, '\\', b) + +fprintf ('Solution to Ax=b via OCTAVE:\n') ; +fprintf ('x2 = A\\b\n') ; + +x2 = A\b + +fprintf ('norm (x1-x2) should be small: %g\n', norm (x1-x2)) ; + +fprintf ('Type ''umfpack_demo'' for a full demo of UMFPACK\n') ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/OCTAVE/umfpack_simple.m.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/OCTAVE/umfpack_simple.m.out Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,79 @@ +octave:4> umfpack_simple +umfpack_simple is the file: /home/dbateman/octave/devel/octave-sparse/UMFPACKv4.3/UMFPACK/OCTAVE/umfpack_simple.m + +umfpack_simple: a simple demo of UMFPACK + +UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A. +Davis. All Rights Reserved. + +UMFPACK License: + + Your use or distribution of UMFPACK or any modified version of + UMFPACK implies that you agree to this License. + + THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY + EXPRESSED OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + + Permission is hereby granted to use or copy this program, 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 UMFPACK or any modified version of UMFPACK 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. This + software was developed with support from the National Science Foundation, + and is provided to you free of charge. + +Availability: http://www.cise.ufl.edu/research/sparse/umfpack + +See also: umfpack, umfpack_details + + +Additional help for built-in functions, operators, and variables +is available in the on-line version of the manual. Use the command +`help -i ' to search the manual index. + +Help and information about Octave is also available on the WWW +at http://www.octave.org and via the help@octave.org +mailing list. +Hit enter to agree to the above License: +A = + + 2 3 0 0 0 + 3 0 4 0 6 + 0 -1 -3 2 0 + 0 0 1 0 0 + 0 4 2 0 1 + +b = + + 8 + 45 + -3 + 3 + 19 + +Solution to Ax=b via UMFPACK: +x1 = umfpack (A, '\', b) +x1 = + + 1.00000 + 2.00000 + 3.00000 + 4.00000 + 5.00000 + +Solution to Ax=b via OCTAVE: +x2 = A\b +x2 = + + 1.00000 + 2.00000 + 3.00000 + 4.00000 + 5.00000 + +norm (x1-x2) should be small: 0 +Type 'umfpack_demo' for a full demo of UMFPACK +octave:5> diary off diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/OCTAVE/umfpack_solve.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/OCTAVE/umfpack_solve.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,97 @@ +function x = umfpack_solve (arg1, op, arg2, Control) +% UMFPACK_SOLVE +% +% x = umfpack_solve (A, '\', b, Control) +% x = umfpack_solve (b, '/', A, Control) +% +% Computes x = A\b, or b/A, where A is square. Uses UMFPACK if A is sparse. +% The Control argument is optional. +% +% See also umfpack, umfpack_make, umfpack_details, umfpack_report, +% and umfpack_simple. + +% UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A. +% Davis. All Rights Reserved. Type umfpack_details for License. + +%------------------------------------------------------------------------------- +% check inputs and get default control parameters +%------------------------------------------------------------------------------- + +if (op == '\\') + A = arg1 ; + b = arg2 ; +elseif (op == '/') + A = arg2 ; + b = arg1 ; +else + help umfack_solve + error ('umfpack_solve: unrecognized operator') ; +end + +[m n] = size (A) ; +if (m ~= n) + help umfpack_solve + error ('umfpack_solve: A must be square') ; +end + +[m1 n1] = size (b) ; +if ((op == '\\' & n ~= m1) | (op == '/' & n1 ~= m)) + help umfpack_solve + error ('umfpack_solve: b has the wrong dimensions') ; +end + +if (nargin < 4) + Control = umfpack ; +end + +%------------------------------------------------------------------------------- +% solve the system +%------------------------------------------------------------------------------- + +if (op == '\\') + + if (~issparse (A)) + + % A is not sparse, so just use MATLAB + x = A\b ; + + elseif (n1 == 1 & ~issparse (b)) + + % the UMFPACK '\' requires b to be a dense column vector + x = umfpack (A, '\\', b, Control) ; + + else + + % factorize with UMFPACK and do the forward/back solves in MATLAB + [L, U, P, Q, R] = umfpack (A, Control) ; + keyboard + x = Q * (U \ (L \ (P * (R \ b)))) ; + + end + +else + + if (~issparse (A)) + + % A is not sparse, so just use MATLAB + x = b/A ; + + elseif (m1 == 1 & ~issparse (b)) + + % the UMFPACK '/' requires b to be a dense column vector + x = umfpack (b, '/', A, Control) ; + + else + + % factorize with UMFPACK and do the forward/back solves in MATLAB + % this mimics the behavior of x = b/A, except for the row scaling + [L, U, P, Q, R] = umfpack (A.', Control) ; + x = (Q * (U \ (L \ (P * (R \ (b.')))))).' ; + + % an alternative method: + % [L, U, P, Q, r] = umfpack (A, Control) ; + % x = (R \ (P' * (L.' \ (U.' \ (Q' * b.'))))).' ; + + end + +end diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/OCTAVE/west0067.mat Binary file liboctave/UMFPACK/UMFPACK/OCTAVE/west0067.mat has changed diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/README.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/README.txt Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,394 @@ +UMFPACK Version 4.4: a set of routines solving sparse linear systems via LU + factorization. Requires two other packages: the BLAS (dense matrix + operations) and AMD (sparse matrix minimum degree ordering). Includes + a C-callable and MATLAB interface, and a basic FORTRAN 77 interface to + a subset of the C-callable routines. + +Quick start (Unix, or Windows with Cygwin): + + To compile, test, and install both UMFPACK and AMD, the UMFPACK and AMD + directories must be in the same parent directory. To configure, edit + UMFPACK/Make/Make.include and AMD/Make/Make.include (otherwise the BLAS + will not be used, and UMFPACK will be slow). cd to this directory (UMFPACK) + and type "make" (or "make lib" if you do not have MATLAB). To compile and + run a demo program for Harwell/Boeing matrices, type "make hb". To compile + a FORTRAN main program that calls the 32-bit C-callable UMFPACK library, + type "make fortran". When done, type "make clean" to remove unused *.o + files (keeps the compiled libraries and demo programs). See the User Guide + (Doc/UserGuide.pdf), or UMFPACK/Make/Make.include, for more details + (including options for compiling 64-bit mode). + +Quick start (for MATLAB users): + + To compile, test, and install the UMFPACK mexFunction, cd to the + UMFPACK/MATLAB directory and type umfpack_make at the MATLAB prompt. + This works on any system supported by MATLAB. + +-------------------------------------------------------------------------------- + +UMFPACK Version 4.4 (Jan. 28, 2005), Copyright (c) 2005 by Timothy A. +Davis. All Rights Reserved. + +UMFPACK License: + + Your use or distribution of UMFPACK or any modified version of + UMFPACK implies that you agree to this License. + + THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY + EXPRESSED OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + + Permission is hereby granted to use or copy this program, 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 UMFPACK or any modified version of UMFPACK 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. This + software was developed with support from the National Science Foundation, + and is provided to you free of charge. + +Availability: + + http://www.cise.ufl.edu/research/sparse/umfpack + + UMFPACK (including versions 2.2.1 and earlier, in Fortran) is available at + http://www.cise.ufl.edu/research/sparse. MA38 is available in the Harwell + Subroutine Library. This version of UMFPACK includes a modified form of + COLAMD Version 2.0, originally released on Jan. 31, 2000, also available at + http://www.cise.ufl.edu/research/sparse. COLAMD V2.0 is also incorporated + as a built-in function in MATLAB version 6.1, by The MathWorks, Inc. + (http://www.mathworks.com). COLAMD V1.0 appears as a column-preordering + in SuperLU (SuperLU is available at http://www.netlib.org). + UMFPACK v4.0 is a built-in routine in MATLAB 6.5. + UMFPACK v4.3 is a built-in routine in MATLAB 7.1. + +-------------------------------------------------------------------------------- + +Refer to ../AMD/README for the License for AMD, which is a separate +package for ordering sparse matrices that is required by UMFPACK. +UMFPACK v4.4 can use either AMD v1.0 or v1.1. + +-------------------------------------------------------------------------------- + +This is the UMFPACK README.txt file. It is a terse overview of UMFPACK. +Refer to the User Guide (Doc/UserGuide.pdf) for how to install and use UMFPACK, +or to the Quick Start Guide, QuickStart.pdf. + +Description: + + UMFPACK is a set of routines for solving unsymmetric sparse linear systems, + Ax=b, using the Unsymmetric MultiFrontal method. Written in ANSI/ISO C, + with a MATLAB (Version 6.0 or later) interface. + + For best performance, UMFPACK requires an optimized BLAS library. It can + also be compiled without any BLAS at all. UMFPACK requires AMD Version 1.0 + or Version 1.1 + +Authors: + + Timothy A. Davis (davis@cise.ufl.edu), University of Florida. + + Includes a modified version of COLAMD V2.0, by Stefan I. Larimore and + Timothy A. Davis, University of Florida. The COLAMD algorithm was developed + in collaboration with John Gilbert, Xerox Palo Alto Research Center, and + Esmond Ng, Lawrence Berkeley National Laboratory. + + Includes AMD, by Timothy A. Davis, Patrick R. Amestoy, and Iain S. Duff. + + UMFPACK Version 2.2.1 (MA38 in the Harwell Subroutine Library) is + co-authored with Iain S. Duff, Rutherford Appleton Laboratory. + +Acknowledgements: + + This work was supported by the National Science Foundation, under + grants DMS-9504974, DMS-9803599, and 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. + + I would also like to thank the many researchers who provided sparse + matrices from a wide range of domains and used earlier versions of UMFPACK/ + MA38 in their applications, and thus assisted in the practical development + of the algorithm (see http://www.cise.ufl.edu/research/sparse, future + contributions of matrices are always welcome). + + The MathWorks, Inc., provided a pre-release of MATLAB V6 which allowed me + to release the first umfpack mexFunction (v3.0) about 6 months earlier than + I had originally planned. They also supported the extension of UMFPACK to + complex, singular, and rectangular matrices (UMFPACK v4.0). + + Penny Anderson (The MathWorks, Inc.), Anshul Gupta (IBM), and Friedrich + Grund (WAIS) assisted in porting UMFPACK to different platforms. Penny + Anderson also incorporated UMFPACK v4.0 into MATLAB, for lu, backslash (\), + and forward slash (/). + + David Bateman (Motorola) wrote the initial version of the packed complex + input option, and umfpack_get_determinant. + +-------------------------------------------------------------------------------- +Files and directories in the UMFPACK distribution: +-------------------------------------------------------------------------------- + + ---------------------------------------------------------------------------- + Subdirectories of the UMFPACK directory: + ---------------------------------------------------------------------------- + + Doc documentation + Make for compiling UMFPACK (a symbolic link to ../AMD/Make) + Source primary source code + Include include files for use in your code that calls UMFPACK + Demo demo programs. also serves as test of the UMFPACK installation. + MATLAB UMFPACK mexFunction for MATLAB, and supporting m-files + Lib where the compiled C-callable UMFPACK library is placed. + + ---------------------------------------------------------------------------- + Files in the UMFPACK directory: + ---------------------------------------------------------------------------- + + Makefile top-level Makefile for GNU make or original make. + Windows users would require Cygwin to use "make" + + README.txt this file + + ---------------------------------------------------------------------------- + Doc directory: documentation + ---------------------------------------------------------------------------- + + ChangeLog change log + License the UMFPACK License + Makefile for creating the documentation + QuickStart.tex Quick Start guide (source) + QuickStart.pdf Quick Start guide (PDF) + UserGuide.bib User Guide (references) + UserGuide.sed1 sed script for processing UserGuide.stex + UserGuide.sed2 sed script for processing UserGuide.stex + UserGuide.stex User Guide (LaTeX) + UserGuide.pdf User Guide (PDF) + + ---------------------------------------------------------------------------- + Make directory: for compiling the UMFPACK library (Lib/libumfpack.a) + ---------------------------------------------------------------------------- + + This is a symbolic link to the ../AMD/Make directory. Refer to the + ../AMD/README file for a list of its contents. + + ---------------------------------------------------------------------------- + Source directory: + ---------------------------------------------------------------------------- + + GNUmakefile a nice Makefile, for GNU make + Makefile an ugly Unix Makefile (for older make's) + + umfpack_col_to_triplet.c convert col form to triplet + umfpack_defaults.c set Control defaults + umfpack_free_numeric.c free Numeric object + umfpack_free_symbolic.c free Symbolic object + umfpack_get_determinant.c compute determinant from Numeric object + umfpack_get_lunz.c get nz's in L and U + umfpack_get_numeric.c get Numeric object + umfpack_get_symbolic.c get Symbolic object + umfpack_load_numeric.c load Numeric object from file + umfpack_load_symbolic.c load Symbolic object from file + umfpack_numeric.c numeric factorization + umfpack_qsymbolic.c symbolic factorization, user Q + umfpack_report_control.c print Control settings + umfpack_report_info.c print Info statistics + umfpack_report_matrix.c print col or row-form sparse matrix + umfpack_report_numeric.c print Numeric object + umfpack_report_perm.c print permutation + umfpack_report_status.c print return status + umfpack_report_symbolic.c print Symbolic object + umfpack_report_triplet.c print triplet matrix + umfpack_report_vector.c print dense vector + umfpack_save_numeric.c save Numeric object to file + umfpack_save_symbolic.c save Symbolic object to file + umfpack_scale.c scale a vector + umfpack_solve.c solve a linear system + umfpack_symbolic.c symbolic factorization + umfpack_tictoc.c timer + umfpack_timer.c timer + umfpack_transpose.c transpose a matrix + umfpack_triplet_to_col.c convert triplet to col form + + umf_config.h configuration file (BLAS, memory, timer) + umf_internal.h definitions internal to UMFPACK + umf_version.h version definitions (int/long, real/complex) + + umf_2by2.[ch] + umf_analyze.[ch] symbolic factorization of A'*A + umf_apply_order.[ch] apply column etree postorder + umf_assemble.[ch] assemble elements into current front + umf_blas3_update.[ch] rank-k update. Uses level-3 BLAS + umf_build_tuples.[ch] construct tuples for elements + umf_colamd.[ch] COLAMD pre-ordering, modified for UMFPACK + umf_create_element.[ch] create a new element + umf_dump.[ch] debugging routines, not normally active + umf_extend_front.[ch] extend the current frontal matrix + umf_free.[ch] free memory + umf_fsize.[ch] determine largest front in each subtree + umf_garbage_collection.[ch] compact Numeric->Memory + umf_get_memory.[ch] make Numeric->Memory bigger + umf_grow_front.[ch] make current frontal matrix bigger + umf_init_front.[ch] initialize a new frontal matrix + umf_is_permutation.[ch] checks the validity of a permutation vector + umf_kernel.[ch] the main numeric factorization kernel + umf_kernel_init.[ch] initializations for umf_kernel + umf_kernel_wrapup.[ch] wrapup for umf_kernel + umf_local_search.[ch] local row and column pivot search + umf_lsolve.[ch] solve Lx=b + umf_ltsolve.[ch] solve L'x=b and L.'x=b + umf_malloc.[ch] malloc some memory + umf_mem_alloc_element.[ch] allocate element in Numeric->Memory + umf_mem_alloc_head_block.[ch] alloc. block at head of Numeric->Memory + umf_mem_alloc_tail_block.[ch] alloc. block at tail of Numeric->Memory + umf_mem_free_tail_block.[ch] free block at tail of Numeric->Memory + umf_mem_init_memoryspace.[ch] initialize Numeric->Memory + umf_realloc.[ch] realloc memory + umf_report_perm.[ch] print a permutation vector + umf_report_vector.[ch] print a double vector + umf_row_search.[ch] look for a pivot row + umf_scale.[ch] scale the pivot column + umf_scale_column.[ch] move pivot row & column into place, log P and Q + umf_set_stats.[ch] set statistics (final or estimates) + umf_singletons.[ch] find all zero-cost pivots + umf_solve.[ch] solve a linear system + umf_start_front.[ch] start a new frontal matrix for one frontal chain + umf_store_lu.[ch] store LU factors of current front + umf_symbolic_usage.[ch] determine memory usage for Symbolic object + umf_transpose.[ch] transpose a matrix in row or col form + umf_triplet.[ch] convert triplet to column form + umf_tuple_lengths.[ch] determine the tuple list lengths + umf_usolve.[ch] solve Ux=b + umf_utsolve.[ch] solve U'x=b and U.'x=b + umf_valid_numeric.[ch] checks the validity of a Numeric object + umf_valid_symbolic.[ch] check the validity of a Symbolic object + + ---------------------------------------------------------------------------- + Include directory: + ---------------------------------------------------------------------------- + + umfpack.h include file for user programs. Includes all of + the following files. This serves are source- + code level documenation. These files are also + used to construct the User Guide. + + umfpack_col_to_triplet.h + umfpack_defaults.h + umfpack_free_numeric.h + umfpack_free_symbolic.h + umfpack_get_determinant.h + umfpack_get_lunz.h + umfpack_get_numeric.h + umfpack_get_symbolic.h + umfpack_load_numeric.h + umfpack_load_symbolic.h + umfpack_numeric.h + umfpack_qsymbolic.h + umfpack_report_control.h + umfpack_report_info.h + umfpack_report_matrix.h + umfpack_report_numeric.h + umfpack_report_perm.h + umfpack_report_status.h + umfpack_report_symbolic.h + umfpack_report_triplet.h + umfpack_report_vector.h + umfpack_save_numeric.h + umfpack_save_symbolic.h + umfpack_scale.h + umfpack_solve.h + umfpack_symbolic.h + umfpack_tictoc.h + umfpack_timer.h + umfpack_transpose.h + umfpack_triplet_to_col.h + + umfpack_wsolve.h note that there is no umfpack_wsolve.c. The + umfpack_*_wsolve routines are created from the + umfpack_solve.c file. + + ---------------------------------------------------------------------------- + Demo directory: + ---------------------------------------------------------------------------- + + Makefile for GNU make or original make + + umfpack_simple.c a simple demo + umpack_xx_demo.c template to create the demo codes below + + umfpack_di_demo.sed for creating umfpack_di_demo.c + umfpack_dl_demo.sed for creating umfpack_dl_demo.c + umfpack_zi_demo.sed for creating umfpack_zi_demo.c + umfpack_zl_demo.sed for creating umfpack_zl_demo.c + + umfpack_di_demo.c a full demo (real/int version) + umfpack_dl_demo.c a full demo (real/long version) + umfpack_zi_demo.c a full demo (complex/int version) + umfpack_zl_demo.c a full demo (complex/long version) + + umfpack_di_demo.out umfpack_di_demo output, unmodified Make.include + umfpack_dl_demo.out umfpack_dl_demo output, unmodified Make.include + umfpack_zi_demo.out umfpack_zi_demo output, unmodified Make.include + umfpack_zl_demo.out umfpack_zl_demo output, unmodified Make.include + + umf4.c a demo (real/int) for Harwell/Boeing matrices + umf4.out output of "make hb", unmodified Make.include + HB directory of sample Harwell/Boeing matrices + readhb.f reads HB matrices, keeps zero entries + readhb_nozeros.f reads HB matrices, removes zero entries + readhb_size.f reads HB matrix dimension, nnz + tmp empty directory for umf4.c demo + + umf4_f77wrapper.c a simple FORTRAN interface for UMFPACK. + compile with "make fortran" + umf4hb.f a demo of the FORTRAN interface + umf4hb.out output of "make fortran" + + umf4_f77zwrapper.c a simple FORTRAN interface for the complex + UMFPACK routines. compile with "make fortran" + umf4zhb.f a demo of the FORTRAN interface (complex) + umf4zhb.out output of umf4zhb with HB/qc324.cua + + umf4hb64.f 64-bit version of umf4hb.f + + simple_compile a single command that compiles the double/int + version of UMFPACK (useful prototype for + Microsoft Visual Studio project) + + ---------------------------------------------------------------------------- + MATLAB directory: + ---------------------------------------------------------------------------- + + Contents.m for "help umfpack" listing of toolbox contents + GNUmakefile a nice Makefile, for GNU make + Makefile an ugly Unix Makefile (for older make's) + + lu_normest.m 1-norm estimate of A-L*U (by Hager & Davis). + luflop.m for "help luflop" + luflopmex.c luflop mexFunction, for computing LU flop count + umfpack.m for "help umfpack" + umfpack_btf.m solve Ax=b using umfpack and dmperm + umfpack_demo.m a full umfpack demo + umfpack_details.m the details of how to use umfpack + umfpack_make.m compile the umfpack mexFunction within MATLAB + umfpack_report.m report statistics + umfpack_simple.m a simple umfpack demo + umfpack_solve.m x=A\b or b/A for arbitrary b + umfpack_test.m extensive test, requires UF sparse matrices + umfpackmex.c the umfpack mexFunction + west0067.mat sparse matrix for umfpack_demo.m + + umfpack_demo.m.out output of umfpack_demo.m + umfpack_simple.m.out output of umfpack_simple + + lcc_lib/lapacksyms.def LAPACK definitions for lcc compiler (Windows) + lcc_lib/libmwlapack.lib LAPACK definitions for lcc compiler (Windows) + + ---------------------------------------------------------------------------- + Lib directory: libumfpack.a library placed here + ---------------------------------------------------------------------------- + + libumfpack.def UMPFACK definitions for Windows diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/GNUmakefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/GNUmakefile Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,253 @@ +#------------------------------------------------------------------------------- +# UMFPACK Makefile for compiling on Unix systems (for GNU Make) +#------------------------------------------------------------------------------- + +all: ../Lib/libumfpack.a + +include ../Make/Make.include + +C = $(CC) $(CFLAGS) $(CONFIG) -I../Include -I../../AMD/Include -I../../AMD/Source + +#------------------------------------------------------------------------------- +# source files +#------------------------------------------------------------------------------- + +# non-user-callable umf_*.[ch] files: +UMFCH = umf_assemble umf_blas3_update umf_build_tuples umf_create_element \ + umf_dump umf_extend_front umf_garbage_collection umf_get_memory \ + umf_init_front umf_kernel umf_kernel_init umf_kernel_wrapup \ + umf_local_search umf_lsolve umf_ltsolve umf_mem_alloc_element \ + umf_mem_alloc_head_block umf_mem_alloc_tail_block \ + umf_mem_free_tail_block umf_mem_init_memoryspace \ + umf_report_vector umf_row_search umf_scale_column \ + umf_set_stats umf_solve umf_symbolic_usage umf_transpose \ + umf_tuple_lengths umf_usolve umf_utsolve umf_valid_numeric \ + umf_valid_symbolic umf_grow_front umf_start_front umf_2by2 \ + umf_store_lu umf_scale + +# non-user-callable umf_*.[ch] files, int/long versions only (no real/complex): +UMFINT = umf_analyze umf_apply_order umf_colamd umf_free umf_fsize \ + umf_is_permutation umf_malloc umf_realloc umf_report_perm \ + umf_singletons + +# non-user-callable, created from umf_ltsolve.c, umf_utsolve.c, +# umf_triplet.c, and umf_assemble.c , with int/long and real/complex versions: +UMF_CREATED = umf_lhsolve umf_uhsolve umf_triplet_map_nox \ + umf_triplet_nomap_x umf_triplet_nomap_nox umf_triplet_map_x \ + umf_assemble_fixq umf_store_lu_drop + +# non-user-callable, int/long and real/complex versions: +UMF = $(UMF_CREATED) $(UMFCH) + +# user-callable umfpack_*.[ch] files (int/long and real/complex): +UMFPACK = umfpack_col_to_triplet umfpack_defaults umfpack_free_numeric \ + umfpack_free_symbolic umfpack_get_numeric umfpack_get_lunz \ + umfpack_get_symbolic umfpack_get_determinant umfpack_numeric \ + umfpack_qsymbolic umfpack_report_control umfpack_report_info \ + umfpack_report_matrix umfpack_report_numeric umfpack_report_perm \ + umfpack_report_status umfpack_report_symbolic umfpack_report_triplet \ + umfpack_report_vector umfpack_solve umfpack_symbolic \ + umfpack_transpose umfpack_triplet_to_col umfpack_scale \ + umfpack_load_numeric umfpack_save_numeric \ + umfpack_load_symbolic umfpack_save_symbolic + +# user-callable, created from umfpack_solve.c (umfpack_wsolve.h exists, though): +# with int/long and real/complex versions: +UMFPACKW = umfpack_wsolve + +USER = $(UMFPACKW) $(UMFPACK) + +# user-callable, only one version for int/long, real/complex, *.[ch] files: +GENERIC = umfpack_timer umfpack_tictoc + +#------------------------------------------------------------------------------- +# include files: +#------------------------------------------------------------------------------- + +INC = ../Include/umfpack.h \ + umf_config.h umf_version.h umf_internal.h umf_triplet.h \ + $(addsuffix .h,$(UMFCH)) \ + $(addsuffix .h,$(UMFINT)) \ + $(addprefix ../Include/, $(addsuffix .h,$(USER))) \ + $(addprefix ../Include/, $(addsuffix .h,$(GENERIC))) \ + ../../AMD/Source/amd_internal.h ../../AMD/Include/amd.h + +#------------------------------------------------------------------------------- +# object files for each version +#------------------------------------------------------------------------------- + +DI = $(addsuffix .o, $(subst umf_,umf_di_,$(UMF)) $(subst umfpack_,umfpack_di_,$(USER))) +DL = $(addsuffix .o, $(subst umf_,umf_dl_,$(UMF)) $(subst umfpack_,umfpack_dl_,$(USER))) +ZI = $(addsuffix .o, $(subst umf_,umf_zi_,$(UMF)) $(subst umfpack_,umfpack_zi_,$(USER))) +ZL = $(addsuffix .o, $(subst umf_,umf_zl_,$(UMF)) $(subst umfpack_,umfpack_zl_,$(USER))) +I = $(addsuffix .o, $(subst umf_,umf_i_,$(UMFINT))) +L = $(addsuffix .o, $(subst umf_,umf_l_,$(UMFINT))) +GN = $(addsuffix .o, $(subst umfpack_,umfpack_gn_,$(GENERIC))) + +#------------------------------------------------------------------------------- +# compile each int and long routine (with no real/complex version) +#------------------------------------------------------------------------------- + +umf_i_%.o: umf_%.c $(INC) + $(C) -DDINT -c $< -o $@ + +umf_l_%.o: umf_%.c $(INC) + $(C) -DDLONG -c $< -o $@ + +#------------------------------------------------------------------------------- +# compile each routine in the DI version +#------------------------------------------------------------------------------- + +umf_di_%.o: umf_%.c $(INC) + $(C) -DDINT -c $< -o $@ + +umf_di_%hsolve.o: umf_%tsolve.c $(INC) + $(C) -DDINT -DCONJUGATE_SOLVE -c $< -o $@ + +umf_di_triplet_map_x.o: umf_triplet.c $(INC) + $(C) -DDINT -DDO_MAP -DDO_VALUES -c $< -o $@ + +umf_di_triplet_map_nox.o: umf_triplet.c $(INC) + $(C) -DDINT -DDO_MAP -c $< -o $@ + +umf_di_triplet_nomap_x.o: umf_triplet.c $(INC) + $(C) -DDINT -DDO_VALUES -c $< -o $@ + +umf_di_triplet_nomap_nox.o: umf_triplet.c $(INC) + $(C) -DDINT -c $< -o $@ + +umf_di_assemble_fixq.o: umf_assemble.c $(INC) + $(C) -DDINT -DFIXQ -c $< -o $@ + +umf_di_store_lu_drop.o: umf_store_lu.c $(INC) + $(C) -DDINT -DDROP -c $< -o $@ + +umfpack_di_wsolve.o: umfpack_solve.c $(INC) + $(C) -DDINT -DWSOLVE -c $< -o $@ + +umfpack_di_%.o: umfpack_%.c $(INC) + $(C) -DDINT -c $< -o $@ + +#------------------------------------------------------------------------------- +# compile each routine in the DL version +#------------------------------------------------------------------------------- + +umf_dl_%.o: umf_%.c $(INC) + $(C) -DDLONG -c $< -o $@ + +umf_dl_%hsolve.o: umf_%tsolve.c $(INC) + $(C) -DDLONG -DCONJUGATE_SOLVE -c $< -o $@ + +umf_dl_triplet_map_x.o: umf_triplet.c $(INC) + $(C) -DDLONG -DDO_MAP -DDO_VALUES -c $< -o $@ + +umf_dl_triplet_map_nox.o: umf_triplet.c $(INC) + $(C) -DDLONG -DDO_MAP -c $< -o $@ + +umf_dl_triplet_nomap_x.o: umf_triplet.c $(INC) + $(C) -DDLONG -DDO_VALUES -c $< -o $@ + +umf_dl_triplet_nomap_nox.o: umf_triplet.c $(INC) + $(C) -DDLONG -c $< -o $@ + +umf_dl_assemble_fixq.o: umf_assemble.c $(INC) + $(C) -DDLONG -DFIXQ -c $< -o $@ + +umf_dl_store_lu_drop.o: umf_store_lu.c $(INC) + $(C) -DDLONG -DDROP -c $< -o $@ + +umfpack_dl_wsolve.o: umfpack_solve.c $(INC) + $(C) -DDLONG -DWSOLVE -c $< -o $@ + +umfpack_dl_%.o: umfpack_%.c $(INC) + $(C) -DDLONG -c $< -o $@ + +#------------------------------------------------------------------------------- +# compile each routine in the ZI version +#------------------------------------------------------------------------------- + +umf_zi_%.o: umf_%.c $(INC) + $(C) -DZINT -c $< -o $@ + +umf_zi_%hsolve.o: umf_%tsolve.c $(INC) + $(C) -DZINT -DCONJUGATE_SOLVE -c $< -o $@ + +umf_zi_triplet_map_x.o: umf_triplet.c $(INC) + $(C) -DZINT -DDO_MAP -DDO_VALUES -c $< -o $@ + +umf_zi_triplet_map_nox.o: umf_triplet.c $(INC) + $(C) -DZINT -DDO_MAP -c $< -o $@ + +umf_zi_triplet_nomap_x.o: umf_triplet.c $(INC) + $(C) -DZINT -DDO_VALUES -c $< -o $@ + +umf_zi_triplet_nomap_nox.o: umf_triplet.c $(INC) + $(C) -DZINT -c $< -o $@ + +umf_zi_assemble_fixq.o: umf_assemble.c $(INC) + $(C) -DZINT -DFIXQ -c $< -o $@ + +umf_zi_store_lu_drop.o: umf_store_lu.c $(INC) + $(C) -DZINT -DDROP -c $< -o $@ + +umfpack_zi_wsolve.o: umfpack_solve.c $(INC) + $(C) -DZINT -DWSOLVE -c $< -o $@ + +umfpack_zi_%.o: umfpack_%.c $(INC) + $(C) -DZINT -c $< -o $@ + +#------------------------------------------------------------------------------- +# compile each routine in the ZL version +#------------------------------------------------------------------------------- + +umf_zl_%.o: umf_%.c $(INC) + $(C) -DZLONG -c $< -o $@ + +umf_zl_%hsolve.o: umf_%tsolve.c $(INC) + $(C) -DZLONG -DCONJUGATE_SOLVE -c $< -o $@ + +umf_zl_triplet_map_x.o: umf_triplet.c $(INC) + $(C) -DZLONG -DDO_MAP -DDO_VALUES -c $< -o $@ + +umf_zl_triplet_map_nox.o: umf_triplet.c $(INC) + $(C) -DZLONG -DDO_MAP -c $< -o $@ + +umf_zl_triplet_nomap_x.o: umf_triplet.c $(INC) + $(C) -DZLONG -DDO_VALUES -c $< -o $@ + +umf_zl_triplet_nomap_nox.o: umf_triplet.c $(INC) + $(C) -DZLONG -c $< -o $@ + +umf_zl_assemble_fixq.o: umf_assemble.c $(INC) + $(C) -DZLONG -DFIXQ -c $< -o $@ + +umf_zl_store_lu_drop.o: umf_store_lu.c $(INC) + $(C) -DZLONG -DDROP -c $< -o $@ + +umfpack_zl_wsolve.o: umfpack_solve.c $(INC) + $(C) -DZLONG -DWSOLVE -c $< -o $@ + +umfpack_zl_%.o: umfpack_%.c $(INC) + $(C) -DZLONG -c $< -o $@ + +#------------------------------------------------------------------------------- +# Create the generic routines (GN) using a generic rule +#------------------------------------------------------------------------------- + +umfpack_gn_%.o: umfpack_%.c $(INC) + $(C) -c $< -o $@ + +#------------------------------------------------------------------------------- +# Create the libumfpack.a library +#------------------------------------------------------------------------------- + +../Lib/libumfpack.a: $(I) $(L) $(GN) $(DI) $(DL) $(ZI) $(ZL) + $(AR) cr ../Lib/libumfpack.a $^ + - $(RANLIB) ../Lib/libumfpack.a + +#------------------------------------------------------------------------------- +# Remove all but the files in the original distribution +#------------------------------------------------------------------------------- + +purge: clean + - $(RM) ../Lib/libumfpack.a diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/Makefile Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,479 @@ +#------------------------------------------------------------------------------- +# UMFPACK Makefile for compiling on Unix systems (for original make only) +#------------------------------------------------------------------------------- + +# This is a very ugly Makefile, and is only provided for those who do not +# have GNU make. Note that it is not used if you have GNU make. It ignores +# dependency checking and just compiles everything. It was created +# automatically, via make -n using the GNUmakefile. That way, I don't have +# maintain two Makefiles. + +all: everything + +include ../Make/Make.include + +C = $(CC) $(CFLAGS) $(CONFIG) -I../Include -I../../AMD/Include -I../../AMD/Source + +everything: + $(C) -DDINT -c umf_analyze.c -o umf_i_analyze.o + $(C) -DDINT -c umf_apply_order.c -o umf_i_apply_order.o + $(C) -DDINT -c umf_colamd.c -o umf_i_colamd.o + $(C) -DDINT -c umf_free.c -o umf_i_free.o + $(C) -DDINT -c umf_fsize.c -o umf_i_fsize.o + $(C) -DDINT -c umf_is_permutation.c -o umf_i_is_permutation.o + $(C) -DDINT -c umf_malloc.c -o umf_i_malloc.o + $(C) -DDINT -c umf_realloc.c -o umf_i_realloc.o + $(C) -DDINT -c umf_report_perm.c -o umf_i_report_perm.o + $(C) -DDINT -c umf_singletons.c -o umf_i_singletons.o + $(C) -DDLONG -c umf_analyze.c -o umf_l_analyze.o + $(C) -DDLONG -c umf_apply_order.c -o umf_l_apply_order.o + $(C) -DDLONG -c umf_colamd.c -o umf_l_colamd.o + $(C) -DDLONG -c umf_free.c -o umf_l_free.o + $(C) -DDLONG -c umf_fsize.c -o umf_l_fsize.o + $(C) -DDLONG -c umf_is_permutation.c -o umf_l_is_permutation.o + $(C) -DDLONG -c umf_malloc.c -o umf_l_malloc.o + $(C) -DDLONG -c umf_realloc.c -o umf_l_realloc.o + $(C) -DDLONG -c umf_report_perm.c -o umf_l_report_perm.o + $(C) -DDLONG -c umf_singletons.c -o umf_l_singletons.o + $(C) -c umfpack_timer.c -o umfpack_gn_timer.o + $(C) -c umfpack_tictoc.c -o umfpack_gn_tictoc.o + $(C) -DDINT -DCONJUGATE_SOLVE -c umf_ltsolve.c -o umf_di_lhsolve.o + $(C) -DDINT -DCONJUGATE_SOLVE -c umf_utsolve.c -o umf_di_uhsolve.o + $(C) -DDINT -DDO_MAP -c umf_triplet.c -o umf_di_triplet_map_nox.o + $(C) -DDINT -DDO_VALUES -c umf_triplet.c -o umf_di_triplet_nomap_x.o + $(C) -DDINT -c umf_triplet.c -o umf_di_triplet_nomap_nox.o + $(C) -DDINT -DDO_MAP -DDO_VALUES -c umf_triplet.c -o umf_di_triplet_map_x.o + $(C) -DDINT -DFIXQ -c umf_assemble.c -o umf_di_assemble_fixq.o + $(C) -DDINT -DDROP -c umf_store_lu.c -o umf_di_store_lu_drop.o + $(C) -DDINT -c umf_assemble.c -o umf_di_assemble.o + $(C) -DDINT -c umf_blas3_update.c -o umf_di_blas3_update.o + $(C) -DDINT -c umf_build_tuples.c -o umf_di_build_tuples.o + $(C) -DDINT -c umf_create_element.c -o umf_di_create_element.o + $(C) -DDINT -c umf_dump.c -o umf_di_dump.o + $(C) -DDINT -c umf_extend_front.c -o umf_di_extend_front.o + $(C) -DDINT -c umf_garbage_collection.c -o umf_di_garbage_collection.o + $(C) -DDINT -c umf_get_memory.c -o umf_di_get_memory.o + $(C) -DDINT -c umf_init_front.c -o umf_di_init_front.o + $(C) -DDINT -c umf_kernel.c -o umf_di_kernel.o + $(C) -DDINT -c umf_kernel_init.c -o umf_di_kernel_init.o + $(C) -DDINT -c umf_kernel_wrapup.c -o umf_di_kernel_wrapup.o + $(C) -DDINT -c umf_local_search.c -o umf_di_local_search.o + $(C) -DDINT -c umf_lsolve.c -o umf_di_lsolve.o + $(C) -DDINT -c umf_ltsolve.c -o umf_di_ltsolve.o + $(C) -DDINT -c umf_mem_alloc_element.c -o umf_di_mem_alloc_element.o + $(C) -DDINT -c umf_mem_alloc_head_block.c -o umf_di_mem_alloc_head_block.o + $(C) -DDINT -c umf_mem_alloc_tail_block.c -o umf_di_mem_alloc_tail_block.o + $(C) -DDINT -c umf_mem_free_tail_block.c -o umf_di_mem_free_tail_block.o + $(C) -DDINT -c umf_mem_init_memoryspace.c -o umf_di_mem_init_memoryspace.o + $(C) -DDINT -c umf_report_vector.c -o umf_di_report_vector.o + $(C) -DDINT -c umf_row_search.c -o umf_di_row_search.o + $(C) -DDINT -c umf_scale_column.c -o umf_di_scale_column.o + $(C) -DDINT -c umf_set_stats.c -o umf_di_set_stats.o + $(C) -DDINT -c umf_solve.c -o umf_di_solve.o + $(C) -DDINT -c umf_symbolic_usage.c -o umf_di_symbolic_usage.o + $(C) -DDINT -c umf_transpose.c -o umf_di_transpose.o + $(C) -DDINT -c umf_tuple_lengths.c -o umf_di_tuple_lengths.o + $(C) -DDINT -c umf_usolve.c -o umf_di_usolve.o + $(C) -DDINT -c umf_utsolve.c -o umf_di_utsolve.o + $(C) -DDINT -c umf_valid_numeric.c -o umf_di_valid_numeric.o + $(C) -DDINT -c umf_valid_symbolic.c -o umf_di_valid_symbolic.o + $(C) -DDINT -c umf_grow_front.c -o umf_di_grow_front.o + $(C) -DDINT -c umf_start_front.c -o umf_di_start_front.o + $(C) -DDINT -c umf_2by2.c -o umf_di_2by2.o + $(C) -DDINT -c umf_store_lu.c -o umf_di_store_lu.o + $(C) -DDINT -c umf_scale.c -o umf_di_scale.o + $(C) -DDINT -DWSOLVE -c umfpack_solve.c -o umfpack_di_wsolve.o + $(C) -DDINT -c umfpack_col_to_triplet.c -o umfpack_di_col_to_triplet.o + $(C) -DDINT -c umfpack_defaults.c -o umfpack_di_defaults.o + $(C) -DDINT -c umfpack_free_numeric.c -o umfpack_di_free_numeric.o + $(C) -DDINT -c umfpack_free_symbolic.c -o umfpack_di_free_symbolic.o + $(C) -DDINT -c umfpack_get_numeric.c -o umfpack_di_get_numeric.o + $(C) -DDINT -c umfpack_get_lunz.c -o umfpack_di_get_lunz.o + $(C) -DDINT -c umfpack_get_symbolic.c -o umfpack_di_get_symbolic.o + $(C) -DDINT -c umfpack_get_determinant.c -o umfpack_di_get_determinant.o + $(C) -DDINT -c umfpack_numeric.c -o umfpack_di_numeric.o + $(C) -DDINT -c umfpack_qsymbolic.c -o umfpack_di_qsymbolic.o + $(C) -DDINT -c umfpack_report_control.c -o umfpack_di_report_control.o + $(C) -DDINT -c umfpack_report_info.c -o umfpack_di_report_info.o + $(C) -DDINT -c umfpack_report_matrix.c -o umfpack_di_report_matrix.o + $(C) -DDINT -c umfpack_report_numeric.c -o umfpack_di_report_numeric.o + $(C) -DDINT -c umfpack_report_perm.c -o umfpack_di_report_perm.o + $(C) -DDINT -c umfpack_report_status.c -o umfpack_di_report_status.o + $(C) -DDINT -c umfpack_report_symbolic.c -o umfpack_di_report_symbolic.o + $(C) -DDINT -c umfpack_report_triplet.c -o umfpack_di_report_triplet.o + $(C) -DDINT -c umfpack_report_vector.c -o umfpack_di_report_vector.o + $(C) -DDINT -c umfpack_solve.c -o umfpack_di_solve.o + $(C) -DDINT -c umfpack_symbolic.c -o umfpack_di_symbolic.o + $(C) -DDINT -c umfpack_transpose.c -o umfpack_di_transpose.o + $(C) -DDINT -c umfpack_triplet_to_col.c -o umfpack_di_triplet_to_col.o + $(C) -DDINT -c umfpack_scale.c -o umfpack_di_scale.o + $(C) -DDINT -c umfpack_load_numeric.c -o umfpack_di_load_numeric.o + $(C) -DDINT -c umfpack_save_numeric.c -o umfpack_di_save_numeric.o + $(C) -DDINT -c umfpack_load_symbolic.c -o umfpack_di_load_symbolic.o + $(C) -DDINT -c umfpack_save_symbolic.c -o umfpack_di_save_symbolic.o + $(C) -DDLONG -DCONJUGATE_SOLVE -c umf_ltsolve.c -o umf_dl_lhsolve.o + $(C) -DDLONG -DCONJUGATE_SOLVE -c umf_utsolve.c -o umf_dl_uhsolve.o + $(C) -DDLONG -DDO_MAP -c umf_triplet.c -o umf_dl_triplet_map_nox.o + $(C) -DDLONG -DDO_VALUES -c umf_triplet.c -o umf_dl_triplet_nomap_x.o + $(C) -DDLONG -c umf_triplet.c -o umf_dl_triplet_nomap_nox.o + $(C) -DDLONG -DDO_MAP -DDO_VALUES -c umf_triplet.c -o umf_dl_triplet_map_x.o + $(C) -DDLONG -DFIXQ -c umf_assemble.c -o umf_dl_assemble_fixq.o + $(C) -DDLONG -DDROP -c umf_store_lu.c -o umf_dl_store_lu_drop.o + $(C) -DDLONG -c umf_assemble.c -o umf_dl_assemble.o + $(C) -DDLONG -c umf_blas3_update.c -o umf_dl_blas3_update.o + $(C) -DDLONG -c umf_build_tuples.c -o umf_dl_build_tuples.o + $(C) -DDLONG -c umf_create_element.c -o umf_dl_create_element.o + $(C) -DDLONG -c umf_dump.c -o umf_dl_dump.o + $(C) -DDLONG -c umf_extend_front.c -o umf_dl_extend_front.o + $(C) -DDLONG -c umf_garbage_collection.c -o umf_dl_garbage_collection.o + $(C) -DDLONG -c umf_get_memory.c -o umf_dl_get_memory.o + $(C) -DDLONG -c umf_init_front.c -o umf_dl_init_front.o + $(C) -DDLONG -c umf_kernel.c -o umf_dl_kernel.o + $(C) -DDLONG -c umf_kernel_init.c -o umf_dl_kernel_init.o + $(C) -DDLONG -c umf_kernel_wrapup.c -o umf_dl_kernel_wrapup.o + $(C) -DDLONG -c umf_local_search.c -o umf_dl_local_search.o + $(C) -DDLONG -c umf_lsolve.c -o umf_dl_lsolve.o + $(C) -DDLONG -c umf_ltsolve.c -o umf_dl_ltsolve.o + $(C) -DDLONG -c umf_mem_alloc_element.c -o umf_dl_mem_alloc_element.o + $(C) -DDLONG -c umf_mem_alloc_head_block.c -o umf_dl_mem_alloc_head_block.o + $(C) -DDLONG -c umf_mem_alloc_tail_block.c -o umf_dl_mem_alloc_tail_block.o + $(C) -DDLONG -c umf_mem_free_tail_block.c -o umf_dl_mem_free_tail_block.o + $(C) -DDLONG -c umf_mem_init_memoryspace.c -o umf_dl_mem_init_memoryspace.o + $(C) -DDLONG -c umf_report_vector.c -o umf_dl_report_vector.o + $(C) -DDLONG -c umf_row_search.c -o umf_dl_row_search.o + $(C) -DDLONG -c umf_scale_column.c -o umf_dl_scale_column.o + $(C) -DDLONG -c umf_set_stats.c -o umf_dl_set_stats.o + $(C) -DDLONG -c umf_solve.c -o umf_dl_solve.o + $(C) -DDLONG -c umf_symbolic_usage.c -o umf_dl_symbolic_usage.o + $(C) -DDLONG -c umf_transpose.c -o umf_dl_transpose.o + $(C) -DDLONG -c umf_tuple_lengths.c -o umf_dl_tuple_lengths.o + $(C) -DDLONG -c umf_usolve.c -o umf_dl_usolve.o + $(C) -DDLONG -c umf_utsolve.c -o umf_dl_utsolve.o + $(C) -DDLONG -c umf_valid_numeric.c -o umf_dl_valid_numeric.o + $(C) -DDLONG -c umf_valid_symbolic.c -o umf_dl_valid_symbolic.o + $(C) -DDLONG -c umf_grow_front.c -o umf_dl_grow_front.o + $(C) -DDLONG -c umf_start_front.c -o umf_dl_start_front.o + $(C) -DDLONG -c umf_2by2.c -o umf_dl_2by2.o + $(C) -DDLONG -c umf_store_lu.c -o umf_dl_store_lu.o + $(C) -DDLONG -c umf_scale.c -o umf_dl_scale.o + $(C) -DDLONG -DWSOLVE -c umfpack_solve.c -o umfpack_dl_wsolve.o + $(C) -DDLONG -c umfpack_col_to_triplet.c -o umfpack_dl_col_to_triplet.o + $(C) -DDLONG -c umfpack_defaults.c -o umfpack_dl_defaults.o + $(C) -DDLONG -c umfpack_free_numeric.c -o umfpack_dl_free_numeric.o + $(C) -DDLONG -c umfpack_free_symbolic.c -o umfpack_dl_free_symbolic.o + $(C) -DDLONG -c umfpack_get_numeric.c -o umfpack_dl_get_numeric.o + $(C) -DDLONG -c umfpack_get_lunz.c -o umfpack_dl_get_lunz.o + $(C) -DDLONG -c umfpack_get_symbolic.c -o umfpack_dl_get_symbolic.o + $(C) -DDLONG -c umfpack_get_determinant.c -o umfpack_dl_get_determinant.o + $(C) -DDLONG -c umfpack_numeric.c -o umfpack_dl_numeric.o + $(C) -DDLONG -c umfpack_qsymbolic.c -o umfpack_dl_qsymbolic.o + $(C) -DDLONG -c umfpack_report_control.c -o umfpack_dl_report_control.o + $(C) -DDLONG -c umfpack_report_info.c -o umfpack_dl_report_info.o + $(C) -DDLONG -c umfpack_report_matrix.c -o umfpack_dl_report_matrix.o + $(C) -DDLONG -c umfpack_report_numeric.c -o umfpack_dl_report_numeric.o + $(C) -DDLONG -c umfpack_report_perm.c -o umfpack_dl_report_perm.o + $(C) -DDLONG -c umfpack_report_status.c -o umfpack_dl_report_status.o + $(C) -DDLONG -c umfpack_report_symbolic.c -o umfpack_dl_report_symbolic.o + $(C) -DDLONG -c umfpack_report_triplet.c -o umfpack_dl_report_triplet.o + $(C) -DDLONG -c umfpack_report_vector.c -o umfpack_dl_report_vector.o + $(C) -DDLONG -c umfpack_solve.c -o umfpack_dl_solve.o + $(C) -DDLONG -c umfpack_symbolic.c -o umfpack_dl_symbolic.o + $(C) -DDLONG -c umfpack_transpose.c -o umfpack_dl_transpose.o + $(C) -DDLONG -c umfpack_triplet_to_col.c -o umfpack_dl_triplet_to_col.o + $(C) -DDLONG -c umfpack_scale.c -o umfpack_dl_scale.o + $(C) -DDLONG -c umfpack_load_numeric.c -o umfpack_dl_load_numeric.o + $(C) -DDLONG -c umfpack_save_numeric.c -o umfpack_dl_save_numeric.o + $(C) -DDLONG -c umfpack_load_symbolic.c -o umfpack_dl_load_symbolic.o + $(C) -DDLONG -c umfpack_save_symbolic.c -o umfpack_dl_save_symbolic.o + $(C) -DZINT -DCONJUGATE_SOLVE -c umf_ltsolve.c -o umf_zi_lhsolve.o + $(C) -DZINT -DCONJUGATE_SOLVE -c umf_utsolve.c -o umf_zi_uhsolve.o + $(C) -DZINT -DDO_MAP -c umf_triplet.c -o umf_zi_triplet_map_nox.o + $(C) -DZINT -DDO_VALUES -c umf_triplet.c -o umf_zi_triplet_nomap_x.o + $(C) -DZINT -c umf_triplet.c -o umf_zi_triplet_nomap_nox.o + $(C) -DZINT -DDO_MAP -DDO_VALUES -c umf_triplet.c -o umf_zi_triplet_map_x.o + $(C) -DZINT -DFIXQ -c umf_assemble.c -o umf_zi_assemble_fixq.o + $(C) -DZINT -DDROP -c umf_store_lu.c -o umf_zi_store_lu_drop.o + $(C) -DZINT -c umf_assemble.c -o umf_zi_assemble.o + $(C) -DZINT -c umf_blas3_update.c -o umf_zi_blas3_update.o + $(C) -DZINT -c umf_build_tuples.c -o umf_zi_build_tuples.o + $(C) -DZINT -c umf_create_element.c -o umf_zi_create_element.o + $(C) -DZINT -c umf_dump.c -o umf_zi_dump.o + $(C) -DZINT -c umf_extend_front.c -o umf_zi_extend_front.o + $(C) -DZINT -c umf_garbage_collection.c -o umf_zi_garbage_collection.o + $(C) -DZINT -c umf_get_memory.c -o umf_zi_get_memory.o + $(C) -DZINT -c umf_init_front.c -o umf_zi_init_front.o + $(C) -DZINT -c umf_kernel.c -o umf_zi_kernel.o + $(C) -DZINT -c umf_kernel_init.c -o umf_zi_kernel_init.o + $(C) -DZINT -c umf_kernel_wrapup.c -o umf_zi_kernel_wrapup.o + $(C) -DZINT -c umf_local_search.c -o umf_zi_local_search.o + $(C) -DZINT -c umf_lsolve.c -o umf_zi_lsolve.o + $(C) -DZINT -c umf_ltsolve.c -o umf_zi_ltsolve.o + $(C) -DZINT -c umf_mem_alloc_element.c -o umf_zi_mem_alloc_element.o + $(C) -DZINT -c umf_mem_alloc_head_block.c -o umf_zi_mem_alloc_head_block.o + $(C) -DZINT -c umf_mem_alloc_tail_block.c -o umf_zi_mem_alloc_tail_block.o + $(C) -DZINT -c umf_mem_free_tail_block.c -o umf_zi_mem_free_tail_block.o + $(C) -DZINT -c umf_mem_init_memoryspace.c -o umf_zi_mem_init_memoryspace.o + $(C) -DZINT -c umf_report_vector.c -o umf_zi_report_vector.o + $(C) -DZINT -c umf_row_search.c -o umf_zi_row_search.o + $(C) -DZINT -c umf_scale_column.c -o umf_zi_scale_column.o + $(C) -DZINT -c umf_set_stats.c -o umf_zi_set_stats.o + $(C) -DZINT -c umf_solve.c -o umf_zi_solve.o + $(C) -DZINT -c umf_symbolic_usage.c -o umf_zi_symbolic_usage.o + $(C) -DZINT -c umf_transpose.c -o umf_zi_transpose.o + $(C) -DZINT -c umf_tuple_lengths.c -o umf_zi_tuple_lengths.o + $(C) -DZINT -c umf_usolve.c -o umf_zi_usolve.o + $(C) -DZINT -c umf_utsolve.c -o umf_zi_utsolve.o + $(C) -DZINT -c umf_valid_numeric.c -o umf_zi_valid_numeric.o + $(C) -DZINT -c umf_valid_symbolic.c -o umf_zi_valid_symbolic.o + $(C) -DZINT -c umf_grow_front.c -o umf_zi_grow_front.o + $(C) -DZINT -c umf_start_front.c -o umf_zi_start_front.o + $(C) -DZINT -c umf_2by2.c -o umf_zi_2by2.o + $(C) -DZINT -c umf_store_lu.c -o umf_zi_store_lu.o + $(C) -DZINT -c umf_scale.c -o umf_zi_scale.o + $(C) -DZINT -DWSOLVE -c umfpack_solve.c -o umfpack_zi_wsolve.o + $(C) -DZINT -c umfpack_col_to_triplet.c -o umfpack_zi_col_to_triplet.o + $(C) -DZINT -c umfpack_defaults.c -o umfpack_zi_defaults.o + $(C) -DZINT -c umfpack_free_numeric.c -o umfpack_zi_free_numeric.o + $(C) -DZINT -c umfpack_free_symbolic.c -o umfpack_zi_free_symbolic.o + $(C) -DZINT -c umfpack_get_numeric.c -o umfpack_zi_get_numeric.o + $(C) -DZINT -c umfpack_get_lunz.c -o umfpack_zi_get_lunz.o + $(C) -DZINT -c umfpack_get_symbolic.c -o umfpack_zi_get_symbolic.o + $(C) -DZINT -c umfpack_get_determinant.c -o umfpack_zi_get_determinant.o + $(C) -DZINT -c umfpack_numeric.c -o umfpack_zi_numeric.o + $(C) -DZINT -c umfpack_qsymbolic.c -o umfpack_zi_qsymbolic.o + $(C) -DZINT -c umfpack_report_control.c -o umfpack_zi_report_control.o + $(C) -DZINT -c umfpack_report_info.c -o umfpack_zi_report_info.o + $(C) -DZINT -c umfpack_report_matrix.c -o umfpack_zi_report_matrix.o + $(C) -DZINT -c umfpack_report_numeric.c -o umfpack_zi_report_numeric.o + $(C) -DZINT -c umfpack_report_perm.c -o umfpack_zi_report_perm.o + $(C) -DZINT -c umfpack_report_status.c -o umfpack_zi_report_status.o + $(C) -DZINT -c umfpack_report_symbolic.c -o umfpack_zi_report_symbolic.o + $(C) -DZINT -c umfpack_report_triplet.c -o umfpack_zi_report_triplet.o + $(C) -DZINT -c umfpack_report_vector.c -o umfpack_zi_report_vector.o + $(C) -DZINT -c umfpack_solve.c -o umfpack_zi_solve.o + $(C) -DZINT -c umfpack_symbolic.c -o umfpack_zi_symbolic.o + $(C) -DZINT -c umfpack_transpose.c -o umfpack_zi_transpose.o + $(C) -DZINT -c umfpack_triplet_to_col.c -o umfpack_zi_triplet_to_col.o + $(C) -DZINT -c umfpack_scale.c -o umfpack_zi_scale.o + $(C) -DZINT -c umfpack_load_numeric.c -o umfpack_zi_load_numeric.o + $(C) -DZINT -c umfpack_save_numeric.c -o umfpack_zi_save_numeric.o + $(C) -DZINT -c umfpack_load_symbolic.c -o umfpack_zi_load_symbolic.o + $(C) -DZINT -c umfpack_save_symbolic.c -o umfpack_zi_save_symbolic.o + $(C) -DZLONG -DCONJUGATE_SOLVE -c umf_ltsolve.c -o umf_zl_lhsolve.o + $(C) -DZLONG -DCONJUGATE_SOLVE -c umf_utsolve.c -o umf_zl_uhsolve.o + $(C) -DZLONG -DDO_MAP -c umf_triplet.c -o umf_zl_triplet_map_nox.o + $(C) -DZLONG -DDO_VALUES -c umf_triplet.c -o umf_zl_triplet_nomap_x.o + $(C) -DZLONG -c umf_triplet.c -o umf_zl_triplet_nomap_nox.o + $(C) -DZLONG -DDO_MAP -DDO_VALUES -c umf_triplet.c -o umf_zl_triplet_map_x.o + $(C) -DZLONG -DFIXQ -c umf_assemble.c -o umf_zl_assemble_fixq.o + $(C) -DZLONG -DDROP -c umf_store_lu.c -o umf_zl_store_lu_drop.o + $(C) -DZLONG -c umf_assemble.c -o umf_zl_assemble.o + $(C) -DZLONG -c umf_blas3_update.c -o umf_zl_blas3_update.o + $(C) -DZLONG -c umf_build_tuples.c -o umf_zl_build_tuples.o + $(C) -DZLONG -c umf_create_element.c -o umf_zl_create_element.o + $(C) -DZLONG -c umf_dump.c -o umf_zl_dump.o + $(C) -DZLONG -c umf_extend_front.c -o umf_zl_extend_front.o + $(C) -DZLONG -c umf_garbage_collection.c -o umf_zl_garbage_collection.o + $(C) -DZLONG -c umf_get_memory.c -o umf_zl_get_memory.o + $(C) -DZLONG -c umf_init_front.c -o umf_zl_init_front.o + $(C) -DZLONG -c umf_kernel.c -o umf_zl_kernel.o + $(C) -DZLONG -c umf_kernel_init.c -o umf_zl_kernel_init.o + $(C) -DZLONG -c umf_kernel_wrapup.c -o umf_zl_kernel_wrapup.o + $(C) -DZLONG -c umf_local_search.c -o umf_zl_local_search.o + $(C) -DZLONG -c umf_lsolve.c -o umf_zl_lsolve.o + $(C) -DZLONG -c umf_ltsolve.c -o umf_zl_ltsolve.o + $(C) -DZLONG -c umf_mem_alloc_element.c -o umf_zl_mem_alloc_element.o + $(C) -DZLONG -c umf_mem_alloc_head_block.c -o umf_zl_mem_alloc_head_block.o + $(C) -DZLONG -c umf_mem_alloc_tail_block.c -o umf_zl_mem_alloc_tail_block.o + $(C) -DZLONG -c umf_mem_free_tail_block.c -o umf_zl_mem_free_tail_block.o + $(C) -DZLONG -c umf_mem_init_memoryspace.c -o umf_zl_mem_init_memoryspace.o + $(C) -DZLONG -c umf_report_vector.c -o umf_zl_report_vector.o + $(C) -DZLONG -c umf_row_search.c -o umf_zl_row_search.o + $(C) -DZLONG -c umf_scale_column.c -o umf_zl_scale_column.o + $(C) -DZLONG -c umf_set_stats.c -o umf_zl_set_stats.o + $(C) -DZLONG -c umf_solve.c -o umf_zl_solve.o + $(C) -DZLONG -c umf_symbolic_usage.c -o umf_zl_symbolic_usage.o + $(C) -DZLONG -c umf_transpose.c -o umf_zl_transpose.o + $(C) -DZLONG -c umf_tuple_lengths.c -o umf_zl_tuple_lengths.o + $(C) -DZLONG -c umf_usolve.c -o umf_zl_usolve.o + $(C) -DZLONG -c umf_utsolve.c -o umf_zl_utsolve.o + $(C) -DZLONG -c umf_valid_numeric.c -o umf_zl_valid_numeric.o + $(C) -DZLONG -c umf_valid_symbolic.c -o umf_zl_valid_symbolic.o + $(C) -DZLONG -c umf_grow_front.c -o umf_zl_grow_front.o + $(C) -DZLONG -c umf_start_front.c -o umf_zl_start_front.o + $(C) -DZLONG -c umf_2by2.c -o umf_zl_2by2.o + $(C) -DZLONG -c umf_store_lu.c -o umf_zl_store_lu.o + $(C) -DZLONG -c umf_scale.c -o umf_zl_scale.o + $(C) -DZLONG -DWSOLVE -c umfpack_solve.c -o umfpack_zl_wsolve.o + $(C) -DZLONG -c umfpack_col_to_triplet.c -o umfpack_zl_col_to_triplet.o + $(C) -DZLONG -c umfpack_defaults.c -o umfpack_zl_defaults.o + $(C) -DZLONG -c umfpack_free_numeric.c -o umfpack_zl_free_numeric.o + $(C) -DZLONG -c umfpack_free_symbolic.c -o umfpack_zl_free_symbolic.o + $(C) -DZLONG -c umfpack_get_numeric.c -o umfpack_zl_get_numeric.o + $(C) -DZLONG -c umfpack_get_lunz.c -o umfpack_zl_get_lunz.o + $(C) -DZLONG -c umfpack_get_symbolic.c -o umfpack_zl_get_symbolic.o + $(C) -DZLONG -c umfpack_get_determinant.c -o umfpack_zl_get_determinant.o + $(C) -DZLONG -c umfpack_numeric.c -o umfpack_zl_numeric.o + $(C) -DZLONG -c umfpack_qsymbolic.c -o umfpack_zl_qsymbolic.o + $(C) -DZLONG -c umfpack_report_control.c -o umfpack_zl_report_control.o + $(C) -DZLONG -c umfpack_report_info.c -o umfpack_zl_report_info.o + $(C) -DZLONG -c umfpack_report_matrix.c -o umfpack_zl_report_matrix.o + $(C) -DZLONG -c umfpack_report_numeric.c -o umfpack_zl_report_numeric.o + $(C) -DZLONG -c umfpack_report_perm.c -o umfpack_zl_report_perm.o + $(C) -DZLONG -c umfpack_report_status.c -o umfpack_zl_report_status.o + $(C) -DZLONG -c umfpack_report_symbolic.c -o umfpack_zl_report_symbolic.o + $(C) -DZLONG -c umfpack_report_triplet.c -o umfpack_zl_report_triplet.o + $(C) -DZLONG -c umfpack_report_vector.c -o umfpack_zl_report_vector.o + $(C) -DZLONG -c umfpack_solve.c -o umfpack_zl_solve.o + $(C) -DZLONG -c umfpack_symbolic.c -o umfpack_zl_symbolic.o + $(C) -DZLONG -c umfpack_transpose.c -o umfpack_zl_transpose.o + $(C) -DZLONG -c umfpack_triplet_to_col.c -o umfpack_zl_triplet_to_col.o + $(C) -DZLONG -c umfpack_scale.c -o umfpack_zl_scale.o + $(C) -DZLONG -c umfpack_load_numeric.c -o umfpack_zl_load_numeric.o + $(C) -DZLONG -c umfpack_save_numeric.c -o umfpack_zl_save_numeric.o + $(C) -DZLONG -c umfpack_load_symbolic.c -o umfpack_zl_load_symbolic.o + $(C) -DZLONG -c umfpack_save_symbolic.c -o umfpack_zl_save_symbolic.o + $(AR) cr ../Lib/libumfpack.a \ + umf_i_analyze.o umf_i_apply_order.o umf_i_colamd.o umf_i_free.o \ + umf_i_fsize.o umf_i_is_permutation.o umf_i_malloc.o umf_i_realloc.o \ + umf_i_report_perm.o umf_i_singletons.o \ + umf_l_analyze.o umf_l_apply_order.o umf_l_colamd.o umf_l_free.o \ + umf_l_fsize.o umf_l_is_permutation.o umf_l_malloc.o umf_l_realloc.o \ + umf_l_report_perm.o umf_l_singletons.o \ + umfpack_gn_timer.o umfpack_gn_tictoc.o \ + umf_di_lhsolve.o \ + umf_di_uhsolve.o umf_di_triplet_map_nox.o umf_di_triplet_nomap_x.o \ + umf_di_triplet_nomap_nox.o umf_di_triplet_map_x.o \ + umf_di_assemble_fixq.o umf_di_store_lu_drop.o umf_di_assemble.o \ + umf_di_blas3_update.o umf_di_build_tuples.o \ + umf_di_create_element.o umf_di_dump.o umf_di_extend_front.o \ + umf_di_garbage_collection.o umf_di_get_memory.o \ + umf_di_init_front.o umf_di_kernel.o umf_di_kernel_init.o \ + umf_di_kernel_wrapup.o umf_di_local_search.o umf_di_lsolve.o \ + umf_di_ltsolve.o umf_di_mem_alloc_element.o \ + umf_di_mem_alloc_head_block.o umf_di_mem_alloc_tail_block.o \ + umf_di_mem_free_tail_block.o umf_di_mem_init_memoryspace.o \ + umf_di_report_vector.o umf_di_row_search.o umf_di_scale_column.o \ + umf_di_set_stats.o umf_di_solve.o umf_di_symbolic_usage.o \ + umf_di_transpose.o umf_di_tuple_lengths.o umf_di_usolve.o \ + umf_di_utsolve.o umf_di_valid_numeric.o umf_di_valid_symbolic.o \ + umf_di_grow_front.o umf_di_start_front.o umf_di_2by2.o \ + umf_di_store_lu.o umf_di_scale.o umfpack_di_wsolve.o \ + umfpack_di_col_to_triplet.o umfpack_di_defaults.o \ + umfpack_di_free_numeric.o umfpack_di_free_symbolic.o \ + umfpack_di_get_numeric.o umfpack_di_get_lunz.o \ + umfpack_di_get_symbolic.o umfpack_di_get_determinant.o \ + umfpack_di_numeric.o \ + umfpack_di_qsymbolic.o umfpack_di_report_control.o \ + umfpack_di_report_info.o umfpack_di_report_matrix.o \ + umfpack_di_report_numeric.o umfpack_di_report_perm.o \ + umfpack_di_report_status.o umfpack_di_report_symbolic.o \ + umfpack_di_report_triplet.o umfpack_di_report_vector.o \ + umfpack_di_solve.o umfpack_di_symbolic.o umfpack_di_transpose.o \ + umfpack_di_triplet_to_col.o umfpack_di_scale.o \ + umfpack_di_load_numeric.o umfpack_di_save_numeric.o \ + umfpack_di_load_symbolic.o umfpack_di_save_symbolic.o \ + umf_dl_lhsolve.o \ + umf_dl_uhsolve.o umf_dl_triplet_map_nox.o umf_dl_triplet_nomap_x.o \ + umf_dl_triplet_nomap_nox.o umf_dl_triplet_map_x.o \ + umf_dl_assemble_fixq.o umf_dl_store_lu_drop.o umf_dl_assemble.o \ + umf_dl_blas3_update.o umf_dl_build_tuples.o \ + umf_dl_create_element.o umf_dl_dump.o umf_dl_extend_front.o \ + umf_dl_garbage_collection.o umf_dl_get_memory.o \ + umf_dl_init_front.o umf_dl_kernel.o umf_dl_kernel_init.o \ + umf_dl_kernel_wrapup.o umf_dl_local_search.o umf_dl_lsolve.o \ + umf_dl_ltsolve.o umf_dl_mem_alloc_element.o \ + umf_dl_mem_alloc_head_block.o umf_dl_mem_alloc_tail_block.o \ + umf_dl_mem_free_tail_block.o umf_dl_mem_init_memoryspace.o \ + umf_dl_report_vector.o umf_dl_row_search.o umf_dl_scale_column.o \ + umf_dl_set_stats.o umf_dl_solve.o umf_dl_symbolic_usage.o \ + umf_dl_transpose.o umf_dl_tuple_lengths.o umf_dl_usolve.o \ + umf_dl_utsolve.o umf_dl_valid_numeric.o umf_dl_valid_symbolic.o \ + umf_dl_grow_front.o umf_dl_start_front.o umf_dl_2by2.o \ + umf_dl_store_lu.o umf_dl_scale.o umfpack_dl_wsolve.o \ + umfpack_dl_col_to_triplet.o umfpack_dl_defaults.o \ + umfpack_dl_free_numeric.o umfpack_dl_free_symbolic.o \ + umfpack_dl_get_numeric.o umfpack_dl_get_lunz.o \ + umfpack_dl_get_symbolic.o umfpack_dl_get_determinant.o \ + umfpack_dl_numeric.o \ + umfpack_dl_qsymbolic.o umfpack_dl_report_control.o \ + umfpack_dl_report_info.o umfpack_dl_report_matrix.o \ + umfpack_dl_report_numeric.o umfpack_dl_report_perm.o \ + umfpack_dl_report_status.o umfpack_dl_report_symbolic.o \ + umfpack_dl_report_triplet.o umfpack_dl_report_vector.o \ + umfpack_dl_solve.o umfpack_dl_symbolic.o umfpack_dl_transpose.o \ + umfpack_dl_triplet_to_col.o umfpack_dl_scale.o \ + umfpack_dl_load_numeric.o umfpack_dl_save_numeric.o \ + umfpack_dl_load_symbolic.o umfpack_dl_save_symbolic.o \ + umf_zi_lhsolve.o \ + umf_zi_uhsolve.o umf_zi_triplet_map_nox.o umf_zi_triplet_nomap_x.o \ + umf_zi_triplet_nomap_nox.o umf_zi_triplet_map_x.o \ + umf_zi_assemble_fixq.o umf_zi_store_lu_drop.o umf_zi_assemble.o \ + umf_zi_blas3_update.o umf_zi_build_tuples.o \ + umf_zi_create_element.o umf_zi_dump.o umf_zi_extend_front.o \ + umf_zi_garbage_collection.o umf_zi_get_memory.o \ + umf_zi_init_front.o umf_zi_kernel.o umf_zi_kernel_init.o \ + umf_zi_kernel_wrapup.o umf_zi_local_search.o umf_zi_lsolve.o \ + umf_zi_ltsolve.o umf_zi_mem_alloc_element.o \ + umf_zi_mem_alloc_head_block.o umf_zi_mem_alloc_tail_block.o \ + umf_zi_mem_free_tail_block.o umf_zi_mem_init_memoryspace.o \ + umf_zi_report_vector.o umf_zi_row_search.o umf_zi_scale_column.o \ + umf_zi_set_stats.o umf_zi_solve.o umf_zi_symbolic_usage.o \ + umf_zi_transpose.o umf_zi_tuple_lengths.o umf_zi_usolve.o \ + umf_zi_utsolve.o umf_zi_valid_numeric.o umf_zi_valid_symbolic.o \ + umf_zi_grow_front.o umf_zi_start_front.o umf_zi_2by2.o \ + umf_zi_store_lu.o umf_zi_scale.o umfpack_zi_wsolve.o \ + umfpack_zi_col_to_triplet.o umfpack_zi_defaults.o \ + umfpack_zi_free_numeric.o umfpack_zi_free_symbolic.o \ + umfpack_zi_get_numeric.o umfpack_zi_get_lunz.o \ + umfpack_zi_get_symbolic.o umfpack_zi_get_determinant.o \ + umfpack_zi_numeric.o \ + umfpack_zi_qsymbolic.o umfpack_zi_report_control.o \ + umfpack_zi_report_info.o umfpack_zi_report_matrix.o \ + umfpack_zi_report_numeric.o umfpack_zi_report_perm.o \ + umfpack_zi_report_status.o umfpack_zi_report_symbolic.o \ + umfpack_zi_report_triplet.o umfpack_zi_report_vector.o \ + umfpack_zi_solve.o umfpack_zi_symbolic.o umfpack_zi_transpose.o \ + umfpack_zi_triplet_to_col.o umfpack_zi_scale.o \ + umfpack_zi_load_numeric.o umfpack_zi_save_numeric.o \ + umfpack_zi_load_symbolic.o umfpack_zi_save_symbolic.o \ + umf_zl_lhsolve.o \ + umf_zl_uhsolve.o umf_zl_triplet_map_nox.o umf_zl_triplet_nomap_x.o \ + umf_zl_triplet_nomap_nox.o umf_zl_triplet_map_x.o \ + umf_zl_assemble_fixq.o umf_zl_store_lu_drop.o umf_zl_assemble.o \ + umf_zl_blas3_update.o umf_zl_build_tuples.o \ + umf_zl_create_element.o umf_zl_dump.o umf_zl_extend_front.o \ + umf_zl_garbage_collection.o umf_zl_get_memory.o \ + umf_zl_init_front.o umf_zl_kernel.o umf_zl_kernel_init.o \ + umf_zl_kernel_wrapup.o umf_zl_local_search.o umf_zl_lsolve.o \ + umf_zl_ltsolve.o umf_zl_mem_alloc_element.o \ + umf_zl_mem_alloc_head_block.o umf_zl_mem_alloc_tail_block.o \ + umf_zl_mem_free_tail_block.o umf_zl_mem_init_memoryspace.o \ + umf_zl_report_vector.o umf_zl_row_search.o umf_zl_scale_column.o \ + umf_zl_set_stats.o umf_zl_solve.o umf_zl_symbolic_usage.o \ + umf_zl_transpose.o umf_zl_tuple_lengths.o umf_zl_usolve.o \ + umf_zl_utsolve.o umf_zl_valid_numeric.o umf_zl_valid_symbolic.o \ + umf_zl_grow_front.o umf_zl_start_front.o umf_zl_2by2.o \ + umf_zl_store_lu.o umf_zl_scale.o umfpack_zl_wsolve.o \ + umfpack_zl_col_to_triplet.o umfpack_zl_defaults.o \ + umfpack_zl_free_numeric.o umfpack_zl_free_symbolic.o \ + umfpack_zl_get_numeric.o umfpack_zl_get_lunz.o \ + umfpack_zl_get_symbolic.o umfpack_zl_get_determinant.o \ + umfpack_zl_numeric.o \ + umfpack_zl_qsymbolic.o umfpack_zl_report_control.o \ + umfpack_zl_report_info.o umfpack_zl_report_matrix.o \ + umfpack_zl_report_numeric.o umfpack_zl_report_perm.o \ + umfpack_zl_report_status.o umfpack_zl_report_symbolic.o \ + umfpack_zl_report_triplet.o umfpack_zl_report_vector.o \ + umfpack_zl_solve.o umfpack_zl_symbolic.o umfpack_zl_transpose.o \ + umfpack_zl_triplet_to_col.o umfpack_zl_scale.o \ + umfpack_zl_load_numeric.o umfpack_zl_save_numeric.o \ + umfpack_zl_load_symbolic.o umfpack_zl_save_symbolic.o + - $(RANLIB) ../Lib/libumfpack.a + +#------------------------------------------------------------------------------- +# Remove all but the files in the original distribution +#------------------------------------------------------------------------------- + +purge: clean + - $(RM) ../Lib/libumfpack.a diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_2by2.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_2by2.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,859 @@ +/* ========================================================================== */ +/* === UMF_2by2 ============================================================= */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* Not user-callable. Computes a row permutation P so that A (P,:) has a + * mostly zero-free diagonal, with large entries on the diagonal. It does this + * by swapping pairs of rows. Once a row is swapped it is not swapped again. + * This is a "cheap" assignment, not a complete max. transversal or + * bi-partite matching. It is only a partial matching. For most matrices + * for which this algorithm is used, however, the matching is complete (in + * UMFPACK this algorithm is used for matrices with roughly symmetric pattern, + * and these matrices typically have a mostly-zero-free diagonal to begin with. + * This algorithm is not meant to be used on arbitrary unsymmetric matrices + * (for those matrices, UMFPACK uses its unsymmetric strategy and does not + * use this algorithm). + * + * Even if incomplete, the matching is usually good enough for UMFPACK's + * symmetric strategy, which can easily pivot off the diagonal during numerical + * factorization if it finds a weak diagonal entry. + * + * The algorithms works as follows. First, row scaling factors are computed, + * and weak diagonal entries are found. A weak entry is a value A(k,k) whose + * absolute value is < tol * max (abs (A (:,k))). For each weak diagonal k in + * increasing order of degree in A+A', the algorithm finds an index j such + * that A (k,j) and A (j,k) are "large" (greater than or equal to tol times + * the largest magnitude in their columns). Row j must also not have already + * been swapped. Rows j and k are then swapped. If we come to a diagonal k + * that has already been swapped, then it is not modified. This case occurs + * for "oxo" pivots: + * + * k j + * k o x + * j x o + * + * which are swapped once to obtain + * + * k j + * j x o + * k o x + * + * These two rows are then not modified any further (A (j,j) was weak, but + * after one swap the permuted the jth diagonal entry is strong. + * + * This algorithm only works on square matrices (real, complex, or pattern- + * only). The numerical values are optional. If not present, each entry is + * treated as numerically acceptable (tol is ignored), and the algorithm + * operates by just using the pattern, not the values. Each column of the + * input matrix A must be sorted, with no duplicate entries. The matrix A + * can be optionally scaled prior to the numerical test. The matrix A (:,P) + * has the same diagonal entries as A (:,P), except in different order. So + * the output permutation P can also be used to swap the columns of A. + */ + +#include "umf_internal.h" + +#ifndef NDEBUG +#include "umf_is_permutation.h" +#endif + +/* x is "weak" if it is less than ctol. If x or ctol are NaN, then define + * x as not "weak". This is a rather arbitrary choice, made to simplify the + * computation. On all but a PC with Microsoft C/C++, this test becomes + * ((x) - ctol < 0). */ +#define WEAK(x,ctol) (SCALAR_IS_LTZERO ((x)-(ctol))) + +/* For flag value in Next [col] */ +#define IS_WEAK -2 + +/* ========================================================================== */ +/* === two_by_two =========================================================== */ +/* ========================================================================== */ + +PRIVATE Int two_by_two /* returns # unmatched weak diagonals */ +( + /* input, not modified */ + Int n2, /* C is n2-by-n2 */ + Int Cp [ ], /* size n2+1, column pointers for C */ + Int Ci [ ], /* size snz = Cp [n2], row indices for C */ + Int Degree [ ], /* Degree [i] = degree of row i of C+C' */ + + /* input, not defined on output */ + Int Next [ ], /* Next [k] == IS_WEAK if k is a weak diagonal */ + Int Ri [ ], /* Ri [i] is the length of row i in C */ + + /* output, not defined on input */ + Int P [ ], + + /* workspace, not defined on input or output */ + Int Rp [ ], + Int Head [ ] +) +{ + Int deg, newcol, row, col, p, p2, unmatched, k, j, j2, j_best, best, jdiff, + jdiff_best, jdeg, jdeg_best, cp, cp1, cp2, rp, rp1, rp2, maxdeg, + mindeg ; + + /* ---------------------------------------------------------------------- */ + /* place weak diagonals in the degree lists */ + /* ---------------------------------------------------------------------- */ + + for (deg = 0 ; deg < n2 ; deg++) + { + Head [deg] = EMPTY ; + } + + maxdeg = 0 ; + mindeg = Int_MAX ; + for (newcol = n2-1 ; newcol >= 0 ; newcol--) + { + if (Next [newcol] == IS_WEAK) + { + /* add this column to the list of weak nodes */ + DEBUGm1 ((" newcol "ID" has a weak diagonal deg "ID"\n", + newcol, deg)) ; + deg = Degree [newcol] ; + ASSERT (deg >= 0 && deg < n2) ; + Next [newcol] = Head [deg] ; + Head [deg] = newcol ; + maxdeg = MAX (maxdeg, deg) ; + mindeg = MIN (mindeg, deg) ; + } + } + + /* ---------------------------------------------------------------------- */ + /* construct R = C' (C = strong entries in pruned submatrix) */ + /* ---------------------------------------------------------------------- */ + + /* Ri [0..n2-1] is the length of each row of R */ + /* use P as temporary pointer into the row form of R [ */ + Rp [0] = 0 ; + for (row = 0 ; row < n2 ; row++) + { + Rp [row+1] = Rp [row] + Ri [row] ; + P [row] = Rp [row] ; + } + /* Ri no longer needed for row counts */ + + /* all entries in C are strong */ + for (col = 0 ; col < n2 ; col++) + { + p2 = Cp [col+1] ; + for (p = Cp [col] ; p < p2 ; p++) + { + /* place the column index in row = Ci [p] */ + Ri [P [Ci [p]]++] = col ; + } + } + + /* contents of P no longer needed ] */ + +#ifndef NDEBUG + DEBUG0 (("==================R: row form of strong entries in A:\n")) ; + UMF_dump_col_matrix ((double *) NULL, +#ifdef COMPLEX + (double *) NULL, +#endif + Ri, Rp, n2, n2, Rp [n2]) ; +#endif + ASSERT (AMD_valid (n2, n2, Rp, Ri)) ; + + /* ---------------------------------------------------------------------- */ + /* for each weak diagonal, find a pair of strong off-diagonal entries */ + /* ---------------------------------------------------------------------- */ + + for (row = 0 ; row < n2 ; row++) + { + P [row] = EMPTY ; + } + + unmatched = 0 ; + best = EMPTY ; + jdiff = EMPTY ; + jdeg = EMPTY ; + + for (deg = mindeg ; deg <= maxdeg ; deg++) + { + /* find the next weak diagonal of lowest degree */ + DEBUGm2 (("---------------------------------- Deg: "ID"\n", deg)) ; + for (k = Head [deg] ; k != EMPTY ; k = Next [k]) + { + DEBUGm2 (("k: "ID"\n", k)) ; + if (P [k] == EMPTY) + { + /* C (k,k) is a weak diagonal entry. Find an index j != k such + * that C (j,k) and C (k,j) are both strong, and also such + * that Degree [j] is minimized. In case of a tie, pick + * the smallest index j. C and R contain the pattern of + * strong entries only. + * + * Note that row k of R and column k of C are both sorted. */ + + DEBUGm4 (("===== Weak diagonal k = "ID"\n", k)) ; + DEBUG1 (("Column k of C:\n")) ; + for (p = Cp [k] ; p < Cp [k+1] ; p++) + { + DEBUG1 ((" "ID": deg "ID"\n", Ci [p], Degree [Ci [p]])); + } + DEBUG1 (("Row k of R (strong entries only):\n")) ; + for (p = Rp [k] ; p < Rp [k+1] ; p++) + { + DEBUG1 ((" "ID": deg "ID"\n", Ri [p], Degree [Ri [p]])); + } + + /* no (C (k,j), C (j,k)) pair exists yet */ + j_best = EMPTY ; + jdiff_best = Int_MAX ; + jdeg_best = Int_MAX ; + + /* pointers into column k (including values) */ + cp1 = Cp [k] ; + cp2 = Cp [k+1] ; + cp = cp1 ; + + /* pointers into row k (strong entries only, no values) */ + rp1 = Rp [k] ; + rp2 = Rp [k+1] ; + rp = rp1 ; + + /* while entries searched in column k and row k */ + while (TRUE) + { + + if (cp >= cp2) + { + /* no more entries in this column */ + break ; + } + + /* get C (j,k), which is strong */ + j = Ci [cp] ; + + if (rp >= rp2) + { + /* no more entries in this column */ + break ; + } + + /* get R (k,j2), which is strong */ + j2 = Ri [rp] ; + + if (j < j2) + { + /* C (j,k) is strong, but R (k,j) is not strong */ + cp++ ; + continue ; + } + + if (j2 < j) + { + /* C (k,j2) is strong, but R (j2,k) is not strong */ + rp++ ; + continue ; + } + + /* j == j2: C (j,k) is strong and R (k,j) is strong */ + + best = FALSE ; + + if (P [j] == EMPTY) + { + /* j has not yet been matched */ + jdeg = Degree [j] ; + jdiff = SCALAR_ABS (k-j) ; + + DEBUG1 (("Try candidate j "ID" deg "ID" diff "ID + "\n", j, jdeg, jdiff)) ; + + if (j_best == EMPTY) + { + /* this is the first candidate seen */ + DEBUG1 ((" first\n")) ; + best = TRUE ; + } + else + { + if (jdeg < jdeg_best) + { + /* the degree of j is best seen so far. */ + DEBUG1 ((" least degree\n")) ; + best = TRUE ; + } + else if (jdeg == jdeg_best) + { + /* degree of j and j_best are the same */ + /* tie break by nearest node number */ + if (jdiff < jdiff_best) + { + DEBUG1 ((" tie degree, closer\n")) ; + best = TRUE ; + } + else if (jdiff == jdiff_best) + { + /* |j-k| = |j_best-k|. For any given k + * and j_best there is only one other j + * than can be just as close as j_best. + * Tie break by picking the smaller of + * j and j_best */ + DEBUG1 ((" tie degree, as close\n")); + best = j < j_best ; + } + } + else + { + /* j has higher degree than best so far */ + best = FALSE ; + } + } + } + + if (best) + { + /* j is best match for k */ + /* found a strong pair, A (j,k) and A (k,j) */ + DEBUG1 ((" --- Found pair k: "ID" j: " ID + " jdeg: "ID" jdiff: "ID"\n", + k, j, jdeg, jdiff)) ; + ASSERT (jdiff != EMPTY) ; + ASSERT (jdeg != EMPTY) ; + j_best = j ; + jdeg_best = jdeg ; + jdiff_best = jdiff ; + } + + /* get the next entries in column k and row k */ + cp++ ; + rp++ ; + } + + /* save the pair (j,k), if we found one */ + if (j_best != EMPTY) + { + j = j_best ; + DEBUGm4 ((" --- best pair j: "ID" for k: "ID"\n", j, k)) ; + P [k] = j ; + P [j] = k ; + } + else + { + /* no match was found for k */ + unmatched++ ; + } + } + } + } + + /* ---------------------------------------------------------------------- */ + /* finalize the row permutation, P */ + /* ---------------------------------------------------------------------- */ + + for (k = 0 ; k < n2 ; k++) + { + if (P [k] == EMPTY) + { + P [k] = k ; + } + } + ASSERT (UMF_is_permutation (P, Rp, n2, n2)) ; + + return (unmatched) ; +} + + +/* ========================================================================== */ +/* === UMF_2by2 ============================================================= */ +/* ========================================================================== */ + +GLOBAL void UMF_2by2 +( + /* input, not modified: */ + Int n, /* A is n-by-n */ + const Int Ap [ ], /* size n+1 */ + const Int Ai [ ], /* size nz = Ap [n] */ + const double Ax [ ], /* size nz if present */ +#ifdef COMPLEX + const double Az [ ], /* size nz if present */ +#endif + double tol, /* tolerance for determining whether or not an + * entry is numerically acceptable. If tol <= 0 + * then all numerical values ignored. */ + Int scale, /* scaling to perform (none, sum, or max) */ + Int Cperm1 [ ], /* singleton permutations */ +#ifndef NDEBUG + Int Rperm1 [ ], /* not needed, since Rperm1 = Cperm1 for submatrix S */ +#endif + Int InvRperm1 [ ], /* inverse of Rperm1 */ + Int n1, /* number of singletons */ + Int nempty, /* number of empty rows/cols */ + + /* input, contents undefined on output: */ + Int Degree [ ], /* Degree [j] is the number of off-diagonal + * entries in row/column j of S+S', where + * where S = A (Cperm1 [n1..], Rperm1 [n1..]). + * Note that S is not used, nor formed. */ + + /* output: */ + Int P [ ], /* P [k] = i means original row i is kth row in S(P,:) + * where S = A (Cperm1 [n1..], Rperm1 [n1..]) */ + Int *p_nweak, + Int *p_unmatched, + + /* workspace (not defined on input or output): */ + Int Ri [ ], /* of size >= max (nz, n) */ + Int Rp [ ], /* of size n+1 */ + double Rs [ ], /* of size n if present. Rs = sum (abs (A),2) or + * max (abs (A),2), the sum or max of each row. Unused + * if scale is equal to UMFPACK_SCALE_NONE. */ + Int Head [ ], /* of size n. Head pointers for bucket sort */ + Int Next [ ], /* of size n. Next pointers for bucket sort */ + Int Ci [ ], /* size nz */ + Int Cp [ ] /* size n+1 */ +) +{ + + /* ---------------------------------------------------------------------- */ + /* local variables */ + /* ---------------------------------------------------------------------- */ + + Entry aij ; + double cmax, value, rs, ctol, dvalue ; + Int k, p, row, col, do_values, do_sum, do_max, do_scale, nweak, weak, + p1, p2, dfound, unmatched, n2, oldrow, newrow, oldcol, newcol, pp ; +#ifdef COMPLEX + Int split = SPLIT (Az) ; +#endif +#ifndef NRECIPROCAL + Int do_recip = FALSE ; +#endif + +#ifndef NDEBUG + /* UMF_debug += 99 ; */ + DEBUGm3 (("\n ==================================UMF_2by2: tol %g\n", tol)) ; + ASSERT (AMD_valid (n, n, Ap, Ai)) ; + for (k = n1 ; k < n - nempty ; k++) + { + ASSERT (Cperm1 [k] == Rperm1 [k]) ; + } +#endif + + /* ---------------------------------------------------------------------- */ + /* determine scaling options */ + /* ---------------------------------------------------------------------- */ + + /* use the values, but only if they are present */ + /* ignore the values if tol <= 0 */ + do_values = (tol > 0) && (Ax != (double *) NULL) ; + if (do_values && (Rs != (double *) NULL)) + { + do_sum = (scale == UMFPACK_SCALE_SUM) ; + do_max = (scale == UMFPACK_SCALE_MAX) ; + } + else + { + /* no scaling */ + do_sum = FALSE ; + do_max = FALSE ; + } + do_scale = do_max || do_sum ; + DEBUGm3 (("do_values "ID" do_sum "ID" do_max "ID" do_scale "ID"\n", + do_values, do_sum, do_max, do_scale)) ; + + /* ---------------------------------------------------------------------- */ + /* compute the row scaling, if requested */ + /* ---------------------------------------------------------------------- */ + + /* see also umf_kernel_init */ + + if (do_scale) + { +#ifndef NRECIPROCAL + double rsmin ; +#endif + for (row = 0 ; row < n ; row++) + { + Rs [row] = 0.0 ; + } + for (col = 0 ; col < n ; col++) + { + p2 = Ap [col+1] ; + for (p = Ap [col] ; p < p2 ; p++) + { + row = Ai [p] ; + ASSIGN (aij, Ax, Az, p, split) ; + APPROX_ABS (value, aij) ; + rs = Rs [row] ; + if (!SCALAR_IS_NAN (rs)) + { + if (SCALAR_IS_NAN (value)) + { + /* if any entry in a row is NaN, then the scale factor + * for the row is NaN. It will be set to 1 later. */ + Rs [row] = value ; + } + else if (do_max) + { + Rs [row] = MAX (rs, value) ; + } + else + { + Rs [row] += value ; + } + } + } + } +#ifndef NRECIPROCAL + rsmin = Rs [0] ; + if (SCALAR_IS_ZERO (rsmin) || SCALAR_IS_NAN (rsmin)) + { + rsmin = 1.0 ; + } +#endif + for (row = 0 ; row < n ; row++) + { + /* do not scale an empty row, or a row with a NaN */ + rs = Rs [row] ; + if (SCALAR_IS_ZERO (rs) || SCALAR_IS_NAN (rs)) + { + Rs [row] = 1.0 ; + } +#ifndef NRECIPROCAL + rsmin = MIN (rsmin, Rs [row]) ; +#endif + } + +#ifndef NRECIPROCAL + /* multiply by the reciprocal if Rs is not too small */ + do_recip = (rsmin >= RECIPROCAL_TOLERANCE) ; + if (do_recip) + { + /* invert the scale factors */ + for (row = 0 ; row < n ; row++) + { + Rs [row] = 1.0 / Rs [row] ; + } + } +#endif + } + + /* ---------------------------------------------------------------------- */ + /* compute the max in each column and find diagonal */ + /* ---------------------------------------------------------------------- */ + + nweak = 0 ; + +#ifndef NDEBUG + for (k = 0 ; k < n ; k++) + { + ASSERT (Rperm1 [k] >= 0 && Rperm1 [k] < n) ; + ASSERT (InvRperm1 [Rperm1 [k]] == k) ; + } +#endif + + n2 = n - n1 - nempty ; + + /* use Ri to count the number of strong entries in each row */ + for (row = 0 ; row < n2 ; row++) + { + Ri [row] = 0 ; + } + + pp = 0 ; + ctol = 0 ; + dvalue = 1 ; + + /* construct C = pruned submatrix, strong values only, column form */ + + for (k = n1 ; k < n - nempty ; k++) + { + oldcol = Cperm1 [k] ; + newcol = k - n1 ; + Next [newcol] = EMPTY ; + DEBUGm1 (("Column "ID" newcol "ID" oldcol "ID"\n", k, newcol, oldcol)) ; + + Cp [newcol] = pp ; + + dfound = FALSE ; + p1 = Ap [oldcol] ; + p2 = Ap [oldcol+1] ; + if (do_values) + { + cmax = 0 ; + dvalue = 0 ; + + if (!do_scale) + { + /* no scaling */ + for (p = p1 ; p < p2 ; p++) + { + oldrow = Ai [p] ; + ASSERT (oldrow >= 0 && oldrow < n) ; + newrow = InvRperm1 [oldrow] - n1 ; + ASSERT (newrow >= -n1 && newrow < n2) ; + if (newrow < 0) continue ; + ASSIGN (aij, Ax, Az, p, split) ; + APPROX_ABS (value, aij) ; + /* if either cmax or value is NaN, define cmax as NaN */ + if (!SCALAR_IS_NAN (cmax)) + { + if (SCALAR_IS_NAN (value)) + { + cmax = value ; + } + else + { + cmax = MAX (cmax, value) ; + } + } + if (oldrow == oldcol) + { + /* we found the diagonal entry in this column */ + dvalue = value ; + dfound = TRUE ; + ASSERT (newrow == newcol) ; + } + } + } +#ifndef NRECIPROCAL + else if (do_recip) + { + /* multiply by the reciprocal */ + for (p = p1 ; p < p2 ; p++) + { + oldrow = Ai [p] ; + ASSERT (oldrow >= 0 && oldrow < n) ; + newrow = InvRperm1 [oldrow] - n1 ; + ASSERT (newrow >= -n1 && newrow < n2) ; + if (newrow < 0) continue ; + ASSIGN (aij, Ax, Az, p, split) ; + APPROX_ABS (value, aij) ; + value *= Rs [oldrow] ; + /* if either cmax or value is NaN, define cmax as NaN */ + if (!SCALAR_IS_NAN (cmax)) + { + if (SCALAR_IS_NAN (value)) + { + cmax = value ; + } + else + { + cmax = MAX (cmax, value) ; + } + } + if (oldrow == oldcol) + { + /* we found the diagonal entry in this column */ + dvalue = value ; + dfound = TRUE ; + ASSERT (newrow == newcol) ; + } + } + } +#endif + else + { + /* divide instead */ + for (p = p1 ; p < p2 ; p++) + { + oldrow = Ai [p] ; + ASSERT (oldrow >= 0 && oldrow < n) ; + newrow = InvRperm1 [oldrow] - n1 ; + ASSERT (newrow >= -n1 && newrow < n2) ; + if (newrow < 0) continue ; + ASSIGN (aij, Ax, Az, p, split) ; + APPROX_ABS (value, aij) ; + value /= Rs [oldrow] ; + /* if either cmax or value is NaN, define cmax as NaN */ + if (!SCALAR_IS_NAN (cmax)) + { + if (SCALAR_IS_NAN (value)) + { + cmax = value ; + } + else + { + cmax = MAX (cmax, value) ; + } + } + if (oldrow == oldcol) + { + /* we found the diagonal entry in this column */ + dvalue = value ; + dfound = TRUE ; + ASSERT (newrow == newcol) ; + } + } + } + + ctol = tol * cmax ; + DEBUGm1 ((" cmax col "ID" %g ctol %g\n", oldcol, cmax, ctol)) ; + } + else + { + for (p = p1 ; p < p2 ; p++) + { + oldrow = Ai [p] ; + ASSERT (oldrow >= 0 && oldrow < n) ; + newrow = InvRperm1 [oldrow] - n1 ; + ASSERT (newrow >= -n1 && newrow < n2) ; + if (newrow < 0) continue ; + Ci [pp++] = newrow ; + if (oldrow == oldcol) + { + /* we found the diagonal entry in this column */ + ASSERT (newrow == newcol) ; + dfound = TRUE ; + } + /* count the entries in each column */ + Ri [newrow]++ ; + } + } + + /* ------------------------------------------------------------------ */ + /* flag the weak diagonals */ + /* ------------------------------------------------------------------ */ + + if (!dfound) + { + /* no diagonal entry present */ + weak = TRUE ; + } + else + { + /* diagonal entry is present, check its value */ + weak = (do_values) ? WEAK (dvalue, ctol) : FALSE ; + } + if (weak) + { + /* flag this column as weak */ + DEBUG0 (("Weak!\n")) ; + Next [newcol] = IS_WEAK ; + nweak++ ; + } + + /* ------------------------------------------------------------------ */ + /* count entries in each row that are not numerically weak */ + /* ------------------------------------------------------------------ */ + + if (do_values) + { + if (!do_scale) + { + /* no scaling */ + for (p = p1 ; p < p2 ; p++) + { + oldrow = Ai [p] ; + newrow = InvRperm1 [oldrow] - n1 ; + if (newrow < 0) continue ; + ASSIGN (aij, Ax, Az, p, split) ; + APPROX_ABS (value, aij) ; + weak = WEAK (value, ctol) ; + if (!weak) + { + DEBUG0 ((" strong: row "ID": %g\n", oldrow, value)) ; + Ci [pp++] = newrow ; + Ri [newrow]++ ; + } + } + } +#ifndef NRECIPROCAL + else if (do_recip) + { + /* multiply by the reciprocal */ + for (p = p1 ; p < p2 ; p++) + { + oldrow = Ai [p] ; + newrow = InvRperm1 [oldrow] - n1 ; + if (newrow < 0) continue ; + ASSIGN (aij, Ax, Az, p, split) ; + APPROX_ABS (value, aij) ; + value *= Rs [oldrow] ; + weak = WEAK (value, ctol) ; + if (!weak) + { + DEBUG0 ((" strong: row "ID": %g\n", oldrow, value)) ; + Ci [pp++] = newrow ; + Ri [newrow]++ ; + } + } + } +#endif + else + { + /* divide instead */ + for (p = p1 ; p < p2 ; p++) + { + oldrow = Ai [p] ; + newrow = InvRperm1 [oldrow] - n1 ; + if (newrow < 0) continue ; + ASSIGN (aij, Ax, Az, p, split) ; + APPROX_ABS (value, aij) ; + value /= Rs [oldrow] ; + weak = WEAK (value, ctol) ; + if (!weak) + { + DEBUG0 ((" strong: row "ID": %g\n", oldrow, value)) ; + Ci [pp++] = newrow ; + Ri [newrow]++ ; + } + } + } + } + } + Cp [n2] = pp ; + ASSERT (AMD_valid (n2, n2, Cp, Ci)) ; + + if (nweak == 0) + { + /* nothing to do, quick return */ + DEBUGm2 (("\n =============================UMF_2by2: quick return\n")) ; + for (k = 0 ; k < n ; k++) + { + P [k] = k ; + } + *p_nweak = 0 ; + *p_unmatched = 0 ; + return ; + } + +#ifndef NDEBUG + for (k = 0 ; k < n2 ; k++) + { + P [k] = EMPTY ; + } + for (k = 0 ; k < n2 ; k++) + { + ASSERT (Degree [k] >= 0 && Degree [k] < n2) ; + } +#endif + + /* ---------------------------------------------------------------------- */ + /* find the 2-by-2 permutation */ + /* ---------------------------------------------------------------------- */ + + /* The matrix S is now mapped to the index range 0 to n2-1. We have + * S = A (Rperm [n1 .. n-nempty-1], Cperm [n1 .. n-nempty-1]), and then + * C = pattern of strong entries in S. A weak diagonal k in S is marked + * with Next [k] = IS_WEAK. */ + + unmatched = two_by_two (n2, Cp, Ci, Degree, Next, Ri, P, Rp, Head) ; + + /* ---------------------------------------------------------------------- */ + + *p_nweak = nweak ; + *p_unmatched = unmatched ; + +#ifndef NDEBUG + DEBUGm4 (("UMF_2by2: weak "ID" unmatched "ID"\n", nweak, unmatched)) ; + for (row = 0 ; row < n ; row++) + { + DEBUGm2 (("P ["ID"] = "ID"\n", row, P [row])) ; + } + DEBUGm2 (("\n =============================UMF_2by2: done\n\n")) ; +#endif +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_2by2.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_2by2.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,36 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL void UMF_2by2 +( + Int n, + const Int Ap [ ], + const Int Ai [ ], + const double Ax [ ], +#ifdef COMPLEX + const double Az [ ], +#endif + double tol, + Int scale, + Int Cperm1 [ ], +#ifndef NDEBUG + Int Rperm1 [ ], +#endif + Int InvRperm [ ], + Int n1, + Int nempty, + Int Degree [ ], + Int P [ ], + Int *p_nweak, + Int *p_nmatched, + Int Ri [ ], + Int Rp [ ], + double Rs [ ], + Int Head [ ], + Int Next [ ], + Int Si [ ], + Int Sp [ ] +) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_analyze.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_analyze.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,704 @@ +/* ========================================================================== */ +/* === UMF_analyze ========================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + Symbolic LL' factorization of A'*A, to get upper bounds on the size of + L and U for LU = PAQ, and to determine the frontal matrices and + (supernodal) column elimination tree. No fill-reducing column pre-ordering + is used. + + Returns TRUE if successful, FALSE if out of memory. UMF_analyze can only + run out of memory if anzmax (which is Ap [n_row]) is too small. + + Uses workspace of size O(nonzeros in A). On input, the matrix A is + stored in row-form at the tail end of Ai. It is destroyed on output. + The rows of A must be sorted by increasing first column index. + The matrix is assumed to be valid. + + Empty rows and columns have already been removed. + +*/ + +#include "umf_internal.h" +#include "umf_apply_order.h" +#include "umf_fsize.h" + +/* ========================================================================== */ + +GLOBAL Int UMF_analyze +( + Int n_row, /* A is n_row-by-n_col */ + Int n_col, + Int Ai [ ], /* Ai [Ap [0]..Ap[n_row]-1]: column indices */ + /* destroyed on output. Note that this is NOT the */ + /* user's Ai that was passed to UMFPACK_*symbolic */ + /* size of Ai, Ap [n_row] = anzmax >= anz + n_col */ + /* Ap [0] must be => n_col. The space to the */ + /* front of Ai is used as workspace. */ + + Int Ap [ ], /* of size MAX (n_row, n_col) + 1 */ + /* Ap [0..n_row]: row pointers */ + /* Row i is in Ai [Ap [i] ... Ap [i+1]-1] */ + + /* rows must have smallest col index first, or be */ + /* in sorted form. Used as workspace of size n_col */ + /* and destroyed. */ + + /* Note that this is NOT the */ + /* user's Ap that was passed to UMFPACK_*symbolic */ + + Int Up [ ], /* workspace of size n_col, and output column perm. + * for column etree postorder. */ + + Int fixQ, + + /* temporary workspaces: */ + Int W [ ], /* W [0..n_col-1] */ + Int Link [ ], /* Link [0..n_col-1] */ + + /* output: information about each frontal matrix: */ + Int Front_ncols [ ], /* size n_col */ + Int Front_nrows [ ], /* of size n_col */ + Int Front_npivcol [ ], /* of size n_col */ + Int Front_parent [ ], /* of size n_col */ + Int *nfr_out, + + Int *p_ncompactions /* number of compactions in UMF_analyze */ +) +{ + /* ====================================================================== */ + /* ==== local variables ================================================= */ + /* ====================================================================== */ + + Int j, j3, col, k, row, parent, j2, pdest, p, p2, thickness, npivots, nfr, + i, *Winv, kk, npiv, jnext, krow, knext, pfirst, jlast, ncompactions, + *Front_stack, *Front_order, *Front_child, *Front_sibling, + Wflag, npivcol, fallrows, fallcols, fpiv, frows, fcols, *Front_size ; + + nfr = 0 ; + DEBUG0 (("UMF_analyze: anzmax "ID" anrow "ID" ancol "ID"\n", + Ap [n_row], n_row, n_col)) ; + + /* ====================================================================== */ + /* ==== initializations ================================================= */ + /* ====================================================================== */ + +#pragma ivdep + for (j = 0 ; j < n_col ; j++) + { + Link [j] = EMPTY ; + W [j] = EMPTY ; + Up [j] = EMPTY ; + + /* Frontal matrix data structure: */ + Front_npivcol [j] = 0 ; /* number of pivot columns */ + Front_nrows [j] = 0 ; /* number of rows, incl. pivot rows */ + Front_ncols [j] = 0 ; /* number of cols, incl. pivot cols */ + Front_parent [j] = EMPTY ; /* parent front */ + /* Note that only non-pivotal columns are stored in a front (a "row" */ + /* of U) during elimination. */ + } + + /* the rows must be sorted by increasing min col */ + krow = 0 ; + pfirst = Ap [0] ; + jlast = EMPTY ; + jnext = EMPTY ; + Wflag = 0 ; + + /* this test requires the size of Ai to be >= n_col + nz */ + ASSERT (pfirst >= n_col) ; /* Ai must be large enough */ + + /* pdest points to the first free space in Ai */ + pdest = 0 ; + ncompactions = 0 ; + + /* ====================================================================== */ + /* === compute symbolic LL' factorization (unsorted) ==================== */ + /* ====================================================================== */ + + for (j = 0 ; j < n_col ; j = jnext) + { + DEBUG1 (("\n\n============Front "ID" starting. nfr = "ID"\n", j, nfr)) ; + + /* ================================================================== */ + /* === garbage collection =========================================== */ + /* ================================================================== */ + + if (pdest + (n_col-j) > pfirst) + { + /* we might run out ... compact the rows of U */ + +#ifndef NDEBUG + DEBUG0 (("UMF_analyze COMPACTION, j="ID" pfirst="ID"\n", + j, pfirst)) ; + for (row = 0 ; row < j ; row++) + { + if (Up [row] != EMPTY) + { + /* this is a live row of U */ + DEBUG1 (("Live row: "ID" cols: ", row)) ; + p = Up [row] ; + ASSERT (Front_ncols [row] > Front_npivcol [row]) ; + p2 = p + (Front_ncols [row] - Front_npivcol [row]) ; + for ( ; p < p2 ; p++) + { + DEBUG1 ((ID, Ai [p])) ; + ASSERT (p < pfirst) ; + ASSERT (Ai [p] > row && Ai [p] < n_col) ; + } + DEBUG1 (("\n")) ; + } + } + DEBUG1 (("\nStarting to compact:\n")) ; +#endif + + pdest = 0 ; + ncompactions++ ; + for (row = 0 ; row < j ; row++) + { + if (Up [row] != EMPTY) + { + /* this is a live row of U */ + DEBUG1 (("Live row: "ID" cols: ", row)) ; + ASSERT (row < n_col) ; + p = Up [row] ; + ASSERT (Front_ncols [row] > Front_npivcol [row]) ; + p2 = p + (Front_ncols [row] - Front_npivcol [row]) ; + Up [row] = pdest ; + for ( ; p < p2 ; p++) + { + DEBUG1 ((ID, Ai [p])) ; + ASSERT (p < pfirst) ; + ASSERT (Ai [p] > row && Ai [p] < n_col) ; + Ai [pdest++] = Ai [p] ; + ASSERT (pdest <= pfirst) ; + } + DEBUG1 (("\n")) ; + } + } + +#ifndef NDEBUG + DEBUG1 (("\nAFTER COMPACTION, j="ID" pfirst="ID"\n", j, pfirst)) ; + for (row = 0 ; row < j ; row++) + { + if (Up [row] != EMPTY) + { + /* this is a live row of U */ + DEBUG1 (("Live row: "ID" cols: ", row)) ; + p = Up [row] ; + ASSERT (Front_ncols [row] > Front_npivcol [row]) ; + p2 = p + (Front_ncols [row] - Front_npivcol [row]) ; + for ( ; p < p2 ; p++) + { + DEBUG1 ((ID, Ai [p])) ; + ASSERT (p < pfirst) ; + ASSERT (Ai [p] > row && Ai [p] < n_col) ; + } + DEBUG1 (("\n")) ; + } + } +#endif + + } + + if (pdest + (n_col-j) > pfirst) + { + /* :: out of memory in umf_analyze :: */ + /* it can't happen, if pfirst >= n_col */ + return (FALSE) ; /* internal error! */ + } + + /* ------------------------------------------------------------------ */ + /* is the last front a child of this one? */ + /* ------------------------------------------------------------------ */ + + if (jlast != EMPTY && Link [j] == jlast) + { + /* yes - create row j by appending to jlast */ + DEBUG1 (("GOT:last front is child of this one: j "ID" jlast "ID"\n", + j, jlast)) ; + ASSERT (jlast >= 0 && jlast < j) ; + + Up [j] = Up [jlast] ; + Up [jlast] = EMPTY ; + + /* find the parent, delete column j, and update W */ + parent = n_col ; + for (p = Up [j] ; p < pdest ; ) + { + j3 = Ai [p] ; + DEBUG1 (("Initial row of U: col "ID" ", j3)) ; + ASSERT (j3 >= 0 && j3 < n_col) ; + DEBUG1 (("W: "ID" \n", W [j3])) ; + ASSERT (W [j3] == Wflag) ; + if (j == j3) + { + DEBUG1 (("Found column j at p = "ID"\n", p)) ; + Ai [p] = Ai [--pdest] ; + } + else + { + if (j3 < parent) + { + parent = j3 ; + } + p++ ; + } + } + + /* delete jlast from the link list of j */ + Link [j] = Link [jlast] ; + + ASSERT (Front_nrows [jlast] > Front_npivcol [jlast]) ; + thickness = (Front_nrows [jlast] - Front_npivcol [jlast]) ; + DEBUG1 (("initial thickness: "ID"\n", thickness)) ; + + } + else + { + Up [j] = pdest ; + parent = n_col ; + /* thickness: number of (nonpivotal) rows in frontal matrix j */ + thickness = 0 ; + Wflag = j ; + } + + /* ================================================================== */ + /* === compute row j of A*A' ======================================== */ + /* ================================================================== */ + + /* ------------------------------------------------------------------ */ + /* flag the diagonal entry in row U, but do not add to pattern */ + /* ------------------------------------------------------------------ */ + + ASSERT (pdest <= pfirst) ; + W [j] = Wflag ; + + DEBUG1 (("\nComputing row "ID" of A'*A\n", j)) ; + DEBUG2 ((" col: "ID" (diagonal)\n", j)) ; + + /* ------------------------------------------------------------------ */ + /* find the rows the contribute to this column j */ + /* ------------------------------------------------------------------ */ + + jnext = n_col ; + for (knext = krow ; knext < n_row ; knext++) + { + ASSERT (Ap [knext] < Ap [knext+1]) ; + ASSERT (Ap [knext] >= pfirst && Ap [knext] <= Ap [n_row]) ; + jnext = Ai [Ap [knext]] ; + ASSERT (jnext >= j) ; + if (jnext != j) + { + break ; + } + } + + /* rows krow ... knext-1 all have first column index of j */ + /* (or are empty) */ + + /* row knext has first column index of jnext */ + /* if knext = n_row, then jnext is n_col */ + if (knext == n_row) + { + jnext = n_col ; + } + + ASSERT (jnext > j) ; + ASSERT (jnext <= n_col) ; + + /* ------------------------------------------------------------------ */ + /* for each nonzero A (k,j) in column j of A do: */ + /* ------------------------------------------------------------------ */ + + for (k = krow ; k < knext ; k++) + { + p = Ap [k] ; + p2 = Ap [k+1] ; + ASSERT (p < p2) ; + + /* merge row k of A into W */ + DEBUG2 ((" ---- A row "ID" ", k)) ; + ASSERT (k >= 0 && k < n_row) ; + ASSERT (Ai [p] == j) ; + DEBUG2 ((" p "ID" p2 "ID"\n cols:", p, p2)) ; + ASSERT (p >= pfirst && p < Ap [n_row]) ; + ASSERT (p2 > pfirst && p2 <= Ap [n_row]) ; + for ( ; p < p2 ; p++) + { + /* add to pattern if seen for the first time */ + col = Ai [p] ; + ASSERT (col >= j && col < n_col) ; + DEBUG3 ((" "ID, col)) ; + if (W [col] != Wflag) + { + Ai [pdest++] = col ; + ASSERT (pdest <= pfirst) ; + /* flag this column has having been seen for row j */ + W [col] = Wflag ; + if (col < parent) + { + parent = col ; + } + } + } + DEBUG2 (("\n")) ; + thickness++ ; + } + +#ifndef NDEBUG + DEBUG3 (("\nRow "ID" of A'A:\n", j)) ; + for (p = Up [j] ; p < pdest ; p++) + { + DEBUG3 ((" "ID, Ai [p])) ; + } + DEBUG3 (("\n")) ; +#endif + + /* ------------------------------------------------------------------ */ + /* delete rows up to but not including knext */ + /* ------------------------------------------------------------------ */ + + krow = knext ; + pfirst = Ap [knext] ; + + /* we can now use Ai [0..pfirst-1] as workspace for rows of U */ + + /* ================================================================== */ + /* === compute jth row of U ========================================= */ + /* ================================================================== */ + + /* for each nonzero U (k,j) in column j of U (1:j-1,:) do */ + for (k = Link [j] ; k != EMPTY ; k = Link [k]) + { + /* merge row k of U into W */ + DEBUG2 ((" ---- U row "ID, k)) ; + ASSERT (k >= 0 && k < n_col) ; + ASSERT (Up [k] != EMPTY) ; + p = Up [k] ; + ASSERT (Front_ncols [k] > Front_npivcol [k]) ; + p2 = p + (Front_ncols [k] - Front_npivcol [k]) ; + DEBUG2 ((" p "ID" p2 "ID"\n cols:", p, p2)) ; + ASSERT (p <= pfirst) ; + ASSERT (p2 <= pfirst) ; + for ( ; p < p2 ; p++) + { + /* add to pattern if seen for the first time */ + col = Ai [p] ; + ASSERT (col >= j && col < n_col) ; + DEBUG3 ((" "ID, col)) ; + if (W [col] != Wflag) + { + Ai [pdest++] = col ; + ASSERT (pdest <= pfirst) ; + /* flag this col has having been seen for row j */ + W [col] = Wflag ; + if (col < parent) + { + parent = col ; + } + } + } + DEBUG2 (("\n")) ; + + /* mark the row k as deleted */ + Up [k] = EMPTY ; + + ASSERT (Front_nrows [k] > Front_npivcol [k]) ; + thickness += (Front_nrows [k] - Front_npivcol [k]) ; + ASSERT (Front_parent [k] == j) ; + } + +#ifndef NDEBUG + DEBUG3 (("\nRow "ID" of U prior to supercolumn detection:\n", j)); + for (p = Up [j] ; p < pdest ; p++) + { + DEBUG3 ((" "ID, Ai [p])) ; + } + DEBUG3 (("\n")) ; + DEBUG1 (("thickness, prior to supercol detect: "ID"\n", thickness)) ; +#endif + + /* ================================================================== */ + /* === quicky mass elimination ====================================== */ + /* ================================================================== */ + + /* this code detects some supernodes, but it might miss */ + /* some because the elimination tree (created on the fly) */ + /* is not yet post-ordered, and because the pattern of A'*A */ + /* is also computed on the fly. */ + + /* j2 is incremented because the pivot columns are not stored */ + + for (j2 = j+1 ; j2 < jnext ; j2++) + { + ASSERT (j2 >= 0 && j2 < n_col) ; + if (W [j2] != Wflag || Link [j2] != EMPTY) + { + break ; + } + } + + /* the loop above terminated with j2 at the first non-supernode */ + DEBUG1 (("jnext = "ID"\n", jnext)) ; + ASSERT (j2 <= jnext) ; + jnext = j2 ; + j2-- ; + DEBUG1 (("j2 = "ID"\n", j2)) ; + ASSERT (j2 < n_col) ; + + npivots = j2-j+1 ; + DEBUG1 (("Number of pivot columns: "ID"\n", npivots)) ; + + /* rows j:j2 have the same nonzero pattern, except for columns j:j2-1 */ + + if (j2 > j) + { + /* supernode detected, prune the pattern of new row j */ + ASSERT (parent == j+1) ; + ASSERT (j2 < n_col) ; + DEBUG1 (("Supernode detected, j "ID" to j2 "ID"\n", j, j2)) ; + + parent = n_col ; + p2 = pdest ; + pdest = Up [j] ; + for (p = Up [j] ; p < p2 ; p++) + { + col = Ai [p] ; + ASSERT (col >= 0 && col < n_col) ; + ASSERT (W [col] == Wflag) ; + if (col > j2) + { + /* keep this col in the pattern of the new row j */ + Ai [pdest++] = col ; + if (col < parent) + { + parent = col ; + } + } + } + } + + DEBUG1 (("Parent ["ID"] = "ID"\n", j, parent)) ; + ASSERT (parent > j2) ; + + if (parent == n_col) + { + /* this front has no parent - it is the root of a subtree */ + parent = EMPTY ; + } + +#ifndef NDEBUG + DEBUG3 (("\nFinal row "ID" of U after supercolumn detection:\n", j)) ; + for (p = Up [j] ; p < pdest ; p++) + { + ASSERT (Ai [p] >= 0 && Ai [p] < n_col) ; + DEBUG3 ((" "ID" ("ID")", Ai [p], W [Ai [p]])) ; + ASSERT (W [Ai [p]] == Wflag) ; + } + DEBUG3 (("\n")) ; +#endif + + /* ================================================================== */ + /* === frontal matrix =============================================== */ + /* ================================================================== */ + + /* front has Front_npivcol [j] pivot columns */ + /* entire front is Front_nrows [j] -by- Front_ncols [j] */ + /* j is first column in the front */ + + npivcol = npivots ; + fallrows = thickness ; + fallcols = npivots + pdest - Up [j] ; + + /* number of pivots in the front (rows and columns) */ + fpiv = MIN (npivcol, fallrows) ; + + /* size of contribution block */ + frows = fallrows - fpiv ; + fcols = fallcols - fpiv ; + + if (frows == 0 || fcols == 0) + { + /* front has no contribution block and thus needs no parent */ + DEBUG1 (("Frontal matrix evaporation\n")) ; + Up [j] = EMPTY ; + parent = EMPTY ; + } + + Front_npivcol [j] = npivots ; + Front_nrows [j] = fallrows ; + Front_ncols [j] = fallcols ; + Front_parent [j] = parent ; + ASSERT (npivots > 0) ; + + /* Front_parent [j] is the first column of the parent frontal matrix */ + + DEBUG1 (("\n\n==== Front "ID", nfr "ID" pivot columns "ID":"ID + " all front: "ID"-by-"ID" Parent: "ID"\n", j, nfr, j,j+npivots-1, + Front_nrows [j], Front_ncols [j], Front_parent [j])) ; + nfr++ ; + + /* ================================================================== */ + /* === prepare this row for its parent ============================== */ + /* ================================================================== */ + + if (parent != EMPTY) + { + Link [j] = Link [parent] ; + Link [parent] = j ; + } + + ASSERT (jnext > j) ; + + jlast = j ; + } + + /* ====================================================================== */ + /* === postorder the fronts ============================================= */ + /* ====================================================================== */ + + *nfr_out = nfr ; + + Front_order = W ; /* use W for Front_order [ */ + + if (fixQ) + { + /* do not postorder the fronts if Q is fixed */ + DEBUG1 (("\nNo postorder (Q is fixed)\n")) ; + k = 0 ; + /* Pragma added May 14, 2003. The Intel compiler icl 6.0 (an old + * version) incorrectly vectorizes this loop. */ +#pragma novector + for (j = 0 ; j < n_col ; j++) + { + if (Front_npivcol [j] > 0) + { + Front_order [j] = k++ ; + DEBUG1 (("Front order of j: "ID" is:"ID"\n", j, + Front_order [j])) ; + } + else + { + Front_order [j] = EMPTY ; + } + } + } + else + { + + /* use Ap for Front_child and use Link for Front_sibling [ */ + Front_child = Ap ; + Front_sibling = Link ; + + /* use Ai for Front_stack, size of Ai is >= 2*n_col */ + Front_stack = Ai ; + Front_size = Front_stack + n_col ; + + UMF_fsize (n_col, Front_size, Front_nrows, Front_ncols, + Front_parent, Front_npivcol) ; + + AMD_postorder (n_col, Front_parent, Front_npivcol, Front_size, + Front_order, Front_child, Front_sibling, Front_stack) ; + + /* done with Front_child, Front_sibling, Front_size, and Front_stack ]*/ + + /* ------------------------------------------------------------------ */ + /* construct the column permutation (return in Up) */ + /* ------------------------------------------------------------------ */ + + /* Front_order [i] = k means that front i is kth front in the new order. + * i is in the range 0 to n_col-1, and k is in the range 0 to nfr-1 */ + + /* Use Ai as workspace for Winv [ */ + Winv = Ai ; + for (k = 0 ; k < nfr ; k++) + { + Winv [k] = EMPTY ; + } + + /* compute the inverse of Front_order, so that Winv [k] = i */ + /* if Front_order [i] = k */ + + DEBUG1 (("\n\nComputing output column permutation:\n")) ; + for (i = 0 ; i < n_col ; i++) + { + k = Front_order [i] ; + if (k != EMPTY) + { + DEBUG1 (("Front "ID" new order: "ID"\n", i, k)) ; + ASSERT (k >= 0 && k < nfr) ; + ASSERT (Winv [k] == EMPTY) ; + Winv [k] = i ; + } + } + + /* Use Up as output permutation */ + kk = 0 ; + for (k = 0 ; k < nfr ; k++) + { + i = Winv [k] ; + DEBUG1 (("Old Front "ID" New Front "ID" npivots "ID" nrows "ID + " ncols "ID"\n", + i, k, Front_npivcol [i], Front_nrows [i], Front_ncols [i])) ; + ASSERT (i >= 0 && i < n_col) ; + ASSERT (Front_npivcol [i] > 0) ; + for (npiv = 0 ; npiv < Front_npivcol [i] ; npiv++) + { + Up [kk] = i + npiv ; + DEBUG1 ((" Cperm ["ID"] = "ID"\n", kk, Up [kk])) ; + kk++ ; + } + } + ASSERT (kk == n_col) ; + + /* Winv no longer needed ] */ + } + + /* ---------------------------------------------------------------------- */ + /* apply the postorder traversal to renumber the frontal matrices */ + /* (or pack them in same order, if fixQ) */ + /* ---------------------------------------------------------------------- */ + + /* use Ai as workspace */ + + UMF_apply_order (Front_npivcol, Front_order, Ai, n_col, nfr) ; + UMF_apply_order (Front_nrows, Front_order, Ai, n_col, nfr) ; + UMF_apply_order (Front_ncols, Front_order, Ai, n_col, nfr) ; + UMF_apply_order (Front_parent, Front_order, Ai, n_col, nfr) ; + + /* fix the parent to refer to the new numbering */ + for (i = 0 ; i < nfr ; i++) + { + parent = Front_parent [i] ; + if (parent != EMPTY) + { + ASSERT (parent >= 0 && parent < n_col) ; + ASSERT (Front_order [parent] >= 0 && Front_order [parent] < nfr) ; + Front_parent [i] = Front_order [parent] ; + } + } + + /* Front_order longer needed ] */ + +#ifndef NDEBUG + DEBUG1 (("\nFinal frontal matrices:\n")) ; + for (i = 0 ; i < nfr ; i++) + { + DEBUG1 (("Final front "ID": npiv "ID" nrows "ID" ncols "ID" parent " + ID"\n", i, Front_npivcol [i], Front_nrows [i], + Front_ncols [i], Front_parent [i])) ; + } +#endif + + *p_ncompactions = ncompactions ; + return (TRUE) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_analyze.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_analyze.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,23 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL Int UMF_analyze +( + Int n_row, + Int n_col, + Int Ai [ ], + Int Ap [ ], + Int Up [ ], + Int fixQ, + Int Front_ncols [ ], + Int W [ ], + Int Link [ ], + Int Front_nrows [ ], + Int Front_npivcol [ ], + Int Front_parent [ ], + Int *nfr_out, + Int *p_ncompactions +) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_apply_order.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_apply_order.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,43 @@ +/* ========================================================================== */ +/* === UMF_apply_order ====================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + Apply post-ordering of supernodal elimination tree. +*/ + +#include "umf_internal.h" + +GLOBAL void UMF_apply_order +( + Int Front [ ], /* of size nn on input, size nfr on output */ + const Int Order [ ], /* Order [i] = k, i in the range 0..nn-1, + * and k in the range 0..nfr-1, means that node + * i is the kth node in the postordered tree. */ + Int Temp [ ], /* workspace of size nfr */ + Int nn, /* nodes are numbered in the range 0..nn-1 */ + Int nfr /* the number of nodes actually in use */ +) +{ + Int i, k ; + for (i = 0 ; i < nn ; i++) + { + k = Order [i] ; + ASSERT (k >= EMPTY && k < nfr) ; + if (k != EMPTY) + { + Temp [k] = Front [i] ; + } + } + + for (k = 0 ; k < nfr ; k++) + { + Front [k] = Temp [k] ; + } +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_apply_order.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_apply_order.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,14 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL void UMF_apply_order +( + Int Front [ ], + const Int Order [ ], + Int Temp [ ], + Int n_col, + Int nfr +) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_assemble.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_assemble.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,1215 @@ +/* ========================================================================== */ +/* === UMF_assemble ========================================================= */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* Degree update and numerical assembly. This is compiled twice (with and + * without FIXQ) for each real/complex int/long version, for a total of 8 + * versions.*/ + +#include "umf_internal.h" +#include "umf_mem_free_tail_block.h" + +/* ========================================================================== */ +/* === row_assemble ========================================================= */ +/* ========================================================================== */ + +PRIVATE void row_assemble +( + Int row, + NumericType *Numeric, + WorkType *Work +) +{ + + Entry *S, *Fcblock, *Frow ; + Int tpi, e, *E, *Fcpos, *Frpos, *Row_degree, *Row_tuples, *Row_tlen, rdeg0, + f, nrows, ncols, *Rows, *Cols, col, ncolsleft, j ; + Tuple *tp, *tp1, *tp2, *tpend ; + Unit *Memory, *p ; + Element *ep ; + +#ifndef FIXQ + Int *Col_degree ; + Col_degree = Numeric->Cperm ; +#endif + + Row_tuples = Numeric->Uip ; + tpi = Row_tuples [row] ; + if (!tpi) return ; + + Memory = Numeric->Memory ; + E = Work->E ; + Fcpos = Work->Fcpos ; + Frpos = Work->Frpos ; + Row_degree = Numeric->Rperm ; + Row_tlen = Numeric->Uilen ; + E = Work->E ; + Memory = Numeric->Memory ; + rdeg0 = Work->rdeg0 ; + Fcblock = Work->Fcblock ; + +#ifndef NDEBUG + DEBUG6 (("SCAN2-row: "ID"\n", row)) ; + UMF_dump_rowcol (0, Numeric, Work, row, FALSE) ; +#endif + + ASSERT (NON_PIVOTAL_ROW (row)) ; + + tp = (Tuple *) (Memory + tpi) ; + tp1 = tp ; + tp2 = tp ; + tpend = tp + Row_tlen [row] ; + for ( ; tp < tpend ; tp++) + { + e = tp->e ; + ASSERT (e > 0 && e <= Work->nel) ; + if (!E [e]) continue ; /* element already deallocated */ + f = tp->f ; + p = Memory + E [e] ; + ep = (Element *) p ; + p += UNITS (Element, 1) ; + Cols = (Int *) p ; + Rows = Cols + ep->ncols ; + if (Rows [f] == EMPTY) continue ; /* row already assembled */ + ASSERT (row == Rows [f] && row >= 0 && row < Work->n_row) ; + + if (ep->rdeg == rdeg0) + { + /* ------------------------------------------------------ */ + /* this is an old Lson - assemble just one row */ + /* ------------------------------------------------------ */ + + /* flag the row as assembled from the Lson */ + Rows [f] = EMPTY ; + + nrows = ep->nrows ; + ncols = ep->ncols ; + + p += UNITS (Int, ncols + nrows) ; + S = ((Entry *) p) + f ; + + DEBUG6 (("Old LSON: "ID"\n", e)) ; +#ifndef NDEBUG + UMF_dump_element (Numeric, Work, e, FALSE) ; +#endif + + ncolsleft = ep->ncolsleft ; + + Frow = Fcblock + Frpos [row] ; + DEBUG6 (("LSON found (in scan2-row): "ID"\n", e)) ; + + Row_degree [row] -= ncolsleft ; + + if (ncols == ncolsleft) + { + /* -------------------------------------------------- */ + /* no columns assembled out this Lson yet */ + /* -------------------------------------------------- */ + +#pragma ivdep + for (j = 0 ; j < ncols ; j++) + { + col = Cols [j] ; + ASSERT (col >= 0 && col < Work->n_col) ; +#ifndef FIXQ + Col_degree [col] -- ; +#endif + /* Frow [Fcpos [col]] += *S ; */ + ASSEMBLE (Frow [Fcpos [col]], *S) ; + S += nrows ; + } + + } + else + { + /* -------------------------------------------------- */ + /* some columns have been assembled out of this Lson */ + /* -------------------------------------------------- */ + +#pragma ivdep + for (j = 0 ; j < ncols ; j++) + { + col = Cols [j] ; + if (col >= 0) + { + ASSERT (col < Work->n_col) ; +#ifndef FIXQ + Col_degree [col] -- ; +#endif + /* Frow [Fcpos [col]] += *S ; */ + ASSEMBLE (Frow [Fcpos [col]], *S) ; + } + S += nrows ; + } + + } + ep->nrowsleft-- ; + ASSERT (ep->nrowsleft > 0) ; + } + else + { + *tp2++ = *tp ; /* leave the tuple in the list */ + } + } + Row_tlen [row] = tp2 - tp1 ; + +#ifndef NDEBUG + DEBUG7 (("row assembled in scan2-row: "ID"\n", row)) ; + UMF_dump_rowcol (0, Numeric, Work, row, FALSE) ; + DEBUG7 (("Current frontal matrix: (scan 1b)\n")) ; + UMF_dump_current_front (Numeric, Work, TRUE) ; +#endif +} + +/* ========================================================================== */ +/* === col_assemble ========================================================= */ +/* ========================================================================== */ + +PRIVATE void col_assemble +( + Int col, + NumericType *Numeric, + WorkType *Work +) +{ + + Entry *S, *Fcblock, *Fcol ; + Int tpi, e, *E, *Fcpos, *Frpos, *Row_degree, *Col_tuples, *Col_tlen, cdeg0, + f, nrows, ncols, *Rows, *Cols, row, nrowsleft, i ; + Tuple *tp, *tp1, *tp2, *tpend ; + Unit *Memory, *p ; + Element *ep ; + +#if !defined (FIXQ) || !defined (NDEBUG) + Int *Col_degree ; + Col_degree = Numeric->Cperm ; +#endif + + Col_tuples = Numeric->Lip ; + tpi = Col_tuples [col] ; + if (!tpi) return ; + + Memory = Numeric->Memory ; + E = Work->E ; + Fcpos = Work->Fcpos ; + Frpos = Work->Frpos ; + Row_degree = Numeric->Rperm ; + Col_tlen = Numeric->Lilen ; + E = Work->E ; + Memory = Numeric->Memory ; + cdeg0 = Work->cdeg0 ; + Fcblock = Work->Fcblock ; + + DEBUG6 (("SCAN2-col: "ID"\n", col)) ; +#ifndef NDEBUG + UMF_dump_rowcol (1, Numeric, Work, col, FALSE) ; +#endif + + ASSERT (NON_PIVOTAL_COL (col)) ; + tp = (Tuple *) (Memory + tpi) ; + tp1 = tp ; + tp2 = tp ; + tpend = tp + Col_tlen [col] ; + for ( ; tp < tpend ; tp++) + { + e = tp->e ; + ASSERT (e > 0 && e <= Work->nel) ; + if (!E [e]) continue ; /* element already deallocated */ + f = tp->f ; + p = Memory + E [e] ; + ep = (Element *) p ; + p += UNITS (Element, 1) ; + Cols = (Int *) p ; + + if (Cols [f] == EMPTY) continue ; /* col already assembled */ + ASSERT (col == Cols [f] && col >= 0 && col < Work->n_col) ; + + if (ep->cdeg == cdeg0) + { + /* ------------------------------------------------------ */ + /* this is an old Uson - assemble just one col */ + /* ------------------------------------------------------ */ + + /* flag the col as assembled from the Uson */ + Cols [f] = EMPTY ; + + nrows = ep->nrows ; + ncols = ep->ncols ; + Rows = Cols + ncols ; + p += UNITS (Int, ncols + nrows) ; + S = ((Entry *) p) + f * nrows ; + + DEBUG6 (("Old USON: "ID"\n", e)) ; +#ifndef NDEBUG + UMF_dump_element (Numeric, Work, e, FALSE) ; +#endif + + nrowsleft = ep->nrowsleft ; + + Fcol = Fcblock + Fcpos [col] ; + DEBUG6 (("USON found (in scan2-col): "ID"\n", e)) ; +#ifndef FIXQ + Col_degree [col] -= nrowsleft ; +#endif + if (nrows == nrowsleft) + { + /* -------------------------------------------------- */ + /* no rows assembled out of this Uson yet */ + /* -------------------------------------------------- */ + +#pragma ivdep + for (i = 0 ; i < nrows ; i++) + { + row = Rows [i] ; + ASSERT (row >= 0 && row < Work->n_row) ; + Row_degree [row]-- ; + /* Fcol [Frpos [row]] += S [i] ; */ + ASSEMBLE (Fcol [Frpos [row]], S [i]) ; + } + } + else + { + /* -------------------------------------------------- */ + /* some rows have been assembled out of this Uson */ + /* -------------------------------------------------- */ + +#pragma ivdep + for (i = 0 ; i < nrows ; i++) + { + row = Rows [i] ; + if (row >= 0) + { + ASSERT (row < Work->n_row) ; + Row_degree [row]-- ; + /* Fcol [Frpos [row]] += S [i] ; */ + ASSEMBLE (Fcol [Frpos [row]], S [i]) ; + } + } + } + ep->ncolsleft-- ; + ASSERT (ep->ncolsleft > 0) ; + } + else + { + *tp2++ = *tp ; /* leave the tuple in the list */ + } + } + Col_tlen [col] = tp2 - tp1 ; + +#ifndef NDEBUG + DEBUG7 (("Column assembled in scan2-col: "ID"\n", col)) ; + UMF_dump_rowcol (1, Numeric, Work, col, FALSE) ; + DEBUG7 (("Current frontal matrix: after scan2-col\n")) ; + UMF_dump_current_front (Numeric, Work, TRUE) ; +#endif + +} + + +/* ========================================================================== */ +/* === UMF_assemble / UMF_assemble_fixq ===================================== */ +/* ========================================================================== */ + +#ifndef FIXQ +GLOBAL void UMF_assemble +#else +GLOBAL void UMF_assemble_fixq +#endif +( + NumericType *Numeric, + WorkType *Work +) +{ + /* ---------------------------------------------------------------------- */ + /* local variables */ + /* ---------------------------------------------------------------------- */ + + Int e, i, row, col, i2, nrows, ncols, f, tpi, extcdeg, extrdeg, rdeg0, + cdeg0, son_list, next, nrows_to_assemble, + ncols_to_assemble, ngetrows, j, j2, + nrowsleft, /* number of rows remaining in S */ + ncolsleft, /* number of columns remaining in S */ + prior_Lson, prior_Uson, *E, *Cols, *Rows, *Wm, *Woo, + *Row_tuples, *Row_degree, *Row_tlen, + *Col_tuples, *Col_tlen ; + Unit *Memory, *p ; + Element *ep ; + Tuple *tp, *tp1, *tp2, *tpend ; + Entry + *S, /* a pointer into the contribution block of a son */ + *Fcblock, /* current contribution block */ + *Fcol ; /* a column of FC */ + Int *Frpos, + *Fcpos, + fnrows, /* number of rows in contribution block in F */ + fncols ; /* number of columns in contribution block in F */ + +#if !defined (FIXQ) || !defined (NDEBUG) + Int *Col_degree ; +#endif + +#ifndef NDEBUG + Int n_row, n_col ; + n_row = Work->n_row ; + n_col = Work->n_col ; + DEBUG3 (("::Assemble SCANS 1-4\n")) ; + UMF_dump_current_front (Numeric, Work, TRUE) ; +#endif + +#if !defined (FIXQ) || !defined (NDEBUG) + Col_degree = Numeric->Cperm ; /* not updated if FIXQ is true */ +#endif + + /* ---------------------------------------------------------------------- */ + /* get parameters */ + /* ---------------------------------------------------------------------- */ + + fncols = Work->fncols ; + fnrows = Work->fnrows ; + Fcpos = Work->Fcpos ; + Frpos = Work->Frpos ; + Row_degree = Numeric->Rperm ; + Row_tuples = Numeric->Uip ; + Row_tlen = Numeric->Uilen ; + Col_tuples = Numeric->Lip ; + Col_tlen = Numeric->Lilen ; + E = Work->E ; + Memory = Numeric->Memory ; + Wm = Work->Wm ; + Woo = Work->Woo ; + rdeg0 = Work->rdeg0 ; + cdeg0 = Work->cdeg0 ; + +#ifndef NDEBUG + DEBUG6 (("============================================\n")) ; + DEBUG6 (("Degree update, assembly.\n")) ; + DEBUG6 (("pivot row pattern: fncols="ID"\n", fncols)) ; + for (j = 0 ; j < fncols ; j++) + { + col = Work->Fcols [j] ; + DEBUG6 ((ID" ", col)) ; + ASSERT (Fcpos [col] == j * Work->fnr_curr) ; + ASSERT (NON_PIVOTAL_COL (col)) ; + } + ASSERT (Fcpos [Work->pivcol] >= 0) ; + DEBUG6 (("pivcol: "ID" pos "ID" fnr_curr "ID" fncols "ID"\n", + Work->pivcol, Fcpos [Work->pivcol], Work->fnr_curr, fncols)) ; + ASSERT (Fcpos [Work->pivcol] < fncols * Work->fnr_curr) ; + DEBUG6 (("\npivot col pattern: fnrows="ID"\n", fnrows)) ; + for (i = 0 ; i < fnrows ; i++) + { + row = Work->Frows [i] ; + DEBUG6 ((ID" ", row)) ; + ASSERT (Frpos [row] == i) ; + ASSERT (NON_PIVOTAL_ROW (row)) ; + } + DEBUG6 (("\n")) ; + ASSERT (Frpos [Work->pivrow] >= 0) ; + ASSERT (Frpos [Work->pivrow] < fnrows) ; + ASSERT (Work->Flublock == (Entry *) (Numeric->Memory + E [0])) ; + ASSERT (Work->Fcblock == Work->Flublock + Work->nb * + (Work->nb + Work->fnr_curr + Work->fnc_curr)) ; +#endif + + Fcblock = Work->Fcblock ; + + /* ---------------------------------------------------------------------- */ + /* determine the largest actual frontal matrix size (for Info only) */ + /* ---------------------------------------------------------------------- */ + + ASSERT (fnrows == Work->fnrows_new + 1) ; + ASSERT (fncols == Work->fncols_new + 1) ; + + Numeric->maxnrows = MAX (Numeric->maxnrows, fnrows) ; + Numeric->maxncols = MAX (Numeric->maxncols, fncols) ; + + /* this is safe from integer overflow, since the current frontal matrix + * is already allocated. */ + Numeric->maxfrsize = MAX (Numeric->maxfrsize, fnrows * fncols) ; + + /* ---------------------------------------------------------------------- */ + /* assemble from prior elements into the current frontal matrix */ + /* ---------------------------------------------------------------------- */ + + DEBUG2 (("New assemble start [prior_element:"ID"\n", Work->prior_element)) ; + + /* Currently no rows or columns are marked. No elements are scanned, */ + /* that is, (ep->next == EMPTY) is true for all elements */ + + son_list = 0 ; /* start creating son_list [ */ + + /* ---------------------------------------------------------------------- */ + /* determine if most recent element is Lson or Uson of current front */ + /* ---------------------------------------------------------------------- */ + + if (!Work->do_extend) + { + prior_Uson = ( Work->pivcol_in_front && !Work->pivrow_in_front) ; + prior_Lson = (!Work->pivcol_in_front && Work->pivrow_in_front) ; + if (prior_Uson || prior_Lson) + { + e = Work->prior_element ; + if (e != EMPTY) + { + ASSERT (E [e]) ; + p = Memory + E [e] ; + ep = (Element *) p ; + ep->next = son_list ; + son_list = e ; +#ifndef NDEBUG + DEBUG2 (("e "ID" is Prior son "ID" "ID"\n", + e, prior_Uson, prior_Lson)) ; + UMF_dump_element (Numeric, Work, e, FALSE) ; +#endif + ASSERT (E [e]) ; + } + } + } + Work->prior_element = EMPTY ; + + /* ---------------------------------------------------------------------- */ + /* SCAN1-row: scan the element lists of each new row in the pivot col */ + /* and compute the external column degree for each frontal */ + /* ---------------------------------------------------------------------- */ + + for (i2 = Work->fscan_row ; i2 < fnrows ; i2++) + { + /* Get a row */ + row = Work->NewRows [i2] ; + if (row < 0) row = FLIP (row) ; + ASSERT (row >= 0 && row < n_row) ; + + DEBUG6 (("SCAN1-row: "ID"\n", row)) ; +#ifndef NDEBUG + UMF_dump_rowcol (0, Numeric, Work, row, FALSE) ; +#endif + + ASSERT (NON_PIVOTAL_ROW (row)) ; + tpi = Row_tuples [row] ; + if (!tpi) continue ; + tp = (Tuple *) (Memory + tpi) ; + tp1 = tp ; + tp2 = tp ; + tpend = tp + Row_tlen [row] ; + for ( ; tp < tpend ; tp++) + { + e = tp->e ; + ASSERT (e > 0 && e <= Work->nel) ; + if (!E [e]) continue ; /* element already deallocated */ + f = tp->f ; + p = Memory + E [e] ; + ep = (Element *) p ; + p += UNITS (Element, 1) ; + Rows = ((Int *) p) + ep->ncols ; + if (Rows [f] == EMPTY) continue ; /* row already assembled */ + ASSERT (row == Rows [f]) ; + + if (ep->cdeg < cdeg0) + { + /* first time seen in scan1-row */ + ep->cdeg = ep->nrowsleft + cdeg0 ; + DEBUG6 (("e "ID" First seen: cdeg: "ID" ", e, ep->cdeg-cdeg0)) ; + ASSERT (ep->ncolsleft > 0 && ep->nrowsleft > 0) ; + } + + ep->cdeg-- ; /* decrement external column degree */ + DEBUG6 (("e "ID" New ext col deg: "ID"\n", e, ep->cdeg - cdeg0)) ; + + /* this element is not yet in the new son list */ + if (ep->cdeg == cdeg0 && ep->next == EMPTY) + { + /* A new LUson or Uson has been found */ + ep->next = son_list ; + son_list = e ; + } + + ASSERT (ep->cdeg >= cdeg0) ; + *tp2++ = *tp ; /* leave the tuple in the list */ + } + Row_tlen [row] = tp2 - tp1 ; + } + + /* ---------------------------------------------------------------------- */ + /* SCAN1-col: scan the element lists of each new col in the pivot row */ + /* and compute the external row degree for each frontal */ + /* ---------------------------------------------------------------------- */ + + for (j2 = Work->fscan_col ; j2 < fncols ; j2++) + { + /* Get a column */ + col = Work->NewCols [j2] ; + if (col < 0) col = FLIP (col) ; + ASSERT (col >= 0 && col < n_col) ; + + DEBUG6 (("SCAN 1-col: "ID"\n", col)) ; +#ifndef NDEBUG + UMF_dump_rowcol (1, Numeric, Work, col, FALSE) ; +#endif + + ASSERT (NON_PIVOTAL_COL (col)) ; + tpi = Col_tuples [col] ; + if (!tpi) continue ; + tp = (Tuple *) (Memory + tpi) ; + tp1 = tp ; + tp2 = tp ; + tpend = tp + Col_tlen [col] ; + for ( ; tp < tpend ; tp++) + { + e = tp->e ; + ASSERT (e > 0 && e <= Work->nel) ; + if (!E [e]) continue ; /* element already deallocated */ + f = tp->f ; + p = Memory + E [e] ; + ep = (Element *) p ; + p += UNITS (Element, 1) ; + Cols = (Int *) p ; + if (Cols [f] == EMPTY) continue ; /* column already assembled */ + ASSERT (col == Cols [f]) ; + + if (ep->rdeg < rdeg0) + { + /* first time seen in scan1-col */ + ep->rdeg = ep->ncolsleft + rdeg0 ; + DEBUG6 (("e "ID" First seen: rdeg: "ID" ", e, ep->rdeg-rdeg0)) ; + ASSERT (ep->ncolsleft > 0 && ep->nrowsleft > 0) ; + } + + ep->rdeg-- ; /* decrement external row degree */ + DEBUG6 (("e "ID" New ext row degree: "ID"\n", e, ep->rdeg-rdeg0)) ; + + if (ep->rdeg == rdeg0 && ep->next == EMPTY) + { + /* A new LUson or Lson has been found */ + ep->next = son_list ; + son_list = e ; + } + + ASSERT (ep->rdeg >= rdeg0) ; + *tp2++ = *tp ; /* leave the tuple in the list */ + } + Col_tlen [col] = tp2 - tp1 ; + } + + /* ---------------------------------------------------------------------- */ + /* assemble new sons via full scans */ + /* ---------------------------------------------------------------------- */ + + next = EMPTY ; + + for (e = son_list ; e > 0 ; e = next) + { + ASSERT (e > 0 && e <= Work->nel && E [e]) ; + p = Memory + E [e] ; + DEBUG2 (("New son: "ID"\n", e)) ; +#ifndef NDEBUG + UMF_dump_element (Numeric, Work, e, FALSE) ; +#endif + GET_ELEMENT (ep, p, Cols, Rows, ncols, nrows, S) ; + nrowsleft = ep->nrowsleft ; + ncolsleft = ep->ncolsleft ; + next = ep->next ; + ep->next = EMPTY ; + + extrdeg = (ep->rdeg < rdeg0) ? ncolsleft : (ep->rdeg - rdeg0) ; + extcdeg = (ep->cdeg < cdeg0) ? nrowsleft : (ep->cdeg - cdeg0) ; + ncols_to_assemble = ncolsleft - extrdeg ; + nrows_to_assemble = nrowsleft - extcdeg ; + DEBUG2 (("extrdeg "ID" extcdeg "ID"\n", extrdeg, extcdeg)) ; + + if (extrdeg == 0 && extcdeg == 0) + { + + /* -------------------------------------------------------------- */ + /* this is an LUson - assemble an entire contribution block */ + /* -------------------------------------------------------------- */ + + DEBUG6 (("LUson found: "ID"\n", e)) ; + + if (nrows == nrowsleft) + { + /* ---------------------------------------------------------- */ + /* no rows assembled out of this LUson yet */ + /* ---------------------------------------------------------- */ + + /* compute the compressed column offset vector*/ + /* [ use Wm [0..nrows-1] for offsets */ +#pragma ivdep + for (i = 0 ; i < nrows ; i++) + { + row = Rows [i] ; + Row_degree [row] -= ncolsleft ; + Wm [i] = Frpos [row] ; + } + + if (ncols == ncolsleft) + { + /* ------------------------------------------------------ */ + /* no rows or cols assembled out of LUson yet */ + /* ------------------------------------------------------ */ + + for (j = 0 ; j < ncols ; j++) + { + col = Cols [j] ; +#ifndef FIXQ + Col_degree [col] -= nrowsleft ; +#endif + Fcol = Fcblock + Fcpos [col] ; +#pragma ivdep + for (i = 0 ; i < nrows ; i++) + { + /* Fcol [Wm [i]] += S [i] ; */ + ASSEMBLE (Fcol [Wm [i]], S [i]) ; + } + S += nrows ; + } + + + } + else + { + /* ------------------------------------------------------ */ + /* only cols have been assembled out of LUson */ + /* ------------------------------------------------------ */ + + for (j = 0 ; j < ncols ; j++) + { + col = Cols [j] ; + if (col >= 0) + { +#ifndef FIXQ + Col_degree [col] -= nrowsleft ; +#endif + Fcol = Fcblock + Fcpos [col] ; +#pragma ivdep + for (i = 0 ; i < nrows ; i++) + { + /* Fcol [Wm [i]] += S [i] ; */ + ASSEMBLE (Fcol [Wm [i]], S [i]) ; + } + } + S += nrows ; + } + + } + /* ] done using Wm [0..nrows-1] for offsets */ + } + else + { + /* ---------------------------------------------------------- */ + /* some rows have been assembled out of this LUson */ + /* ---------------------------------------------------------- */ + + /* compute the compressed column offset vector*/ + /* [ use Woo,Wm [0..nrowsleft-1] for offsets */ + ngetrows = 0 ; + for (i = 0 ; i < nrows ; i++) + { + row = Rows [i] ; + if (row >= 0) + { + Row_degree [row] -= ncolsleft ; + Woo [ngetrows] = i ; + Wm [ngetrows++] = Frpos [row] ; + } + } + ASSERT (ngetrows == nrowsleft) ; + + if (ncols == ncolsleft) + { + /* ------------------------------------------------------ */ + /* only rows have been assembled out of this LUson */ + /* ------------------------------------------------------ */ + + for (j = 0 ; j < ncols ; j++) + { + col = Cols [j] ; +#ifndef FIXQ + Col_degree [col] -= nrowsleft ; +#endif + Fcol = Fcblock + Fcpos [col] ; +#pragma ivdep + for (i = 0 ; i < nrowsleft ; i++) + { + /* Fcol [Wm [i]] += S [Woo [i]] ; */ + ASSEMBLE (Fcol [Wm [i]], S [Woo [i]]) ; + } + S += nrows ; + } + + } + else + { + /* ------------------------------------------------------ */ + /* both rows and columns have been assembled out of LUson */ + /* ------------------------------------------------------ */ + + for (j = 0 ; j < ncols ; j++) + { + col = Cols [j] ; + if (col >= 0) + { +#ifndef FIXQ + Col_degree [col] -= nrowsleft ; +#endif + Fcol = Fcblock + Fcpos [col] ; +#pragma ivdep + for (i = 0 ; i < nrowsleft ; i++) + { + /* Fcol [Wm [i]] += S [Woo [i]] ; */ + ASSEMBLE (Fcol [Wm [i]], S [Woo [i]]) ; + } + } + S += nrows ; + } + + } + /* ] done using Woo,Wm [0..nrowsleft-1] */ + } + + /* deallocate the element: remove from ordered list */ + UMF_mem_free_tail_block (Numeric, E [e]) ; + E [e] = 0 ; + + } + else if (extcdeg == 0) + { + + /* -------------------------------------------------------------- */ + /* this is a Uson - assemble all possible columns */ + /* -------------------------------------------------------------- */ + + DEBUG6 (("New USON: "ID"\n", e)) ; + ASSERT (extrdeg > 0) ; + + DEBUG6 (("New uson "ID" cols to do "ID"\n", e, ncols_to_assemble)) ; + + if (ncols_to_assemble > 0) + { + + Int skip = FALSE ; + if (ncols_to_assemble * 16 < ncols && nrows == 1) + { + /* this is a tall and thin frontal matrix consisting of + * only one column (most likely an original column). Do + * not assemble it. It cannot be the pivot column, since + * the pivot column element would be an LU son, not an Lson, + * of the current frontal matrix. */ + ASSERT (nrowsleft == 1) ; + ASSERT (Rows [0] >= 0 && Rows [0] < Work->n_row) ; + skip = TRUE ; + Work->any_skip = TRUE ; + } + + if (!skip) + { + + if (nrows == nrowsleft) + { + /* -------------------------------------------------- */ + /* no rows have been assembled out of this Uson yet */ + /* -------------------------------------------------- */ + + /* compute the compressed column offset vector */ + /* [ use Wm [0..nrows-1] for offsets */ +#pragma ivdep + for (i = 0 ; i < nrows ; i++) + { + row = Rows [i] ; + ASSERT (row >= 0 && row < n_row) ; + Row_degree [row] -= ncols_to_assemble ; + Wm [i] = Frpos [row] ; + } + + for (j = 0 ; j < ncols ; j++) + { + col = Cols [j] ; + if ((col >= 0) && (Fcpos [col] >= 0)) + { +#ifndef FIXQ + Col_degree [col] -= nrowsleft ; +#endif + Fcol = Fcblock + Fcpos [col] ; +#pragma ivdep + for (i = 0 ; i < nrows ; i++) + { + /* Fcol [Wm [i]] += S [i] ; */ + ASSEMBLE (Fcol [Wm [i]], S [i]) ; + } + /* flag the column as assembled from Uson */ + Cols [j] = EMPTY ; + } + S += nrows ; + } + + + /* ] done using Wm [0..nrows-1] for offsets */ + } + else + { + /* -------------------------------------------------- */ + /* some rows have been assembled out of this Uson */ + /* -------------------------------------------------- */ + + /* compute the compressed column offset vector*/ + /* [ use Woo,Wm [0..nrows-1] for offsets */ + ngetrows = 0 ; + for (i = 0 ; i < nrows ; i++) + { + row = Rows [i] ; + if (row >= 0) + { + Row_degree [row] -= ncols_to_assemble ; + ASSERT (row < n_row && Frpos [row] >= 0) ; + Woo [ngetrows] = i ; + Wm [ngetrows++] = Frpos [row] ; + } + } + ASSERT (ngetrows == nrowsleft) ; + + for (j = 0 ; j < ncols ; j++) + { + col = Cols [j] ; + if ((col >= 0) && (Fcpos [col] >= 0)) + { +#ifndef FIXQ + Col_degree [col] -= nrowsleft ; +#endif + Fcol = Fcblock + Fcpos [col] ; +#pragma ivdep + for (i = 0 ; i < nrowsleft ; i++) + { + /* Fcol [Wm [i]] += S [Woo [i]] ; */ + ASSEMBLE (Fcol [Wm [i]], S [Woo [i]]) ; + } + /* flag the column as assembled from Uson */ + Cols [j] = EMPTY ; + } + S += nrows ; + } + + /* ] done using Woo,Wm */ + } + ep->ncolsleft = extrdeg ; + } + } + + } + else + { + + /* -------------------------------------------------------------- */ + /* this is an Lson - assemble all possible rows */ + /* -------------------------------------------------------------- */ + + DEBUG6 (("New LSON: "ID"\n", e)) ; + ASSERT (extrdeg == 0 && extcdeg > 0) ; + + DEBUG6 (("New lson "ID" rows to do "ID"\n", e, nrows_to_assemble)) ; + + if (nrows_to_assemble > 0) + { + + Int skip = FALSE ; + if (nrows_to_assemble * 16 < nrows && ncols == 1) + { + /* this is a tall and thin frontal matrix consisting of + * only one column (most likely an original column). Do + * not assemble it. It cannot be the pivot column, since + * the pivot column element would be an LU son, not an Lson, + * of the current frontal matrix. */ + ASSERT (ncolsleft == 1) ; + ASSERT (Cols [0] >= 0 && Cols [0] < Work->n_col) ; + Work->any_skip = TRUE ; + skip = TRUE ; + } + + if (!skip) + { + + /* compute the compressed column offset vector */ + /* [ use Woo,Wm [0..nrows-1] for offsets */ + ngetrows = 0 ; + for (i = 0 ; i < nrows ; i++) + { + row = Rows [i] ; + if ((row >= 0) && (Frpos [row] >= 0)) + { + ASSERT (row < n_row) ; + Row_degree [row] -= ncolsleft ; + Woo [ngetrows] = i ; + Wm [ngetrows++] = Frpos [row] ; + /* flag the row as assembled from the Lson */ + Rows [i] = EMPTY ; + } + } + ASSERT (nrowsleft - ngetrows == extcdeg) ; + ASSERT (ngetrows == nrows_to_assemble) ; + + if (ncols == ncolsleft) + { + /* -------------------------------------------------- */ + /* no columns assembled out this Lson yet */ + /* -------------------------------------------------- */ + + for (j = 0 ; j < ncols ; j++) + { + col = Cols [j] ; + ASSERT (col >= 0 && col < n_col) ; +#ifndef FIXQ + Col_degree [col] -= nrows_to_assemble ; +#endif + Fcol = Fcblock + Fcpos [col] ; +#pragma ivdep + for (i = 0 ; i < nrows_to_assemble ; i++) + { + /* Fcol [Wm [i]] += S [Woo [i]] ; */ + ASSEMBLE (Fcol [Wm [i]], S [Woo [i]]) ; + } + S += nrows ; + } + + + } + else + { + /* -------------------------------------------------- */ + /* some columns have been assembled out of this Lson */ + /* -------------------------------------------------- */ + + for (j = 0 ; j < ncols ; j++) + { + col = Cols [j] ; + ASSERT (col < n_col) ; + if (col >= 0) + { +#ifndef FIXQ + Col_degree [col] -= nrows_to_assemble ; +#endif + Fcol = Fcblock + Fcpos [col] ; +#pragma ivdep + for (i = 0 ; i < nrows_to_assemble ; i++) + { + /* Fcol [Wm [i]] += S [Woo [i]] ; */ + ASSEMBLE (Fcol [Wm [i]], S [Woo [i]]) ; + } + } + S += nrows ; + } + + } + + /* ] done using Woo,Wm */ + + ep->nrowsleft = extcdeg ; + } + } + } + } + + /* Note that garbage collection, and build tuples */ + /* both destroy the son list. */ + + /* ] son_list now empty */ + + /* ---------------------------------------------------------------------- */ + /* If frontal matrix extended, assemble old L/Usons from new rows/cols */ + /* ---------------------------------------------------------------------- */ + + /* ---------------------------------------------------------------------- */ + /* SCAN2-row: assemble rows of old Lsons from the new rows */ + /* ---------------------------------------------------------------------- */ + +#ifndef NDEBUG + DEBUG7 (("Current frontal matrix: (prior to scan2-row)\n")) ; + UMF_dump_current_front (Numeric, Work, TRUE) ; +#endif + + /* rescan the pivot row */ + if (Work->any_skip) + { + row_assemble (Work->pivrow, Numeric, Work) ; + } + + if (Work->do_scan2row) + { + for (i2 = Work->fscan_row ; i2 < fnrows ; i2++) + { + /* Get a row */ + row = Work->NewRows [i2] ; + if (row < 0) row = FLIP (row) ; + ASSERT (row >= 0 && row < n_row) ; + if (!(row == Work->pivrow && Work->any_skip)) + { + /* assemble it */ + row_assemble (row, Numeric, Work) ; + } + } + } + + /* ---------------------------------------------------------------------- */ + /* SCAN2-col: assemble columns of old Usons from the new columns */ + /* ---------------------------------------------------------------------- */ + +#ifndef NDEBUG + DEBUG7 (("Current frontal matrix: (prior to scan2-col)\n")) ; + UMF_dump_current_front (Numeric, Work, TRUE) ; +#endif + + /* rescan the pivot col */ + if (Work->any_skip) + { + col_assemble (Work->pivcol, Numeric, Work) ; + } + + if (Work->do_scan2col) + { + + for (j2 = Work->fscan_col ; j2 < fncols ; j2++) + { + /* Get a column */ + col = Work->NewCols [j2] ; + if (col < 0) col = FLIP (col) ; + ASSERT (col >= 0 && col < n_col) ; + if (!(col == Work->pivcol && Work->any_skip)) + { + /* assemble it */ + col_assemble (col, Numeric, Work) ; + } + } + } + + /* ---------------------------------------------------------------------- */ + /* done. the remainder of this routine is used only when in debug mode */ + /* ---------------------------------------------------------------------- */ + +#ifndef NDEBUG + + /* ---------------------------------------------------------------------- */ + /* when debugging: make sure the assembly did everything that it could */ + /* ---------------------------------------------------------------------- */ + + DEBUG3 (("::Assemble done\n")) ; + + for (i2 = 0 ; i2 < fnrows ; i2++) + { + /* Get a row */ + row = Work->Frows [i2] ; + ASSERT (row >= 0 && row < n_row) ; + + DEBUG6 (("DEBUG SCAN 1: "ID"\n", row)) ; + UMF_dump_rowcol (0, Numeric, Work, row, TRUE) ; + + ASSERT (NON_PIVOTAL_ROW (row)) ; + tpi = Row_tuples [row] ; + if (!tpi) continue ; + tp = (Tuple *) (Memory + tpi) ; + tpend = tp + Row_tlen [row] ; + for ( ; tp < tpend ; tp++) + { + e = tp->e ; + ASSERT (e > 0 && e <= Work->nel) ; + if (!E [e]) continue ; /* element already deallocated */ + f = tp->f ; + p = Memory + E [e] ; + ep = (Element *) p ; + p += UNITS (Element, 1) ; + Cols = (Int *) p ; + Rows = ((Int *) p) + ep->ncols ; + if (Rows [f] == EMPTY) continue ; /* row already assembled */ + ASSERT (row == Rows [f]) ; + extrdeg = (ep->rdeg < rdeg0) ? ep->ncolsleft : (ep->rdeg - rdeg0) ; + extcdeg = (ep->cdeg < cdeg0) ? ep->nrowsleft : (ep->cdeg - cdeg0) ; + DEBUG6 (( + "e "ID" After assembly ext row deg: "ID" ext col degree "ID"\n", + e, extrdeg, extcdeg)) ; + + if (Work->any_skip) + { + /* no Lsons in any row, except for very tall and thin ones */ + ASSERT (extrdeg >= 0) ; + if (extrdeg == 0) + { + /* this is an unassemble Lson */ + ASSERT (ep->ncols == 1) ; + ASSERT (ep->ncolsleft == 1) ; + col = Cols [0] ; + ASSERT (col != Work->pivcol) ; + } + } + else + { + /* no Lsons in any row */ + ASSERT (extrdeg > 0) ; + /* Uson external row degree is = number of cols left */ + ASSERT (IMPLIES (extcdeg == 0, extrdeg == ep->ncolsleft)) ; + } + } + } + + /* ---------------------------------------------------------------------- */ + + for (j2 = 0 ; j2 < fncols ; j2++) + { + /* Get a column */ + col = Work->Fcols [j2] ; + ASSERT (col >= 0 && col < n_col) ; + + DEBUG6 (("DEBUG SCAN 2: "ID"\n", col)) ; +#ifndef FIXQ + UMF_dump_rowcol (1, Numeric, Work, col, TRUE) ; +#else + UMF_dump_rowcol (1, Numeric, Work, col, FALSE) ; +#endif + + ASSERT (NON_PIVOTAL_COL (col)) ; + tpi = Col_tuples [col] ; + if (!tpi) continue ; + tp = (Tuple *) (Memory + tpi) ; + tpend = tp + Col_tlen [col] ; + for ( ; tp < tpend ; tp++) + { + e = tp->e ; + ASSERT (e > 0 && e <= Work->nel) ; + if (!E [e]) continue ; /* element already deallocated */ + f = tp->f ; + p = Memory + E [e] ; + ep = (Element *) p ; + p += UNITS (Element, 1) ; + Cols = (Int *) p ; + Rows = ((Int *) p) + ep->ncols ; + if (Cols [f] == EMPTY) continue ; /* column already assembled */ + ASSERT (col == Cols [f]) ; + extrdeg = (ep->rdeg < rdeg0) ? ep->ncolsleft : (ep->rdeg - rdeg0) ; + extcdeg = (ep->cdeg < cdeg0) ? ep->nrowsleft : (ep->cdeg - cdeg0) ; + DEBUG6 (("e "ID" After assembly ext col deg: "ID"\n", e, extcdeg)) ; + + if (Work->any_skip) + { + /* no Usons in any column, except for very tall and thin ones */ + ASSERT (extcdeg >= 0) ; + if (extcdeg == 0) + { + /* this is an unassemble Uson */ + ASSERT (ep->nrows == 1) ; + ASSERT (ep->nrowsleft == 1) ; + row = Rows [0] ; + ASSERT (row != Work->pivrow) ; + } + } + else + { + /* no Usons in any column */ + ASSERT (extcdeg > 0) ; + /* Lson external column degree is = number of rows left */ + ASSERT (IMPLIES (extrdeg == 0, extcdeg == ep->nrowsleft)) ; + } + } + } +#endif /* NDEBUG */ +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_assemble.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_assemble.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,17 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL void UMF_assemble +( + NumericType *Numeric, + WorkType *Work +) ; + +GLOBAL void UMF_assemble_fixq +( + NumericType *Numeric, + WorkType *Work +) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_blas3_update.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_blas3_update.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,164 @@ +/* ========================================================================== */ +/* === UMF_blas3_update ===================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +#include "umf_internal.h" + +GLOBAL void UMF_blas3_update +( + WorkType *Work +) +{ + /* ---------------------------------------------------------------------- */ + /* local variables */ + /* ---------------------------------------------------------------------- */ + + Entry *L, *U, *C, *LU ; + Int k, m, n, d, nb, dc ; + + DEBUG5 (("In UMF_blas3_update "ID" "ID" "ID"\n", + Work->fnpiv, Work->fnrows, Work->fncols)) ; + + k = Work->fnpiv ; + if (k == 0) + { + /* no work to do */ + return ; + } + + m = Work->fnrows ; + n = Work->fncols ; + + d = Work->fnr_curr ; + dc = Work->fnc_curr ; + nb = Work->nb ; + ASSERT (d >= 0 && (d % 2) == 1) ; + C = Work->Fcblock ; /* ldc is fnr_curr */ + L = Work->Flblock ; /* ldl is fnr_curr */ + U = Work->Fublock ; /* ldu is fnc_curr, stored by rows */ + LU = Work->Flublock ; /* nb-by-nb */ + +#ifndef NDEBUG + DEBUG5 (("DO RANK-NB UPDATE of frontal:\n")) ; + DEBUG5 (("DGEMM : "ID" "ID" "ID"\n", k, m, n)) ; + DEBUG7 (("C block: ")) ; UMF_dump_dense (C, d, m, n) ; + DEBUG7 (("A block: ")) ; UMF_dump_dense (L, d, m, k) ; + DEBUG7 (("B' block: ")) ; UMF_dump_dense (U, dc, n, k) ; + DEBUG7 (("LU block: ")) ; UMF_dump_dense (LU, nb, k, k) ; +#endif + + if (k == 1) + { + +#ifdef USE_NO_BLAS + + /* no BLAS available - use plain C code instead */ + Int i, j ; + + /* rank-1 outer product to update the C block */ + for (j = 0 ; j < n ; j++) + { + Entry u_j = U [j] ; + if (IS_NONZERO (u_j)) + { + Entry *c_ij, *l_is ; + c_ij = & C [j*d] ; + l_is = & L [0] ; +#pragma ivdep + for (i = 0 ; i < m ; i++) + { + /* C [i+j*d]-= L [i] * U [j] */ + MULT_SUB (*c_ij, *l_is, u_j) ; + c_ij++ ; + l_is++ ; + } + } + } + +#else + BLAS_GER (m, n, L, U, C, d) ; + +#endif /* USE_NO_BLAS */ + + } + else + { + +#ifdef USE_NO_BLAS + + /* no BLAS available - use plain C code instead */ + Int i, j, s ; + + /* triangular solve to update the U block */ + for (s = 0 ; s < k ; s++) + { + for (i = s+1 ; i < k ; i++) + { + Entry l_is = LU [i+s*nb] ; + if (IS_NONZERO (l_is)) + { + Entry *u_ij, *u_sj ; + u_ij = & U [i*dc] ; + u_sj = & U [s*dc] ; +#pragma ivdep + for (j = 0 ; j < n ; j++) + { + /* U [i*dc+j] -= LU [i+s*nb] * U [s*dc+j] ; */ + MULT_SUB (*u_ij, l_is, *u_sj) ; + u_ij++ ; + u_sj++ ; + } + } + } + } + + /* rank-k outer product to update the C block */ + /* C = C - L*U' (U is stored by rows, not columns) */ + for (s = 0 ; s < k ; s++) + { + for (j = 0 ; j < n ; j++) + { + Entry u_sj = U [j+s*dc] ; + if (IS_NONZERO (u_sj)) + { + Entry *c_ij, *l_is ; + c_ij = & C [j*d] ; + l_is = & L [s*d] ; +#pragma ivdep + for (i = 0 ; i < m ; i++) + { + /* C [i+j*d]-= L [i+s*d] * U [s*dc+j] */ + MULT_SUB (*c_ij, *l_is, u_sj) ; + c_ij++ ; + l_is++ ; + } + } + } + } + +#else + + BLAS_TRSM_RIGHT (n, k, LU, nb, U, dc) ; + BLAS_GEMM (m, n, k, L, U, dc, C, d) ; + +#endif /* USE_NO_BLAS */ + + } + +#ifndef NDEBUG + DEBUG5 (("RANK-NB UPDATE of frontal done:\n")) ; + DEBUG5 (("DGEMM : "ID" "ID" "ID"\n", k, m, n)) ; + DEBUG7 (("C block: ")) ; UMF_dump_dense (C, d, m, n) ; + DEBUG7 (("A block: ")) ; UMF_dump_dense (L, d, m, k) ; + DEBUG7 (("B' block: ")) ; UMF_dump_dense (U, dc, n, k) ; + DEBUG7 (("LU block: ")) ; UMF_dump_dense (LU, nb, k, k) ; +#endif + + DEBUG2 (("blas3 "ID" "ID" "ID"\n", k, Work->fnrows, Work->fncols)) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_blas3_update.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_blas3_update.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,10 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL void UMF_blas3_update +( + WorkType *Work +) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_build_tuples.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_build_tuples.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,159 @@ +/* ========================================================================== */ +/* === UMF_build_tuples ===================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + Construct the tuple lists from a set of packed elements (no holes in + elements, no internal or external fragmentation, and a packed (0..Work->nel) + element name space). Assume no tuple lists are currently allocated, but + that the tuple lengths have been initialized by UMF_tuple_lengths. + + Returns TRUE if successful, FALSE if not enough memory. +*/ + +#include "umf_internal.h" +#include "umf_mem_alloc_tail_block.h" + +GLOBAL Int UMF_build_tuples +( + NumericType *Numeric, + WorkType *Work +) +{ + /* ---------------------------------------------------------------------- */ + /* local variables */ + /* ---------------------------------------------------------------------- */ + + Int e, nrows, ncols, nel, *Rows, *Cols, row, col, n_row, n_col, *E, + *Row_tuples, *Row_degree, *Row_tlen, + *Col_tuples, *Col_degree, *Col_tlen, n1 ; + Element *ep ; + Unit *p ; + Tuple tuple, *tp ; + + /* ---------------------------------------------------------------------- */ + /* get parameters */ + /* ---------------------------------------------------------------------- */ + + E = Work->E ; + Col_degree = Numeric->Cperm ; /* for NON_PIVOTAL_COL macro */ + Row_degree = Numeric->Rperm ; /* for NON_PIVOTAL_ROW macro */ + Row_tuples = Numeric->Uip ; + Row_tlen = Numeric->Uilen ; + Col_tuples = Numeric->Lip ; + Col_tlen = Numeric->Lilen ; + n_row = Work->n_row ; + n_col = Work->n_col ; + nel = Work->nel ; + n1 = Work->n1 ; + + DEBUG3 (("BUILD_TUPLES: n_row "ID" n_col "ID" nel "ID"\n", + n_row, n_col, nel)) ; + + /* ---------------------------------------------------------------------- */ + /* allocate space for the tuple lists */ + /* ---------------------------------------------------------------------- */ + + /* Garbage collection and memory reallocation have already attempted to */ + /* ensure that there is enough memory for all the tuple lists. If */ + /* memory allocation fails here, then there is nothing more to be done. */ + + for (row = n1 ; row < n_row ; row++) + { + if (NON_PIVOTAL_ROW (row)) + { + Row_tuples [row] = UMF_mem_alloc_tail_block (Numeric, + UNITS (Tuple, TUPLES (Row_tlen [row]))) ; + if (!Row_tuples [row]) + { + /* :: out of memory for row tuples :: */ + DEBUGm4 (("out of memory: build row tuples\n")) ; + return (FALSE) ; /* out of memory for row tuples */ + } + Row_tlen [row] = 0 ; + } + } + + /* push on stack in reverse order, so column tuples are in the order */ + /* that they will be deleted. */ + for (col = n_col-1 ; col >= n1 ; col--) + { + if (NON_PIVOTAL_COL (col)) + { + Col_tuples [col] = UMF_mem_alloc_tail_block (Numeric, + UNITS (Tuple, TUPLES (Col_tlen [col]))) ; + if (!Col_tuples [col]) + { + /* :: out of memory for col tuples :: */ + DEBUGm4 (("out of memory: build col tuples\n")) ; + return (FALSE) ; /* out of memory for col tuples */ + } + Col_tlen [col] = 0 ; + } + } + +#ifndef NDEBUG + UMF_dump_memory (Numeric) ; +#endif + + /* ---------------------------------------------------------------------- */ + /* create the tuple lists (exclude element 0) */ + /* ---------------------------------------------------------------------- */ + + /* for all elements, in order of creation */ + for (e = 1 ; e <= nel ; e++) + { + DEBUG9 (("Adding tuples for element: "ID" at "ID"\n", e, E [e])) ; + ASSERT (E [e]) ; /* no external fragmentation */ + p = Numeric->Memory + E [e] ; + GET_ELEMENT_PATTERN (ep, p, Cols, Rows, ncols) ; + nrows = ep->nrows ; + ASSERT (e != 0) ; + ASSERT (e == 0 || nrows == ep->nrowsleft) ; + ASSERT (e == 0 || ncols == ep->ncolsleft) ; + tuple.e = e ; + for (tuple.f = 0 ; tuple.f < ncols ; tuple.f++) + { + col = Cols [tuple.f] ; + ASSERT (col >= n1 && col < n_col) ; + ASSERT (NON_PIVOTAL_COL (col)) ; + ASSERT (Col_tuples [col]) ; + tp = ((Tuple *) (Numeric->Memory + Col_tuples [col])) + + Col_tlen [col]++ ; + *tp = tuple ; +#ifndef NDEBUG + UMF_dump_rowcol (1, Numeric, Work, col, FALSE) ; +#endif + } + for (tuple.f = 0 ; tuple.f < nrows ; tuple.f++) + { + row = Rows [tuple.f] ; + ASSERT (row >= n1 && row < n_row) ; + ASSERT (NON_PIVOTAL_COL (col)) ; + ASSERT (Row_tuples [row]) ; + tp = ((Tuple *) (Numeric->Memory + Row_tuples [row])) + + Row_tlen [row]++ ; + *tp = tuple ; +#ifndef NDEBUG + UMF_dump_rowcol (0, Numeric, Work, row, FALSE) ; +#endif + } + } + + /* ---------------------------------------------------------------------- */ + /* the tuple lists are now valid, and can be scanned */ + /* ---------------------------------------------------------------------- */ + +#ifndef NDEBUG + UMF_dump_memory (Numeric) ; + UMF_dump_matrix (Numeric, Work, FALSE) ; +#endif + DEBUG3 (("BUILD_TUPLES: done\n")) ; + return (TRUE) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_build_tuples.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_build_tuples.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,11 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL Int UMF_build_tuples +( + NumericType *Numeric, + WorkType *Work +) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_colamd.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_colamd.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,3139 @@ +/* ========================================================================== */ +/* === UMF_colamd =========================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* +UMF_colamd: an approximate minimum degree column ordering algorithm, + used as a preordering for UMFPACK. + +NOTE: if this routine is used outside of UMFPACK, for a sparse Cholesky +factorization of (AQ)'*(AQ) or a QR factorization of A, then one line should +be removed (the "&& pivot_row_thickness > 0" expression). See the comment +regarding the Cholesky factorization, below. + +Purpose: + + Colamd computes a permutation Q such that the Cholesky factorization of + (AQ)'(AQ) has less fill-in and requires fewer floating point operations + than A'A. This also provides a good ordering for sparse partial + pivoting methods, P(AQ) = LU, where Q is computed prior to numerical + factorization, and P is computed during numerical factorization via + conventional partial pivoting with row interchanges. Colamd is the + column ordering method used in SuperLU, part of the ScaLAPACK library. + It is also available as built-in function in MATLAB Version 6, + available from MathWorks, Inc. (http://www.mathworks.com). This + routine can be used in place of colmmd in MATLAB. By default, the \ + and / operators in MATLAB perform a column ordering (using colmmd + or colamd) prior to LU factorization using sparse partial pivoting, + in the built-in MATLAB lu(A) routine. + + This code is derived from Colamd Version 2.0. + +Authors: + + The authors of the COLAMD code itself are Stefan I. Larimore and Timothy A. + Davis, University of Florida. The algorithm was developed in collaboration + with John Gilbert, Xerox PARC, and Esmond Ng, Oak Ridge National Laboratory. + The AMD metric on which this is based is by Patrick Amestoy, T. Davis, + and Iain Duff. + +Date: + + UMFPACK Version: see above. + COLAMD Version 2.0 was released on January 31, 2000. + +Acknowledgements: + + This work was supported by the National Science Foundation, under + grants DMS-9504974, DMS-9803599, and CCR-0203270. + +UMFPACK: Copyright (c) 2003 by Timothy A. Davis. All Rights Reserved. + +See the UMFPACK README file for the License for your use of this code. + +Availability: + + Both UMFPACK and the original unmodified colamd/symamd library are + available at http://www.cise.ufl.edu/research/sparse. + +Changes for inclusion in UMFPACK: + + * symamd, symamd_report, and colamd_report removed + + * additional terms added to RowInfo, ColInfo, and stats + + * Frontal matrix information computed for UMFPACK + + * routines renamed + + * column elimination tree post-ordering incorporated. In the original + version 2.0, this was performed in colamd.m. + +For more information, see: + + Amestoy, P. R. and Davis, T. A. and Duff, I. S., + An approximate minimum degree ordering algorithm, + SIAM J. Matrix Analysis and Applic, vol 17, no 4., pp 886-905, 1996. + + Davis, T. A. and Gilbert, J. R. and Larimore, S. I. and Ng, E. G., + A column approximate minimum degree ordering algorithm, + Univ. of Florida, CISE Dept., TR-00-005, Gainesville, FL + Oct. 2000. Submitted to ACM Trans. Math. Softw. + +*/ + +/* ========================================================================== */ +/* === Description of user-callable routines ================================ */ +/* ========================================================================== */ + +/* + ---------------------------------------------------------------------------- + colamd_recommended: removed for UMFPACK + ---------------------------------------------------------------------------- + + ---------------------------------------------------------------------------- + colamd_set_defaults: + ---------------------------------------------------------------------------- + + C syntax: + + #include "colamd.h" + colamd_set_defaults (double knobs [COLAMD_KNOBS]) ; + + Purpose: + + Sets the default parameters. The use of this routine is optional. + + Arguments: + + double knobs [COLAMD_KNOBS] ; Output only. + + Let c = knobs [COLAMD_DENSE_COL], r = knobs [COLAMD_DENSE_ROW]. + Colamd: rows with more than max (16, r*16*sqrt(n_col)) + entries are removed prior to ordering. Columns with more than + max (16, c*16*sqrt(n_row)) entries are removed prior to + ordering, and placed last in the output column ordering. + + Symamd: removed for UMFPACK. + + COLAMD_DENSE_ROW and COLAMD_DENSE_COL are defined as 0 and 1, + respectively, in colamd.h. Default values of these two knobs + are both 0.5. Currently, only knobs [0] and knobs [1] are + used, but future versions may use more knobs. If so, they will + be properly set to their defaults by the future version of + colamd_set_defaults, so that the code that calls colamd will + not need to change, assuming that you either use + colamd_set_defaults, or pass a (double *) NULL pointer as the + knobs array to colamd or symamd. + + knobs [COLAMD_AGGRESSIVE]: if nonzero, then perform aggressive + absorption. Otherwise, do not. This version does aggressive + absorption by default. COLAMD v2.1 (in MATLAB) always + does aggressive absorption (it doesn't have an option to turn + it off). + + ---------------------------------------------------------------------------- + colamd: + ---------------------------------------------------------------------------- + + C syntax: + + #include "colamd.h" + Int UMF_colamd (Int n_row, Int n_col, Int Alen, Int *A, Int *p, + double knobs [COLAMD_KNOBS], Int stats [COLAMD_STATS]) ; + + Purpose: + + Computes a column ordering (Q) of A such that P(AQ)=LU or + (AQ)'AQ=LL' have less fill-in and require fewer floating point + operations than factorizing the unpermuted matrix A or A'A, + respectively. + + Returns: + + TRUE (1) if successful, FALSE (0) otherwise. + + Arguments: + + Int n_row ; Input argument. + + Number of rows in the matrix A. + Restriction: n_row >= 0. + Colamd returns FALSE if n_row is negative. + + Int n_col ; Input argument. + + Number of columns in the matrix A. + Restriction: n_col >= 0. + Colamd returns FALSE if n_col is negative. + + Int Alen ; Input argument. + + Restriction (see note): + Alen >= 2*nnz + 8*(n_col+1) + 6*(n_row+1) + n_col + Colamd returns FALSE if these conditions are not met. + + Note: this restriction makes an modest assumption regarding + the size of the two typedef's structures in colamd.h. + We do, however, guarantee that + + Alen >= UMF_COLAMD_RECOMMENDED (nnz, n_row, n_col) + + will be sufficient. + + Int A [Alen] ; Input and output argument. + + A is an integer array of size Alen. Alen must be at least as + large as the bare minimum value given above, but this is very + low, and can result in excessive run time. For best + performance, we recommend that Alen be greater than or equal to + UMF_COLAMD_RECOMMENDED (nnz, n_row, n_col), which adds + nnz/5 to the bare minimum value given above. + + On input, the row indices of the entries in column c of the + matrix are held in A [(p [c]) ... (p [c+1]-1)]. The row indices + in a given column c need not be in ascending order, and + duplicate row indices may be be present. However, colamd will + work a little faster if both of these conditions are met + (Colamd puts the matrix into this format, if it finds that the + the conditions are not met). + + The matrix is 0-based. That is, rows are in the range 0 to + n_row-1, and columns are in the range 0 to n_col-1. Colamd + returns FALSE if any row index is out of range. + + A holds the inverse permutation on output. + + Int p [n_col+1] ; Both input and output argument. + + p is an integer array of size n_col+1. On input, it holds the + "pointers" for the column form of the matrix A. Column c of + the matrix A is held in A [(p [c]) ... (p [c+1]-1)]. The first + entry, p [0], must be zero, and p [c] <= p [c+1] must hold + for all c in the range 0 to n_col-1. The value p [n_col] is + thus the total number of entries in the pattern of the matrix A. + Colamd returns FALSE if these conditions are not met. + + On output, if colamd returns TRUE, the array p holds the column + permutation (Q, for P(AQ)=LU or (AQ)'(AQ)=LL'), where p [0] is + the first column index in the new ordering, and p [n_col-1] is + the last. That is, p [k] = j means that column j of A is the + kth pivot column, in AQ, where k is in the range 0 to n_col-1 + (p [0] = j means that column j of A is the first column in AQ). + + If colamd returns FALSE, then no permutation is returned, and + p is undefined on output. + + double knobs [COLAMD_KNOBS] ; Input argument. + + See colamd_set_defaults for a description. + The behavior is undefined if knobs contains NaN's. + (UMFPACK does not call umf_colamd with NaN-valued knobs). + + Int stats [COLAMD_STATS] ; Output argument. + + Statistics on the ordering, and error status. + See colamd.h for related definitions. + Colamd returns FALSE if stats is not present. + + stats [0]: number of dense or empty rows ignored. + + stats [1]: number of dense or empty columns ignored (and + ordered last in the output permutation p) + Note that a row can become "empty" if it + contains only "dense" and/or "empty" columns, + and similarly a column can become "empty" if it + only contains "dense" and/or "empty" rows. + + stats [2]: number of garbage collections performed. + This can be excessively high if Alen is close + to the minimum required value. + + stats [3]: status code. < 0 is an error code. + > 1 is a warning or notice. + + 0 OK. Each column of the input matrix contained + row indices in increasing order, with no + duplicates. + + -11 Columns of input matrix jumbled + (unsorted columns or duplicate entries). + + stats [4]: the bad column index + stats [5]: the bad row index + + -1 A is a null pointer + + -2 p is a null pointer + + -3 n_row is negative + + stats [4]: n_row + + -4 n_col is negative + + stats [4]: n_col + + -5 number of nonzeros in matrix is negative + + stats [4]: number of nonzeros, p [n_col] + + -6 p [0] is nonzero + + stats [4]: p [0] + + -7 A is too small + + stats [4]: required size + stats [5]: actual size (Alen) + + -8 a column has a zero or negative number of + entries (changed for UMFPACK) + + stats [4]: column with <= 0 entries + stats [5]: number of entries in col + + -9 a row index is out of bounds + + stats [4]: column with bad row index + stats [5]: bad row index + stats [6]: n_row, # of rows of matrx + + -10 unused + + -999 (unused; see symamd.c) + + Future versions may return more statistics in the stats array. + + Example: + + See http://www.cise.ufl.edu/~davis/colamd/example.c + for a complete example. + + To order the columns of a 5-by-4 matrix with 11 nonzero entries in + the following nonzero pattern + + x 0 x 0 + x 0 x x + 0 x x 0 + 0 0 x x + x x 0 0 + + with default knobs and no output statistics, do the following: + + #include "colamd.h" + #define ALEN UMF_COLAMD_RECOMMENDED (11, 5, 4) + Int A [ALEN] = {1, 2, 5, 3, 5, 1, 2, 3, 4, 2, 4} ; + Int p [ ] = {0, 3, 5, 9, 11} ; + Int stats [COLAMD_STATS] ; + UMF_colamd (5, 4, ALEN, A, p, (double *) NULL, stats) ; + + The permutation is returned in the array p, and A is destroyed. + + + ---------------------------------------------------------------------------- + symamd: does not appear in this version for UMFPACK + ---------------------------------------------------------------------------- + + ---------------------------------------------------------------------------- + colamd_report: does not appear in this version for UMFPACK + ---------------------------------------------------------------------------- + + ---------------------------------------------------------------------------- + symamd_report: does not appear in this version for UMFPACK + ---------------------------------------------------------------------------- + +*/ + +/* ========================================================================== */ +/* === Scaffolding code definitions ======================================== */ +/* ========================================================================== */ + +/* UMFPACK debugging control moved to amd_internal.h */ + +/* + Our "scaffolding code" philosophy: In our opinion, well-written library + code should keep its "debugging" code, and just normally have it turned off + by the compiler so as not to interfere with performance. This serves + several purposes: + + (1) assertions act as comments to the reader, telling you what the code + expects at that point. All assertions will always be true (unless + there really is a bug, of course). + + (2) leaving in the scaffolding code assists anyone who would like to modify + the code, or understand the algorithm (by reading the debugging output, + one can get a glimpse into what the code is doing). + + (3) (gasp!) for actually finding bugs. This code has been heavily tested + and "should" be fully functional and bug-free ... but you never know... + + To enable debugging, comment out the "#define NDEBUG" above. For a MATLAB + mexFunction, you will also need to modify mexopts.sh to remove the -DNDEBUG + definition. The code will become outrageously slow when debugging is + enabled. To control the level of debugging output, set an environment + variable D to 0 (little), 1 (some), 2, 3, or 4 (lots). When debugging, + you should see the following message on the standard output: + + colamd: debug version, D = 1 (THIS WILL BE SLOW!) + + or a similar message for symamd. If you don't, then debugging has not + been enabled. + +*/ + +/* ========================================================================== */ +/* === Include files ======================================================== */ +/* ========================================================================== */ + +/* ------------------ */ +/* modified for UMFPACK: */ +#include "umf_internal.h" +#include "umf_colamd.h" +#include "umf_apply_order.h" +#include "umf_fsize.h" +/* ------------------ */ + +/* ========================================================================== */ +/* === Definitions ========================================================== */ +/* ========================================================================== */ + +/* ------------------ */ +/* UMFPACK: duplicate definitions moved to umf_internal.h */ +/* ------------------ */ + +/* Row and column status */ +#define ALIVE (0) +#define DEAD (-1) + +/* Column status */ +#define DEAD_PRINCIPAL (-1) +#define DEAD_NON_PRINCIPAL (-2) + +/* Macros for row and column status update and checking. */ +#define ROW_IS_DEAD(r) ROW_IS_MARKED_DEAD (Row[r].shared2.mark) +#define ROW_IS_MARKED_DEAD(row_mark) (row_mark < ALIVE) +#define ROW_IS_ALIVE(r) (Row [r].shared2.mark >= ALIVE) +#define COL_IS_DEAD(c) (Col [c].start < ALIVE) +#define COL_IS_ALIVE(c) (Col [c].start >= ALIVE) +#define COL_IS_DEAD_PRINCIPAL(c) (Col [c].start == DEAD_PRINCIPAL) +#define KILL_ROW(r) { Row [r].shared2.mark = DEAD ; } +#define KILL_PRINCIPAL_COL(c) { Col [c].start = DEAD_PRINCIPAL ; } +#define KILL_NON_PRINCIPAL_COL(c) { Col [c].start = DEAD_NON_PRINCIPAL ; } + +/* ------------------ */ +/* UMFPACK: Colamd reporting mechanism moved to umf_internal.h */ +/* ------------------ */ + +/* ========================================================================== */ +/* === Prototypes of PRIVATE routines ======================================= */ +/* ========================================================================== */ + +PRIVATE Int init_rows_cols +( + Int n_row, + Int n_col, + Colamd_Row Row [], + Colamd_Col Col [], + Int A [], + Int p [] + /* Int stats [COLAMD_STATS] */ +) ; + +PRIVATE void init_scoring +( + Int n_row, + Int n_col, + Colamd_Row Row [], + Colamd_Col Col [], + Int A [], + Int head [], + double knobs [COLAMD_KNOBS], + Int *p_n_row2, + Int *p_n_col2, + Int *p_max_deg + /* ------------------ */ + /* added for UMFPACK */ + , Int *p_ndense_row /* number of dense rows */ + , Int *p_nempty_row /* number of original empty rows */ + , Int *p_nnewlyempty_row /* number of newly empty rows */ + , Int *p_ndense_col /* number of dense cols (excl "empty" cols) */ + , Int *p_nempty_col /* number of original empty cols */ + , Int *p_nnewlyempty_col /* number of newly empty cols */ +) ; + +PRIVATE Int find_ordering +( + Int n_row, + Int n_col, + Int Alen, + Colamd_Row Row [], + Colamd_Col Col [], + Int A [], + Int head [], + Int n_col2, + Int max_deg, + Int pfree + /* ------------------ */ + /* added for UMFPACK: */ + , Int Front_npivcol [ ] + , Int Front_nrows [ ] + , Int Front_ncols [ ] + , Int Front_parent [ ] + , Int Front_cols [ ] + , Int *p_nfr + , Int aggressive + , Int InFront [ ] + /* ------------------ */ +) ; + +/* ------------------ */ +/* order_children deleted for UMFPACK: */ +/* ------------------ */ + +PRIVATE void detect_super_cols +( + +#ifndef NDEBUG + Int n_col, + Colamd_Row Row [], +#endif /* NDEBUG */ + + Colamd_Col Col [], + Int A [], + Int head [], + Int row_start, + Int row_length +) ; + +PRIVATE Int garbage_collection +( + Int n_row, + Int n_col, + Colamd_Row Row [], + Colamd_Col Col [], + Int A [], + Int *pfree +) ; + +PRIVATE Int clear_mark +( + Int n_row, + Colamd_Row Row [] +) ; + +/* ------------------ */ +/* print_report deleted for UMFPACK */ +/* ------------------ */ + +/* ========================================================================== */ +/* === Debugging prototypes and definitions ================================= */ +/* ========================================================================== */ + +#ifndef NDEBUG + +/* ------------------ */ +/* debugging macros moved for UMFPACK */ +/* ------------------ */ + +PRIVATE void debug_deg_lists +( + Int n_row, + Int n_col, + Colamd_Row Row [], + Colamd_Col Col [], + Int head [], + Int min_score, + Int should, + Int max_deg +) ; + +PRIVATE void debug_mark +( + Int n_row, + Colamd_Row Row [], + Int tag_mark, + Int max_mark +) ; + +PRIVATE void debug_matrix +( + Int n_row, + Int n_col, + Colamd_Row Row [], + Colamd_Col Col [], + Int A [] +) ; + +PRIVATE void debug_structures +( + Int n_row, + Int n_col, + Colamd_Row Row [], + Colamd_Col Col [], + Int A [], + Int n_col2 +) ; + +/* ------------------ */ +/* dump_super added for UMFPACK: */ +PRIVATE void dump_super +( + Int super_c, + Colamd_Col Col [], + Int n_col +) ; +/* ------------------ */ + +#endif /* NDEBUG */ + +/* ========================================================================== */ + + + +/* ========================================================================== */ +/* === USER-CALLABLE ROUTINES: ============================================== */ +/* ========================================================================== */ + + +/* ========================================================================== */ +/* === colamd_set_defaults ================================================== */ +/* ========================================================================== */ + +/* + The colamd_set_defaults routine sets the default values of the user- + controllable parameters for colamd: + + knobs [0] rows with knobs[0]*n_col entries or more are removed + prior to ordering in colamd. Rows and columns with + knobs[0]*n_col entries or more are removed prior to + ordering in symamd and placed last in the output + ordering. + + knobs [1] columns with knobs[1]*n_row entries or more are removed + prior to ordering in colamd, and placed last in the + column permutation. Symamd ignores this knob. + + knobs [2] if nonzero, then perform aggressive absorption. + + knobs [3..19] unused, but future versions might use this +*/ + +GLOBAL void UMF_colamd_set_defaults +( + /* === Parameters ======================================================= */ + + double knobs [COLAMD_KNOBS] /* knob array */ +) +{ + /* === Local variables ================================================== */ + + Int i ; + +#if 0 + if (!knobs) + { + return ; /* UMFPACK always passes knobs array */ + } +#endif + for (i = 0 ; i < COLAMD_KNOBS ; i++) + { + knobs [i] = 0 ; + } + knobs [COLAMD_DENSE_ROW] = 0.2 ; /* default changed for UMFPACK */ + knobs [COLAMD_DENSE_COL] = 0.2 ; /* default changed for UMFPACK */ + knobs [COLAMD_AGGRESSIVE] = TRUE ; /* default is to do aggressive + * absorption */ +} + + +/* ========================================================================== */ +/* === symamd removed for UMFPACK =========================================== */ +/* ========================================================================== */ + + + +/* ========================================================================== */ +/* === colamd =============================================================== */ +/* ========================================================================== */ + +/* + The colamd routine computes a column ordering Q of a sparse matrix + A such that the LU factorization P(AQ) = LU remains sparse, where P is + selected via partial pivoting. The routine can also be viewed as + providing a permutation Q such that the Cholesky factorization + (AQ)'(AQ) = LL' remains sparse. +*/ + +/* For UMFPACK: colamd always returns TRUE */ + +GLOBAL Int UMF_colamd /* returns TRUE if successful, FALSE otherwise*/ +( + /* === Parameters ======================================================= */ + + Int n_row, /* number of rows in A */ + Int n_col, /* number of columns in A */ + Int Alen, /* length of A */ + Int A [], /* row indices of A */ + Int p [], /* pointers to columns in A */ + double knobs [COLAMD_KNOBS],/* parameters (uses defaults if NULL) */ + Int stats [COLAMD_STATS] /* output statistics and error codes */ + + /* ------------------ */ + /* added for UMFPACK: each Front_ array is of size n_col+1 */ + , Int Front_npivcol [ ] /* # pivot cols in each front */ + , Int Front_nrows [ ] /* # of rows in each front (incl. pivot rows) */ + , Int Front_ncols [ ] /* # of cols in each front (incl. pivot cols) */ + , Int Front_parent [ ] /* parent of each front */ + , Int Front_cols [ ] /* link list of pivot columns for each front */ + , Int *p_nfr /* total number of frontal matrices */ + , Int InFront [ ] /* InFront [row] = f if the original row was + * absorbed into front f. EMPTY if the row was + * empty, dense, or not absorbed. This array + * has size n_row+1 */ + /* ------------------ */ +) +{ + /* === Local variables ================================================== */ + + Int row ; /* row index */ + Int i ; /* loop index */ + Int nnz ; /* nonzeros in A */ + Int Row_size ; /* size of Row [], in integers */ + Int Col_size ; /* size of Col [], in integers */ +#if 0 + Int need ; /* minimum required length of A */ +#endif + Colamd_Row *Row ; /* pointer into A of Row [0..n_row] array */ + Colamd_Col *Col ; /* pointer into A of Col [0..n_col] array */ + Int n_col2 ; /* number of non-dense, non-empty columns */ + Int n_row2 ; /* number of non-dense, non-empty rows */ + Int ngarbage ; /* number of garbage collections performed */ + Int max_deg ; /* maximum row degree */ + Int aggressive ; /* TRUE if doing aggressive absorption */ +#if 0 + double default_knobs [COLAMD_KNOBS] ; /* default knobs array */ +#endif + + /* ------------------ */ + /* debugging initializations moved for UMFPACK */ + /* ------------------ */ + + /* ------------------ */ + /* added for UMFPACK: */ + Int ndense_row, nempty_row, parent, ndense_col, + nempty_col, k, col, nfr, *Front_child, *Front_sibling, *Front_stack, + *Front_order, *Front_size ; + Int nnewlyempty_col, nnewlyempty_row ; + /* ------------------ */ + + /* === Check the input arguments ======================================== */ + +#if 0 + if (!stats) + { + DEBUG0 (("colamd: stats not present\n")) ; + return (FALSE) ; /* UMFPACK: always passes stats [ ] */ + } +#endif + + ASSERT (stats != (Int *) NULL) ; + + for (i = 0 ; i < COLAMD_STATS ; i++) + { + stats [i] = 0 ; + } + stats [COLAMD_STATUS] = COLAMD_OK ; + stats [COLAMD_INFO1] = -1 ; + stats [COLAMD_INFO2] = -1 ; + +#if 0 + if (!A) /* A is not present */ + { + /* UMFPACK: always passes A [ ] */ + DEBUG0 (("colamd: A not present\n")) ; + stats [COLAMD_STATUS] = COLAMD_ERROR_A_not_present ; + return (FALSE) ; + } + + if (!p) /* p is not present */ + { + /* UMFPACK: always passes p [ ] */ + DEBUG0 (("colamd: p not present\n")) ; + stats [COLAMD_STATUS] = COLAMD_ERROR_p_not_present ; + return (FALSE) ; + } + + if (n_row < 0) /* n_row must be >= 0 */ + { + /* UMFPACK: does not call UMF_colamd if n <= 0 */ + DEBUG0 (("colamd: nrow negative "ID"\n", n_row)) ; + stats [COLAMD_STATUS] = COLAMD_ERROR_nrow_negative ; + stats [COLAMD_INFO1] = n_row ; + return (FALSE) ; + } + + if (n_col < 0) /* n_col must be >= 0 */ + { + /* UMFPACK: does not call UMF_colamd if n <= 0 */ + DEBUG0 (("colamd: ncol negative "ID"\n", n_col)) ; + stats [COLAMD_STATUS] = COLAMD_ERROR_ncol_negative ; + stats [COLAMD_INFO1] = n_col ; + return (FALSE) ; + } +#endif + + ASSERT (A != (Int *) NULL) ; + ASSERT (p != (Int *) NULL) ; + ASSERT (n_row >= 0) ; + ASSERT (n_col >= 0) ; + + nnz = p [n_col] ; + +#if 0 + if (nnz < 0) /* nnz must be >= 0 */ + { + /* UMFPACK: does not call UMF_colamd if nnz < 0 */ + DEBUG0 (("colamd: number of entries negative "ID"\n", nnz)) ; + stats [COLAMD_STATUS] = COLAMD_ERROR_nnz_negative ; + stats [COLAMD_INFO1] = nnz ; + return (FALSE) ; + } + + if (p [0] != 0) /* p [0] must be exactly zero */ + { + DEBUG0 (("colamd: p[0] not zero "ID"\n", p [0])) ; + stats [COLAMD_STATUS] = COLAMD_ERROR_p0_nonzero ; + stats [COLAMD_INFO1] = p [0] ; + return (FALSE) ; + } +#endif + + ASSERT (nnz >= 0) ; + ASSERT (p [0] == 0) ; + + /* === If no knobs, set default knobs =================================== */ + +#if 0 + if (!knobs) + { + /* UMFPACK: always passes the knobs */ + UMF_colamd_set_defaults (default_knobs) ; + knobs = default_knobs ; + } +#endif + + ASSERT (knobs != (double *) NULL) ; + + /* --------------------- */ + /* added for UMFPACK v4.1: */ + aggressive = (knobs [COLAMD_AGGRESSIVE] != 0) ; + /* --------------------- */ + + /* === Allocate the Row and Col arrays from array A ===================== */ + + Col_size = UMF_COLAMD_C (n_col) ; + Row_size = UMF_COLAMD_R (n_row) ; + +#if 0 + need = MAX (2*nnz, 4*n_col) + n_col + Col_size + Row_size ; + if (need > Alen) + { + /* UMFPACK: always passes enough space */ + /* not enough space in array A to perform the ordering */ + DEBUG0 (("colamd: Need Alen >= "ID", given only Alen = "ID"\n", + need, Alen)) ; + stats [COLAMD_STATUS] = COLAMD_ERROR_A_too_small ; + stats [COLAMD_INFO1] = need ; + stats [COLAMD_INFO2] = Alen ; + return (FALSE) ; + } +#endif + + Alen -= Col_size + Row_size ; + Col = (Colamd_Col *) &A [Alen] ; + Row = (Colamd_Row *) &A [Alen + Col_size] ; + + /* Size of A is now Alen >= MAX (2*nnz, 4*n_col) + n_col. The ordering + * requires Alen >= 2*nnz + n_col, and the postorder requires + * Alen >= 5*n_col. */ + + /* === Construct the row and column data structures ===================== */ + + i = init_rows_cols (n_row, n_col, Row, Col, A, p) ; + +#if 0 + if (!i) + { + /* input matrix is invalid */ + DEBUG0 (("colamd: Matrix invalid\n")) ; + return (FALSE) ; + } +#endif + + ASSERT (i) ; + + /* === UMFPACK: Initialize front info =================================== */ + + for (col = 0 ; col < n_col ; col++) + { + Front_npivcol [col] = 0 ; + Front_nrows [col] = 0 ; + Front_ncols [col] = 0 ; + Front_parent [col] = EMPTY ; + Front_cols [col] = EMPTY ; + } + + /* === Initialize scores, kill dense rows/columns ======================= */ + + init_scoring (n_row, n_col, Row, Col, A, p, knobs, + &n_row2, &n_col2, &max_deg + /* ------------------ */ + /* added for UMFPACK: */ + , &ndense_row, &nempty_row, &nnewlyempty_row + , &ndense_col, &nempty_col, &nnewlyempty_col + /* ------------------ */ + ) ; + ASSERT (n_row2 == n_row - nempty_row - nnewlyempty_row - ndense_row) ; + ASSERT (n_col2 == n_col - nempty_col - nnewlyempty_col - ndense_col) ; + + /* === Order the supercolumns =========================================== */ + + ngarbage = find_ordering (n_row, n_col, Alen, Row, Col, A, p, + n_col2, max_deg, 2*nnz + /* ------------------ */ + /* added for UMFPACK: */ + , Front_npivcol, Front_nrows, Front_ncols, Front_parent, Front_cols + , &nfr, aggressive, InFront + /* ------------------ */ + ) ; + + /* ------------------ */ + /* changed for UMFPACK: */ + + /* A is no longer needed, so use A [0..5*nfr-1] as workspace [ [ */ + /* This step requires Alen >= 5*n_col */ + Front_child = A ; + Front_sibling = Front_child + nfr ; + Front_stack = Front_sibling + nfr ; + Front_order = Front_stack + nfr ; + Front_size = Front_order + nfr ; + + UMF_fsize (nfr, Front_size, Front_nrows, Front_ncols, + Front_parent, Front_npivcol) ; + + AMD_postorder (nfr, Front_parent, Front_npivcol, Front_size, + Front_order, Front_child, Front_sibling, Front_stack) ; + + /* Front_size, Front_stack, Front_child, Front_sibling no longer needed ] */ + + /* use A [0..nfr-1] as workspace */ + UMF_apply_order (Front_npivcol, Front_order, A, nfr, nfr) ; + UMF_apply_order (Front_nrows, Front_order, A, nfr, nfr) ; + UMF_apply_order (Front_ncols, Front_order, A, nfr, nfr) ; + UMF_apply_order (Front_parent, Front_order, A, nfr, nfr) ; + UMF_apply_order (Front_cols, Front_order, A, nfr, nfr) ; + + /* fix the parent to refer to the new numbering */ + for (i = 0 ; i < nfr ; i++) + { + parent = Front_parent [i] ; + if (parent != EMPTY) + { + Front_parent [i] = Front_order [parent] ; + } + } + + /* fix InFront to refer to the new numbering */ + for (row = 0 ; row < n_row ; row++) + { + i = InFront [row] ; + ASSERT (i >= EMPTY && i < nfr) ; + if (i != EMPTY) + { + InFront [row] = Front_order [i] ; + } + } + + /* Front_order longer needed ] */ + + /* === Order the columns in the fronts ================================== */ + + /* use A [0..n_col-1] as inverse permutation */ + for (i = 0 ; i < n_col ; i++) + { + A [i] = EMPTY ; + } + k = 0 ; + for (i = 0 ; i < nfr ; i++) + { + ASSERT (Front_npivcol [i] > 0) ; + for (col = Front_cols [i] ; col != EMPTY ; col = Col [col].nextcol) + { + ASSERT (col >= 0 && col < n_col) ; + DEBUG1 (("Colamd output ordering: k "ID" col "ID"\n", k, col)) ; + p [k] = col ; + ASSERT (A [col] == EMPTY) ; + A [col] = k ; + k++ ; + } + } + + /* === Order the "dense" and null columns =============================== */ + + ASSERT (k == n_col2) ; + if (n_col2 < n_col) + { + for (col = 0 ; col < n_col ; col++) + { + if (A [col] == EMPTY) + { + k = Col [col].shared2.order ; + ASSERT (k >= n_col2 && k < n_col) ; + DEBUG1 (("Colamd output ordering: k "ID" col "ID + " (dense or null col)\n", k, col)) ; + p [k] = col ; + A [col] = k ; + } + } + } + + /* ------------------ */ + + /* === Return statistics in stats ======================================= */ + + /* ------------------ */ + /* modified for UMFPACK */ + stats [COLAMD_DENSE_ROW] = ndense_row ; + stats [COLAMD_EMPTY_ROW] = nempty_row ; + stats [COLAMD_NEWLY_EMPTY_ROW] = nnewlyempty_row ; + stats [COLAMD_DENSE_COL] = ndense_col ; + stats [COLAMD_EMPTY_COL] = nempty_col ; + stats [COLAMD_NEWLY_EMPTY_COL] = nnewlyempty_col ; + ASSERT (ndense_col + nempty_col + nnewlyempty_col == n_col - n_col2) ; + /* ------------------ */ + stats [COLAMD_DEFRAG_COUNT] = ngarbage ; + *p_nfr = nfr ; + DEBUG1 (("colamd: done.\n")) ; + return (TRUE) ; +} + + + + +/* ========================================================================== */ +/* === colamd_report removed for UMFPACK ==================================== */ +/* ========================================================================== */ + +/* ========================================================================== */ +/* === symamd_report removed for UMFPACK ==================================== */ +/* ========================================================================== */ + + + +/* ========================================================================== */ +/* === NON-USER-CALLABLE ROUTINES: ========================================== */ +/* ========================================================================== */ + +/* There are no user-callable routines beyond this point in the file */ + + +/* ========================================================================== */ +/* === init_rows_cols ======================================================= */ +/* ========================================================================== */ + +/* + Takes the column form of the matrix in A and creates the row form of the + matrix. Also, row and column attributes are stored in the Col and Row + structs. If the columns are un-sorted or contain duplicate row indices, + this routine will also sort and remove duplicate row indices from the + column form of the matrix. Returns FALSE if the matrix is invalid, + TRUE otherwise. Not user-callable. +*/ + +/* For UMFPACK, this always returns TRUE */ + +PRIVATE Int init_rows_cols /* returns TRUE if OK, or FALSE otherwise */ +( + /* === Parameters ======================================================= */ + + Int n_row, /* number of rows of A */ + Int n_col, /* number of columns of A */ + Colamd_Row Row [], /* of size n_row+1 */ + Colamd_Col Col [], /* of size n_col+1 */ + Int A [], /* row indices of A, of size Alen */ + Int p [] /* pointers to columns in A, of size n_col+1 */ +/* + Int stats [COLAMD_STATS] colamd statistics, removed for UMFPACK +*/ +) +{ + /* === Local variables ================================================== */ + + Int col ; /* a column index */ + Int row ; /* a row index */ + Int *cp ; /* a column pointer */ + Int *cp_end ; /* a pointer to the end of a column */ + + /* === Initialize columns, and check column pointers ==================== */ + + for (col = 0 ; col < n_col ; col++) + { + Col [col].start = p [col] ; + Col [col].length = p [col+1] - p [col] ; + +#if 0 + if (Col [col].length < 0) + { + /* column pointers must be non-decreasing */ + stats [COLAMD_STATUS] = COLAMD_ERROR_col_length_negative ; + stats [COLAMD_INFO1] = col ; + stats [COLAMD_INFO2] = Col [col].length ; + DEBUG0 (("colamd: col "ID" length "ID" <= 0\n", + col, Col [col].length)); + return (FALSE) ; + } +#endif + + ASSERT (Col [col].length >= 0) ; + + /* added for UMFPACK v4.1 */ + ASSERT (Col [col].length > 0) ; + + Col [col].shared1.thickness = 1 ; + Col [col].shared2.score = 0 ; + Col [col].shared3.prev = EMPTY ; + Col [col].shared4.degree_next = EMPTY ; + + /* ------------------ */ + /* added for UMFPACK: */ + Col [col].nextcol = EMPTY ; + Col [col].lastcol = col ; + /* ------------------ */ + } + + /* p [0..n_col] no longer needed, used as "head" in subsequent routines */ + + /* === Scan columns, compute row degrees, and check row indices ========= */ + + /* ------------------ */ + /* stats [COLAMD_INFO3] = 0 ; */ + /* number of duplicate or unsorted row indices - not computed in UMFPACK */ + /* ------------------ */ + + for (row = 0 ; row < n_row ; row++) + { + Row [row].length = 0 ; + /* ------------------ */ + /* removed for UMFPACK */ + /* Row [row].shared2.mark = -1 ; */ + /* ------------------ */ + /* ------------------ */ + /* added for UMFPACK: */ + Row [row].thickness = 1 ; + Row [row].front = EMPTY ; + /* ------------------ */ + } + + for (col = 0 ; col < n_col ; col++) + { +#ifndef NDEBUG + Int last_row = -1 ; +#endif + + cp = &A [p [col]] ; + cp_end = &A [p [col+1]] ; + + while (cp < cp_end) + { + row = *cp++ ; + +#if 0 + /* make sure row indices within range */ + if (row < 0 || row >= n_row) + { + stats [COLAMD_STATUS] = COLAMD_ERROR_row_index_out_of_bounds ; + stats [COLAMD_INFO1] = col ; + stats [COLAMD_INFO2] = row ; + /* ------------------ */ + /* not needed in UMFPACK: */ + /* stats [COLAMD_INFO3] = n_row ; */ + /* ------------------ */ + DEBUG0 (("colamd: row "ID" col "ID" out of bounds\n", row,col)); + return (FALSE) ; + } +#endif + + ASSERT (row >= 0 && row < n_row) ; + +#if 0 + /* ------------------ */ + /* changed for UMFPACK */ + if (row <= last_row) + { + /* row index are unsorted or repeated (or both), thus col */ + /* is jumbled. This is an error condition for UMFPACK */ + stats [COLAMD_STATUS] = COLAMD_ERROR_jumbled_matrix ; + stats [COLAMD_INFO1] = col ; + stats [COLAMD_INFO2] = row ; + DEBUG1 (("colamd: row "ID" col "ID" unsorted/duplicate\n", + row, col)) ; + return (FALSE) ; + } + /* ------------------ */ +#endif + + ASSERT (row > last_row) ; + + /* ------------------ */ + /* changed for UMFPACK - jumbled columns not tolerated */ + Row [row].length++ ; + /* ------------------ */ + +#ifndef NDEBUG + last_row = row ; +#endif + } + } + + /* === Compute row pointers ============================================= */ + + /* row form of the matrix starts directly after the column */ + /* form of matrix in A */ + Row [0].start = p [n_col] ; + Row [0].shared1.p = Row [0].start ; + /* ------------------ */ + /* removed for UMFPACK */ + /* Row [0].shared2.mark = -1 ; */ + /* ------------------ */ + for (row = 1 ; row < n_row ; row++) + { + Row [row].start = Row [row-1].start + Row [row-1].length ; + Row [row].shared1.p = Row [row].start ; + /* ------------------ */ + /* removed for UMFPACK */ + /* Row [row].shared2.mark = -1 ; */ + /* ------------------ */ + } + + /* === Create row form ================================================== */ + + /* ------------------ */ + /* jumbled matrix case removed for UMFPACK */ + /* ------------------ */ + + for (col = 0 ; col < n_col ; col++) + { + cp = &A [p [col]] ; + cp_end = &A [p [col+1]] ; + while (cp < cp_end) + { + A [(Row [*cp++].shared1.p)++] = col ; + } + } + + /* === Clear the row marks and set row degrees ========================== */ + + for (row = 0 ; row < n_row ; row++) + { + Row [row].shared2.mark = 0 ; + Row [row].shared1.degree = Row [row].length ; + } + + /* ------------------ */ + /* recreate columns for jumbled matrix case removed for UMFPACK */ + /* ------------------ */ + + return (TRUE) ; +} + + +/* ========================================================================== */ +/* === init_scoring ========================================================= */ +/* ========================================================================== */ + +/* + Kills dense or empty columns and rows, calculates an initial score for + each column, and places all columns in the degree lists. Not user-callable. +*/ + +PRIVATE void init_scoring +( + /* === Parameters ======================================================= */ + + Int n_row, /* number of rows of A */ + Int n_col, /* number of columns of A */ + Colamd_Row Row [], /* of size n_row+1 */ + Colamd_Col Col [], /* of size n_col+1 */ + Int A [], /* column form and row form of A */ + Int head [], /* of size n_col+1 */ + double knobs [COLAMD_KNOBS],/* parameters */ + Int *p_n_row2, /* number of non-dense, non-empty rows */ + Int *p_n_col2, /* number of non-dense, non-empty columns */ + Int *p_max_deg /* maximum row degree */ + /* ------------------ */ + /* added for UMFPACK */ + , Int *p_ndense_row /* number of dense rows */ + , Int *p_nempty_row /* number of original empty rows */ + , Int *p_nnewlyempty_row /* number of newly empty rows */ + , Int *p_ndense_col /* number of dense cols (excl "empty" cols) */ + , Int *p_nempty_col /* number of original empty cols */ + , Int *p_nnewlyempty_col /* number of newly empty cols */ + /* ------------------ */ +) +{ + /* === Local variables ================================================== */ + + Int c ; /* a column index */ + Int r, row ; /* a row index */ + Int *cp ; /* a column pointer */ + Int deg ; /* degree of a row or column */ + Int *cp_end ; /* a pointer to the end of a column */ + Int *new_cp ; /* new column pointer */ + Int col_length ; /* length of pruned column */ + Int score ; /* current column score */ + Int n_col2 ; /* number of non-dense, non-empty columns */ + Int n_row2 ; /* number of non-dense, non-empty rows */ + Int dense_row_count ; /* remove rows with more entries than this */ + Int dense_col_count ; /* remove cols with more entries than this */ + Int min_score ; /* smallest column score */ + Int max_deg ; /* maximum row degree */ + Int next_col ; /* Used to add to degree list.*/ + + /* ------------------ */ + /* added for UMFPACK */ + Int ndense_row ; /* number of dense rows */ + Int nempty_row ; /* number of empty rows */ + Int nnewlyempty_row ; /* number of newly empty rows */ + Int ndense_col ; /* number of dense cols (excl "empty" cols) */ + Int nempty_col ; /* number of original empty cols */ + Int nnewlyempty_col ; /* number of newly empty cols */ + Int ne ; + /* ------------------ */ + +#ifndef NDEBUG + Int debug_count ; /* debug only. */ +#endif /* NDEBUG */ + + /* === Extract knobs ==================================================== */ + + /* --------------------- */ + /* old dense row/column knobs: + dense_row_count = MAX (0, MIN (knobs [COLAMD_DENSE_ROW] * n_col, n_col)) ; + dense_col_count = MAX (0, MIN (knobs [COLAMD_DENSE_COL] * n_row, n_row)) ; + */ + /* new, for UMFPACK: */ + /* Note: if knobs contains a NaN, this is undefined: */ + dense_row_count = + UMFPACK_DENSE_DEGREE_THRESHOLD (knobs [COLAMD_DENSE_ROW], n_col) ; + dense_col_count = + UMFPACK_DENSE_DEGREE_THRESHOLD (knobs [COLAMD_DENSE_COL], n_row) ; + /* Make sure dense_*_count is between 0 and n: */ + dense_row_count = MAX (0, MIN (dense_row_count, n_col)) ; + dense_col_count = MAX (0, MIN (dense_col_count, n_row)) ; + /* --------------------- */ + + DEBUG1 (("colamd: densecount: "ID" "ID"\n", + dense_row_count, dense_col_count)) ; + max_deg = 0 ; + n_col2 = n_col ; + n_row2 = n_row ; + + /* --------------------- */ + /* added for UMFPACK */ + ndense_col = 0 ; + nempty_col = 0 ; + nnewlyempty_col = 0 ; + ndense_row = 0 ; + nempty_row = 0 ; + nnewlyempty_row = 0 ; + /* --------------------- */ + + /* === Kill empty columns =============================================== */ + + /* removed for UMFPACK v4.1. prune_singletons has already removed empty + * columns and empty rows */ + +#if 0 + /* Put the empty columns at the end in their natural order, so that LU */ + /* factorization can proceed as far as possible. */ + for (c = n_col-1 ; c >= 0 ; c--) + { + deg = Col [c].length ; + if (deg == 0) + { + /* this is a empty column, kill and order it last */ + Col [c].shared2.order = --n_col2 ; + KILL_PRINCIPAL_COL (c) ; + /* --------------------- */ + /* added for UMFPACK */ + nempty_col++ ; + /* --------------------- */ + } + } + DEBUG1 (("colamd: null columns killed: "ID"\n", n_col - n_col2)) ; +#endif + +#ifndef NDEBUG + for (c = 0 ; c < n_col ; c++) + { + ASSERT (Col [c].length > 0) ; + } +#endif + + /* === Count null rows ================================================== */ + +#if 0 + for (r = 0 ; r < n_row ; r++) + { + deg = Row [r].shared1.degree ; + if (deg == 0) + { + /* this is an original empty row */ + nempty_row++ ; + } + } +#endif + +#ifndef NDEBUG + for (r = 0 ; r < n_row ; r++) + { + ASSERT (Row [r].shared1.degree > 0) ; + ASSERT (Row [r].length > 0) ; + } +#endif + + /* === Kill dense columns =============================================== */ + + /* Put the dense columns at the end, in their natural order */ + for (c = n_col-1 ; c >= 0 ; c--) + { + + /* ----------------------------------------------------------------- */ +#if 0 + /* removed for UMFPACK v4.1: no empty columns */ + /* skip any dead columns */ + if (COL_IS_DEAD (c)) + { + continue ; + } +#endif + ASSERT (COL_IS_ALIVE (c)) ; + ASSERT (Col [c].length > 0) ; + /* ----------------------------------------------------------------- */ + + deg = Col [c].length ; + if (deg > dense_col_count) + { + /* this is a dense column, kill and order it last */ + Col [c].shared2.order = --n_col2 ; + /* --------------------- */ + /* added for UMFPACK */ + ndense_col++ ; + /* --------------------- */ + /* decrement the row degrees */ + cp = &A [Col [c].start] ; + cp_end = cp + Col [c].length ; + while (cp < cp_end) + { + Row [*cp++].shared1.degree-- ; + } + KILL_PRINCIPAL_COL (c) ; + } + } + DEBUG1 (("colamd: Dense and null columns killed: "ID"\n", n_col - n_col2)) ; + + /* === Kill dense and empty rows ======================================== */ + + /* Note that there can now be empty rows, since dense columns have + * been deleted. These are "newly" empty rows. */ + + ne = 0 ; + for (r = 0 ; r < n_row ; r++) + { + deg = Row [r].shared1.degree ; + ASSERT (deg >= 0 && deg <= n_col) ; + /* --------------------- */ + /* added for UMFPACK */ + if (deg > dense_row_count) + { + /* There is at least one dense row. Continue ordering, but */ + /* symbolic factorization will be redone after UMF_colamd is done.*/ + ndense_row++ ; + } + if (deg == 0) + { + /* this is a newly empty row, or original empty row */ + ne++ ; + } + /* --------------------- */ + if (deg > dense_row_count || deg == 0) + { + /* kill a dense or empty row */ + KILL_ROW (r) ; + /* --------------------- */ + /* added for UMFPACK */ + Row [r].thickness = 0 ; + /* --------------------- */ + --n_row2 ; + } + else + { + /* keep track of max degree of remaining rows */ + max_deg = MAX (max_deg, deg) ; + } + } + nnewlyempty_row = ne - nempty_row ; + DEBUG1 (("colamd: Dense rows killed: "ID"\n", ndense_row)) ; + DEBUG1 (("colamd: Dense and null rows killed: "ID"\n", n_row - n_row2)) ; + + /* === Compute initial column scores ==================================== */ + + /* At this point the row degrees are accurate. They reflect the number */ + /* of "live" (non-dense) columns in each row. No empty rows exist. */ + /* Some "live" columns may contain only dead rows, however. These are */ + /* pruned in the code below. */ + + /* now find the initial matlab score for each column */ + for (c = n_col-1 ; c >= 0 ; c--) + { + /* skip dead column */ + if (COL_IS_DEAD (c)) + { + continue ; + } + score = 0 ; + cp = &A [Col [c].start] ; + new_cp = cp ; + cp_end = cp + Col [c].length ; + while (cp < cp_end) + { + /* get a row */ + row = *cp++ ; + /* skip if dead */ + if (ROW_IS_DEAD (row)) + { + continue ; + } + /* compact the column */ + *new_cp++ = row ; + /* add row's external degree */ + score += Row [row].shared1.degree - 1 ; + /* guard against integer overflow */ + score = MIN (score, n_col) ; + } + /* determine pruned column length */ + col_length = (Int) (new_cp - &A [Col [c].start]) ; + if (col_length == 0) + { + /* a newly-made null column (all rows in this col are "dense" */ + /* and have already been killed) */ + DEBUG2 (("Newly null killed: "ID"\n", c)) ; + Col [c].shared2.order = --n_col2 ; + KILL_PRINCIPAL_COL (c) ; + /* --------------------- */ + /* added for UMFPACK */ + nnewlyempty_col++ ; + /* --------------------- */ + } + else + { + /* set column length and set score */ + ASSERT (score >= 0) ; + ASSERT (score <= n_col) ; + Col [c].length = col_length ; + Col [c].shared2.score = score ; + } + } + DEBUG1 (("colamd: Dense, null, and newly-null columns killed: "ID"\n", + n_col-n_col2)) ; + + /* At this point, all empty rows and columns are dead. All live columns */ + /* are "clean" (containing no dead rows) and simplicial (no supercolumns */ + /* yet). Rows may contain dead columns, but all live rows contain at */ + /* least one live column. */ + +#ifndef NDEBUG + debug_structures (n_row, n_col, Row, Col, A, n_col2) ; +#endif /* NDEBUG */ + + /* === Initialize degree lists ========================================== */ + +#ifndef NDEBUG + debug_count = 0 ; +#endif /* NDEBUG */ + + /* clear the hash buckets */ + for (c = 0 ; c <= n_col ; c++) + { + head [c] = EMPTY ; + } + min_score = n_col ; + /* place in reverse order, so low column indices are at the front */ + /* of the lists. This is to encourage natural tie-breaking */ + for (c = n_col-1 ; c >= 0 ; c--) + { + /* only add principal columns to degree lists */ + if (COL_IS_ALIVE (c)) + { + DEBUG4 (("place "ID" score "ID" minscore "ID" ncol "ID"\n", + c, Col [c].shared2.score, min_score, n_col)) ; + + /* === Add columns score to DList =============================== */ + + score = Col [c].shared2.score ; + + ASSERT (min_score >= 0) ; + ASSERT (min_score <= n_col) ; + ASSERT (score >= 0) ; + ASSERT (score <= n_col) ; + ASSERT (head [score] >= EMPTY) ; + + /* now add this column to dList at proper score location */ + next_col = head [score] ; + Col [c].shared3.prev = EMPTY ; + Col [c].shared4.degree_next = next_col ; + + /* if there already was a column with the same score, set its */ + /* previous pointer to this new column */ + if (next_col != EMPTY) + { + Col [next_col].shared3.prev = c ; + } + head [score] = c ; + + /* see if this score is less than current min */ + min_score = MIN (min_score, score) ; + +#ifndef NDEBUG + debug_count++ ; +#endif /* NDEBUG */ + + } + } + +#ifndef NDEBUG + DEBUG1 (("colamd: Live cols "ID" out of "ID", non-princ: "ID"\n", + debug_count, n_col, n_col-debug_count)) ; + ASSERT (debug_count == n_col2) ; + debug_deg_lists (n_row, n_col, Row, Col, head, min_score, n_col2, max_deg) ; +#endif /* NDEBUG */ + + /* === Return number of remaining columns, and max row degree =========== */ + + *p_n_col2 = n_col2 ; + *p_n_row2 = n_row2 ; + *p_max_deg = max_deg ; + + /* --------------------- */ + /* added for UMFPACK */ + *p_ndense_row = ndense_row ; + *p_nempty_row = nempty_row ; /* original empty rows */ + *p_nnewlyempty_row = nnewlyempty_row ; + *p_ndense_col = ndense_col ; + *p_nempty_col = nempty_col ; /* original empty cols */ + *p_nnewlyempty_col = nnewlyempty_col ; + /* --------------------- */ +} + + +/* ========================================================================== */ +/* === find_ordering ======================================================== */ +/* ========================================================================== */ + +/* + Order the principal columns of the supercolumn form of the matrix + (no supercolumns on input). Uses a minimum approximate column minimum + degree ordering method. Not user-callable. +*/ + +PRIVATE Int find_ordering /* return the number of garbage collections */ +( + /* === Parameters ======================================================= */ + + Int n_row, /* number of rows of A */ + Int n_col, /* number of columns of A */ + Int Alen, /* size of A, 2*nnz + n_col or larger */ + Colamd_Row Row [], /* of size n_row+1 */ + Colamd_Col Col [], /* of size n_col+1 */ + Int A [], /* column form and row form of A */ + Int head [], /* of size n_col+1 */ + Int n_col2, /* Remaining columns to order */ + Int max_deg, /* Maximum row degree */ + Int pfree /* index of first free slot (2*nnz on entry) */ + /* ------------------ */ + /* added for UMFPACK: */ + , Int Front_npivcol [ ] + , Int Front_nrows [ ] + , Int Front_ncols [ ] + , Int Front_parent [ ] + , Int Front_cols [ ] + , Int *p_nfr /* number of fronts */ + , Int aggressive + , Int InFront [ ] + /* ------------------ */ +) +{ + /* === Local variables ================================================== */ + + Int k ; /* current pivot ordering step */ + Int pivot_col ; /* current pivot column */ + Int *cp ; /* a column pointer */ + Int *rp ; /* a row pointer */ + Int pivot_row ; /* current pivot row */ + Int *new_cp ; /* modified column pointer */ + Int *new_rp ; /* modified row pointer */ + Int pivot_row_start ; /* pointer to start of pivot row */ + Int pivot_row_degree ; /* number of columns in pivot row */ + Int pivot_row_length ; /* number of supercolumns in pivot row */ + Int pivot_col_score ; /* score of pivot column */ + Int needed_memory ; /* free space needed for pivot row */ + Int *cp_end ; /* pointer to the end of a column */ + Int *rp_end ; /* pointer to the end of a row */ + Int row ; /* a row index */ + Int col ; /* a column index */ + Int max_score ; /* maximum possible score */ + Int cur_score ; /* score of current column */ + unsigned Int hash ; /* hash value for supernode detection */ + Int head_column ; /* head of hash bucket */ + Int first_col ; /* first column in hash bucket */ + Int tag_mark ; /* marker value for mark array */ + Int row_mark ; /* Row [row].shared2.mark */ + Int set_difference ; /* set difference size of row with pivot row */ + Int min_score ; /* smallest column score */ + Int col_thickness ; /* "thickness" (no. of columns in a supercol) */ + Int max_mark ; /* maximum value of tag_mark */ + Int pivot_col_thickness ; /* number of columns represented by pivot col */ + Int prev_col ; /* Used by Dlist operations. */ + Int next_col ; /* Used by Dlist operations. */ + Int ngarbage ; /* number of garbage collections performed */ + +#ifndef NDEBUG + Int debug_d ; /* debug loop counter */ + Int debug_step = 0 ; /* debug loop counter */ +#endif /* NDEBUG */ + + /* ------------------ */ + /* added for UMFPACK: */ + Int pivot_row_thickness ; /* number of rows represented by pivot row */ + Int nfr = 0 ; /* number of fronts */ + Int child ; + /* ------------------ */ + + /* === Initialization and clear mark ==================================== */ + + max_mark = MAX_MARK (n_col) ; /* defined in umfpack.h */ + tag_mark = clear_mark (n_row, Row) ; + min_score = 0 ; + ngarbage = 0 ; + DEBUG1 (("colamd: Ordering, n_col2="ID"\n", n_col2)) ; + + for (row = 0 ; row < n_row ; row++) + { + InFront [row] = EMPTY ; + } + + /* === Order the columns ================================================ */ + + for (k = 0 ; k < n_col2 ; /* 'k' is incremented below */) + { + +#ifndef NDEBUG + if (debug_step % 100 == 0) + { + DEBUG2 (("\n... Step k: "ID" out of n_col2: "ID"\n", k, n_col2)) ; + } + else + { + DEBUG3 (("\n-----Step k: "ID" out of n_col2: "ID"\n", k, n_col2)) ; + } + debug_step++ ; + debug_deg_lists (n_row, n_col, Row, Col, head, + min_score, n_col2-k, max_deg) ; + debug_matrix (n_row, n_col, Row, Col, A) ; +#endif /* NDEBUG */ + + /* === Select pivot column, and order it ============================ */ + + /* make sure degree list isn't empty */ + ASSERT (min_score >= 0) ; + ASSERT (min_score <= n_col) ; + ASSERT (head [min_score] >= EMPTY) ; + +#ifndef NDEBUG + for (debug_d = 0 ; debug_d < min_score ; debug_d++) + { + ASSERT (head [debug_d] == EMPTY) ; + } +#endif /* NDEBUG */ + + /* get pivot column from head of minimum degree list */ + while (head [min_score] == EMPTY && min_score < n_col) + { + min_score++ ; + } + pivot_col = head [min_score] ; + ASSERT (pivot_col >= 0 && pivot_col <= n_col) ; + next_col = Col [pivot_col].shared4.degree_next ; + head [min_score] = next_col ; + if (next_col != EMPTY) + { + Col [next_col].shared3.prev = EMPTY ; + } + + ASSERT (COL_IS_ALIVE (pivot_col)) ; + DEBUG3 (("Pivot col: "ID"\n", pivot_col)) ; + + /* remember score for defrag check */ + pivot_col_score = Col [pivot_col].shared2.score ; + + /* the pivot column is the kth column in the pivot order */ + Col [pivot_col].shared2.order = k ; + + /* increment order count by column thickness */ + pivot_col_thickness = Col [pivot_col].shared1.thickness ; + /* ------------------ */ + /* changed for UMFPACK: */ + k += pivot_col_thickness ; + /* ------------------ */ + ASSERT (pivot_col_thickness > 0) ; + + /* === Garbage_collection, if necessary ============================= */ + + needed_memory = MIN (pivot_col_score, n_col - k) ; + if (pfree + needed_memory >= Alen) + { + pfree = garbage_collection (n_row, n_col, Row, Col, A, &A [pfree]) ; + ngarbage++ ; + /* after garbage collection we will have enough */ + ASSERT (pfree + needed_memory < Alen) ; + /* garbage collection has wiped out the Row[].shared2.mark array */ + tag_mark = clear_mark (n_row, Row) ; + +#ifndef NDEBUG + debug_matrix (n_row, n_col, Row, Col, A) ; +#endif /* NDEBUG */ + } + + /* === Compute pivot row pattern ==================================== */ + + /* get starting location for this new merged row */ + pivot_row_start = pfree ; + + /* initialize new row counts to zero */ + pivot_row_degree = 0 ; + + /* ------------------ */ + /* added for UMFPACK: */ + pivot_row_thickness = 0 ; + /* ------------------ */ + + /* [ tag pivot column as having been visited so it isn't included */ + /* in merged pivot row */ + Col [pivot_col].shared1.thickness = -pivot_col_thickness ; + + /* pivot row is the union of all rows in the pivot column pattern */ + cp = &A [Col [pivot_col].start] ; + cp_end = cp + Col [pivot_col].length ; + while (cp < cp_end) + { + /* get a row */ + row = *cp++ ; + DEBUG4 (("Pivot col pattern %d "ID"\n", ROW_IS_ALIVE(row), row)) ; + /* skip if row is dead */ + if (ROW_IS_DEAD (row)) + { + continue ; + } + + /* ------------------ */ + /* added for UMFPACK: */ + /* sum the thicknesses of all the rows */ + /* ASSERT (Row [row].thickness > 0) ; */ + pivot_row_thickness += Row [row].thickness ; + /* ------------------ */ + + rp = &A [Row [row].start] ; + rp_end = rp + Row [row].length ; + while (rp < rp_end) + { + /* get a column */ + col = *rp++ ; + /* add the column, if alive and untagged */ + col_thickness = Col [col].shared1.thickness ; + if (col_thickness > 0 && COL_IS_ALIVE (col)) + { + /* tag column in pivot row */ + Col [col].shared1.thickness = -col_thickness ; + ASSERT (pfree < Alen) ; + /* place column in pivot row */ + A [pfree++] = col ; + pivot_row_degree += col_thickness ; + /* ------------------ */ + /* added for UMFPACK: */ + DEBUG4 (("\t\t\tNew live column in pivot row: "ID"\n",col)); + /* ------------------ */ + } + /* ------------------ */ + /* added for UMFPACK */ +#ifndef NDEBUG + if (col_thickness < 0 && COL_IS_ALIVE (col)) + { + DEBUG4 (("\t\t\tOld live column in pivot row: "ID"\n",col)); + } +#endif + /* ------------------ */ + } + } + + /* ------------------ */ + /* added for UMFPACK: */ + /* pivot_row_thickness is the number of rows in frontal matrix */ + /* both pivotal rows and nonpivotal rows */ + /* ------------------ */ + + /* clear tag on pivot column */ + Col [pivot_col].shared1.thickness = pivot_col_thickness ; /* ] */ + max_deg = MAX (max_deg, pivot_row_degree) ; + +#ifndef NDEBUG + DEBUG3 (("check2\n")) ; + debug_mark (n_row, Row, tag_mark, max_mark) ; +#endif /* NDEBUG */ + + /* === Kill all rows used to construct pivot row ==================== */ + + /* also kill pivot row, temporarily */ + cp = &A [Col [pivot_col].start] ; + cp_end = cp + Col [pivot_col].length ; + while (cp < cp_end) + { + /* may be killing an already dead row */ + row = *cp++ ; + + DEBUG2 (("Kill row in pivot col: "ID" alive? %d, front "ID"\n", + row, ROW_IS_ALIVE (row), Row [row].front)) ; + + /* added for UMFPACK: */ + if (ROW_IS_ALIVE (row)) + { + if (Row [row].front != EMPTY) + { + /* This row represents a frontal matrix. */ + /* Row [row].front is a child of current front */ + child = Row [row].front ; + Front_parent [child] = nfr ; + DEBUG1 (("Front "ID" => front "ID", normal\n", child, nfr)); + } + else + { + /* This is an original row. Keep track of which front + * is its parent in the row-merge tree. */ + InFront [row] = nfr ; + DEBUG1 (("Row "ID" => front "ID", normal\n", row, nfr)) ; + } + } + + KILL_ROW (row) ; + + /* ------------------ */ + /* added for UMFPACK: */ + Row [row].thickness = 0 ; + /* ------------------ */ + } + + /* === Select a row index to use as the new pivot row =============== */ + + pivot_row_length = pfree - pivot_row_start ; + if (pivot_row_length > 0) + { + /* pick the "pivot" row arbitrarily (first row in col) */ + pivot_row = A [Col [pivot_col].start] ; + DEBUG3 (("Pivotal row is "ID"\n", pivot_row)) ; + } + else + { + /* there is no pivot row, since it is of zero length */ + pivot_row = EMPTY ; + ASSERT (pivot_row_length == 0) ; + } + ASSERT (Col [pivot_col].length > 0 || pivot_row_length == 0) ; + + /* === Approximate degree computation =============================== */ + + /* Here begins the computation of the approximate degree. The column */ + /* score is the sum of the pivot row "length", plus the size of the */ + /* set differences of each row in the column minus the pattern of the */ + /* pivot row itself. The column ("thickness") itself is also */ + /* excluded from the column score (we thus use an approximate */ + /* external degree). */ + + /* The time taken by the following code (compute set differences, and */ + /* add them up) is proportional to the size of the data structure */ + /* being scanned - that is, the sum of the sizes of each column in */ + /* the pivot row. Thus, the amortized time to compute a column score */ + /* is proportional to the size of that column (where size, in this */ + /* context, is the column "length", or the number of row indices */ + /* in that column). The number of row indices in a column is */ + /* monotonically non-decreasing, from the length of the original */ + /* column on input to colamd. */ + + /* === Compute set differences ====================================== */ + + DEBUG3 (("** Computing set differences phase. **\n")) ; + + /* pivot row is currently dead - it will be revived later. */ + + DEBUG3 (("Pivot row: \n")) ; + /* for each column in pivot row */ + rp = &A [pivot_row_start] ; + rp_end = rp + pivot_row_length ; + while (rp < rp_end) + { + col = *rp++ ; + ASSERT (COL_IS_ALIVE (col) && col != pivot_col) ; + DEBUG3 ((" Col: "ID"\n", col)) ; + + /* clear tags used to construct pivot row pattern */ + col_thickness = -Col [col].shared1.thickness ; + ASSERT (col_thickness > 0) ; + Col [col].shared1.thickness = col_thickness ; + + /* === Remove column from degree list =========================== */ + + cur_score = Col [col].shared2.score ; + prev_col = Col [col].shared3.prev ; + next_col = Col [col].shared4.degree_next ; + ASSERT (cur_score >= 0) ; + ASSERT (cur_score <= n_col) ; + ASSERT (cur_score >= EMPTY) ; + if (prev_col == EMPTY) + { + head [cur_score] = next_col ; + } + else + { + Col [prev_col].shared4.degree_next = next_col ; + } + if (next_col != EMPTY) + { + Col [next_col].shared3.prev = prev_col ; + } + + /* === Scan the column ========================================== */ + + cp = &A [Col [col].start] ; + cp_end = cp + Col [col].length ; + while (cp < cp_end) + { + /* get a row */ + row = *cp++ ; + row_mark = Row [row].shared2.mark ; + /* skip if dead */ + if (ROW_IS_MARKED_DEAD (row_mark)) + { + continue ; + } + ASSERT (row != pivot_row) ; + set_difference = row_mark - tag_mark ; + /* check if the row has been seen yet */ + if (set_difference < 0) + { + ASSERT (Row [row].shared1.degree <= max_deg) ; + set_difference = Row [row].shared1.degree ; + } + /* subtract column thickness from this row's set difference */ + set_difference -= col_thickness ; + ASSERT (set_difference >= 0) ; + ASSERT (ROW_IS_ALIVE (row)) ; + + /* absorb this row if the set difference becomes zero */ + if (set_difference == 0 && aggressive) + { + /* v4.1: do aggressive absorption */ + DEBUG3 (("aggressive absorption. Row: "ID"\n", row)) ; + + if (Row [row].front != EMPTY) + { + /* Row [row].front is a child of current front. */ + child = Row [row].front ; + Front_parent [child] = nfr ; + DEBUG1 (("Front "ID" => front "ID", aggressive\n", + child, nfr)) ; + } + else + { + /* this is an original row. Keep track of which front + * assembles it, for the row-merge tree */ + InFront [row] = nfr ; + DEBUG1 (("Row "ID" => front "ID", aggressive\n", + row, nfr)) ; + } + + KILL_ROW (row) ; + + /* sum the thicknesses of all the rows */ + /* ASSERT (Row [row].thickness > 0) ; */ + pivot_row_thickness += Row [row].thickness ; + Row [row].thickness = 0 ; + + } + else + { + /* save the new mark */ + Row [row].shared2.mark = set_difference + tag_mark ; + } + } + } + +#ifndef NDEBUG + debug_deg_lists (n_row, n_col, Row, Col, head, + min_score, n_col2-k-pivot_row_degree, max_deg) ; +#endif /* NDEBUG */ + + /* === Add up set differences for each column ======================= */ + + DEBUG3 (("** Adding set differences phase. **\n")) ; + + /* for each column in pivot row */ + rp = &A [pivot_row_start] ; + rp_end = rp + pivot_row_length ; + while (rp < rp_end) + { + /* get a column */ + col = *rp++ ; + ASSERT (COL_IS_ALIVE (col) && col != pivot_col) ; + hash = 0 ; + cur_score = 0 ; + cp = &A [Col [col].start] ; + /* compact the column */ + new_cp = cp ; + cp_end = cp + Col [col].length ; + + DEBUG4 (("Adding set diffs for Col: "ID".\n", col)) ; + + while (cp < cp_end) + { + /* get a row */ + row = *cp++ ; + ASSERT(row >= 0 && row < n_row) ; + row_mark = Row [row].shared2.mark ; + /* skip if dead */ + if (ROW_IS_MARKED_DEAD (row_mark)) + { + /* ------------------ */ + /* changed for UMFPACK: */ + DEBUG4 ((" Row "ID", dead\n", row)) ; + /* ------------------ */ + continue ; + } + /* ------------------ */ + /* changed for UMFPACK: */ + /* ASSERT (row_mark > tag_mark) ; */ + DEBUG4 ((" Row "ID", set diff "ID"\n", row, row_mark-tag_mark)); + ASSERT (row_mark >= tag_mark) ; + /* ------------------ */ + /* compact the column */ + *new_cp++ = row ; + /* compute hash function */ + hash += row ; + /* add set difference */ + cur_score += row_mark - tag_mark ; + /* integer overflow... */ + cur_score = MIN (cur_score, n_col) ; + } + + /* recompute the column's length */ + Col [col].length = (Int) (new_cp - &A [Col [col].start]) ; + + /* === Further mass elimination ================================= */ + + if (Col [col].length == 0) + { + DEBUG4 (("further mass elimination. Col: "ID"\n", col)) ; + /* nothing left but the pivot row in this column */ + KILL_PRINCIPAL_COL (col) ; + pivot_row_degree -= Col [col].shared1.thickness ; + ASSERT (pivot_row_degree >= 0) ; + /* order it */ + Col [col].shared2.order = k ; + /* increment order count by column thickness */ + k += Col [col].shared1.thickness ; + + /* ------------------ */ + /* added for UMFPACK: */ + pivot_col_thickness += Col [col].shared1.thickness ; + + /* add to column list of front ... */ +#ifndef NDEBUG + DEBUG1 (("Mass")) ; + dump_super (col, Col, n_col) ; +#endif + Col [Col [col].lastcol].nextcol = Front_cols [nfr] ; + Front_cols [nfr] = col ; + /* ------------------ */ + + } + else + { + /* === Prepare for supercolumn detection ==================== */ + + DEBUG4 (("Preparing supercol detection for Col: "ID".\n", col)); + + /* save score so far */ + Col [col].shared2.score = cur_score ; + + /* add column to hash table, for supercolumn detection */ + /* NOTE: hash is an unsigned Int to avoid a problem in ANSI C. + * The sign of the expression a % b is not defined when a and/or + * b are negative. Since hash is unsigned and n_col >= 0, + * this problem is avoided. */ + hash %= n_col + 1 ; + + DEBUG4 ((" Hash = "ID", n_col = "ID".\n", (Int) hash, n_col)) ; + ASSERT (((Int) hash) <= n_col) ; + + head_column = head [hash] ; + if (head_column > EMPTY) + { + /* degree list "hash" is non-empty, use prev (shared3) of */ + /* first column in degree list as head of hash bucket */ + first_col = Col [head_column].shared3.headhash ; + Col [head_column].shared3.headhash = col ; + } + else + { + /* degree list "hash" is empty, use head as hash bucket */ + first_col = - (head_column + 2) ; + head [hash] = - (col + 2) ; + } + Col [col].shared4.hash_next = first_col ; + + /* save hash function in Col [col].shared3.hash */ + Col [col].shared3.hash = (Int) hash ; + ASSERT (COL_IS_ALIVE (col)) ; + } + } + + /* The approximate external column degree is now computed. */ + + /* === Supercolumn detection ======================================== */ + + DEBUG3 (("** Supercolumn detection phase. **\n")) ; + + detect_super_cols ( + +#ifndef NDEBUG + n_col, Row, +#endif /* NDEBUG */ + + Col, A, head, pivot_row_start, pivot_row_length) ; + + /* === Kill the pivotal column ====================================== */ + + KILL_PRINCIPAL_COL (pivot_col) ; + + /* ------------------ */ + /* added for UMFPACK: */ + /* add columns to column list of front */ +#ifndef NDEBUG + DEBUG1 (("Pivot")) ; + dump_super (pivot_col, Col, n_col) ; +#endif + Col [Col [pivot_col].lastcol].nextcol = Front_cols [nfr] ; + Front_cols [nfr] = pivot_col ; + /* ------------------ */ + + /* === Clear mark =================================================== */ + + tag_mark += (max_deg + 1) ; + if (tag_mark >= max_mark) + { + DEBUG2 (("clearing tag_mark\n")) ; + tag_mark = clear_mark (n_row, Row) ; + } + +#ifndef NDEBUG + DEBUG3 (("check3\n")) ; + debug_mark (n_row, Row, tag_mark, max_mark) ; +#endif /* NDEBUG */ + + /* === Finalize the new pivot row, and column scores ================ */ + + DEBUG3 (("** Finalize scores phase. **\n")) ; + DEBUG3 (("pivot_row_degree "ID"\n", pivot_row_degree)) ; + + /* for each column in pivot row */ + rp = &A [pivot_row_start] ; + /* compact the pivot row */ + new_rp = rp ; + rp_end = rp + pivot_row_length ; + while (rp < rp_end) + { + col = *rp++ ; + DEBUG3 (("Col "ID" \n", col)) ; + /* skip dead columns */ + if (COL_IS_DEAD (col)) + { + DEBUG3 (("dead\n")) ; + continue ; + } + *new_rp++ = col ; + /* add new pivot row to column */ + A [Col [col].start + (Col [col].length++)] = pivot_row ; + + /* retrieve score so far and add on pivot row's degree. */ + /* (we wait until here for this in case the pivot */ + /* row's degree was reduced due to mass elimination). */ + cur_score = Col [col].shared2.score + pivot_row_degree ; + DEBUG3 ((" cur_score "ID" ", cur_score)) ; + + /* calculate the max possible score as the number of */ + /* external columns minus the 'k' value minus the */ + /* columns thickness */ + max_score = n_col - k - Col [col].shared1.thickness ; + DEBUG3 ((" max_score "ID" ", max_score)) ; + + /* make the score the external degree of the union-of-rows */ + cur_score -= Col [col].shared1.thickness ; + DEBUG3 ((" cur_score "ID" ", cur_score)) ; + + /* make sure score is less or equal than the max score */ + cur_score = MIN (cur_score, max_score) ; + ASSERT (cur_score >= 0) ; + + /* store updated score */ + Col [col].shared2.score = cur_score ; + DEBUG3 ((" "ID"\n", cur_score)) ; + + /* === Place column back in degree list ========================= */ + + ASSERT (min_score >= 0) ; + ASSERT (min_score <= n_col) ; + ASSERT (cur_score >= 0) ; + ASSERT (cur_score <= n_col) ; + ASSERT (head [cur_score] >= EMPTY) ; + next_col = head [cur_score] ; + Col [col].shared4.degree_next = next_col ; + Col [col].shared3.prev = EMPTY ; + if (next_col != EMPTY) + { + Col [next_col].shared3.prev = col ; + } + head [cur_score] = col ; + + /* see if this score is less than current min */ + min_score = MIN (min_score, cur_score) ; + + } + +#ifndef NDEBUG + debug_deg_lists (n_row, n_col, Row, Col, head, + min_score, n_col2-k, max_deg) ; +#endif /* NDEBUG */ + + /* ------------------ */ + /* added for UMFPACK: */ + /* frontal matrix can have more pivot cols than pivot rows for */ + /* singular matrices. */ + + /* number of candidate pivot columns */ + Front_npivcol [nfr] = pivot_col_thickness ; + + /* all rows (not just size of contrib. block) */ + Front_nrows [nfr] = pivot_row_thickness ; + + /* all cols */ + Front_ncols [nfr] = pivot_col_thickness + pivot_row_degree ; + + Front_parent [nfr] = EMPTY ; + + pivot_row_thickness -= pivot_col_thickness ; + DEBUG1 (("Front "ID" Pivot_row_thickness after pivot cols elim: "ID"\n", + nfr, pivot_row_thickness)) ; + pivot_row_thickness = MAX (0, pivot_row_thickness) ; + /* ------------------ */ + + /* === Resurrect the new pivot row ================================== */ + + if (pivot_row_degree > 0 + /* ------------------ */ + /* added for UMFPACK. Note that this part of the expression should be + * removed if this routine is used outside of UMFPACK, for a Cholesky + * factorization of (AQ)'(AQ) */ + && pivot_row_thickness > 0 + /* ------------------ */ + ) + { + /* update pivot row length to reflect any cols that were killed */ + /* during super-col detection and mass elimination */ + Row [pivot_row].start = pivot_row_start ; + Row [pivot_row].length = (Int) (new_rp - &A[pivot_row_start]) ; + ASSERT (Row [pivot_row].length > 0) ; + Row [pivot_row].shared1.degree = pivot_row_degree ; + Row [pivot_row].shared2.mark = 0 ; + /* ------------------ */ + /* added for UMFPACK: */ + Row [pivot_row].thickness = pivot_row_thickness ; + Row [pivot_row].front = nfr ; + /* ------------------ */ + /* pivot row is no longer dead */ + } + + /* ------------------ */ + /* added for UMFPACK: */ + +#ifndef NDEBUG + DEBUG1 (("Front "ID" : "ID" "ID" "ID" ", nfr, + Front_npivcol [nfr], Front_nrows [nfr], Front_ncols [nfr])) ; + DEBUG1 ((" cols:[ ")) ; + debug_d = 0 ; + for (col = Front_cols [nfr] ; col != EMPTY ; col = Col [col].nextcol) + { + DEBUG1 ((" "ID, col)) ; + ASSERT (col >= 0 && col < n_col) ; + ASSERT (COL_IS_DEAD (col)) ; + debug_d++ ; + ASSERT (debug_d <= pivot_col_thickness) ; + } + ASSERT (debug_d == pivot_col_thickness) ; + DEBUG1 ((" ]\n ")) ; +#endif + nfr++ ; /* one more front */ + /* ------------------ */ + + } + + /* === All principal columns have now been ordered ====================== */ + + /* ------------------ */ + /* added for UMFPACK: */ + *p_nfr = nfr ; + /* ------------------ */ + + return (ngarbage) ; +} + + +/* ========================================================================== */ +/* === order_children deleted for UMFPACK =================================== */ +/* ========================================================================== */ + +/* ========================================================================== */ +/* === detect_super_cols ==================================================== */ +/* ========================================================================== */ + +/* + Detects supercolumns by finding matches between columns in the hash buckets. + Check amongst columns in the set A [row_start ... row_start + row_length-1]. + The columns under consideration are currently *not* in the degree lists, + and have already been placed in the hash buckets. + + The hash bucket for columns whose hash function is equal to h is stored + as follows: + + if head [h] is >= 0, then head [h] contains a degree list, so: + + head [h] is the first column in degree bucket h. + Col [head [h]].headhash gives the first column in hash bucket h. + + otherwise, the degree list is empty, and: + + -(head [h] + 2) is the first column in hash bucket h. + + For a column c in a hash bucket, Col [c].shared3.prev is NOT a "previous + column" pointer. Col [c].shared3.hash is used instead as the hash number + for that column. The value of Col [c].shared4.hash_next is the next column + in the same hash bucket. + + Assuming no, or "few" hash collisions, the time taken by this routine is + linear in the sum of the sizes (lengths) of each column whose score has + just been computed in the approximate degree computation. + Not user-callable. +*/ + +PRIVATE void detect_super_cols +( + /* === Parameters ======================================================= */ + +#ifndef NDEBUG + /* these two parameters are only needed when debugging is enabled: */ + Int n_col, /* number of columns of A */ + Colamd_Row Row [], /* of size n_row+1 */ +#endif /* NDEBUG */ + + Colamd_Col Col [], /* of size n_col+1 */ + Int A [], /* row indices of A */ + Int head [], /* head of degree lists and hash buckets */ + Int row_start, /* pointer to set of columns to check */ + Int row_length /* number of columns to check */ +) +{ + /* === Local variables ================================================== */ + + Int hash ; /* hash value for a column */ + Int *rp ; /* pointer to a row */ + Int c ; /* a column index */ + Int super_c ; /* column index of the column to absorb into */ + Int *cp1 ; /* column pointer for column super_c */ + Int *cp2 ; /* column pointer for column c */ + Int length ; /* length of column super_c */ + Int prev_c ; /* column preceding c in hash bucket */ + Int i ; /* loop counter */ + Int *rp_end ; /* pointer to the end of the row */ + Int col ; /* a column index in the row to check */ + Int head_column ; /* first column in hash bucket or degree list */ + Int first_col ; /* first column in hash bucket */ + + /* === Consider each column in the row ================================== */ + + rp = &A [row_start] ; + rp_end = rp + row_length ; + while (rp < rp_end) + { + col = *rp++ ; + if (COL_IS_DEAD (col)) + { + continue ; + } + + /* get hash number for this column */ + hash = Col [col].shared3.hash ; + ASSERT (hash <= n_col) ; + + /* === Get the first column in this hash bucket ===================== */ + + head_column = head [hash] ; + if (head_column > EMPTY) + { + first_col = Col [head_column].shared3.headhash ; + } + else + { + first_col = - (head_column + 2) ; + } + + /* === Consider each column in the hash bucket ====================== */ + + for (super_c = first_col ; super_c != EMPTY ; + super_c = Col [super_c].shared4.hash_next) + { + ASSERT (COL_IS_ALIVE (super_c)) ; + ASSERT (Col [super_c].shared3.hash == hash) ; + length = Col [super_c].length ; + + /* prev_c is the column preceding column c in the hash bucket */ + prev_c = super_c ; + + /* === Compare super_c with all columns after it ================ */ + + for (c = Col [super_c].shared4.hash_next ; + c != EMPTY ; c = Col [c].shared4.hash_next) + { + ASSERT (c != super_c) ; + ASSERT (COL_IS_ALIVE (c)) ; + ASSERT (Col [c].shared3.hash == hash) ; + + /* not identical if lengths or scores are different */ + if (Col [c].length != length || + Col [c].shared2.score != Col [super_c].shared2.score) + { + prev_c = c ; + continue ; + } + + /* compare the two columns */ + cp1 = &A [Col [super_c].start] ; + cp2 = &A [Col [c].start] ; + + for (i = 0 ; i < length ; i++) + { + /* the columns are "clean" (no dead rows) */ + ASSERT (ROW_IS_ALIVE (*cp1)) ; + ASSERT (ROW_IS_ALIVE (*cp2)) ; + /* row indices will same order for both supercols, */ + /* no gather scatter nessasary */ + if (*cp1++ != *cp2++) + { + break ; + } + } + + /* the two columns are different if the for-loop "broke" */ + if (i != length) + { + prev_c = c ; + continue ; + } + + /* === Got it! two columns are identical =================== */ + + ASSERT (Col [c].shared2.score == Col [super_c].shared2.score) ; + + Col [super_c].shared1.thickness += Col [c].shared1.thickness ; + Col [c].shared1.parent = super_c ; + KILL_NON_PRINCIPAL_COL (c) ; + + Col [c].shared2.order = EMPTY ; + /* remove c from hash bucket */ + Col [prev_c].shared4.hash_next = Col [c].shared4.hash_next ; + + /* ------------------ */ + /* added for UMFPACK: */ + /* add c to end of list of super_c */ + ASSERT (Col [super_c].lastcol >= 0) ; + ASSERT (Col [super_c].lastcol < n_col) ; + Col [Col [super_c].lastcol].nextcol = c ; + Col [super_c].lastcol = Col [c].lastcol ; +#ifndef NDEBUG + /* dump the supercolumn */ + DEBUG1 (("Super")) ; + dump_super (super_c, Col, n_col) ; +#endif + /* ------------------ */ + + } + } + + /* === Empty this hash bucket ======================================= */ + + if (head_column > EMPTY) + { + /* corresponding degree list "hash" is not empty */ + Col [head_column].shared3.headhash = EMPTY ; + } + else + { + /* corresponding degree list "hash" is empty */ + head [hash] = EMPTY ; + } + } +} + + +/* ========================================================================== */ +/* === garbage_collection =================================================== */ +/* ========================================================================== */ + +/* + Defragments and compacts columns and rows in the workspace A. Used when + all avaliable memory has been used while performing row merging. Returns + the index of the first free position in A, after garbage collection. The + time taken by this routine is linear is the size of the array A, which is + itself linear in the number of nonzeros in the input matrix. + Not user-callable. +*/ + +PRIVATE Int garbage_collection /* returns the new value of pfree */ +( + /* === Parameters ======================================================= */ + + Int n_row, /* number of rows */ + Int n_col, /* number of columns */ + Colamd_Row Row [], /* row info */ + Colamd_Col Col [], /* column info */ + Int A [], /* A [0 ... Alen-1] holds the matrix */ + Int *pfree /* &A [0] ... pfree is in use */ +) +{ + /* === Local variables ================================================== */ + + Int *psrc ; /* source pointer */ + Int *pdest ; /* destination pointer */ + Int j ; /* counter */ + Int r ; /* a row index */ + Int c ; /* a column index */ + Int length ; /* length of a row or column */ + +#ifndef NDEBUG + Int debug_rows ; + DEBUG2 (("Defrag..\n")) ; + for (psrc = &A[0] ; psrc < pfree ; psrc++) ASSERT (*psrc >= 0) ; + debug_rows = 0 ; +#endif /* NDEBUG */ + + /* === Defragment the columns =========================================== */ + + pdest = &A[0] ; + for (c = 0 ; c < n_col ; c++) + { + if (COL_IS_ALIVE (c)) + { + psrc = &A [Col [c].start] ; + + /* move and compact the column */ + ASSERT (pdest <= psrc) ; + Col [c].start = (Int) (pdest - &A [0]) ; + length = Col [c].length ; + for (j = 0 ; j < length ; j++) + { + r = *psrc++ ; + if (ROW_IS_ALIVE (r)) + { + *pdest++ = r ; + } + } + Col [c].length = (Int) (pdest - &A [Col [c].start]) ; + } + } + + /* === Prepare to defragment the rows =================================== */ + + for (r = 0 ; r < n_row ; r++) + { + if (ROW_IS_ALIVE (r)) + { + if (Row [r].length == 0) + { + /* :: defrag row kill :: */ + /* This row is of zero length. cannot compact it, so kill it. + * NOTE: in the current version, there are no zero-length live + * rows when garbage_collection is called. So this code will + * never trigger. However, if the code is modified, or if + * garbage_collection is called at a different place, then rows + * can be of zero length. So this test is kept, just in case. + */ + DEBUGm4 (("Defrag row kill\n")) ; + KILL_ROW (r) ; + } + else + { + /* save first column index in Row [r].shared2.first_column */ + psrc = &A [Row [r].start] ; + Row [r].shared2.first_column = *psrc ; + ASSERT (ROW_IS_ALIVE (r)) ; + /* flag the start of the row with the one's complement of row */ + *psrc = ONES_COMPLEMENT (r) ; +#ifndef NDEBUG + debug_rows++ ; +#endif /* NDEBUG */ + } + } + } + + /* === Defragment the rows ============================================== */ + + psrc = pdest ; + while (psrc < pfree) + { + /* find a negative number ... the start of a row */ + if (*psrc++ < 0) + { + psrc-- ; + /* get the row index */ + r = ONES_COMPLEMENT (*psrc) ; + ASSERT (r >= 0 && r < n_row) ; + /* restore first column index */ + *psrc = Row [r].shared2.first_column ; + ASSERT (ROW_IS_ALIVE (r)) ; + + /* move and compact the row */ + ASSERT (pdest <= psrc) ; + Row [r].start = (Int) (pdest - &A [0]) ; + length = Row [r].length ; + for (j = 0 ; j < length ; j++) + { + c = *psrc++ ; + if (COL_IS_ALIVE (c)) + { + *pdest++ = c ; + } + } + Row [r].length = (Int) (pdest - &A [Row [r].start]) ; + +#ifndef NDEBUG + debug_rows-- ; +#endif /* NDEBUG */ + + } + } + /* ensure we found all the rows */ + ASSERT (debug_rows == 0) ; + + /* === Return the new value of pfree ==================================== */ + + return ((Int) (pdest - &A [0])) ; +} + + +/* ========================================================================== */ +/* === clear_mark =========================================================== */ +/* ========================================================================== */ + +/* + Clears the Row [].shared2.mark array, and returns the new tag_mark. + Return value is the new tag_mark. Not user-callable. +*/ + +PRIVATE Int clear_mark /* return the new value for tag_mark */ +( + /* === Parameters ======================================================= */ + + Int n_row, /* number of rows in A */ + Colamd_Row Row [] /* Row [0 ... n-1].shared2.mark is set to zero */ +) +{ + /* === Local variables ================================================== */ + + Int r ; + + for (r = 0 ; r < n_row ; r++) + { + if (ROW_IS_ALIVE (r)) + { + Row [r].shared2.mark = 0 ; + } + } + + /* ------------------ */ + return (1) ; + /* ------------------ */ + +} + + +/* ========================================================================== */ +/* === print_report removed for UMFPACK ===================================== */ +/* ========================================================================== */ + + + +/* ========================================================================== */ +/* === colamd debugging routines ============================================ */ +/* ========================================================================== */ + +/* When debugging is disabled, the remainder of this file is ignored. */ + +#ifndef NDEBUG + + +/* ========================================================================== */ +/* === debug_structures ===================================================== */ +/* ========================================================================== */ + +/* + At this point, all empty rows and columns are dead. All live columns + are "clean" (containing no dead rows) and simplicial (no supercolumns + yet). Rows may contain dead columns, but all live rows contain at + least one live column. +*/ + +PRIVATE void debug_structures +( + /* === Parameters ======================================================= */ + + Int n_row, + Int n_col, + Colamd_Row Row [], + Colamd_Col Col [], + Int A [], + Int n_col2 +) +{ + /* === Local variables ================================================== */ + + Int i ; + Int c ; + Int *cp ; + Int *cp_end ; + Int len ; + Int score ; + Int r ; + Int *rp ; + Int *rp_end ; + Int deg ; + + /* === Check A, Row, and Col ============================================ */ + + for (c = 0 ; c < n_col ; c++) + { + if (COL_IS_ALIVE (c)) + { + len = Col [c].length ; + score = Col [c].shared2.score ; + DEBUG4 (("initial live col "ID" "ID" "ID"\n", c, len, score)) ; + ASSERT (len > 0) ; + ASSERT (score >= 0) ; + ASSERT (Col [c].shared1.thickness == 1) ; + cp = &A [Col [c].start] ; + cp_end = cp + len ; + while (cp < cp_end) + { + r = *cp++ ; + ASSERT (ROW_IS_ALIVE (r)) ; + } + } + else + { + i = Col [c].shared2.order ; + ASSERT (i >= n_col2 && i < n_col) ; + } + } + + for (r = 0 ; r < n_row ; r++) + { + if (ROW_IS_ALIVE (r)) + { + i = 0 ; + len = Row [r].length ; + deg = Row [r].shared1.degree ; + ASSERT (len > 0) ; + ASSERT (deg > 0) ; + rp = &A [Row [r].start] ; + rp_end = rp + len ; + while (rp < rp_end) + { + c = *rp++ ; + if (COL_IS_ALIVE (c)) + { + i++ ; + } + } + ASSERT (i > 0) ; + } + } +} + + +/* ========================================================================== */ +/* === debug_deg_lists ====================================================== */ +/* ========================================================================== */ + +/* + Prints the contents of the degree lists. Counts the number of columns + in the degree list and compares it to the total it should have. Also + checks the row degrees. +*/ + +PRIVATE void debug_deg_lists +( + /* === Parameters ======================================================= */ + + Int n_row, + Int n_col, + Colamd_Row Row [], + Colamd_Col Col [], + Int head [], + Int min_score, + Int should, + Int max_deg +) +{ + /* === Local variables ================================================== */ + + Int deg ; + Int col ; + Int have ; + Int row ; + + /* === Check the degree lists =========================================== */ + + if (n_col > 10000 && UMF_debug <= 0) + { + return ; + } + have = 0 ; + DEBUG4 (("Degree lists: "ID"\n", min_score)) ; + for (deg = 0 ; deg <= n_col ; deg++) + { + col = head [deg] ; + if (col == EMPTY) + { + continue ; + } + DEBUG4 ((ID":", deg)) ; + while (col != EMPTY) + { + DEBUG4 ((" "ID, col)) ; + have += Col [col].shared1.thickness ; + ASSERT (COL_IS_ALIVE (col)) ; + col = Col [col].shared4.degree_next ; + } + DEBUG4 (("\n")) ; + } + DEBUG4 (("should "ID" have "ID"\n", should, have)) ; + ASSERT (should == have) ; + + /* === Check the row degrees ============================================ */ + + if (n_row > 10000 && UMF_debug <= 0) + { + return ; + } + for (row = 0 ; row < n_row ; row++) + { + if (ROW_IS_ALIVE (row)) + { + ASSERT (Row [row].shared1.degree <= max_deg) ; + } + } +} + + +/* ========================================================================== */ +/* === debug_mark =========================================================== */ +/* ========================================================================== */ + +/* + Ensures that the tag_mark is less that the maximum and also ensures that + each entry in the mark array is less than the tag mark. +*/ + +PRIVATE void debug_mark +( + /* === Parameters ======================================================= */ + + Int n_row, + Colamd_Row Row [], + Int tag_mark, + Int max_mark +) +{ + /* === Local variables ================================================== */ + + Int r ; + + /* === Check the Row marks ============================================== */ + + ASSERT (tag_mark > 0 && tag_mark <= max_mark) ; + if (n_row > 10000 && UMF_debug <= 0) + { + return ; + } + for (r = 0 ; r < n_row ; r++) + { + ASSERT (Row [r].shared2.mark < tag_mark) ; + } +} + + +/* ========================================================================== */ +/* === debug_matrix ========================================================= */ +/* ========================================================================== */ + +/* + Prints out the contents of the columns and the rows. +*/ + +PRIVATE void debug_matrix +( + /* === Parameters ======================================================= */ + + Int n_row, + Int n_col, + Colamd_Row Row [], + Colamd_Col Col [], + Int A [] +) +{ + /* === Local variables ================================================== */ + + Int r ; + Int c ; + Int *rp ; + Int *rp_end ; + Int *cp ; + Int *cp_end ; + + /* === Dump the rows and columns of the matrix ========================== */ + + if (UMF_debug < 3) + { + return ; + } + DEBUG3 (("DUMP MATRIX:\n")) ; + for (r = 0 ; r < n_row ; r++) + { + DEBUG3 (("Row "ID" alive? %d\n", r, ROW_IS_ALIVE (r))) ; + if (ROW_IS_DEAD (r)) + { + continue ; + } + + /* ------------------ */ + /* changed for UMFPACK: */ + DEBUG3 (("start "ID" length "ID" degree "ID" thickness "ID"\n", + Row [r].start, Row [r].length, Row [r].shared1.degree, + Row [r].thickness)) ; + /* ------------------ */ + + rp = &A [Row [r].start] ; + rp_end = rp + Row [r].length ; + while (rp < rp_end) + { + c = *rp++ ; + DEBUG4 ((" %d col "ID"\n", COL_IS_ALIVE (c), c)) ; + } + } + + for (c = 0 ; c < n_col ; c++) + { + DEBUG3 (("Col "ID" alive? %d\n", c, COL_IS_ALIVE (c))) ; + if (COL_IS_DEAD (c)) + { + continue ; + } + /* ------------------ */ + /* changed for UMFPACK: */ + DEBUG3 (("start "ID" length "ID" shared1[thickness,parent] "ID + " shared2 [order,score] "ID"\n", Col [c].start, Col [c].length, + Col [c].shared1.thickness, Col [c].shared2.score)); + /* ------------------ */ + cp = &A [Col [c].start] ; + cp_end = cp + Col [c].length ; + while (cp < cp_end) + { + r = *cp++ ; + DEBUG4 ((" %d row "ID"\n", ROW_IS_ALIVE (r), r)) ; + } + + /* ------------------ */ + /* added for UMFPACK: */ + DEBUG1 (("Col")) ; + dump_super (c, Col, n_col) ; + /* ------------------ */ + + } +} + +/* ------------------ */ +/* dump_super added for UMFPACK: */ +PRIVATE void dump_super +( + Int super_c, + Colamd_Col Col [], + Int n_col +) +{ + Int col, ncols ; + + DEBUG1 ((" =[ ")) ; + ncols = 0 ; + for (col = super_c ; col != EMPTY ; col = Col [col].nextcol) + { + DEBUG1 ((" "ID, col)) ; + ASSERT (col >= 0 && col < n_col) ; + if (col != super_c) + { + ASSERT (COL_IS_DEAD (col)) ; + } + if (Col [col].nextcol == EMPTY) + { + ASSERT (col == Col [super_c].lastcol) ; + } + ncols++ ; + ASSERT (ncols <= Col [super_c].shared1.thickness) ; + } + ASSERT (ncols == Col [super_c].shared1.thickness) ; + DEBUG1 (("]\n")) ; +} +/* ------------------ */ + + +#endif /* NDEBUG */ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_colamd.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_colamd.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,255 @@ +/* ========================================================================== */ +/* === umf_colamd.h ========================================================= */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + +Authors: + + The authors of the COLAMD code itself are Stefan I. Larimore and Timothy A. + Davis, University of Florida. The algorithm was developed in collaboration + with John Gilbert, Xerox PARC, and Esmond Ng, Oak Ridge National Laboratory. + +Date: + + UMFPACK Version: see above. + COLAMD Version 2.0 was released on January 31, 2000. + +Acknowledgements: + + This work was supported by the National Science Foundation, under + grants DMS-9504974, DMS-9803599, and CCR-0203270. + +UMFPACK: Copyright (c) 2003 by Timothy A. Davis. All Rights Reserved. + +See the UMFPACK README file for the License for your use of this code. + +Availability: + + Both UMFPACK and the original unmodified colamd/symamd library are + available at http://www.cise.ufl.edu/research/sparse. + +*/ + +#ifndef COLAMD_H +#define COLAMD_H + +/* ========================================================================== */ +/* === Include files ======================================================== */ +/* ========================================================================== */ + +#include + +/* ========================================================================== */ +/* === Knob and statistics definitions ====================================== */ +/* ========================================================================== */ + +/* size of the knobs [ ] array. Only knobs [0..2] are currently used. */ +#define COLAMD_KNOBS 20 + +/* number of output statistics. Only stats [0..8] are currently used. */ +#define COLAMD_STATS 20 + +/* knobs [0] and stats [0]: dense row knob and output statistic. */ +#define COLAMD_DENSE_ROW 0 + +/* knobs [1] and stats [1]: dense column knob and output statistic. */ +#define COLAMD_DENSE_COL 1 + +/* knobs [2]: aggressive absorption option */ +#define COLAMD_AGGRESSIVE 2 + +/* stats [2]: memory defragmentation count output statistic */ +#define COLAMD_DEFRAG_COUNT 2 + +/* stats [3]: colamd status: zero OK, > 0 warning or notice, < 0 error */ +#define COLAMD_STATUS 3 + +/* stats [4..6]: error info, or info on jumbled columns */ +#define COLAMD_INFO1 4 +#define COLAMD_INFO2 5 +#define COLAMD_INFO3 6 + +/* ------------------ */ +/* added for UMFPACK: */ +/* stats [7]: number of originally empty rows */ +#define COLAMD_EMPTY_ROW 7 +/* stats [8]: number of originally empty cols */ +#define COLAMD_EMPTY_COL 8 +/* stats [9]: number of rows with entries only in dense cols */ +#define COLAMD_NEWLY_EMPTY_ROW 9 +/* stats [10]: number of cols with entries only in dense rows */ +#define COLAMD_NEWLY_EMPTY_COL 10 +/* ------------------ */ + +/* error codes returned in stats [3]: */ +#define COLAMD_OK (0) +#define COLAMD_ERROR_jumbled_matrix (-11) +#define COLAMD_ERROR_A_not_present (-1) +#define COLAMD_ERROR_p_not_present (-2) +#define COLAMD_ERROR_nrow_negative (-3) +#define COLAMD_ERROR_ncol_negative (-4) +#define COLAMD_ERROR_nnz_negative (-5) +#define COLAMD_ERROR_p0_nonzero (-6) +#define COLAMD_ERROR_A_too_small (-7) +#define COLAMD_ERROR_col_length_negative (-8) +#define COLAMD_ERROR_row_index_out_of_bounds (-9) +#define COLAMD_ERROR_out_of_memory (-10) +#define COLAMD_ERROR_internal_error (-999) + +/* ========================================================================== */ +/* === Row and Column structures ============================================ */ +/* ========================================================================== */ + +/* User code that makes use of the colamd/symamd routines need not directly */ +/* reference these structures. They are used only for the COLAMD_RECOMMENDED */ +/* macro. */ + +typedef struct Colamd_Col_struct +{ + Int start ; /* index for A of first row in this column, or DEAD */ + /* if column is dead */ + Int length ; /* number of rows in this column */ + union + { + Int thickness ; /* number of original columns represented by this */ + /* col, if the column is alive */ + Int parent ; /* parent in parent tree super-column structure, if */ + /* the column is dead */ + } shared1 ; + union + { + Int score ; /* the score used to maintain heap, if col is alive */ + Int order ; /* pivot ordering of this column, if col is dead */ + } shared2 ; + union + { + Int headhash ; /* head of a hash bucket, if col is at the head of */ + /* a degree list */ + Int hash ; /* hash value, if col is not in a degree list */ + Int prev ; /* previous column in degree list, if col is in a */ + /* degree list (but not at the head of a degree list) */ + } shared3 ; + union + { + Int degree_next ; /* next column, if col is in a degree list */ + Int hash_next ; /* next column, if col is in a hash list */ + } shared4 ; + + /* ------------------ */ + /* added for UMFPACK: */ + Int nextcol ; /* next column in this supercolumn */ + Int lastcol ; /* last column in this supercolumn */ + /* ------------------ */ + +} Colamd_Col ; + +typedef struct Colamd_Row_struct +{ + Int start ; /* index for A of first col in this row */ + Int length ; /* number of principal columns in this row */ + union + { + Int degree ; /* number of principal & non-principal columns in row */ + Int p ; /* used as a row pointer in init_rows_cols () */ + } shared1 ; + union + { + Int mark ; /* for computing set differences and marking dead rows*/ + Int first_column ;/* first column in row (used in garbage collection) */ + } shared2 ; + + /* ------------------ */ + /* added for UMFPACK: */ + Int thickness ; /* number of original rows represented by this row */ + /* that are not yet pivotal */ + Int front ; /* -1 if an original row */ + /* k if this row represents the kth frontal matrix */ + /* where k goes from 0 to at most n_col-1 */ + /* ------------------ */ + +} Colamd_Row ; + + + +/* ========================================================================== */ +/* === Colamd recommended memory size ======================================= */ +/* ========================================================================== */ + +/* + The recommended length Alen of the array A passed to colamd is given by + the COLAMD_RECOMMENDED (nnz, n_row, n_col) macro. It returns -1 if any + argument is negative. 2*nnz space is required for the row and column + indices of the matrix. COLAMD_C (n_col) + COLAMD_R (n_row) space is + required for the Col and Row arrays, respectively, which are internal to + colamd. An additional n_col space is the minimal amount of "elbow room", + and nnz/5 more space is recommended for run time efficiency. + + This macro is not needed when using symamd. +*/ + +/* about 8*(n_col+1) integers: */ +#define UMF_COLAMD_C(n_col) ((n_col + 1) * sizeof (Colamd_Col) / sizeof (Int)) + +/* about 6*(n_row+1) integers: */ +#define UMF_COLAMD_R(n_row) ((n_row + 1) * sizeof (Colamd_Row) / sizeof (Int)) + +/* UMFPACK: make sure Alen is >= 5*n_col + size of Col and Row structures. + * Alen is typically about 2.2*nz + 9*n_col + 6*n_row, or 2.2nz+15n for + * square matrices. */ +#define UMF_COLAMD_RECOMMENDED(nnz, n_row, n_col) \ +( \ +((nnz) < 0 || (n_row) < 0 || (n_col) < 0) \ +? \ + (-1) \ +: \ + (MAX (2 * (nnz), 4 * (n_col)) + \ + (Int) UMF_COLAMD_C (n_col) + \ + (Int) UMF_COLAMD_R (n_row) + (n_col) + ((nnz) / 5)) \ +) + +/* ========================================================================== */ +/* === Prototypes of user-callable routines ================================= */ +/* ========================================================================== */ + +/* colamd_recommended removed for UMFPACK */ + +void UMF_colamd_set_defaults /* sets default parameters */ +( /* knobs argument is modified on output */ + double knobs [COLAMD_KNOBS] /* parameter settings for colamd */ +) ; + +Int UMF_colamd /* returns (1) if successful, (0) otherwise*/ +( /* A and p arguments are modified on output */ + Int n_row, /* number of rows in A */ + Int n_col, /* number of columns in A */ + Int Alen, /* size of the array A */ + Int A [], /* row indices of A, of size Alen */ + Int p [], /* column pointers of A, of size n_col+1 */ + double knobs [COLAMD_KNOBS],/* parameter settings for colamd */ + Int stats [COLAMD_STATS] /* colamd output statistics and error codes */ + /* ------------------ */ + /* added for UMFPACK: */ + , Int Front_npivcol [ ] + , Int Front_nrows [ ] + , Int Front_ncols [ ] + , Int Front_parent [ ] + , Int Front_cols [ ] + , Int *p_nfr + , Int InFront [ ] + /* ------------------ */ +) ; + +/* symamd deleted for UMFPACK */ + +/* colamd_report deleted for UMFPACK */ + +/* symamd_report deleted for UMFPACK */ + +#endif /* COLAMD_H */ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_config.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_config.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,919 @@ +/* ========================================================================== */ +/* === umf_config.h ========================================================= */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + This file controls the compile-time configuration of UMFPACK. Modify the + Makefile, the architecture-dependent Make.* file, and this file if + necessary, to control these options. The following flags may be given + as options to your C compiler (as in "cc -DNBLAS", for example). These + flags are normally placed in your CONFIG string, defined in your Make.*. + + All of these options, except for the timer, are for accessing the BLAS. + + -DNBLAS + + BLAS mode. If -DNBLAS is set, then no BLAS will be used. Vanilla + C code will be used instead. This is portable, and easier to + install, but you won't get the best performance. + + If -DNBLAS is not set, then externally-available BLAS routines + (dgemm, dger, and dgemv or the equivalent C-BLAS routines) will be + used. This will give you the best performance, but perhaps at the + expense of portability. + + The default is to use the BLAS, for both the C-callable libumfpack.a + library and the MATLAB mexFunction. If you have trouble installing + UMFPACK, set -DNBLAS (but then UMFPACK will be slow). + + -DCBLAS + + If -DCBLAS is set, then the C-BLAS interface to the BLAS is + used. If your vendor-supplied BLAS library does not have a C-BLAS + interface, you can obtain the ATLAS BLAS, available at + http://www.netlib.org/atlas. + + This flag is ignored if -DNBLAS is set. + + -DLP64 + + This should be defined if you are compiling in the LP64 model + (32 bit int's, 64 bit long's, and 64 bit pointers). In Solaris, + this is obtained with the flags -xtarget=ultra -xarch=v9 for + the cc compiler (for example). + + -DLONGBLAS + + If not defined, then the BLAS are not called in the long integer + version of UMFPACK (the umfpack_*l_* routines). The most common + definitions of the BLAS, unfortunately, use int arguments, and + are thus not suitable for use in the LP64 model. Only the Sun + Performance Library, as far as I can tell, has a version of the + BLAS that allows long integer (64-bit) input arguments. This + flag is set automatically in Sun Solaris if you are using the + Sun Performance BLAS. You can set it yourself, too, if your BLAS + routines can take long integer input arguments. + + -DNSUNPERF + + Applies only to Sun Solaris. If -DNSUNPERF is set, then the Sun + Performance Library BLAS will not be used. + + The Sun Performance Library BLAS is used by default when compiling + the C-callable libumfpack.a library on Sun Solaris. + + This flag is ignored if -DNBLAS is set. + + -DNSCSL + + Applies only to SGI IRIX. If -DSCSL is set, then the SGI SCSL + Scientific Library BLAS will not be used. + + The SGI SCSL Scientific Library BLAS is used by default when + compiling the C-callable libumfpack.a library on SGI IRIX. + + This flag is ignored if -DNBLAS is set. + + -DNPOSIX + + If -DNPOSIX is set, then your Unix operating system is not POSIX- + compliant, and the POSIX routines sysconf ( ) and times ( ) + routines are not used. These routines provide CPU time and + wallclock time information. If -DNPOSIX is set, then the ANSI + C clock ( ) routine is used. If -DNPOSIX is not set, then + sysconf ( ) and times ( ) are used in umfpack_tic and umfpack_toc. + See umfpack_tictoc.c for more information. + The default is to use the POSIX routines, except for Windows, + which is not POSIX-compliant. + + -DGETRUSAGE + + If -DGETRUSAGE is set, then your system's getrusage ( ) routine + will be used for getting the process CPU time. Otherwise the ANSI + C clock ( ) routine will be used. The default is to use getrusage + ( ) on Unix systems, and to use clock on all other architectures. + + -DNO_TIMER + + If -DNO_TIMER is set, then no timing routines are used at all. + + -DNUTIL + + If -DNUTIL is set, then the internal MATLAB utMalloc, utFree, and + utRealloc routines are not used in the UMFPACK mexFunction. The + regular mxMalloc, mxFree, and mxRealloc routines are used instead. + These routines are not documented, but are available for use. For + Windows, -DNUTIL is defined below, because access to the ut* + routines is not available by default. + + -DNRECIPROCAL + + This option controls a tradeoff between speed and accuracy. Using + -DNRECIPROCAL can lead to more accurate results, but with perhaps + some cost in performance, particularly if floating-point division + is much more costly than floating-point multiplication. + + This option determines the method used to scale the pivot column. + If set, or if the absolute value of the pivot is < 1e-12 (or is a + NaN), then the pivot column is divided by the pivot value. + Otherwise, the reciprocal of the pivot value is computed, and the + pivot column is multiplied by (1/pivot). Multiplying by the + reciprocal can be slightly less accurate than dividing by the + pivot, but it is often faster. See umf_scale.c. + + This has a small effect on the performance of UMFPACK, at least on + a Pentium 4M. It may have a larger effect on other architectures + where floating-point division is much more costly than floating- + point multiplication. The RS 6000 is one such example. + + By default, the method chosen is to multiply by the reciprocal + (sacrificing accuracy for speed), except when compiling UMFPACK + as a built-in routine in MATLAB, or when gcc is being used. + + When MATHWORKS is defined, -DNRECIPROCAL is forced on, and the pivot + column is divided by the pivot value. The only way of using the + other method in this case is to edit this file. + + If -DNRECIPROCAL is enabled, then the row scaling factors are always + applied by dividing each row by the scale factor, rather than + multiplying by the reciprocal. If -DNRECIPROCAL is not enabled + (the default case), then the scale factors are normally applied by + multiplying by the reciprocal. If, however, the smallest scale + factor is tiny, then the scale factors are applied via division. + + -DNO_DIVIDE_BY_ZERO + + If the pivot is zero, and this flag is set, then no divide-by-zero + occurs. + + You should normally not set these flags yourself: + + -DBLAS_BY_VALUE if scalars are passed by value, not reference + -DBLAS_NO_UNDERSCORE if no underscore should be appended + -DBLAS_CHAR_ARG if BLAS options are single char's, not strings + + The BLAS options are normally set automatically. If your + architecture cannot be determined (see UMFPACK_ARCHITECTURE, below) + then you may need to set these flags yourself. + + The following options are controlled by amd_internal.h: + + -DMATLAB_MEX_FILE + + This flag is turned on when compiling the umfpack mexFunction for + use in MATLAB. When compiling the MATLAB mexFunction, the MATLAB + BLAS are used (unless -DNBLAS is set). The -DCBLAS, -DNSCSL, and + -DNSUNPERF flags are all ignored. The -DNRECIPROCAL flag is + forced on. Otherwise, [L,U,P,Q,R] = umfpack (A) would return + either L*U = P*(R\A)*Q or L*U = P*R*A*Q. Rather than returning a + flag stating how the scale factors R are to be applied, the umfpack + mexFunction always takes the more accurate route and returns + L*U = P*(R\A)*Q. + + -DMATHWORKS + + This flag is turned on when compiling umfpack as a built-in routine + in MATLAB. The MATLAB BLAS are used for all architectures (-DNBLAS, + -DCBLAS, -DNSCSL, and -DNSUNPERF flags are all ignored). Internal + routines utMalloc, utFree, utRealloc, utPrintf, utDivideComplex, + and utFdlibm_hypot are used, and the "util.h" file is included. + This avoids the problem discussed in the User Guide regarding memory + allocation in MATLAB. utMalloc returns NULL on failure, instead of + terminating the mexFunction (which is what mxMalloc does). However, + the ut* routines are not documented by The MathWorks, Inc., so I + cannot guarantee that you will always be able to use them. + The -DNRECIPROCAL flag is turned on. + + -DNDEBUG + + Debugging mode (if NDEBUG is not defined). The default, of course, + is no debugging. Turning on debugging takes some work (see below). + If you do not edit this file, then debugging is turned off anyway, + regardless of whether or not -DNDEBUG is specified in your compiler + options. +*/ + +/* ========================================================================== */ +/* === AMD configuration ==================================================== */ +/* ========================================================================== */ + +/* NDEBUG, PRINTF defined in amd_internal.h */ + +/* ========================================================================== */ +/* === reciprocal option ==================================================== */ +/* ========================================================================== */ + +/* Force the definition NRECIPROCAL when MATHWORKS or MATLAB_MEX_FILE + * are defined. Do not multiply by the reciprocal in those cases. */ + +#ifndef NRECIPROCAL +#if defined (MATHWORKS) || defined (MATLAB_MEX_FILE) +#define NRECIPROCAL +#endif +#endif + +/* ========================================================================== */ +/* === Microsoft Windows configuration ====================================== */ +/* ========================================================================== */ + +#ifdef UMF_WINDOWS +/* Windows can't access the ut* routines, and it isn't Unix. */ +#define NUTIL +#define NPOSIX +#endif + +/* ========================================================================== */ +/* === 0-based or 1-based printing ========================================== */ +/* ========================================================================== */ + +#if defined (MATLAB_MEX_FILE) && defined (NDEBUG) +/* In MATLAB, matrices are 1-based to the user, but 0-based internally. */ +/* One is added to all row and column indices when printing matrices */ +/* for the MATLAB user. The +1 shift is turned off when debugging. */ +#define INDEX(i) ((i)+1) +#else +/* In ANSI C, matrices are 0-based and indices are reported as such. */ +/* This mode is also used for debug mode, and if MATHWORKS is defined rather */ +/* than MATLAB_MEX_FILE. */ +#define INDEX(i) (i) +#endif + +/* ========================================================================== */ +/* === Timer ================================================================ */ +/* ========================================================================== */ + +/* + If you have the getrusage routine (all Unix systems I've test do), then use + that. Otherwise, use the ANSI C clock function. Note that on many + systems, the ANSI clock function wraps around after only 2147 seconds, or + about 36 minutes. BE CAREFUL: if you compare the run time of UMFPACK with + other sparse matrix packages, be sure to use the same timer. See + umfpack_tictoc.c for the timer used internally by UMFPACK. See also + umfpack_timer.c for the timer used in an earlier version of UMFPACK. + That timer is still available as a user-callable routine, but it is no + longer used internally by UMFPACK. +*/ + +/* Sun Solaris, SGI Irix, Linux, Compaq Alpha, and IBM RS 6000 all have */ +/* getrusage. It's in BSD unix, so perhaps all unix systems have it. */ +#if defined (UMF_SOL2) || defined (UMF_SGI) || defined (UMF_LINUX) \ +|| defined (UMF_ALPHA) || defined (UMF_AIX) +#define GETRUSAGE +#endif + + +/* ========================================================================== */ +/* === BLAS ================================================================= */ +/* ========================================================================== */ + +/* + The adventure begins. Figure out how to call the BLAS ... + + This works, but it is incredibly ugly. The C-BLAS was supposed to solve + this problem, and make it easier to interface a C program to the BLAS. + Unfortunately, the C-BLAS does not have a "long" integer (64 bit) version. + Various vendors have done their own 64-bit BLAS. Sun has dgemm_64 routines + with "long" integers, SGI has a 64-bit dgemm in their scsl_blas_i8 library + with "long long" integers, and so on. + + Different vendors also have different ways of defining a complex number, + some using struct's. That's a bad idea. See umf_version.h for the better + way to do it (the method that was also chosen for the complex C-BLAS, + which is compatible and guaranteed to be portable with ANSI C). + + To make matters worse, SGI's SCSL BLAS has a C-BLAS interface which + differs from the ATLAS C-BLAS interface (see immediately below); + although a more recent version of SGI's C-BLAS interface is correct + if SCSL_VOID_ARGS is defined. +*/ + + +/* -------------------------------------------------------------------------- */ +/* Determine which BLAS to use. */ +/* -------------------------------------------------------------------------- */ + +#if defined (MATHWORKS) +#define USE_MATLAB_BLAS + +#elif defined (NBLAS) +#define USE_NO_BLAS + +#elif defined (MATLAB_MEX_FILE) +#define USE_MATLAB_BLAS + +#elif defined (CBLAS) +#define USE_C_BLAS + +#elif defined (UMF_SOL2) && !defined (NSUNPERF) +#define USE_SUNPERF_BLAS + +#elif defined (UMF_SGI) && !defined (NSCSL) +#define USE_SCSL_BLAS + +#else +#define USE_FORTRAN_BLAS +#endif + +/* -------------------------------------------------------------------------- */ +/* int vs. long integer arguments */ +/* -------------------------------------------------------------------------- */ + +/* + Determine if the BLAS exists for the long integer version. It exists if + LONGBLAS is defined in the Makefile, or if using the BLAS from the + Sun Performance Library, or SGI's SCSL Scientific Library. +*/ + +#if defined (USE_SUNPERF_BLAS) || defined (USE_SCSL_BLAS) +#ifndef LONGBLAS +#define LONGBLAS +#endif +#endif + +/* do not use the BLAS if Int's are long and LONGBLAS is not defined */ +#if defined (LONG_INTEGER) && !defined (LONGBLAS) && !defined (USE_NO_BLAS) +#define USE_NO_BLAS +#endif + + +/* -------------------------------------------------------------------------- */ +/* Use (void *) arguments for the SGI */ +/* -------------------------------------------------------------------------- */ + +#if defined (UMF_SGI) +/* + Use (void *) pointers for complex types in SCSL. + The ATLAS C-BLAS, and the SGI C-BLAS differ. The former uses (void *) + arguments, the latter uses SCSL_ZOMPLEX_T, which are either scsl_zomplex + or (void *). Using (void *) is simpler, and is selected by defining + SCSL_VOID_ARGS, below. The cc compiler doesn't complain, but gcc is + more picky, and generates a warning without this next statement. + With gcc and the 07/09/98 version of SGI's cblas.h, spurious warnings + about complex BLAS arguments will be reported anyway. This is because this + older version of SGI's cblas.h does not make use of the SCSL_VOID_ARGS + parameter, which is present in the 12/6/01 version of SGI's cblas.h. You + can safely ignore these warnings. +*/ +#define SCSL_VOID_ARGS +#endif + + +/* -------------------------------------------------------------------------- */ +/* The BLAS exists, construct appropriate macros */ +/* -------------------------------------------------------------------------- */ + +#if !defined (USE_NO_BLAS) /* { */ + +/* + If the compile-time flag -DNBLAS is defined, then the BLAS are not used, + portable vanilla C code is used instead, and the remainder of this file + is ignored. + + Using the BLAS is much faster, but how C calls the Fortran BLAS is + machine-dependent and thus can cause portability problems. Thus, use + -DNBLAS to ensure portability (at the expense of speed). + + Preferences: + + *** The best interface to use, regardless of the option you select + below, is the standard C-BLAS interface. Not all BLAS libraries + use this interface. The only problem with this interface is that + it does not extend to the LP64 model. The C-BLAS does not provide + for a 64-bit integer. In addition, SGI's older cblas.h can cause + spurious warnings when using the C-BLAS interface. + + 1) often the most preferred (but see option (3)): use the + optimized vendor-supplied library (such as the Sun Performance + Library, or IBM's ESSL). This is often the fastest, but might not + be portable and might not always be available. When compiling a + MATLAB mexFunction it might be difficult get the mex compiler + script to recognize the vendor- supplied BLAS. Note that the + freely-available BLAS (option 3) can be faster than the vendor- + specific BLAS. You are encourage to try both option (1) and (3). + + 2) When compiling the UMFPACK mexFunction to use UMFPACK in MATLAB, use + the BLAS provided by The Mathworks, Inc. This assumes you are using + MATLAB V6 or higher, since the BLAS are not incorporated in V5 or + earlier versions. On my Sun workstation, the MATLAB BLAS gave + slightly worse performance than the Sun Perf. BLAS. The advantage + of using the MATLAB BLAS is that it's available on any computer that + has MATLAB V6 or higher. I have not tried using MATLAB BLAS outside + of a mexFunction in a stand-alone C code, but MATLAB (V6) allows for + this. This is well worth trying if you have MATLAB and don't want + to bother installing the ATLAS BLAS (option 3a, below). The only + glitch to this is that MATLAB does not provide a portable interface + to the BLAS (an underscore is required for some but not all + architectures). For Windows and MATLAB 6.0 or 6.1, you also need + to copy the libmwlapack.dll file into your MATLAB installation + directory; see the User Guide for details. + + In the current distribution, the only BLAS that the UMFPACK + mexFunction will use is the internal MATLAB BLAS. It's possible to + use other BLAS, but handling the porting of using the mex compiler + with different BLAS libraries is not trivial. + + As of MATLAB 6.5, the BLAS used internally in MATLAB is the ATLAS + BLAS. + + 3) Use a freely-available high-performance BLAS library: + + (a) The BLAS by Kazashige Goto and Robert van de Geijn, at + http://www.cs.utexas.edu/users/flame/goto. This BLAS increased + the performance of UMFPACK by almost 50% as compared to the + ATLAS BLAS (v3.2). + + (b) The ATLAS BLAS, available at http://www.netlib.org/atlas, + by R. Clint Whaley, Antoine Petitet, and Jack Dongarra. + This has a standard C interface, and thus the interface to it is + fully portable. Its performance rivals, and sometimes exceeds, + the vendor-supplied BLAS on many computers. + + (b) The Fortran RISC BLAS by Michel Dayde', Iain Duff, Antoine + Petitet, and Abderrahim Qrichi Aniba, available via anonymous + ftp to ftp.enseeiht.fr in the pub/numerique/BLAS/RISC directory, + See M. J. Dayde' and I. S. Duff, "The RISC BLAS: A blocked + implementation of level 3 BLAS for RISC processors, ACM Trans. + Math. Software, vol. 25, no. 3., Sept. 1999. This will give + you good performance, but with the same C-to-Fortran portability + problems as option (1). + + 4) Use UMFPACK's built-in vanilla C code by setting -DNBLAS at compile + time. The key advantage is portability, which is guaranteed if you + have an ANSI C compliant compiler. You also don't need to download + any other package - UMFPACK is stand-alone. No Fortran is used + anywhere in UMFPACK. UMFPACK will be much slower than when using + options (1) through (3), however. + + 5) least preferred: use the standard Fortran implementation of the + BLAS, also available at Netlib (http://www.netlib.org/blas). This + will be no faster than option (4), and not portable because of + C-to-Fortran calling conventions. Don't bother trying option (5). + + The mechanics of how C calls the BLAS on various computers are as follows: + + * C-BLAS (from the ATLAS library, for example): + The same interface is used on all computers. + + * Defaults for calling the Fortran BLAS: + add underscore, pass scalars by reference, use string arguments. + + * The Fortran BLAS on Sun Solaris (when compiling the MATLAB mexFunction + or when using the Fortran RISC BLAS), SGI IRIX, Linux, and Compaq + Alpha: use defaults. + + * Sun Solaris (when using the C-callable Sun Performance library): + no underscore, pass scalars by value, use character arguments. + + * The Fortran BLAS (ESSL Library) on the IBM RS 6000, and HP Unix: + no underscore, pass scalars by reference, use string arguments. + + * The Fortran BLAS on Windows: + no underscore, pass scalars by reference, use string arguments. + If you compile the umfpack mexFunction using umfpack_make, and are + using the lcc compiler bundled with MATLAB, then you must first + copy the umfpack\lcc_lib\libmwlapack.lib file into the + \extern\lib\win32\lcc\ directory, where is the + directory in which MATLAB is installed. Next, type mex -setup + at the MATLAB prompt, and ask MATLAB to select the lcc compiler. + MATLAB has built-in BLAS, but it cannot be accessed by a program + compiled by lcc without first copying this file. +*/ + + + +/* -------------------------------------------------------------------------- */ +#ifdef USE_C_BLAS /* { */ +/* -------------------------------------------------------------------------- */ + + +/* -------------------------------------------------------------------------- */ +/* use the C-BLAS (any computer) */ +/* -------------------------------------------------------------------------- */ + +/* + C-BLAS is the default interface, with the following exceptions. Solaris + uses the Sun Performance BLAS for libumfpack.a (the C-callable library). + SGI IRIX uses the SCSL BLAS for libumfpack.a. All architectures use + MATLAB's internal BLAS for the mexFunction on any architecture. These + options are set in the Make.* files. The Make.generic file uses no BLAS + at all. + + If you use the ATLAS C-BLAS, then be sure to set the -I flag to + -I/path/ATLAS/include, where /path/ATLAS is the ATLAS installation + directory. See Make.solaris for an example. You do not need to do this + for the SGI, which has a /usr/include/cblas.h. +*/ + +#include "cblas.h" + +#ifdef COMPLEX +#define BLAS_GEMM_ROUTINE cblas_zgemm +#define BLAS_TRSM_ROUTINE cblas_ztrsm +#define BLAS_TRSV_ROUTINE cblas_ztrsv +#define BLAS_GEMV_ROUTINE cblas_zgemv +#define BLAS_GER_ROUTINE cblas_zgeru +#define BLAS_SCAL_ROUTINE cblas_zscal +#define BLAS_COPY_ROUTINE cblas_zcopy +#define BLAS_DECLARE_SCALAR(x) double x [2] +#define BLAS_ASSIGN(x,xr,xi) { x [0] = xr ; x [1] = xi ; } +#else +#define BLAS_GEMM_ROUTINE cblas_dgemm +#define BLAS_TRSM_ROUTINE cblas_dtrsm +#define BLAS_TRSV_ROUTINE cblas_dtrsv +#define BLAS_GEMV_ROUTINE cblas_dgemv +#define BLAS_GER_ROUTINE cblas_dger +#define BLAS_SCAL_ROUTINE cblas_dscal +#define BLAS_COPY_ROUTINE cblas_dcopy +#define BLAS_DECLARE_SCALAR(x) double x +#define BLAS_ASSIGN(x,xr,xi) { x = xr ; } +#endif + +#define BLAS_LOWER CblasLower +#define BLAS_UNIT_DIAGONAL CblasUnit +#define BLAS_RIGHT CblasRight +#define BLAS_NO_TRANSPOSE CblasNoTrans +#define BLAS_TRANSPOSE CblasTrans +#define BLAS_COLUMN_MAJOR_ORDER CblasColMajor, +#define BLAS_SCALAR(x) x +#define BLAS_INT_SCALAR(n) n +#define BLAS_ARRAY(a) a + + + +/* -------------------------------------------------------------------------- */ +#else /* } USE_C_BLAS { */ +/* -------------------------------------------------------------------------- */ + +/* -------------------------------------------------------------------------- */ +/* use Fortran (or other architecture-specific) BLAS */ +/* -------------------------------------------------------------------------- */ + +/* No such argument when not using the C-BLAS */ +#define BLAS_COLUMN_MAJOR_ORDER + +/* Determine which architecture we're on and set options accordingly. */ +/* The default, if nothing is defined is to add an underscore, */ +/* pass scalars by reference, and use string arguments. */ + +/* ---------------------------------- */ +/* Sun Performance BLAS */ +/* ---------------------------------- */ + +#ifdef USE_SUNPERF_BLAS +#ifdef _SUNPERF_H +/* has been included somehow anyway, outside of umf_config.h */ +#error "sunperf.h must NOT be #include'd. See umf_config.h for details." +#endif +#define BLAS_BY_VALUE +#define BLAS_NO_UNDERSCORE +#define BLAS_CHAR_ARG +#endif /* USE_SUNPERF_BLAS */ + +/* ---------------------------------- */ +/* SGI SCSL BLAS */ +/* ---------------------------------- */ + +#ifdef USE_SCSL_BLAS +#if defined (LP64) +#include +#else +#include +#endif +#define BLAS_BY_VALUE +#define BLAS_NO_UNDERSCORE +#endif /* USE_SCSL_BLAS */ + +/* ---------------------------------- */ +/* IBM AIX, Windows, and HP Fortran BLAS */ +/* ---------------------------------- */ + +#if defined (UMF_AIX) || defined (UMF_WINDOWS) || defined (UMF_HP) +#define BLAS_NO_UNDERSCORE +#endif + + +/* -------------------------------------------------------------------------- */ +/* BLAS names */ +/* -------------------------------------------------------------------------- */ + +#if defined (LP64) && defined (USE_SUNPERF_BLAS) && defined (LONG_INTEGER) + +/* 64-bit sunperf BLAS, for Sun Solaris only */ +#ifdef COMPLEX +#define BLAS_GEMM_ROUTINE zgemm_64 +#define BLAS_TRSM_ROUTINE ztrsm_64 +#define BLAS_TRSV_ROUTINE ztrsv_64 +#define BLAS_GEMV_ROUTINE zgemv_64 +#define BLAS_GER_ROUTINE zgeru_64 +#define BLAS_SCAL_ROUTINE zscal_64 +#define BLAS_COPY_ROUTINE zcopy_64 +#else +#define BLAS_GEMM_ROUTINE dgemm_64 +#define BLAS_TRSM_ROUTINE dtrsm_64 +#define BLAS_TRSV_ROUTINE dtrsv_64 +#define BLAS_GEMV_ROUTINE dgemv_64 +#define BLAS_GER_ROUTINE dger_64 +#define BLAS_SCAL_ROUTINE dscal_64 +#define BLAS_COPY_ROUTINE dcopy_64 +#endif /* COMPLEX */ + +#else + +#ifdef COMPLEX + +/* naming convention (use underscore, or not) */ +#ifdef BLAS_NO_UNDERSCORE +#define BLAS_GEMM_ROUTINE zgemm +#define BLAS_TRSM_ROUTINE ztrsm +#define BLAS_TRSV_ROUTINE ztrsv +#define BLAS_GEMV_ROUTINE zgemv +#define BLAS_GER_ROUTINE zgeru +#define BLAS_SCAL_ROUTINE zscal +#define BLAS_COPY_ROUTINE zcopy +#else +/* default: add underscore */ +#define BLAS_GEMM_ROUTINE zgemm_ +#define BLAS_TRSM_ROUTINE ztrsm_ +#define BLAS_TRSV_ROUTINE ztrsv_ +#define BLAS_GEMV_ROUTINE zgemv_ +#define BLAS_GER_ROUTINE zgeru_ +#define BLAS_SCAL_ROUTINE zscal_ +#define BLAS_COPY_ROUTINE zcopy_ +#endif + +#else + +/* naming convention (use underscore, or not) */ +#ifdef BLAS_NO_UNDERSCORE +#define BLAS_GEMM_ROUTINE dgemm +#define BLAS_TRSM_ROUTINE dtrsm +#define BLAS_TRSV_ROUTINE dtrsv +#define BLAS_GEMV_ROUTINE dgemv +#define BLAS_GER_ROUTINE dger +#define BLAS_SCAL_ROUTINE dscal +#define BLAS_COPY_ROUTINE dcopy +#else +/* default: add underscore */ +#define BLAS_GEMM_ROUTINE dgemm_ +#define BLAS_TRSM_ROUTINE dtrsm_ +#define BLAS_TRSV_ROUTINE dtrsv_ +#define BLAS_GEMV_ROUTINE dgemv_ +#define BLAS_GER_ROUTINE dger_ +#define BLAS_SCAL_ROUTINE dscal_ +#define BLAS_COPY_ROUTINE dcopy_ +#endif + +#endif /* COMPLEX */ + +#endif /* LP64 && USE_SUNPERF_BLAS */ + + +/* -------------------------------------------------------------------------- */ +/* BLAS real or complex floating-point scalars */ +/* -------------------------------------------------------------------------- */ + +#ifdef COMPLEX + +/* + The SunPerf BLAS expects to see a doublecomplex scalar, but it + also will accept an array of size 2. See the manual, normally at + file:///opt/SUNWspro/WS6U1/lib/locale/C/html/manuals/perflib/user_guide + /plug_using_perflib.html . This manual is inconsistent with the man pages + for zgemm, zgemv, and zgeru and also inconsistent with the + include file. Use this instead, for SunPerf (only works if you do NOT + include sunperf.h). Fortunately, this file (umf_config.h) is not included + in any user code that calls UMFPACK. Thus, the caller may include + sunperf.h in his or her own code, and that is safely ignored here. + SGI's SCSL BLAS has yet a different kind of struct, but we can use a + double array of size 2 instead (since SCSL_VOID_ARGS is defined). + Most BLAS expect complex scalars as pointers to double arrays of size 2. +*/ + +#define BLAS_DECLARE_SCALAR(x) double x [2] +#define BLAS_ASSIGN(x,xr,xi) { x [0] = xr ; x [1] = xi ; } +#define BLAS_SCALAR(x) x + +#else + +#define BLAS_DECLARE_SCALAR(x) double x +#define BLAS_ASSIGN(x,xr,xi) { x = xr ; } +#ifdef BLAS_BY_VALUE +#define BLAS_SCALAR(x) x +#else +#define BLAS_SCALAR(x) &(x) +#endif + +#endif /* COMPLEX */ + + +/* -------------------------------------------------------------------------- */ +/* BLAS integer scalars */ +/* -------------------------------------------------------------------------- */ + +/* + Fortran requires integers to be passed by reference. + The SCSL BLAS requires long long arguments in LP64 mode. +*/ + +#if defined (USE_SCSL_BLAS) && defined (LP64) +#define BLAS_INT_SCALAR(n) ((long long) n) +#else +#ifdef BLAS_BY_VALUE +#define BLAS_INT_SCALAR(n) n +#else +#define BLAS_INT_SCALAR(n) &(n) +#endif +#endif + + +/* -------------------------------------------------------------------------- */ +/* BLAS strings */ +/* -------------------------------------------------------------------------- */ + +/* + The Sun Performance BLAS wants a character instead of a string. +*/ + +#ifdef BLAS_CHAR_ARG +#define BLAS_NO_TRANSPOSE 'N' +#define BLAS_TRANSPOSE 'T' +#define BLAS_LEFT 'L' +#define BLAS_RIGHT 'R' +#define BLAS_LOWER 'L' +#define BLAS_UNIT_DIAGONAL 'U' +#else +#define BLAS_NO_TRANSPOSE "N" +#define BLAS_TRANSPOSE "T" +#define BLAS_LEFT "L" +#define BLAS_RIGHT "R" +#define BLAS_LOWER "L" +#define BLAS_UNIT_DIAGONAL "U" +#endif + + +/* -------------------------------------------------------------------------- */ +/* BLAS arrays */ +/* -------------------------------------------------------------------------- */ + +/* + The complex SunPerf BLAS expects to see a doublecomplex array of size s. + This is broken (see above, regarding complex scalars in sunperf.h). + For SunPerf BLAS, just pass a pointer to the array, and ignore sunperf.h. + With sunperf.h, you would need: + + #define BLAS_ARRAY(a) ((doublecomplex *)(a)) + + SGI's SCSL BLAS has yet a different kind of struct, but we can use a + double array of size 2 instead (since SCSL_VOID_ARGS is defined). + + The real versions all use just a (double *) pointer. + + In all cases, no typecast is required. This will break if is + included. + + If you have read this far, I hope you see now why (void *) a much better + choice for complex BLAS prototypes, and why double x [2] is better than + an architecture dependent struct { double real ; double imag ; } + type definition. + +*/ + +#define BLAS_ARRAY(a) (a) + + +/* -------------------------------------------------------------------------- */ +#endif /* USE_C_BLAS } */ +/* -------------------------------------------------------------------------- */ + + + + + +/* -------------------------------------------------------------------------- */ +/* BLAS macros, for all interfaces */ +/* -------------------------------------------------------------------------- */ + +/* + All architecture dependent issues have now been taken into consideration, + and folded into the macros BLAS_DECLARE_SCALAR, BLAS_ASSIGN, BLAS_*_ROUTINE, + BLAS_COLUMN_MAJOR_ORDER, BLAS_NO_TRANSPOSE, BLAS_TRANSPOSE, BLAS_SCALAR, + BLAS_INT_SCALAR, BLAS_ARRAY, and Int. + + You will note that there is not a *** single *** name, declaration, or + argument to the BLAS which is not somehow different in one or more versions + of the BLAS! +*/ + + +/* C = C - A*B', where: + * A is m-by-k with leading dimension ldac + * B is k-by-n with leading dimension ldb + * C is m-by-n with leading dimension ldac */ +#define BLAS_GEMM(m,n,k,A,B,ldb,C,ldac) \ +{ \ + BLAS_DECLARE_SCALAR (alpha) ; \ + BLAS_DECLARE_SCALAR (beta) ; \ + BLAS_ASSIGN (alpha, -1.0, 0.0) ; \ + BLAS_ASSIGN (beta, 1.0, 0.0) ; \ + (void) BLAS_GEMM_ROUTINE (BLAS_COLUMN_MAJOR_ORDER \ + BLAS_NO_TRANSPOSE, BLAS_TRANSPOSE, \ + BLAS_INT_SCALAR (m), BLAS_INT_SCALAR (n), BLAS_INT_SCALAR (k), \ + BLAS_SCALAR (alpha), \ + BLAS_ARRAY (A), BLAS_INT_SCALAR (ldac), \ + BLAS_ARRAY (B), BLAS_INT_SCALAR (ldb), BLAS_SCALAR (beta), \ + BLAS_ARRAY (C), BLAS_INT_SCALAR (ldac)) ; \ +} + +/* A = A - x*y', where: + * A is m-by-n with leading dimension d + x is a column vector with stride 1 + y is a column vector with stride 1 */ +#define BLAS_GER(m,n,x,y,A,d) \ +{ \ + Int one = 1 ; \ + BLAS_DECLARE_SCALAR (alpha) ; \ + BLAS_ASSIGN (alpha, -1.0, 0.0) ; \ + (void) BLAS_GER_ROUTINE (BLAS_COLUMN_MAJOR_ORDER \ + BLAS_INT_SCALAR (m), BLAS_INT_SCALAR (n), \ + BLAS_SCALAR (alpha), \ + BLAS_ARRAY (x), BLAS_INT_SCALAR (one), \ + BLAS_ARRAY (y), BLAS_INT_SCALAR (one), \ + BLAS_ARRAY (A), BLAS_INT_SCALAR (d)) ; \ +} + +/* y = y - A*x, where A is m-by-n with leading dimension d, + x is a column vector with stride 1 + y is a column vector with stride 1 */ +#define BLAS_GEMV(m,n,A,x,y,d) \ +{ \ + Int one = 1 ; \ + BLAS_DECLARE_SCALAR (alpha) ; \ + BLAS_DECLARE_SCALAR (beta) ; \ + BLAS_ASSIGN (alpha, -1.0, 0.0) ; \ + BLAS_ASSIGN (beta, 1.0, 0.0) ; \ + (void) BLAS_GEMV_ROUTINE (BLAS_COLUMN_MAJOR_ORDER \ + BLAS_NO_TRANSPOSE, \ + BLAS_INT_SCALAR (m), BLAS_INT_SCALAR (n), \ + BLAS_SCALAR (alpha), \ + BLAS_ARRAY (A), BLAS_INT_SCALAR (d), \ + BLAS_ARRAY (x), BLAS_INT_SCALAR (one), BLAS_SCALAR (beta), \ + BLAS_ARRAY (y), BLAS_INT_SCALAR (one)) ; \ +} + + +/* solve Lx=b, where: + * B is a column vector (m-by-1) with leading dimension d + * A is m-by-m with leading dimension d */ +#define BLAS_TRSV(m,A,b,d) \ +{ \ + Int one = 1 ; \ + (void) BLAS_TRSV_ROUTINE (BLAS_COLUMN_MAJOR_ORDER \ + BLAS_LOWER, BLAS_NO_TRANSPOSE, BLAS_UNIT_DIAGONAL, \ + BLAS_INT_SCALAR (m), \ + BLAS_ARRAY (A), BLAS_INT_SCALAR (d), \ + BLAS_ARRAY (b), BLAS_INT_SCALAR (one)) ; \ +} + +/* solve XL'=B where: + * B is m-by-n with leading dimension ldb + * A is n-by-n with leading dimension lda */ +#define BLAS_TRSM_RIGHT(m,n,A,lda,B,ldb) \ +{ \ + BLAS_DECLARE_SCALAR (alpha) ; \ + BLAS_ASSIGN (alpha, 1.0, 0.0) ; \ + (void) BLAS_TRSM_ROUTINE (BLAS_COLUMN_MAJOR_ORDER \ + BLAS_RIGHT, BLAS_LOWER, BLAS_TRANSPOSE, BLAS_UNIT_DIAGONAL, \ + BLAS_INT_SCALAR (m), BLAS_INT_SCALAR (n), \ + BLAS_SCALAR (alpha), \ + BLAS_ARRAY (A), BLAS_INT_SCALAR (lda), \ + BLAS_ARRAY (B), BLAS_INT_SCALAR (ldb)) ; \ +} + +/* x = s*x, where x is a stride-1 vector of length n */ +#define BLAS_SCAL(n,s,x) \ +{ \ + Int one = 1 ; \ + BLAS_DECLARE_SCALAR (alpha) ; \ + BLAS_ASSIGN (alpha, REAL_COMPONENT (s), IMAG_COMPONENT (s)) ; \ + (void) BLAS_SCAL_ROUTINE ( \ + BLAS_INT_SCALAR (n), BLAS_SCALAR (alpha), \ + BLAS_ARRAY (x), BLAS_INT_SCALAR (one)) ; \ +} + +/* x = y, where x and y are a stride-1 vectors of length n */ +#define BLAS_COPY(n,x,y) \ +{ \ + Int one = 1 ; \ + (void) BLAS_COPY_ROUTINE ( \ + BLAS_INT_SCALAR (n), \ + BLAS_ARRAY (x), BLAS_INT_SCALAR (one), \ + BLAS_ARRAY (y), BLAS_INT_SCALAR (one)) ; \ +} + +#endif /* !defined (USE_NO_BLAS) } */ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_create_element.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_create_element.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,604 @@ +/* ========================================================================== */ +/* === UMF_create_element =================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + Factorization of a frontal matrix is complete. Create a new element for + later assembly into a subsequent frontal matrix. Returns TRUE if + successful, FALSE if out of memory. +*/ + +#include "umf_internal.h" +#include "umf_mem_alloc_element.h" +#include "umf_mem_alloc_tail_block.h" +#include "umf_mem_free_tail_block.h" +#include "umf_get_memory.h" + +/* ========================================================================== */ +/* === copy_column ========================================================== */ +/* ========================================================================== */ + +PRIVATE void copy_column (Int len, Entry *X, Entry *Y) +{ + Int i ; +#pragma ivdep + for (i = 0 ; i < len ; i++) + { + Y [i] = X [i] ; + } +} + +/* ========================================================================== */ +/* === UMF_create_element =================================================== */ +/* ========================================================================== */ + +GLOBAL Int UMF_create_element +( + NumericType *Numeric, + WorkType *Work, + SymbolicType *Symbolic +) +{ + /* ---------------------------------------------------------------------- */ + /* local variables */ + /* ---------------------------------------------------------------------- */ + + Int j, col, row, *Fcols, *Frows, fnrows, fncols, *Cols, len, needunits, t1, + t2, size, e, i, *E, *Fcpos, *Frpos, *Rows, eloc, fnr_curr, f, + got_memory, *Row_tuples, *Row_degree, *Row_tlen, *Col_tuples, max_mark, + *Col_degree, *Col_tlen, nn, n_row, n_col, r2, c2, do_Fcpos ; + Entry *C, *Fcol ; + Element *ep ; + Unit *p, *Memory ; + Tuple *tp, *tp1, *tp2, tuple, *tpend ; +#ifndef NDEBUG + DEBUG2 (("FRONTAL WRAPUP\n")) ; + UMF_dump_current_front (Numeric, Work, TRUE) ; +#endif + + /* ---------------------------------------------------------------------- */ + /* get parameters */ + /* ---------------------------------------------------------------------- */ + + ASSERT (Work->fnpiv == 0) ; + ASSERT (Work->fnzeros == 0) ; + Row_degree = Numeric->Rperm ; + Row_tuples = Numeric->Uip ; + Row_tlen = Numeric->Uilen ; + Col_degree = Numeric->Cperm ; + Col_tuples = Numeric->Lip ; + Col_tlen = Numeric->Lilen ; + n_row = Work->n_row ; + n_col = Work->n_col ; + nn = MAX (n_row, n_col) ; + Fcols = Work->Fcols ; + Frows = Work->Frows ; + Fcpos = Work->Fcpos ; + Frpos = Work->Frpos ; + Memory = Numeric->Memory ; + fncols = Work->fncols ; + fnrows = Work->fnrows ; + + tp = (Tuple *) NULL ; + tp1 = (Tuple *) NULL ; + tp2 = (Tuple *) NULL ; + + /* ---------------------------------------------------------------------- */ + /* add the current frontal matrix to the degrees of each column */ + /* ---------------------------------------------------------------------- */ + + if (!Symbolic->fixQ) + { + /* but only if the column ordering is not fixed */ +#pragma ivdep + for (j = 0 ; j < fncols ; j++) + { + /* add the current frontal matrix to the degree */ + ASSERT (Fcols [j] >= 0 && Fcols [j] < n_col) ; + Col_degree [Fcols [j]] += fnrows ; + } + } + + /* ---------------------------------------------------------------------- */ + /* add the current frontal matrix to the degrees of each row */ + /* ---------------------------------------------------------------------- */ + +#pragma ivdep + for (i = 0 ; i < fnrows ; i++) + { + /* add the current frontal matrix to the degree */ + ASSERT (Frows [i] >= 0 && Frows [i] < n_row) ; + Row_degree [Frows [i]] += fncols ; + } + + /* ---------------------------------------------------------------------- */ + /* Reset the external degree counters */ + /* ---------------------------------------------------------------------- */ + + E = Work->E ; + max_mark = MAX_MARK (nn) ; + + if (!Work->pivcol_in_front) + { + /* clear the external column degrees. no more Usons of current front */ + Work->cdeg0 += (nn + 1) ; + if (Work->cdeg0 >= max_mark) + { + /* guard against integer overflow. This is very rare */ + DEBUG1 (("Integer overflow, cdeg\n")) ; + Work->cdeg0 = 1 ; +#pragma ivdep + for (e = 1 ; e <= Work->nel ; e++) + { + if (E [e]) + { + ep = (Element *) (Memory + E [e]) ; + ep->cdeg = 0 ; + } + } + } + } + + if (!Work->pivrow_in_front) + { + /* clear the external row degrees. no more Lsons of current front */ + Work->rdeg0 += (nn + 1) ; + if (Work->rdeg0 >= max_mark) + { + /* guard against integer overflow. This is very rare */ + DEBUG1 (("Integer overflow, rdeg\n")) ; + Work->rdeg0 = 1 ; +#pragma ivdep + for (e = 1 ; e <= Work->nel ; e++) + { + if (E [e]) + { + ep = (Element *) (Memory + E [e]) ; + ep->rdeg = 0 ; + } + } + } + } + + /* ---------------------------------------------------------------------- */ + /* clear row/col offsets */ + /* ---------------------------------------------------------------------- */ + + if (!Work->pivrow_in_front) + { +#pragma ivdep + for (j = 0 ; j < fncols ; j++) + { + Fcpos [Fcols [j]] = EMPTY ; + } + } + + if (!Work->pivcol_in_front) + { +#pragma ivdep + for (i = 0 ; i < fnrows ; i++) + { + Frpos [Frows [i]] = EMPTY ; + } + } + + if (fncols <= 0 || fnrows <= 0) + { + /* no element to create */ + DEBUG2 (("Element evaporation\n")) ; + Work->prior_element = EMPTY ; + return (TRUE) ; + } + + /* ---------------------------------------------------------------------- */ + /* create element for later assembly */ + /* ---------------------------------------------------------------------- */ + +#ifndef NDEBUG + UMF_allocfail = FALSE ; + if (UMF_gprob > 0) + { + double rrr = ((double) (rand ( ))) / (((double) RAND_MAX) + 1) ; + DEBUG4 (("Check random %e %e\n", rrr, UMF_gprob)) ; + UMF_allocfail = rrr < UMF_gprob ; + if (UMF_allocfail) DEBUGm2 (("Random garbage collection (create)\n")); + } +#endif + + needunits = 0 ; + got_memory = FALSE ; + eloc = UMF_mem_alloc_element (Numeric, fnrows, fncols, &Rows, &Cols, &C, + &needunits, &ep) ; + + /* if UMF_get_memory needs to be called */ + if (Work->do_grow) + { + /* full compaction of current frontal matrix, since UMF_grow_front will + * be called next anyway. */ + r2 = fnrows ; + c2 = fncols ; + do_Fcpos = FALSE ; + } + else + { + /* partial compaction. */ + r2 = MAX (fnrows, Work->fnrows_new + 1) ; + c2 = MAX (fncols, Work->fncols_new + 1) ; + /* recompute Fcpos if pivot row is in the front */ + do_Fcpos = Work->pivrow_in_front ; + } + + if (!eloc) + { + /* Do garbage collection, realloc, and try again. */ + /* Compact the current front if it needs to grow anyway. */ + /* Note that there are no pivot rows or columns in the current front */ + DEBUGm3 (("get_memory from umf_create_element, 1\n")) ; + if (!UMF_get_memory (Numeric, Work, needunits, r2, c2, do_Fcpos)) + { + /* :: out of memory in umf_create_element (1) :: */ + DEBUGm4 (("out of memory: create element (1)\n")) ; + return (FALSE) ; /* out of memory */ + } + got_memory = TRUE ; + Memory = Numeric->Memory ; + eloc = UMF_mem_alloc_element (Numeric, fnrows, fncols, &Rows, &Cols, &C, + &needunits, &ep) ; + ASSERT (eloc >= 0) ; + if (!eloc) + { + /* :: out of memory in umf_create_element (2) :: */ + DEBUGm4 (("out of memory: create element (2)\n")) ; + return (FALSE) ; /* out of memory */ + } + } + + e = ++(Work->nel) ; /* get the name of this new frontal matrix */ + Work->prior_element = e ; + DEBUG8 (("wrapup e "ID" nel "ID"\n", e, Work->nel)) ; + + ASSERT (e > 0 && e < Work->elen) ; + ASSERT (E [e] == 0) ; + E [e] = eloc ; + + if (Work->pivcol_in_front) + { + /* the new element is a Uson of the next frontal matrix */ + ep->cdeg = Work->cdeg0 ; + } + + if (Work->pivrow_in_front) + { + /* the new element is an Lson of the next frontal matrix */ + ep->rdeg = Work->rdeg0 ; + } + + /* ---------------------------------------------------------------------- */ + /* copy frontal matrix into the new element */ + /* ---------------------------------------------------------------------- */ + +#pragma ivdep + for (i = 0 ; i < fnrows ; i++) + { + Rows [i] = Frows [i] ; + } +#pragma ivdep + for (i = 0 ; i < fncols ; i++) + { + Cols [i] = Fcols [i] ; + } + Fcol = Work->Fcblock ; + DEBUG0 (("copy front "ID" by "ID"\n", fnrows, fncols)) ; + fnr_curr = Work->fnr_curr ; + ASSERT (fnr_curr >= 0 && fnr_curr % 2 == 1) ; + for (j = 0 ; j < fncols ; j++) + { + copy_column (fnrows, Fcol, C) ; +#if 0 +#ifdef USE_NO_BLAS + copy_column (fnrows, Fcol, C) ; +#else + could also use BLAS-COPY (fnrows, Fcol, C) here, but it is typically + not as fast as the inlined copy_column subroutine, above. +#endif + for (i = 0 ; i < fnrows ; i++) + { + C [i] = Fcol [i] ; + } +#endif + Fcol += fnr_curr ; + C += fnrows ; + } + + DEBUG8 (("element copied\n")) ; + + /* ---------------------------------------------------------------------- */ + /* add tuples for the new element */ + /* ---------------------------------------------------------------------- */ + + tuple.e = e ; + + if (got_memory) + { + + /* ------------------------------------------------------------------ */ + /* UMF_get_memory ensures enough space exists for each new tuple */ + /* ------------------------------------------------------------------ */ + + /* place (e,f) in the element list of each column */ + for (tuple.f = 0 ; tuple.f < fncols ; tuple.f++) + { + col = Fcols [tuple.f] ; + ASSERT (col >= 0 && col < n_col) ; + ASSERT (NON_PIVOTAL_COL (col)) ; + ASSERT (Col_tuples [col]) ; + tp = ((Tuple *) (Memory + Col_tuples [col])) + Col_tlen [col]++ ; + *tp = tuple ; + } + + /* ------------------------------------------------------------------ */ + + /* place (e,f) in the element list of each row */ + for (tuple.f = 0 ; tuple.f < fnrows ; tuple.f++) + { + row = Frows [tuple.f] ; + ASSERT (row >= 0 && row < n_row) ; + ASSERT (NON_PIVOTAL_ROW (row)) ; + ASSERT (Row_tuples [row]) ; + tp = ((Tuple *) (Memory + Row_tuples [row])) + Row_tlen [row]++ ; + *tp = tuple ; + } + + } + else + { + + /* ------------------------------------------------------------------ */ + /* place (e,f) in the element list of each column */ + /* ------------------------------------------------------------------ */ + + /* might not have enough space for each tuple */ + + for (tuple.f = 0 ; tuple.f < fncols ; tuple.f++) + { + col = Fcols [tuple.f] ; + ASSERT (col >= 0 && col < n_col) ; + ASSERT (NON_PIVOTAL_COL (col)) ; + t1 = Col_tuples [col] ; + DEBUG1 (("Placing on col:"ID" , tuples at "ID"\n", + col, Col_tuples [col])) ; + + size = 0 ; + len = 0 ; + + if (t1) + { + p = Memory + t1 ; + tp = (Tuple *) p ; + size = GET_BLOCK_SIZE (p) ; + len = Col_tlen [col] ; + tp2 = tp + len ; + } + + needunits = UNITS (Tuple, len + 1) ; + DEBUG1 (("len: "ID" size: "ID" needunits: "ID"\n", + len, size, needunits)); + + if (needunits > size && t1) + { + /* prune the tuples */ + tp1 = tp ; + tp2 = tp ; + tpend = tp + len ; + for ( ; tp < tpend ; tp++) + { + e = tp->e ; + ASSERT (e > 0 && e <= Work->nel) ; + if (!E [e]) continue ; /* element already deallocated */ + f = tp->f ; + p = Memory + E [e] ; + ep = (Element *) p ; + p += UNITS (Element, 1) ; + Cols = (Int *) p ; + ; + if (Cols [f] == EMPTY) continue ; /* already assembled */ + ASSERT (col == Cols [f]) ; + *tp2++ = *tp ; /* leave the tuple in the list */ + } + len = tp2 - tp1 ; + Col_tlen [col] = len ; + needunits = UNITS (Tuple, len + 1) ; + } + + if (needunits > size) + { + /* no room exists - reallocate elsewhere */ + DEBUG1 (("REALLOCATE Col: "ID", size "ID" to "ID"\n", + col, size, 2*needunits)) ; + +#ifndef NDEBUG + UMF_allocfail = FALSE ; + if (UMF_gprob > 0) /* a double relop, but ignore NaN case */ + { + double rrr = ((double) (rand ( ))) / + (((double) RAND_MAX) + 1) ; + DEBUG1 (("Check random %e %e\n", rrr, UMF_gprob)) ; + UMF_allocfail = rrr < UMF_gprob ; + if (UMF_allocfail) DEBUGm2 (("Random gar. (col tuple)\n")) ; + } +#endif + + needunits = MIN (2*needunits, (Int) UNITS (Tuple, nn)) ; + t2 = UMF_mem_alloc_tail_block (Numeric, needunits) ; + if (!t2) + { + /* :: get memory in umf_create_element (1) :: */ + /* get memory, reconstruct all tuple lists, and return */ + /* Compact the current front if it needs to grow anyway. */ + /* Note: no pivot rows or columns in the current front */ + DEBUGm4 (("get_memory from umf_create_element, 1\n")) ; + return (UMF_get_memory (Numeric, Work, 0, r2, c2,do_Fcpos)); + } + Col_tuples [col] = t2 ; + tp2 = (Tuple *) (Memory + t2) ; + if (t1) + { + for (i = 0 ; i < len ; i++) + { + *tp2++ = *tp1++ ; + } + UMF_mem_free_tail_block (Numeric, t1) ; + } + } + + /* place the new (e,f) tuple in the element list of the column */ + Col_tlen [col]++ ; + *tp2 = tuple ; + } + + /* ------------------------------------------------------------------ */ + /* place (e,f) in the element list of each row */ + /* ------------------------------------------------------------------ */ + + for (tuple.f = 0 ; tuple.f < fnrows ; tuple.f++) + { + row = Frows [tuple.f] ; + ASSERT (row >= 0 && row < n_row) ; + ASSERT (NON_PIVOTAL_ROW (row)) ; + t1 = Row_tuples [row] ; + DEBUG1 (("Placing on row:"ID" , tuples at "ID"\n", + row, Row_tuples [row])) ; + + size = 0 ; + len = 0 ; + if (t1) + { + p = Memory + t1 ; + tp = (Tuple *) p ; + size = GET_BLOCK_SIZE (p) ; + len = Row_tlen [row] ; + tp2 = tp + len ; + } + + needunits = UNITS (Tuple, len + 1) ; + DEBUG1 (("len: "ID" size: "ID" needunits: "ID"\n", + len, size, needunits)) ; + + if (needunits > size && t1) + { + /* prune the tuples */ + tp1 = tp ; + tp2 = tp ; + tpend = tp + len ; + for ( ; tp < tpend ; tp++) + { + e = tp->e ; + ASSERT (e > 0 && e <= Work->nel) ; + if (!E [e]) + { + continue ; /* element already deallocated */ + } + f = tp->f ; + p = Memory + E [e] ; + ep = (Element *) p ; + p += UNITS (Element, 1) ; + Cols = (Int *) p ; + Rows = Cols + (ep->ncols) ; + if (Rows [f] == EMPTY) continue ; /* already assembled */ + ASSERT (row == Rows [f]) ; + *tp2++ = *tp ; /* leave the tuple in the list */ + } + len = tp2 - tp1 ; + Row_tlen [row] = len ; + needunits = UNITS (Tuple, len + 1) ; + } + + if (needunits > size) + { + /* no room exists - reallocate elsewhere */ + DEBUG1 (("REALLOCATE Row: "ID", size "ID" to "ID"\n", + row, size, 2*needunits)) ; + +#ifndef NDEBUG + UMF_allocfail = FALSE ; + if (UMF_gprob > 0) /* a double relop, but ignore NaN case */ + { + double rrr = ((double) (rand ( ))) / + (((double) RAND_MAX) + 1) ; + DEBUG1 (("Check random %e %e\n", rrr, UMF_gprob)) ; + UMF_allocfail = rrr < UMF_gprob ; + if (UMF_allocfail) DEBUGm2 (("Random gar. (row tuple)\n")) ; + } +#endif + + needunits = MIN (2*needunits, (Int) UNITS (Tuple, nn)) ; + t2 = UMF_mem_alloc_tail_block (Numeric, needunits) ; + if (!t2) + { + /* :: get memory in umf_create_element (2) :: */ + /* get memory, reconstruct all tuple lists, and return */ + /* Compact the current front if it needs to grow anyway. */ + /* Note: no pivot rows or columns in the current front */ + DEBUGm4 (("get_memory from umf_create_element, 2\n")) ; + return (UMF_get_memory (Numeric, Work, 0, r2, c2,do_Fcpos)); + } + Row_tuples [row] = t2 ; + tp2 = (Tuple *) (Memory + t2) ; + if (t1) + { + for (i = 0 ; i < len ; i++) + { + *tp2++ = *tp1++ ; + } + UMF_mem_free_tail_block (Numeric, t1) ; + } + } + + /* place the new (e,f) tuple in the element list of the row */ + Row_tlen [row]++ ; + *tp2 = tuple ; + } + + } + + /* ---------------------------------------------------------------------- */ + +#ifndef NDEBUG + DEBUG1 (("Done extending\nFINAL: element row pattern: len="ID"\n", fncols)); + for (j = 0 ; j < fncols ; j++) DEBUG1 ((""ID"\n", Fcols [j])) ; + DEBUG1 (("FINAL: element col pattern: len="ID"\n", fnrows)) ; + for (j = 0 ; j < fnrows ; j++) DEBUG1 ((""ID"\n", Frows [j])) ; + for (j = 0 ; j < fncols ; j++) + { + col = Fcols [j] ; + ASSERT (col >= 0 && col < n_col) ; + UMF_dump_rowcol (1, Numeric, Work, col, !Symbolic->fixQ) ; + } + for (j = 0 ; j < fnrows ; j++) + { + row = Frows [j] ; + ASSERT (row >= 0 && row < n_row) ; + UMF_dump_rowcol (0, Numeric, Work, row, TRUE) ; + } + if (n_row < 1000 && n_col < 1000) + { + UMF_dump_memory (Numeric) ; + } + DEBUG1 (("New element, after filling with stuff: "ID"\n", e)) ; + UMF_dump_element (Numeric, Work, e, TRUE) ; + if (nn < 1000) + { + DEBUG4 (("Matrix dump, after New element: "ID"\n", e)) ; + UMF_dump_matrix (Numeric, Work, TRUE) ; + } + DEBUG3 (("FRONTAL WRAPUP DONE\n")) ; +#endif + + return (TRUE) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_create_element.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_create_element.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,12 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL Int UMF_create_element +( + NumericType *Numeric, + WorkType *Work, + SymbolicType *Symbolic +) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_dump.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_dump.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,1225 @@ +/* ========================================================================== */ +/* === UMF_dump ============================================================= */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* These routines, and external variables, are used only when debugging. */ +/* If debugging is disabled (for normal operation) then this entire file */ +/* becomes empty */ + +#include "umf_internal.h" + +#ifndef NDEBUG + +/* These global debugging variables and arrays do not exist if debugging */ +/* is disabled at compile time (which is the default). */ +GLOBAL Int UMF_debug = -999 ; +GLOBAL Int UMF_allocfail = FALSE ; +GLOBAL double UMF_gprob = -1.0 ; + +/* static debugging arrays used only in UMF_dump_rowcol */ +PRIVATE Int UMF_DBflag = 0 ; +PRIVATE Int UMF_DBpacked [UMF_DBMAX+1] ; +PRIVATE Int UMF_DBscatter [UMF_DBMAX+1] ; + +/* ========================================================================== */ +/* === UMF_DBinit =========================================================== */ +/* ========================================================================== */ + +/* clear the debugging arrays */ + +PRIVATE void UMF_DBinit +( + void +) +{ + Int i ; + + /* Int_MAX is defined in umfpack.h */ + if (UMF_DBflag < 1 || UMF_DBflag == Int_MAX) + { + /* clear the debugging arrays */ + UMF_DBflag = 0 ; + for (i = 0 ; i <= UMF_DBMAX ; i++) + { + UMF_DBscatter [i] = 0 ; + UMF_DBpacked [i] = 0 ; + } + } + + UMF_DBflag++ ; + + /* UMF_DBflag > UMF_DBscatter [0...UMF_DBmax] is now true */ +} + +/* ========================================================================== */ +/* === UMF_dump_dense ======================================================= */ +/* ========================================================================== */ + +GLOBAL void UMF_dump_dense +( + Entry *C, + Int dim, + Int m, + Int n +) +{ + + /* dump C [1..m,1..n], with column dimenstion dim */ + Int i, j; + + if (UMF_debug < 7) return ; + if (C == (Entry *) NULL) + { + DEBUG7 (("No dense matrix allocated\n")) ; + return ; + } + DEBUG8 ((" dimension= "ID" rows= "ID" cols= "ID"\n", dim, m, n)) ; + + for (i = 0 ; i < m ; i++) + { + DEBUG9 ((ID": ", i)) ; + for (j = 0 ; j < n ; j++) + { + EDEBUG9 (C [i+j*dim]) ; + if (j % 6 == 5) DEBUG9 (("\n ")) ; + } + DEBUG9 (("\n")) ; + } + + for (i = 0 ; i < m ; i++) + { + for (j = 0 ; j < n ; j++) + { + if (IS_ZERO (C [i+j*dim])) + { + DEBUG8 ((".")) ; + } + else + { + DEBUG8 (("X")) ; + } + } + DEBUG8 (("\n")) ; + } +} + +/* ========================================================================== */ +/* === UMF_dump_element ===================================================== */ +/* ========================================================================== */ + +GLOBAL void UMF_dump_element +( + NumericType *Numeric, + WorkType *Work, + Int e, + Int clean +) +{ + + Int i, j, k, *Rows, *Cols, nrows, ncols, *E, row, col, + *Row_degree, *Col_degree ; + Entry *C ; + Element *ep ; + Unit *p ; + + if (UMF_debug < 7) return ; + + if (e == 0) + { + UMF_dump_current_front (Numeric, Work, FALSE) ; + return ; + } + + DEBUG7 (("\n====================ELEMENT: "ID" ", e)) ; + if (!Numeric || !Work || !Numeric->Memory) + { + DEBUG7 ((" No Numeric, Work\n")) ; + return ; + } + DEBUG7 ((" nel: "ID" of "ID, e, Work->nel)) ; + E = Work->E ; + if (!E) + { + DEBUG7 ((" No elements\n")) ; + return ; + } + if (e < 0 || e > Work->nel) + { + DEBUG7 (("e out of range!\n")) ; + return ; + } + if (!E [e]) + { + DEBUG7 ((" deallocated\n")) ; + return ; + } + DEBUG7 (("\n")) ; + Col_degree = Numeric->Cperm ; + Row_degree = Numeric->Rperm ; + + p = Numeric->Memory + E [e] ; + DEBUG7 (("ep "ID"\n", (Int) (p-Numeric->Memory))) ; + GET_ELEMENT (ep, p, Cols, Rows, ncols, nrows, C) ; + DEBUG7 (("nrows "ID" nrowsleft "ID"\n", nrows, ep->nrowsleft)) ; + DEBUG7 (("ncols "ID" ncolsleft "ID"\n", ncols, ep->ncolsleft)) ; + DEBUG7 (("cdeg-cdeg0 "ID" rdeg-rdeg0 "ID" next "ID"\n", + ep->cdeg - Work->cdeg0, ep->rdeg - Work->rdeg0, ep->next)) ; + + DEBUG8 (("rows: ")) ; + k = 0 ; + for (i = 0 ; i < ep->nrows ; i++) + { + row = Rows [i] ; + if (row >= 0) + { + DEBUG8 ((" "ID, row)) ; + ASSERT (row < Work->n_row) ; + if ((k++ % 10) == 9) DEBUG8 (("\n")) ; + ASSERT (IMPLIES (clean, NON_PIVOTAL_ROW (row))) ; + } + } + + DEBUG8 (("\ncols: ")) ; + k = 0 ; + for (j = 0 ; j < ep->ncols ; j++) + { + col = Cols [j] ; + if (col >= 0) + { + DEBUG8 ((" "ID, col)) ; + ASSERT (col < Work->n_col) ; + if ((k++ % 10) == 9) DEBUG8 (("\n")) ; + ASSERT (IMPLIES (clean, NON_PIVOTAL_COL (col))) ; + } + } + + DEBUG8 (("\nvalues:\n")) ; + if (UMF_debug >= 9) + { + for (i = 0 ; i < ep->nrows ; i++) + { + row = Rows [i] ; + if (row >= 0) + { + DEBUG9 ((ID": ", row)) ; + k = 0 ; + for (j = 0 ; j < ep->ncols ; j++) + { + col = Cols [j] ; + if (col >= 0) + { + EDEBUG9 (C [i+j*ep->nrows]) ; + if (k++ % 6 == 5) DEBUG9 (("\n ")) ; + } + } + DEBUG9 (("\n")) ; + } + } + } + + DEBUG7 (("====================\n")) ; +} + + +/* ========================================================================== */ +/* === UMF_dump_rowcol ====================================================== */ +/* ========================================================================== */ + +/* dump a row or a column, from one or more memory spaces */ +/* return exact degree */ + +GLOBAL void UMF_dump_rowcol +( + Int dumpwhich, /* 0 for row, 1 for column */ + NumericType *Numeric, + WorkType *Work, + Int dumpindex, /* row or column index to dump */ + Int check_degree /* true if degree is to be checked */ +) +{ + Entry value ; + Entry *C ; + Int f, nrows, j, jj, len, e, deg, index, n_row, n_col, *Cols, *Rows, nn, + dumpdeg, ncols, preve, *E, tpi, *Pattern, approx_deg, not_in_use ; + Tuple *tp, *tend ; + Element *ep ; + Int *Row_tuples, *Row_degree, *Row_tlen ; + Int *Col_tuples, *Col_degree, *Col_tlen ; + Unit *p ; + Int is_there ; + + /* clear the debugging arrays */ + UMF_DBinit () ; + + if (dumpwhich == 0) + { + DEBUG7 (("\n====================ROW: "ID, dumpindex)) ; + } + else + { + DEBUG7 (("\n====================COL: "ID, dumpindex)) ; + } + + if (dumpindex == EMPTY) + { + DEBUG7 ((" (EMPTY)\n")) ; + return ; + } + + deg = 0 ; + approx_deg = 0 ; + + if (!Numeric || !Work) + { + DEBUG7 ((" No Numeric, Work\n")) ; + return ; + } + + n_row = Work->n_row ; + n_col = Work->n_col ; + nn = MAX (n_row, n_col) ; + E = Work->E ; + + Col_degree = Numeric->Cperm ; + Row_degree = Numeric->Rperm ; + + Row_tuples = Numeric->Uip ; + Row_tlen = Numeric->Uilen ; + Col_tuples = Numeric->Lip ; + Col_tlen = Numeric->Lilen ; + + if (!E + || !Row_tuples || !Row_degree || !Row_tlen + || !Col_tuples || !Col_degree || !Col_tlen) + { + DEBUG7 ((" No E, Rows, Cols\n")) ; + return ; + } + + if (dumpwhich == 0) + { + /* dump a row */ + ASSERT (dumpindex >= 0 && dumpindex < n_row) ; + if (!NON_PIVOTAL_ROW (dumpindex)) + { + DEBUG7 ((" Pivotal\n")) ; + return ; + } + len = Row_tlen [dumpindex] ; + dumpdeg = Row_degree [dumpindex] ; + tpi = Row_tuples [dumpindex] ; + } + else + { + /* dump a column */ + ASSERT (dumpindex >= 0 && dumpindex < n_col) ; + if (!NON_PIVOTAL_COL (dumpindex)) + { + DEBUG7 ((" Pivotal\n")) ; + return ; + } + len = Col_tlen [dumpindex] ; + dumpdeg = Col_degree [dumpindex] ; + tpi = Col_tuples [dumpindex] ; + } + + p = Numeric->Memory + tpi ; + tp = (Tuple *) p ; + if (!tpi) + { + DEBUG7 ((" Nonpivotal, No tuple list tuples "ID" tlen "ID"\n", + tpi, len)) ; + return ; + } + ASSERT (p >= Numeric->Memory + Numeric->itail) ; + ASSERT (p < Numeric->Memory + Numeric->size) ; + + DEBUG7 ((" degree: "ID" len: "ID"\n", dumpdeg, len)) ; + not_in_use = (p-1)->header.size - UNITS (Tuple, len) ; + DEBUG7 ((" Tuple list: p+1: "ID" size: "ID" units, "ID" not in use\n", + (Int) (p-Numeric->Memory), (p-1)->header.size, not_in_use)) ; + ASSERT (not_in_use >= 0) ; + tend = tp + len ; + preve = 0 ; + for ( ; tp < tend ; tp++) + { + /* row/col of element e, offset is f: */ + /* DEBUG8 ((" (tp="ID")\n", tp)) ; */ + e = tp->e ; + f = tp->f ; + DEBUG8 ((" (e="ID", f="ID")\n", e, f)) ; + ASSERT (e > 0 && e <= Work->nel) ; + /* dump the pattern and values */ + if (E [e]) + { + p = Numeric->Memory + E [e] ; + GET_ELEMENT (ep, p, Cols, Rows, ncols, nrows, C) ; + if (dumpwhich == 0) + { + Pattern = Cols ; + jj = ep->ncols ; + is_there = Rows [f] >= 0 ; + if (is_there) approx_deg += ep->ncolsleft ; + } + else + { + Pattern = Rows ; + jj = ep->nrows ; + is_there = Cols [f] >= 0 ; + if (is_there) approx_deg += ep->nrowsleft ; + } + if (!is_there) + { + DEBUG8 (("\t\tnot present\n")) ; + } + else + { + for (j = 0 ; j < jj ; j++) + { + index = Pattern [j] ; + value = + C [ (dumpwhich == 0) ? (f+nrows*j) : (j+nrows*f) ] ; + if (index >= 0) + { + DEBUG8 (("\t\t"ID":", index)) ; + EDEBUG8 (value) ; + DEBUG8 (("\n")) ; + if (dumpwhich == 0) + { + /* col must be in the range 0..n_col-1 */ + ASSERT (index < n_col) ; + } + else + { + /* row must be in the range 0..n_row-1 */ + ASSERT (index < n_row) ; + } + + if (nn <= UMF_DBMAX) + { + if (UMF_DBscatter [index] != UMF_DBflag) + { + UMF_DBpacked [deg++] = index ; + UMF_DBscatter [index] = UMF_DBflag ; + } + } + } + } + } + /* the (e,f) tuples should be in order of their creation */ + /* this means that garbage collection will not jumble them */ + ASSERT (preve < e) ; + preve = e ; + } + else + { + DEBUG8 (("\t\tdeallocated\n")) ; + } + } + + if (nn <= UMF_DBMAX) + { + if (deg > 0) + { + DEBUG7 ((" Assembled, actual deg: "ID" : ", deg)) ; + for (j = 0 ; j < deg ; j++) + { + index = UMF_DBpacked [j] ; + DEBUG8 ((ID" ", index)) ; + if (j % 20 == 19) DEBUG8 (("\n ")) ; + ASSERT (UMF_DBscatter [index] == UMF_DBflag) ; + } + DEBUG7 (("\n")) ; + } + } + + /* Col_degree is not maintained when fixQ is true */ + if (check_degree) + { + DEBUG8 ((" approx_deg "ID" dumpdeg "ID"\n", approx_deg, dumpdeg)) ; + ASSERT (approx_deg == dumpdeg) ; + } + + DEBUG7 (("====================\n")) ; + + /* deg is now the exact degree */ + /* if nn <= UMF_DBMAX, then UMF_DBscatter [i] == UMF_DBflag for every i */ + /* in the row or col, and != UMF_DBflag if not */ + + return ; +} + + +/* ========================================================================== */ +/* === UMF_dump_matrix ====================================================== */ +/* ========================================================================== */ + +GLOBAL void UMF_dump_matrix +( + NumericType *Numeric, + WorkType *Work, + Int check_degree +) +{ + + Int e, row, col, intfrag, frag, n_row, n_col, *E, fullsize, actualsize ; + Element *ep ; + Unit *p ; + + DEBUG6 (("=================================================== MATRIX:\n")) ; + if (!Numeric || !Work) + { + DEBUG6 (("No Numeric or Work allocated\n")) ; + return ; + } + if (!Numeric->Memory) + { + DEBUG6 (("No Numeric->Memory\n")) ; + return ; + } + + n_row = Work->n_row ; + n_col = Work->n_col ; + DEBUG6 (("n_row "ID" n_col "ID" nz "ID"\n", n_row, n_col, Work->nz)) ; + DEBUG6 (("============================ ELEMENTS: "ID" \n", Work->nel)) ; + intfrag = 0 ; + E = Work->E ; + if (!E) + { + DEBUG6 (("No elements allocated\n")) ; + } + else + { + for (e = 0 ; e <= Work->nel ; e++) + { + UMF_dump_element (Numeric, Work, e, FALSE) ; + if (e > 0 && E [e]) + { + p = Numeric->Memory + E [e] ; + ep = (Element *) p ; + ASSERT (ep->nrowsleft > 0 || ep->ncolsleft > 0) ; + fullsize = GET_BLOCK_SIZE (p) ; + actualsize = GET_ELEMENT_SIZE (ep->nrowsleft,ep->ncolsleft); + frag = fullsize - actualsize ; + intfrag += frag ; + DEBUG7 (("dump el: "ID", full "ID" actual "ID" frag: "ID + " intfrag: "ID"\n", e, fullsize, actualsize, frag, + intfrag)) ; + } + } + } + + DEBUG6 (("CURRENT INTERNAL FRAG in elements: "ID" \n", intfrag)) ; + + + + DEBUG6 (("======================================== ROWS: "ID"\n", n_row)) ; + UMF_debug -= 2 ; + for (row = 0 ; row < n_row ; row++) + { + UMF_dump_rowcol (0, Numeric, Work, row, check_degree) ; + } + UMF_debug += 2 ; + DEBUG6 (("======================================== COLS: "ID"\n", n_col)) ; + UMF_debug -= 2 ; + for (col = 0 ; col < n_col ; col++) + { + UMF_dump_rowcol (1, Numeric, Work, col, FALSE) ; + } + UMF_debug += 2 ; + DEBUG6 (("============================================= END OF MATRIX:\n")); +} + + +/* ========================================================================== */ +/* === UMF_dump_current_front =============================================== */ +/* ========================================================================== */ + +GLOBAL void UMF_dump_current_front +( + NumericType *Numeric, + WorkType *Work, + Int check +) +{ + + Entry *Flublock, *Flblock, *Fublock, *Fcblock ; + Int fnrows_max, fncols_max, fnrows, fncols, fnpiv, *Frows, *Fcols, + i, j, *Fcpos, *Frpos, fnr_curr, fnc_curr, *E ; + if (!Work) return ; + DEBUG7 (("\n\n========CURRENT FRONTAL MATRIX:\n")) ; + + Flublock = Work->Flublock ; + Flblock = Work->Flblock ; + Fublock = Work->Fublock ; + Fcblock = Work->Fcblock ; + + Frows = Work->Frows ; + Fcols = Work->Fcols ; + Frpos = Work->Frpos ; + Fcpos = Work->Fcpos ; + fnrows_max = Work->fnrows_max ; + fncols_max = Work->fncols_max ; + fnr_curr = Work->fnr_curr ; + fnc_curr = Work->fnc_curr ; + fnrows = Work->fnrows ; + fncols = Work->fncols ; + fnpiv = Work->fnpiv ; + E = Work->E ; + + DEBUG6 (("=== fnpiv= "ID"\n", fnpiv)) ; + DEBUG6 (("fnrows_max fncols_max "ID" "ID"\n",fnrows_max, fncols_max)) ; + DEBUG6 (("fnr_curr fnc_curr "ID" "ID"\n",fnr_curr, fnc_curr)) ; + DEBUG6 (("fnrows fncols "ID" "ID"\n",fnrows, fncols)) ; + ASSERT ((fnr_curr % 2 == 1) || fnr_curr == 0) ; + DEBUG6 (("Pivot row pattern:\n")) ; + for (j = 0 ; j < fncols ; j++) + { + DEBUG7 ((ID" "ID" "ID" %d\n", j, Fcols [j], Fcpos [Fcols [j]], + j < fncols)) ; + if (check) + { + ASSERT (Fcols [j] >= 0 && Fcols [j] < Work->n_col) ; + ASSERT (Fcpos [Fcols [j]] == j * fnr_curr) ; + } + } + DEBUG6 (("Pivot col pattern:\n")) ; + for (i = 0 ; i < fnrows ; i++) + { + DEBUG7 ((ID" "ID" "ID" %d\n", i, Frows [i], Frpos [Frows [i]], + i < fnrows)) ; + if (check) + { + ASSERT (Frows [i] >= 0 && Frows [i] < Work->n_row) ; + ASSERT (Frpos [Frows [i]] == i) ; + } + } + if (UMF_debug < 7) return ; + + if (!E [0]) + { + DEBUG6 (("current front not allocated\n")) ; + ASSERT (!Work->Flublock) ; + return ; + } + + ASSERT (Work->Flublock == (Entry *) (Numeric->Memory + E [0])) ; + DEBUG7 (("C block: ")) ; + UMF_dump_dense (Fcblock, fnr_curr, fnrows, fncols) ; + DEBUG7 (("L block: ")) ; + UMF_dump_dense (Flblock, fnr_curr, fnrows, fnpiv) ; + DEBUG7 (("U' block: ")) ; + UMF_dump_dense (Fublock, fnc_curr, fncols, fnpiv) ; + DEBUG7 (("LU block: ")) ; + UMF_dump_dense (Flublock, Work->nb, fnpiv, fnpiv) ; + if (fnpiv > 0) + { + DEBUG7 (("Pivot entry: ")) ; + EDEBUG7 (Flublock [(fnpiv-1)+(fnpiv-1)*Work->nb]) ; + DEBUG7 (("\n")) ; + } +} + +/* ========================================================================== */ +/* === UMF_dump_lu ========================================================== */ +/* ========================================================================== */ + +GLOBAL void UMF_dump_lu +( + NumericType *Numeric +) +{ + Int i, n_row, n_col, *Cperm, *Rperm ; + + DEBUG6 (("=============================================== LU factors:\n")) ; + if (!Numeric) + { + DEBUG6 (("No LU factors allocated\n")) ; + return ; + } + n_row = Numeric->n_row ; + n_col = Numeric->n_col ; + DEBUG6 (("n_row: "ID" n_col: "ID"\n", n_row, n_col)) ; + DEBUG6 (("nLentries: "ID" nUentries: "ID"\n", + Numeric->nLentries, Numeric->nUentries)) ; + + if (Numeric->Cperm) + { + Cperm = Numeric->Cperm ; + DEBUG7 (("Column permutations: (new: old)\n")) ; + for (i = 0 ; i < n_col ; i++) + { + if (Cperm [i] != EMPTY) + { + DEBUG7 ((ID": "ID"\n", i, Cperm [i])) ; + } + } + } + else + { + DEBUG7 (("No Numeric->Cperm allocatated\n")) ; + } + + if (Numeric->Rperm) + { + Rperm = Numeric->Rperm ; + DEBUG7 (("row permutations: (new: old)\n")) ; + for (i = 0 ; i < n_row ; i++) + { + if (Rperm [i] != EMPTY) + { + DEBUG7 ((ID": "ID"\n", i, Rperm [i])) ; + } + } + } + else + { + DEBUG7 (("No Numeric->Rperm allocatated\n")) ; + } + + DEBUG6 (("========================================= END OF LU factors:\n")); +} + + +/* ========================================================================== */ +/* === UMF_dump_memory ====================================================== */ +/* ========================================================================== */ + +GLOBAL void UMF_dump_memory +( + NumericType *Numeric +) +{ + + Unit *p ; + Int prevsize, s ; + Int found ; + + if (!Numeric) + { + DEBUG6 (("No memory space S allocated\n")) ; + return ; + } + + DEBUG6 (("\n ============================================== MEMORY:\n")) ; + if (!Numeric || !Numeric->Memory) + { + DEBUG6 (("No memory space Numeric allocated\n")) ; + return ; + } + + DEBUG6 (("S: "ID"\n", (Int) Numeric)) ; + DEBUG6 (("S->ihead : "ID"\n", Numeric->ihead)) ; + DEBUG6 (("S->itail : "ID"\n", Numeric->itail)) ; + DEBUG6 (("S->size : "ID"\n", Numeric->size)) ; + DEBUG6 (("S->ngarbage : "ID"\n", Numeric->ngarbage)) ; + DEBUG6 (("S->nrealloc : "ID"\n", Numeric->nrealloc)) ; + DEBUG6 ((" in use at head : "ID"\n", Numeric->ihead)) ; + DEBUG6 ((" free space : "ID"\n", + Numeric->itail - Numeric->ihead)) ; + DEBUG6 ((" blocks in use at tail : "ID"\n", + Numeric->size - Numeric->itail)) ; + DEBUG6 ((" total in use : "ID"\n", + Numeric->size - (Numeric->itail - Numeric->ihead))) ; + + prevsize = 0 ; + found = FALSE ; + + ASSERT (0 <= Numeric->ihead) ; + ASSERT (Numeric->ihead <= Numeric->itail) ; + ASSERT (Numeric->itail <= Numeric->size) ; + + p = Numeric->Memory + Numeric->itail ; + + while (p < Numeric->Memory + Numeric->size) + { + DEBUG8 (("p: "ID" p+1: "ID" prevsize: "ID" size: "ID, + (Int) (p-Numeric->Memory), (Int) (p+1-Numeric->Memory), + p->header.prevsize, p->header.size)) ; + if (p->header.size < 0) + { + DEBUG8 ((" free")) ; + } + + if (p == Numeric->Memory + Numeric->itail) + { + ASSERT (p->header.prevsize == 0) ; + } + else + { + ASSERT (p->header.prevsize > 0) ; + } + + ASSERT (p->header.size != 0) ; + s = prevsize >= 0 ? prevsize : -prevsize ; + ASSERT (p->header.prevsize == s) ; + /* no adjacent free blocks */ + ASSERT (p->header.size > 0 || prevsize > 0) ; + if (Numeric->ibig != EMPTY) + { + if (p == Numeric->Memory + Numeric->ibig) + { + ASSERT (p->header.size < 0) ; + DEBUG8 ((" <===== Numeric->ibig")) ; + found = TRUE ; + } + } + s = p->header.size ; + prevsize = s ; + s = s >= 0 ? s : -s ; + p = p + 1 + s ; + DEBUG8 (("\n")) ; + } + + ASSERT (p == Numeric->Memory + Numeric->size) ; + ASSERT (IMPLIES (Numeric->ibig != EMPTY, found)) ; + DEBUG6 (("============================================= END OF MEMORY:\n")); + +} + + +/* ========================================================================== */ +/* === UMF_dump_packed_memory =============================================== */ +/* ========================================================================== */ + +GLOBAL void UMF_dump_packed_memory +( + NumericType *Numeric, + WorkType *Work +) +{ + Unit *p, *p3 ; + Int prevsize, col, row, *Rows, *Cols, ncols, nrows, k, esize, + *Row_tuples, *Row_degree, *Col_tuples, *Col_degree ; + Entry *C ; + Element *ep ; + + Col_degree = Numeric->Cperm ; /* for NON_PIVOTAL_COL macro */ + Row_degree = Numeric->Rperm ; /* for NON_PIVOTAL_ROW macro */ + Row_tuples = Numeric->Uip ; + Col_tuples = Numeric->Lip ; + + DEBUG6 (("============================================ PACKED MEMORY:\n")) ; + if (!Numeric || !Numeric->Memory) + { + DEBUG6 (("No memory space S allocated\n")) ; + return ; + } + DEBUG6 (("S: "ID"\n", (Int) Numeric)) ; + DEBUG6 (("S->ihead : "ID"\n", Numeric->ihead)) ; + DEBUG6 (("S->itail : "ID"\n", Numeric->itail)) ; + DEBUG6 (("S->size : "ID"\n", Numeric->size)) ; + DEBUG6 (("S->ngarbage : "ID"\n", Numeric->ngarbage)) ; + DEBUG6 (("S->nrealloc : "ID"\n", Numeric->nrealloc)) ; + DEBUG6 ((" in use at head : "ID"\n", Numeric->ihead)) ; + DEBUG6 ((" free space : "ID"\n", + Numeric->itail - Numeric->ihead)) ; + DEBUG6 ((" blocks in use at tail : "ID"\n", + Numeric->size - Numeric->itail)) ; + DEBUG6 ((" total in use : "ID"\n", + Numeric->size - (Numeric->itail - Numeric->ihead))) ; + + ASSERT (0 <= Numeric->ihead) ; + ASSERT (Numeric->ihead <= Numeric->itail) ; + ASSERT (Numeric->itail <= Numeric->size) ; + + for (row = 0 ; row < Work->n_row ; row++) + { + ASSERT (IMPLIES (NON_PIVOTAL_ROW (row), !Row_tuples [row])) ; + } + for (col = 0 ; col < Work->n_col ; col++) + { + ASSERT (IMPLIES (NON_PIVOTAL_COL (col), !Col_tuples [col])) ; + } + + prevsize = 0 ; + p = Numeric->Memory + Numeric->itail ; + while (p < Numeric->Memory + Numeric->size) + { + DEBUG9 (("====================\n")) ; + DEBUG7 (("p: "ID" p+1: "ID" prevsize: "ID" size: "ID"\n", + (Int) (p-Numeric->Memory), (Int) (p+1-Numeric->Memory), + p->header.prevsize, p->header.size)) ; + ASSERT (p->header.size > 0) ; + + if (p == Numeric->Memory + Numeric->itail) + { + ASSERT (p->header.prevsize == 0) ; + } + else + { + ASSERT (p->header.prevsize > 0) ; + } + + ASSERT (p->header.prevsize == prevsize) ; + prevsize = p->header.size ; + + if (p != Numeric->Memory + Numeric->size - 2) + { + + p3 = p + 1 ; + if (p3 == Numeric->Memory + Work->E [0]) + { + /* this is the current frontal matrix */ + UMF_dump_current_front (Numeric, Work, FALSE) ; + } + else + { + + /* this is a packed element */ + GET_ELEMENT (ep, p3, Cols, Rows, ncols, nrows, C) ; + DEBUG9 (("ep "ID"\n nrows "ID" ncols "ID"\n", + (Int) ((p+1)-Numeric->Memory), ep->nrows, ep->ncols)) ; + DEBUG9 (("rows:")) ; + for (k = 0 ; k < ep->nrows; k++) + { + row = Rows [k] ; + DEBUG9 ((" "ID, row)) ; + ASSERT (row >= 0 && row <= Work->n_row) ; + if ((k % 10) == 9) DEBUG9 (("\n")) ; + } + DEBUG9 (("\ncols:")) ; + for (k = 0 ; k < ep->ncols; k++) + { + col = Cols [k] ; + DEBUG9 ((" "ID, col)) ; + ASSERT (col >= 0 && col <= Work->n_col) ; + if ((k % 10) == 9) DEBUG9 (("\n")) ; + } + DEBUG9 (("\nvalues: ")) ; + if (UMF_debug >= 9) + { + UMF_dump_dense (C, ep->nrows, ep->nrows, ep->ncols) ; + } + esize = GET_ELEMENT_SIZE (ep->nrows, ep->ncols) ; + DEBUG9 (("esize: "ID"\n", esize)) ; + ASSERT (esize <= p->header.size) ; + } + + } + else + { + /* this is the final marker block */ + ASSERT (p->header.size == 1) ; + } + p = p + 1 + p->header.size ; + } + + ASSERT (Numeric->ibig == EMPTY) ; + ASSERT (p == Numeric->Memory + Numeric->size) ; + DEBUG6 (("======================================END OF PACKED MEMORY:\n")) ; + +} + +/* ========================================================================== */ +/* === UMF_dump_col_matrix ================================================== */ +/* ========================================================================== */ + +/* This code is the same for real or complex matrices. */ + +GLOBAL void UMF_dump_col_matrix +( + const double Ax [ ], /* Ax [0..nz-1]: real values, in column order */ +#ifdef COMPLEX + const double Az [ ], /* Az [0..nz-1]: imag values, in column order */ +#endif + const Int Ai [ ], /* Ai [0..nz-1]: row indices, in column order */ + const Int Ap [ ], /* Ap [0..n_col]: column pointers */ + Int n_row, /* number of rows of A */ + Int n_col, /* number of columns of A */ + Int nz /* number of entries */ +) +{ + Int col, p, p1, p2, row ; +#ifdef COMPLEX + Int split = SPLIT (Az) ; +#endif + + if (!Ai || !Ap) return ; + DEBUG6 (("============================================ COLUMN FORM:\n")) ; + + ASSERT (n_col >= 0) ; + nz = Ap [n_col] ; + DEBUG2 (("UMF_dump_col: nz "ID"\n", nz)) ; + DEBUG2 (("n_row "ID" \n", n_row)) ; + DEBUG2 (("n_col "ID" \n", n_col)) ; + + DEBUG6 ((" n_row = "ID", n_col ="ID" nz = "ID" Ap [0] "ID", Ap [n] "ID"\n", + n_row, n_col, nz, Ap [0], Ap [n_col])) ; + ASSERT (Ap [0] == 0) ; + ASSERT (Ap [n_col] == nz) ; + for (col = 0 ; col < n_col ; col++) + { + p1 = Ap [col] ; + p2 = Ap [col+1] ; + DEBUG6 (("col: "ID", length "ID"\n", col, p2 - p1)) ; + ASSERT (p2 >= p1) ; + for (p = p1 ; p < p2 ; p++) + { + row = Ai [p] ; + ASSERT (row >= 0 && row < n_row) ; + DEBUG6 (("\t"ID" ", row)) ; + if (Ax != (double *) NULL) + { +#ifdef COMPLEX + if (split) + { + DEBUG6 ((" (%e+%ei) ", Ax [p], Az [p])) ; + } + else + { + DEBUG6 ((" (%e+%ei) ", Ax [2*p], Ax [2*p+1])) ; + } +#else + DEBUG6 ((" %e", Ax [p])) ; +#endif + } + DEBUG6 (("\n")) ; + } + } + DEBUG6 (("========================================== COLUMN FORM done\n")) ; +} + + +/* ========================================================================== */ +/* === UMF_dump_chain ======================================================= */ +/* ========================================================================== */ + +GLOBAL void UMF_dump_chain +( + Int frontid, + Int Front_parent [ ], + Int Front_npivcol [ ], + Int Front_nrows [ ], + Int Front_ncols [ ], + Int nfr +) +{ + Int i, len = 0 ; + + /* print a list of contiguous parents */ + i = frontid ; + ASSERT (Front_parent [i] == EMPTY || + (Front_parent [i] > i && Front_parent [i] < nfr)) ; + + len++ ; + DEBUG3 (("Chain:\n "ID" ["ID","ID"]("ID"-by-"ID")\n", i, + Front_npivcol [i], + MIN (Front_npivcol [i], Front_nrows [i]), + Front_nrows [i], + Front_ncols [i])) ; + + for (i = frontid ; i < nfr ; i++) + { + ASSERT (Front_parent [i] == EMPTY || + (Front_parent [i] > i && Front_parent [i] < nfr)) ; + if (Front_parent [i] == i+1) + { + len++ ; + DEBUG3 (("\t"ID" ["ID","ID"]("ID"-by-"ID")\n", i+1, + Front_npivcol [i+1], + MIN (Front_npivcol [i+1], Front_nrows [i+1]), + Front_nrows [i+1], + Front_ncols [i+1])) ; + } + else + { + DEBUG2 (("Length of chain: "ID"\n", len)) ; + return ; + } + } +} + + +/* ========================================================================== */ +/* === UMF_dump_start ======================================================= */ +/* ========================================================================== */ + +GLOBAL void UMF_dump_start +( + void +) +{ + FILE *ff ; + + AMD_debug_init ("from umfpack") ; + + /* get the debug print level from the "debug.umf" file, if it exists */ + UMF_debug = -999 ; + ff = fopen ("debug.umf", "r") ; + if (ff) + { + (void) fscanf (ff, ID, &UMF_debug) ; + (void) fclose (ff) ; + } + + DEBUG0 (("umfpack: debug version (SLOW!) ")) ; + + DEBUG0 ((" BLAS: ")) ; + +#if defined (USE_NO_BLAS) + DEBUG0 (("none.")) ; +#elif defined (USE_C_BLAS) + DEBUG0 (("C-BLAS.")) ; +#elif defined (USE_MATLAB_BLAS) + DEBUG0 (("built-in MATLAB BLAS.")) ; +#elif defined (USE_SUNPERF_BLAS) + DEBUG0 (("Sun Performance Library BLAS.")) ; +#elif defined (USE_SCSL_BLAS) + DEBUG0 (("SGI SCSL BLAS.")) ; +#elif defined (USE_FORTRAN_BLAS) + DEBUG0 (("Fortran BLAS.")) ; +#endif + + DEBUG0 ((" MATLAB: ")) ; +#ifdef MATLAB_MEX_FILE + DEBUG0 (("mexFunction.\n")) ; +#else +#ifdef MATHWORKS + DEBUG0 (("yes (uses MathWorks internal ut* routines).\n")) ; +#else + DEBUG0 (("no.\n")) ; +#endif +#endif + + UMF_gprob = -1.0 ; + ff = fopen ("gprob.umf", "r") ; + if (ff) + { + (void) fscanf (ff, "%lg", &UMF_gprob) ; + (void) fclose (ff) ; + srand (1) ; /* restart the random number generator */ + } + + if (UMF_gprob > 1.0) UMF_gprob = 1.0 ; + DEBUG1 (("factor: UMF_gprob: %e UMF_debug "ID"\n", UMF_gprob, UMF_debug)) ; + + DEBUG2 (("sizeof: (bytes / int / Units) \n")) ; + DEBUG2 (("sizeof (Int) %u %u %u\n", + sizeof (Int), sizeof (Int) / sizeof (int), UNITS (Int, 1) )) ; + DEBUG2 (("sizeof (int) %u %u %u\n", + sizeof (int), sizeof (int) / sizeof (int), UNITS (int, 1) )) ; + DEBUG2 (("sizeof (size_t) %u %u %u\n", + sizeof (size_t), sizeof (size_t) / sizeof (size_t), UNITS (size_t, 1) )) ; + DEBUG2 (("sizeof (long) %u %u %u\n", + sizeof (long), sizeof (long) / sizeof (long), UNITS (long, 1) )) ; + DEBUG2 (("sizeof (double) %u %u %u\n", + sizeof (double), sizeof (double) / sizeof (int), UNITS (double, 1) )) ; + DEBUG2 (("sizeof (Unit) %u %u %u\n", + sizeof (Unit), sizeof (Unit) / sizeof (int), UNITS (Unit, 1) )) ; + DEBUG2 (("sizeof (Entry) %u %u %u\n", + sizeof (Entry), sizeof (Entry) / sizeof (int), UNITS (Entry, 1) )) ; + DEBUG2 (("sizeof (Tuple) %u %u %u\n", + sizeof (Tuple), sizeof (Tuple) / sizeof (int), UNITS (Tuple, 1) )) ; + DEBUG2 (("sizeof (Tuple *) %u %u %u\n", + sizeof (Tuple *), sizeof (Tuple *) / sizeof (int), UNITS (Tuple *, 1) )) ; + DEBUG2 (("sizeof (Element) %u %u %u\n", + sizeof (Element), sizeof (Element) / sizeof (int), UNITS (Element, 1) )) ; + DEBUG2 (("sizeof (Element *) %u %u %u\n", + sizeof (Element *), sizeof (Element *) / sizeof (int), + UNITS (Element *, 1) )) ; + DEBUG2 (("sizeof (WorkType) %u %u %u\n", + sizeof (WorkType), sizeof (WorkType) / sizeof (int), + UNITS (WorkType, 1) )) ; + DEBUG2 (("sizeof (NumericType) %u %u %u\n", + sizeof (NumericType), sizeof (NumericType) / sizeof (int), + UNITS (NumericType, 1) )) ; + DEBUG2 (("sizeof (SymbolicType) %u %u %u\n", + sizeof (SymbolicType), sizeof (SymbolicType) / sizeof (int), + UNITS (SymbolicType, 1) )) ; + +} + + +/* ========================================================================== */ +/* === UMF_dump_rowmerge ==================================================== */ +/* ========================================================================== */ + +GLOBAL void UMF_dump_rowmerge +( + NumericType *Numeric, + SymbolicType *Symbolic, + WorkType *Work +) +{ + Int *Front_leftmostdesc, *Front_1strow, *Front_new1strow, row1, row2, + fleftmost, nfr, n_row, *Row_degree, i, frontid, row ; + + nfr = Symbolic->nfr ; + DEBUG3 (("\n================== Row merge sets: nfr "ID"\n", nfr)) ; + Front_leftmostdesc = Symbolic->Front_leftmostdesc ; + Front_1strow = Symbolic->Front_1strow ; + Front_new1strow = Work->Front_new1strow ; + n_row = Symbolic->n_row ; + Row_degree = Numeric->Rperm ; + frontid = Work->frontid ; + + for (i = frontid ; i <= nfr ; i++) + { + DEBUG3 (("----------------------\n")) ; + if (i == nfr) DEBUG3 (("Dummy: ")) ; + DEBUG3 (("Front "ID" 1strow "ID" new1strow "ID" leftmostdesc "ID, + i, Front_1strow [i], Front_new1strow [i], Front_leftmostdesc [i])) ; + DEBUG3 ((" parent "ID" pivcol "ID"\n", Symbolic->Front_parent [i], + Symbolic->Front_npivcol [i])) ; + + if (i == nfr) + { + fleftmost = -1 ; + row1 = Front_new1strow [i] ; + row2 = n_row-1 ; + } + else + { + fleftmost = Front_leftmostdesc [i] ; + row1 = Front_new1strow [fleftmost] ; + row2 = Front_1strow [i+1] - 1 ; + } + DEBUG3 (("Leftmost: "ID" Rows ["ID" to "ID"], search ["ID" to "ID"]\n", + fleftmost, Front_1strow [i], row2, row1, row2)) ; + + for (row = row1 ; row <= row2 ; row++) + { + ASSERT (row >= 0 && row < n_row) ; + DEBUG3 ((" Row "ID" live: %d\n", row, NON_PIVOTAL_ROW (row))) ; + } + } +} + +/* ========================================================================== */ +/* === UMF_dump_diagonal_map ================================================ */ +/* ========================================================================== */ + +GLOBAL void UMF_dump_diagonal_map +( + Int Diagonal_map [ ], + Int Diagonal_imap [ ], + Int n1, + Int nn, + Int nempty +) +{ + Int row, col ; + if (Diagonal_map != (Int *) NULL) + { + DEBUG2 (("\nDump the Diagonal_map: n1 "ID" nn "ID" nempty "ID"\n", + n1, nn, nempty)) ; + for (col = n1 ; col < nn - nempty ; col++) + { + row = Diagonal_map [col] ; + DEBUG2 ((" Diagonal_map [col = "ID"] gives "ID": ", + col, row)) ; + row = UNFLIP (row) ; + DEBUG2 ((" row "ID"\n", row)) ; + ASSERT (Diagonal_imap [row] == col) ; + } + } +} + +#endif /* NDEBUG */ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_dump.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_dump.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,186 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* umf_dump.h: debugging definitions. */ + +#ifndef NDEBUG + +GLOBAL void UMF_dump_dense +( + Entry *C, + Int dim, + Int m, + Int n +) ; + +GLOBAL void UMF_dump_element +( + NumericType *Numeric, + WorkType *Work, + Int e, + Int clean +) ; + +GLOBAL void UMF_dump_rowcol +( + Int dump_which, + NumericType *Numeric, + WorkType *Work, + Int dump_index, + Int check_degree +) ; + +GLOBAL void UMF_dump_matrix +( + NumericType *Numeric, + WorkType *Work, + Int check_degree +) ; + +GLOBAL void UMF_dump_current_front +( + NumericType *Numeric, + WorkType *Work, + Int check +) ; + +GLOBAL void UMF_dump_lu +( + NumericType *Numeric +) ; + +GLOBAL void UMF_dump_memory +( + NumericType *Numeric +) ; + +GLOBAL void UMF_dump_packed_memory +( + NumericType *Numeric, + WorkType *Work +) ; + +GLOBAL void UMF_dump_col_matrix +( + const double Ax [ ], +#ifdef COMPLEX + const double Az [ ], +#endif + const Int Ai [ ], + const Int Ap [ ], + Int n_row, + Int n_col, + Int nz +) ; + +GLOBAL void UMF_dump_chain +( + Int frontid, + Int Front_parent [ ], + Int Front_npivcol [ ], + Int Front_nrows [ ], + Int Front_ncols [ ], + Int nfr +) ; + +GLOBAL void UMF_dump_rowmerge +( + NumericType *Numeric, + SymbolicType *Symbolic, + WorkType *Work +) ; + +GLOBAL void UMF_dump_start +( + void +) ; + + +GLOBAL void UMF_dump_diagonal_map +( + Int Diagonal_map [ ], + Int Diagonal_imap [ ], + Int n1, + Int nn, + Int nempty +) ; + +#define UMF_DBMAX 50000 +GLOBAL extern Int UMF_debug ; +GLOBAL extern Int UMF_allocfail ; +GLOBAL extern double UMF_gprob ; + +#define DEBUGk(k,params) { if (UMF_debug >= (k)) { PRINTF (params) ; } } + +#define DEBUGm4(params) DEBUGk (-4, params) +#define DEBUGm3(params) DEBUGk (-3, params) +#define DEBUGm2(params) DEBUGk (-2, params) +#define DEBUGm1(params) DEBUGk (-1, params) +#define DEBUG0(params) DEBUGk (0, params) +#define DEBUG1(params) DEBUGk (1, params) +#define DEBUG2(params) DEBUGk (2, params) +#define DEBUG3(params) DEBUGk (3, params) +#define DEBUG4(params) DEBUGk (4, params) +#define DEBUG5(params) DEBUGk (5, params) +#define DEBUG6(params) DEBUGk (6, params) +#define DEBUG7(params) DEBUGk (7, params) +#define DEBUG8(params) DEBUGk (8, params) +#define DEBUG9(params) DEBUGk (9, params) + +#define EDEBUGk(k,a) { if (UMF_debug >= (k)) { PRINT_ENTRY (a) ; } } + +#define EDEBUG0(a) EDEBUGk (0, a) +#define EDEBUG1(a) EDEBUGk (1, a) +#define EDEBUG2(a) EDEBUGk (2, a) +#define EDEBUG3(a) EDEBUGk (3, a) +#define EDEBUG4(a) EDEBUGk (4, a) +#define EDEBUG5(a) EDEBUGk (5, a) +#define EDEBUG6(a) EDEBUGk (6, a) +#define EDEBUG7(a) EDEBUGk (7, a) +#define EDEBUG8(a) EDEBUGk (8, a) +#define EDEBUG9(a) EDEBUGk (9, a) + +/* ASSERT defined in amd_dump.h */ + +#else + +/* ========================================================================== */ +/* === No debugging ========================================================= */ +/* ========================================================================== */ + +/* turn off all debugging macros */ + +#define DEBUGk(k,params) + +#define DEBUGm4(params) +#define DEBUGm3(params) +#define DEBUGm2(params) +#define DEBUGm1(params) +#define DEBUG0(params) +#define DEBUG1(params) +#define DEBUG2(params) +#define DEBUG3(params) +#define DEBUG4(params) +#define DEBUG5(params) +#define DEBUG6(params) +#define DEBUG7(params) +#define DEBUG8(params) +#define DEBUG9(params) + +#define EDEBUGk(k,a) + +#define EDEBUG0(a) +#define EDEBUG1(a) +#define EDEBUG2(a) +#define EDEBUG3(a) +#define EDEBUG4(a) +#define EDEBUG5(a) +#define EDEBUG6(a) +#define EDEBUG7(a) +#define EDEBUG8(a) +#define EDEBUG9(a) + +#endif /* NDEBUG */ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_extend_front.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_extend_front.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,392 @@ +/* ========================================================================== */ +/* === UMF_extend_front ===================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* Called by kernel. */ + +#include "umf_internal.h" +#include "umf_grow_front.h" + +/* ========================================================================== */ +/* === zero_front =========================================================== */ +/* ========================================================================== */ + +PRIVATE void zero_front ( + Entry *Flblock, Entry *Fublock, Entry *Fcblock, + Int fnrows, Int fncols, Int fnr_curr, Int fnc_curr, + Int fnpiv, Int fnrows_extended, Int fncols_extended) +{ + Int j, i ; + Entry *F, *Fj, *Fi ; + + Fj = Fcblock + fnrows ; + for (j = 0 ; j < fncols ; j++) + { + /* zero the new rows in the contribution block: */ + F = Fj ; + Fj += fnr_curr ; +#pragma ivdep + for (i = fnrows ; i < fnrows_extended ; i++) + { + /* CLEAR (Fcblock [i + j*fnr_curr]) ; */ + CLEAR_AND_INCREMENT (F) ; + } + } + + Fj -= fnrows ; + for (j = fncols ; j < fncols_extended ; j++) + { + /* zero the new columns in the contribution block: */ + F = Fj ; + Fj += fnr_curr ; +#pragma ivdep + for (i = 0 ; i < fnrows_extended ; i++) + { + /* CLEAR (Fcblock [i + j*fnr_curr]) ; */ + CLEAR_AND_INCREMENT (F) ; + } + } + + Fj = Flblock + fnrows ; + for (j = 0 ; j < fnpiv ; j++) + { + /* zero the new rows in L block: */ + F = Fj ; + Fj += fnr_curr ; +#pragma ivdep + for (i = fnrows ; i < fnrows_extended ; i++) + { + /* CLEAR (Flblock [i + j*fnr_curr]) ; */ + CLEAR_AND_INCREMENT (F) ; + } + } + + Fi = Fublock + fncols ; + for (i = 0 ; i < fnpiv ; i++) + { + /* zero the new columns in U block: */ + F = Fi ; + Fi += fnc_curr ; +#pragma ivdep + for (j = fncols ; j < fncols_extended ; j++) + { + /* CLEAR (Fublock [i*fnc_curr + j]) ; */ + CLEAR_AND_INCREMENT (F) ; + } + } + +} + +/* ========================================================================== */ +/* === UMF_extend_front ===================================================== */ +/* ========================================================================== */ + +GLOBAL Int UMF_extend_front +( + NumericType *Numeric, + WorkType *Work +) +{ + /* ---------------------------------------------------------------------- */ + /* local variables */ + /* ---------------------------------------------------------------------- */ + + Int j, i, *Frows, row, col, *Wrow, fnr2, fnc2, *Frpos, *Fcpos, *Fcols, + fnrows_extended, rrdeg, ccdeg, fncols_extended, fnr_curr, fnc_curr, + fnrows, fncols, pos, fnpiv, *Wm ; + Entry *Wx, *Wy, *Fu, *Fl ; + + /* ---------------------------------------------------------------------- */ + /* get current frontal matrix and check for frontal growth */ + /* ---------------------------------------------------------------------- */ + + fnpiv = Work->fnpiv ; + +#ifndef NDEBUG + DEBUG2 (("EXTEND FRONT\n")) ; + DEBUG2 (("Work->fnpiv "ID"\n", fnpiv)) ; + ASSERT (Work->Flblock == Work->Flublock + Work->nb*Work->nb) ; + ASSERT (Work->Fublock == Work->Flblock + Work->fnr_curr*Work->nb) ; + ASSERT (Work->Fcblock == Work->Fublock + Work->nb*Work->fnc_curr) ; + DEBUG7 (("C block: ")) ; + UMF_dump_dense (Work->Fcblock, Work->fnr_curr, Work->fnrows, Work->fncols) ; + DEBUG7 (("L block: ")) ; + UMF_dump_dense (Work->Flblock, Work->fnr_curr, Work->fnrows, fnpiv); + DEBUG7 (("U' block: ")) ; + UMF_dump_dense (Work->Fublock, Work->fnc_curr, Work->fncols, fnpiv) ; + DEBUG7 (("LU block: ")) ; + UMF_dump_dense (Work->Flublock, Work->nb, fnpiv, fnpiv) ; +#endif + + if (Work->do_grow) + { + fnr2 = UMF_FRONTAL_GROWTH * Work->fnrows_new + 2 ; + fnc2 = UMF_FRONTAL_GROWTH * Work->fncols_new + 2 ; + if (!UMF_grow_front (Numeric, fnr2, fnc2, Work, 1)) + { + DEBUGm4 (("out of memory: extend front\n")) ; + return (FALSE) ; + } + } + + fnr_curr = Work->fnr_curr ; + fnc_curr = Work->fnc_curr ; + ASSERT (Work->fnrows_new + 1 <= fnr_curr) ; + ASSERT (Work->fncols_new + 1 <= fnc_curr) ; + ASSERT (fnr_curr >= 0 && fnr_curr % 2 == 1) ; + + /* ---------------------------------------------------------------------- */ + /* get parameters */ + /* ---------------------------------------------------------------------- */ + + Frows = Work->Frows ; + Frpos = Work->Frpos ; + Fcols = Work->Fcols ; + Fcpos = Work->Fcpos ; + fnrows = Work->fnrows ; + fncols = Work->fncols ; + rrdeg = Work->rrdeg ; + ccdeg = Work->ccdeg ; + + /* scan starts at the first new column in Fcols */ + /* also scan the pivot column if it was not in the front */ + Work->fscan_col = fncols ; + Work->NewCols = Fcols ; + + /* scan1 starts at the first new row in Frows */ + /* also scan the pivot row if it was not in the front */ + Work->fscan_row = fnrows ; + Work->NewRows = Frows ; + + /* ---------------------------------------------------------------------- */ + /* extend row pattern of the front with the new pivot column */ + /* ---------------------------------------------------------------------- */ + + fnrows_extended = fnrows ; + fncols_extended = fncols ; + +#ifndef NDEBUG + DEBUG2 (("Pivot col, before extension: "ID"\n", fnrows)) ; + for (i = 0 ; i < fnrows ; i++) + { + DEBUG2 ((" "ID": row "ID"\n", i, Frows [i])) ; + ASSERT (Frpos [Frows [i]] == i) ; + } + DEBUG2 (("Extending pivot column: pivcol_in_front: "ID"\n", + Work->pivcol_in_front)) ; +#endif + + Fl = Work->Flblock + fnpiv * fnr_curr ; + + if (Work->pivcol_in_front) + { + /* extended pattern and position already in Frows, Frpos. Values above + * the diagonal are already in LU block. Values on and below the + * diagonal are in Wy [0 .. fnrows_extended-1]. Copy into the L + * block. */ + fnrows_extended += ccdeg ; + Wy = Work->Wy ; + + for (i = 0 ; i < fnrows_extended ; i++) + { + Fl [i] = Wy [i] ; +#ifndef NDEBUG + row = Frows [i] ; + DEBUG2 ((" "ID": row "ID" ", i, row)) ; + EDEBUG2 (Fl [i]) ; + if (row == Work->pivrow) DEBUG2 ((" <- pivrow")) ; + DEBUG2 (("\n")) ; + if (i == fnrows - 1) DEBUG2 ((" :::::::\n")) ; + ASSERT (row >= 0 && row < Work->n_row) ; + ASSERT (Frpos [row] == i) ; +#endif + } + + } + else + { + /* extended pattern,values is in (Wm,Wx), not yet in the front */ + Entry *F ; + Fu = Work->Flublock + fnpiv * Work->nb ; + Wm = Work->Wm ; + Wx = Work->Wx ; + F = Fu ; + for (i = 0 ; i < fnpiv ; i++) + { + CLEAR_AND_INCREMENT (F) ; + } + F = Fl ; + for (i = 0 ; i < fnrows ; i++) + { + CLEAR_AND_INCREMENT (F) ; + } + for (i = 0 ; i < ccdeg ; i++) + { + row = Wm [i] ; +#ifndef NDEBUG + DEBUG2 ((" "ID": row "ID" (ext) ", fnrows_extended, row)) ; + EDEBUG2 (Wx [i]) ; + if (row == Work->pivrow) DEBUG2 ((" <- pivrow")) ; + DEBUG2 (("\n")) ; + ASSERT (row >= 0 && row < Work->n_row) ; +#endif + pos = Frpos [row] ; + if (pos < 0) + { + pos = fnrows_extended++ ; + Frows [pos] = row ; + Frpos [row] = pos ; + } + Fl [pos] = Wx [i] ; + } + } + + ASSERT (fnrows_extended <= fnr_curr) ; + + /* ---------------------------------------------------------------------- */ + /* extend the column pattern of the front with the new pivot row */ + /* ---------------------------------------------------------------------- */ + +#ifndef NDEBUG + DEBUG6 (("Pivot row, before extension: "ID"\n", fncols)) ; + for (j = 0 ; j < fncols ; j++) + { + DEBUG7 ((" "ID": col "ID"\n", j, Fcols [j])) ; + ASSERT (Fcpos [Fcols [j]] == j * fnr_curr) ; + } + DEBUG6 (("Extending pivot row:\n")) ; +#endif + + if (Work->pivrow_in_front) + { + if (Work->pivcol_in_front) + { + ASSERT (Fcols == Work->Wrow) ; + for (j = fncols ; j < rrdeg ; j++) + { +#ifndef NDEBUG + col = Fcols [j] ; + DEBUG2 ((" "ID": col "ID" (ext)\n", j, col)) ; + ASSERT (col != Work->pivcol) ; + ASSERT (col >= 0 && col < Work->n_col) ; + ASSERT (Fcpos [col] < 0) ; +#endif + Fcpos [Fcols [j]] = j * fnr_curr ; + } + } + else + { + /* OUT-IN option: pivcol not in front, but pivrow is in front */ + Wrow = Work->Wrow ; + ASSERT (IMPLIES (Work->pivcol_in_front, Wrow == Fcols)) ; + if (Wrow == Fcols) + { + /* Wrow and Fcols are equivalenced */ + for (j = fncols ; j < rrdeg ; j++) + { + col = Wrow [j] ; + DEBUG2 ((" "ID": col "ID" (ext)\n", j, col)) ; + ASSERT (Fcpos [col] < 0) ; + /* Fcols [j] = col ; not needed */ + Fcpos [col] = j * fnr_curr ; + } + } + else + { + for (j = fncols ; j < rrdeg ; j++) + { + col = Wrow [j] ; + DEBUG2 ((" "ID": col "ID" (ext)\n", j, col)) ; + ASSERT (Fcpos [col] < 0) ; + Fcols [j] = col ; + Fcpos [col] = j * fnr_curr ; + } + } + } + fncols_extended = rrdeg ; + } + else + { + ASSERT (Fcols != Work->Wrow) ; + Wrow = Work->Wrow ; + for (j = 0 ; j < rrdeg ; j++) + { + col = Wrow [j] ; + ASSERT (col >= 0 && col < Work->n_col) ; + if (Fcpos [col] < 0) + { + DEBUG2 ((" col:: "ID" (ext)\n", col)) ; + Fcols [fncols_extended] = col ; + Fcpos [col] = fncols_extended * fnr_curr ; + fncols_extended++ ; + } + } + } + + /* ---------------------------------------------------------------------- */ + /* pivot row and column have been extended */ + /* ---------------------------------------------------------------------- */ + +#ifndef NDEBUG + ASSERT (fncols_extended <= fnc_curr) ; + ASSERT (fnrows_extended <= fnr_curr) ; + + DEBUG6 (("Pivot col, after ext: "ID" "ID"\n", fnrows,fnrows_extended)) ; + for (i = 0 ; i < fnrows_extended ; i++) + { + row = Frows [i] ; + DEBUG7 ((" "ID": row "ID" pos "ID" old: %d", i, row, Frpos [row], + i < fnrows)) ; + if (row == Work->pivrow ) DEBUG7 ((" <-- pivrow")) ; + DEBUG7 (("\n")) ; + ASSERT (Frpos [Frows [i]] == i) ; + } + + DEBUG6 (("Pivot row position: "ID"\n", Frpos [Work->pivrow])) ; + ASSERT (Frpos [Work->pivrow] >= 0) ; + ASSERT (Frpos [Work->pivrow] < fnrows_extended) ; + + DEBUG6 (("Pivot row, after ext: "ID" "ID"\n", fncols,fncols_extended)) ; + for (j = 0 ; j < fncols_extended ; j++) + { + col = Fcols [j] ; + DEBUG7 ((" "ID": col "ID" pos "ID" old: %d", j, col, Fcpos [col], + j < fncols)) ; + if (col == Work->pivcol ) DEBUG7 ((" <-- pivcol")) ; + DEBUG7 (("\n")) ; + ASSERT (Fcpos [Fcols [j]] == j * fnr_curr) ; + } + + DEBUG6 (("Pivot col position: "ID"\n", Fcpos [Work->pivcol])) ; + ASSERT (Fcpos [Work->pivcol] >= 0) ; + ASSERT (Fcpos [Work->pivcol] < fncols_extended * fnr_curr) ; + +#endif + + /* ---------------------------------------------------------------------- */ + /* Zero the newly extended frontal matrix */ + /* ---------------------------------------------------------------------- */ + + zero_front (Work->Flblock, Work->Fublock, Work->Fcblock, + fnrows, fncols, fnr_curr, fnc_curr, + fnpiv, fnrows_extended, fncols_extended) ; + + /* ---------------------------------------------------------------------- */ + /* finalize extended row and column pattern of the frontal matrix */ + /* ---------------------------------------------------------------------- */ + + Work->fnrows = fnrows_extended ; + Work->fncols = fncols_extended ; + + ASSERT (fnrows_extended == Work->fnrows_new + 1) ; + ASSERT (fncols_extended == Work->fncols_new + 1) ; + + return (TRUE) ; + +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_extend_front.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_extend_front.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,11 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL Int UMF_extend_front +( + NumericType *Numeric, + WorkType *Work +) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_free.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_free.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,45 @@ +/* ========================================================================== */ +/* === UMF_free ============================================================= */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + Free a block previously allocated by UMF_malloc and return NULL. + Usage is p = UMF_free (p), to ensure that we don't free it twice. + Also maintains the UMFPACK malloc count. +*/ + +#include "umf_internal.h" + +#if defined (UMF_MALLOC_COUNT) || !defined (NDEBUG) +#include "umf_malloc.h" +#endif + +GLOBAL void *UMF_free +( + void *p +) +{ + DEBUG0 (("UMF_free: "ID"\n", (Int) p)) ; + if (p) + { + + /* see umf_config.h for the memory allocator selection */ + FREE (p) ; + +#if defined (UMF_MALLOC_COUNT) || !defined (NDEBUG) + /* One more object has been free'd. Keep track of the count. */ + /* (purely for sanity checks). */ + UMF_malloc_count-- ; + DEBUG0 ((" new malloc count: "ID"\n", UMF_malloc_count)) ; +#endif + + } + + return ((void *) NULL) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_free.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_free.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,10 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL void *UMF_free +( + void *p +) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_fsize.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_fsize.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,69 @@ +/* ========================================================================== */ +/* === UMF_fsize ============================================================ */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* Determine the largest frontal matrix size for each subtree. Called by + * UMF_colamd and UMF_analyze. Only required to sort the children of each + * node prior to AMD_postorder. */ + +#include "umf_internal.h" + +GLOBAL void UMF_fsize +( + Int nn, + Int Fsize [ ], + Int Fnrows [ ], + Int Fncols [ ], + Int Parent [ ], + Int Npiv [ ] +) +{ + Int j, parent, frsize, r, c ; + + for (j = 0 ; j < nn ; j++) + { + Fsize [j] = EMPTY ; + } + + /* ---------------------------------------------------------------------- */ + /* find max front size for tree rooted at node j, for each front j */ + /* ---------------------------------------------------------------------- */ + + DEBUG1 (("\n\n========================================FRONTS:\n")) ; + for (j = 0 ; j < nn ; j++) + { + if (Npiv [j] > 0) + { + /* this is a frontal matrix */ + parent = Parent [j] ; + r = Fnrows [j] ; + c = Fncols [j] ; + frsize = r * c ; + /* avoid integer overflow */ + if (INT_OVERFLOW (((double) r) * ((double) c))) + { + /* :: frsize int overflow :: */ + frsize = Int_MAX ; + } + DEBUG1 ((""ID" : npiv "ID" size "ID" parent "ID" ", + j, Npiv [j], frsize, parent)) ; + Fsize [j] = MAX (Fsize [j], frsize) ; + DEBUG1 (("Fsize [j = "ID"] = "ID"\n", j, Fsize [j])) ; + if (parent != EMPTY) + { + /* find the maximum frontsize of self and children */ + ASSERT (Npiv [parent] > 0) ; + ASSERT (parent > j) ; + Fsize [parent] = MAX (Fsize [parent], Fsize [j]) ; + DEBUG1 (("Fsize [parent = "ID"] = "ID"\n", + parent, Fsize [parent])); + } + } + } +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_fsize.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_fsize.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,15 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL void UMF_fsize +( + Int nn, + Int MaxFsize [ ], + Int Fnrows [ ], + Int Fncols [ ], + Int Parent [ ], + Int Npiv [ ] +) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_garbage_collection.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_garbage_collection.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,695 @@ +/* ========================================================================== */ +/* === UMF_garbage_collection =============================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + Compress the elements at the tail of Numeric->Memory, and delete the tuples. + Elements are renumbered. The new numbering space is compressed, and + in the order of element creation (original elements of A first, followed + by the new elements in the order that they were formed). + + Only called by UMF_get_memory. + + There are 5 ways in which garbage collection can be performed: + + Allocate a new working array for the current frontal matrix. In this + case, there are never any pivot rows/columns in the current frontal + matrix (fnpiv = 0), and the old working array for the current frontal + matrix can always be fully compacted, to fnrows-by-fncols. + + UMF_kernel : UMF_extend : UMF_grow_front : UMF_get_memory + UMF_kernel : UMF_init_front : UMF_grow_front : UMF_get_memory + UMF_kernel : UMF_start_front : UMF_grow_front : UMF_get_memory + + Allocate a new element. In this case, UMF_grow_front may or may not + be subsequently called, depending on Work->do_grow. There are never + any pivot rows/columns in the current frontal matrix (fnpiv=0), but one + may be added if UMF_init_front is to be called just after + UMF_create_element. If do_grow is true, then the current front can be + fully compacted, to fnrows-by-fncols. Otherwise, it can only be + partially compacted, to MAX (fnrows, fnrows_new + 1) -by- + MAX (fncols, fncols_new + 1). + + UMF_kernel : UMF_create_element : UMF_get_memory + + Allocate rows of L and columns of U. In this case, the current + frontal matrix is only partially compacted, to (fnrows_new + 1)-by- + (fncols_new + 1). There are pivots in the frontal matrix (fnpiv > 0). + + UMF_kernel : UMF_store_lu : UMF_get_memory +*/ + +#include "umf_internal.h" + +GLOBAL void UMF_garbage_collection +( + NumericType *Numeric, + WorkType *Work, + Int drnew, /* compact current front to drnew-by-dcnew */ + Int dcnew, + Int do_Fcpos +) +{ + /* ---------------------------------------------------------------------- */ + /* local variables */ + /* ---------------------------------------------------------------------- */ + + Int size, e, n_row, n_col, nrows, ncols, nrowsleft, ncolsleft, prevsize, + csize, size2, i2, j2, i, j, cdeg, rdeg, *E, row, col, + *Rows, *Cols, *Rows2, *Cols2, nel, e2, *Row_tuples, *Col_tuples, + *Row_degree, *Col_degree ; + Entry *C, *C1, *C3, *C2 ; + Unit *psrc, *pdest, *p, *pnext ; + Element *epsrc, *epdest ; + +#ifndef NDEBUG + Int nmark ; +#endif + + /* ---------------------------------------------------------------------- */ + /* get parameters */ + /* ---------------------------------------------------------------------- */ + + Col_degree = Numeric->Cperm ; /* for NON_PIVOTAL_COL macro */ + Row_degree = Numeric->Rperm ; /* for NON_PIVOTAL_ROW macro */ + Row_tuples = Numeric->Uip ; + Col_tuples = Numeric->Lip ; + E = Work->E ; + n_row = Work->n_row ; + n_col = Work->n_col ; + + /* note that the tuple lengths (Col_tlen and Row_tlen) are updated, but */ + /* the tuple lists themselves are stale and are about to be destroyed */ + /* and recreated. Do not attempt to scan them until they are recreated. */ + +#ifndef NDEBUG + DEBUGm1 (("::::GARBAGE COLLECTION::::\n")) ; + UMF_dump_memory (Numeric) ; +#endif + + Numeric->ngarbage++ ; + + /* ---------------------------------------------------------------------- */ + /* delete the tuple lists by marking the blocks as free */ + /* ---------------------------------------------------------------------- */ + + /* do not modify Row_tlen and Col_tlen */ + /* those are needed for UMF_build_tuples */ + + for (row = 0 ; row < n_row ; row++) + { + if (NON_PIVOTAL_ROW (row) && Row_tuples [row]) + { + DEBUG2 (("row "ID" tuples "ID"\n", row, Row_tuples [row])) ; + p = Numeric->Memory + Row_tuples [row] - 1 ; + DEBUG2 (("Freeing tuple list row "ID", p-S "ID", size "ID"\n", + row, (Int) (p-Numeric->Memory), p->header.size)) ; + ASSERT (p->header.size > 0) ; + ASSERT (p >= Numeric->Memory + Numeric->itail) ; + ASSERT (p < Numeric->Memory + Numeric->size) ; + p->header.size = -p->header.size ; + Row_tuples [row] = 0 ; + } + } + + for (col = 0 ; col < n_col ; col++) + { + if (NON_PIVOTAL_COL (col) && Col_tuples [col]) + { + DEBUG2 (("col "ID" tuples "ID"\n", col, Col_tuples [col])) ; + p = Numeric->Memory + Col_tuples [col] - 1 ; + DEBUG2 (("Freeing tuple list col "ID", p-S "ID", size "ID"\n", + col, (Int) (p-Numeric->Memory), p->header.size)) ; + ASSERT (p->header.size > 0) ; + ASSERT (p >= Numeric->Memory + Numeric->itail) ; + ASSERT (p < Numeric->Memory + Numeric->size) ; + p->header.size = -p->header.size ; + Col_tuples [col] = 0 ; + } + } + + /* ---------------------------------------------------------------------- */ + /* mark the elements, and compress the name space */ + /* ---------------------------------------------------------------------- */ + + nel = Work->nel ; + ASSERT (nel < Work->elen) ; + +#ifndef NDEBUG + nmark = 0 ; + UMF_dump_current_front (Numeric, Work, FALSE) ; + DEBUGm1 (("E [0] "ID" \n", E [0])) ; + ASSERT (IMPLIES (E [0], + Work->Flublock == (Entry *) (Numeric->Memory + E [0]))) ; + ASSERT (IMPLIES (Work->Flublock, + Work->Flublock == (Entry *) (Numeric->Memory + E [0]))) ; + ASSERT ((E [0] != 0) == (Work->Flublock != (Entry *) NULL)) ; +#endif + + e2 = 0 ; + + for (e = 0 ; e <= nel ; e++) /* for all elements in order of creation */ + { + if (E [e]) + { + psrc = Numeric->Memory + E [e] ; + psrc-- ; /* get the header of this block */ + if (e > 0) + { + e2++ ; /* do not renumber element zero */ + } + ASSERT (psrc->header.size > 0) ; + psrc->header.size = e2 ; /* store the new name in the header */ +#ifndef NDEBUG + nmark++ ; +#endif + DEBUG7 ((ID":: Mark e "ID" at psrc-S "ID", new e "ID"\n", + nmark, e, (Int) (psrc-Numeric->Memory), e2)) ; + E [e] = 0 ; + if (e == Work->prior_element) + { + Work->prior_element = e2 ; + } + } + } + + /* all 1..e2 are now in use (element zero may or may not be in use) */ + Work->nel = e2 ; + nel = Work->nel ; + +#ifndef NDEBUG + for (e = 0 ; e < Work->elen ; e++) + { + ASSERT (!E [e]) ; + } +#endif + + /* ---------------------------------------------------------------------- */ + /* compress the elements */ + /* ---------------------------------------------------------------------- */ + + /* point to tail marker block of size 1 + header */ + psrc = Numeric->Memory + Numeric->size - 2 ; + pdest = psrc ; + prevsize = psrc->header.prevsize ; + DEBUG7 (("Starting the compression:\n")) ; + + while (prevsize > 0) + { + + /* ------------------------------------------------------------------ */ + /* move up to the next element above the current header, and */ + /* get the element name and size */ + /* (if it is an element, the name will be positive) */ + /* ------------------------------------------------------------------ */ + + size = prevsize ; + psrc -= (size + 1) ; + e = psrc->header.size ; + prevsize = psrc->header.prevsize ; + /* top block at tail has prevsize of 0 */ + + /* a free block will have a negative size, so skip it */ + /* otherwise, if size >= 0, it holds the element name, not the size */ + + DEBUG8 (("psrc-S: "ID" prevsize: "ID" size: "ID, + (Int) (psrc-Numeric->Memory), prevsize, size)) ; + + if (e == 0) + { + /* -------------------------------------------------------------- */ + /* this is the current frontal matrix */ + /* -------------------------------------------------------------- */ + + Entry *F1, *F2, *Fsrc, *Fdst ; + Int c, r, k, dr, dc, gap, gap1, gap2, nb ; + + /* shift the frontal matrix down */ + F1 = (Entry *) (psrc + 1) ; + + /* get the size of the current front. r and c could be zero */ + k = Work->fnpiv ; + dr = Work->fnr_curr ; + dc = Work->fnc_curr ; + r = Work->fnrows ; + c = Work->fncols ; + nb = Work->nb ; + + ASSERT ((dr >= 0 && (dr % 2) == 1) || dr == 0) ; + ASSERT (drnew >= 0) ; + if (drnew % 2 == 0) + { + /* make sure leading frontal matrix dimension is always odd */ + drnew++ ; + } + drnew = MIN (dr, drnew) ; + ASSERT ((drnew >= 0 && (drnew % 2) == 1) || drnew == 0) ; + + pnext = pdest ; + +#ifndef NDEBUG + DEBUGm2 (("move front: dr "ID" dc "ID" r "ID" drnew "ID" c "ID + " dcnew " ID" k "ID"\n", dr, dc, r, drnew, c, dcnew, k)) ; + DEBUG7 (("\n")) ; + DEBUG7 ((ID":: Move current frontal matrix from: psrc-S: "ID" \n", + nmark, (Int) (psrc-Numeric->Memory))) ; + nmark-- ; + ASSERT (E [e] == 0) ; + ASSERT (Work->Flublock == F1) ; + ASSERT (Work->Flblock == Work->Flublock + nb*nb) ; + ASSERT (Work->Fublock == Work->Flblock + dr*nb) ; + ASSERT (Work->Fcblock == Work->Fublock + nb*dc) ; + DEBUG7 (("C block: ")) ; + UMF_dump_dense (Work->Fcblock, dr, r, c) ; + DEBUG7 (("L block: ")) ; + UMF_dump_dense (Work->Flblock, dr, r, k); + DEBUG7 (("U' block: ")) ; + UMF_dump_dense (Work->Fublock, dc, c, k) ; + DEBUG7 (("LU block: ")) ; + UMF_dump_dense (Work->Flublock, nb, k, k) ; + ASSERT (r <= drnew && c <= dcnew && drnew <= dr && dcnew <= dc) ; +#endif + + /* compact frontal matrix to drnew-by-dcnew before moving it */ + + /* do not compact the LU block (nb-by-nb) */ + + /* compact the columns of L (from dr-by-nb to drnew-by-nb) */ + Fsrc = Work->Flblock ; + Fdst = Work->Flblock ; + ASSERT (Fdst == F1 + nb*nb) ; + gap1 = dr - r ; + gap2 = drnew - r ; + ASSERT (gap1 >= 0) ; + for (j = 0 ; j < k ; j++) + { + for (i = 0 ; i < r ; i++) + { + *Fdst++ = *Fsrc++ ; + } + Fsrc += gap1 ; + Fdst += gap2 ; + } + ASSERT (Fdst == F1 + nb*nb + drnew*k) ; + Fdst += drnew * (nb - k) ; + + /* compact the rows of U (U' from dc-by-nb to dcnew-by-nb) */ + Fsrc = Work->Fublock ; + ASSERT (Fdst == F1 + nb*nb + drnew*nb) ; + gap1 = dc - c ; + gap2 = dcnew - c ; + for (i = 0 ; i < k ; i++) + { + for (j = 0 ; j < c ; j++) + { + *Fdst++ = *Fsrc++ ; + } + Fsrc += gap1 ; + Fdst += gap2 ; + } + ASSERT (Fdst == F1 + nb*nb + drnew*nb + dcnew*k) ; + Fdst += dcnew * (nb - k) ; + + /* compact the columns of C (from dr-by-dc to drnew-by-dcnew) */ + Fsrc = Work->Fcblock ; + ASSERT (Fdst == F1 + nb*nb + drnew*nb + nb*dcnew) ; + gap1 = dr - r ; + gap2 = drnew - r ; + for (j = 0 ; j < c ; j++) + { + for (i = 0 ; i < r ; i++) + { + *Fdst++ = *Fsrc++ ; + } + Fsrc += gap1 ; + Fdst += gap2 ; + } + ASSERT (Fdst == F1 + nb*nb + drnew*nb + nb*dcnew + drnew*c) ; + + /* recompute Fcpos, if necessary */ + if (do_Fcpos) + { + Int *Fcols, *Fcpos ; + Fcols = Work->Fcols ; + Fcpos = Work->Fcpos ; + for (j = 0 ; j < c ; j++) + { + col = Fcols [j] ; + ASSERT (col >= 0 && col < Work->n_col) ; + ASSERT (Fcpos [col] == j * dr) ; + Fcpos [col] = j * drnew ; + } +#ifndef NDEBUG + { + Int cnt = 0 ; + for (j = 0 ; j < Work->n_col ; j++) + { + if (Fcpos [j] != EMPTY) cnt++ ; + } + DEBUGm2 (("Recompute Fcpos cnt "ID" c "ID"\n", cnt, c)) ; + ASSERT (cnt == c) ; + } +#endif + } + +#ifndef NDEBUG + DEBUGm2 (("Compacted front, drnew "ID" dcnew "ID"\n", drnew, dcnew)) ; + DEBUG7 (("C block: ")) ; + UMF_dump_dense (F1 + nb*nb + drnew*nb + nb*dcnew, drnew, r, c) ; + DEBUG7 (("L block: ")) ; + UMF_dump_dense (F1 + nb*nb, drnew, r, k) ; + DEBUG7 (("U block: ")) ; + UMF_dump_dense (F1 + nb*nb + drnew*nb, nb, k, c) ; + DEBUG7 (("LU block: ")) ; + UMF_dump_dense (F1, nb, k, k) ; +#endif + + /* Compacted dimensions of the new frontal matrix. */ + Work->fnr_curr = drnew ; + Work->fnc_curr = dcnew ; + Work->fcurr_size = (drnew + nb) * (dcnew + nb) ; + size = UNITS (Entry, Work->fcurr_size) ; + + /* make sure the object doesn't evaporate. The front can have + * zero size (Work->fcurr_size = 0), but the size of the memory + * block containing it cannot have zero size. */ + size = MAX (1, size) ; + + /* get the destination of frontal matrix */ + pnext->header.prevsize = size ; + pdest -= (size + 1) ; + F2 = (Entry *) (pdest + 1) ; + + ASSERT ((unsigned Int) psrc + 1 + size <= (unsigned Int) pnext) ; + ASSERT (psrc <= pdest) ; + ASSERT (F1 <= F2) ; + + /* move the C block first */ + Fsrc = F1 + nb*nb + drnew*nb + nb*dcnew + drnew*c ; + Fdst = F2 + nb*nb + drnew*nb + nb*dcnew + drnew*c ; + gap = drnew - r ; + for (j = c-1 ; j >= 0 ; j--) + { + Fsrc -= gap ; + Fdst -= gap ; + /* move column j of C */ + for (i = r-1 ; i >= 0 ; i--) + { + *--Fdst = *--Fsrc ; + } + } + ASSERT (Fsrc == F1 + nb*nb + drnew*nb + nb*dcnew) ; + ASSERT (Fdst == F2 + nb*nb + drnew*nb + nb*dcnew) ; + + /* move the U block */ + Fsrc -= dcnew * (nb - k) ; + Fdst -= dcnew * (nb - k) ; + ASSERT (Fsrc == F1 + nb*nb + drnew*nb + dcnew*k) ; + ASSERT (Fdst == F2 + nb*nb + drnew*nb + dcnew*k) ; + gap = dcnew - c ; + for (i = k-1 ; i >= 0 ; i--) + { + Fsrc -= gap ; + Fdst -= gap ; + for (j = c-1 ; j >= 0 ; j--) + { + *--Fdst = *--Fsrc ; + } + } + ASSERT (Fsrc == F1 + nb*nb + drnew*nb) ; + ASSERT (Fdst == F2 + nb*nb + drnew*nb) ; + + /* move the L block */ + Fsrc -= drnew * (nb - k) ; + Fdst -= drnew * (nb - k) ; + ASSERT (Fsrc == F1 + nb*nb + drnew*k) ; + ASSERT (Fdst == F2 + nb*nb + drnew*k) ; + gap = drnew - r ; + for (j = k-1 ; j >= 0 ; j--) + { + Fsrc -= gap ; + Fdst -= gap ; + for (i = r-1 ; i >= 0 ; i--) + { + *--Fdst = *--Fsrc ; + } + } + ASSERT (Fsrc == F1 + nb*nb) ; + ASSERT (Fdst == F2 + nb*nb) ; + + /* move the LU block */ + Fsrc -= nb * (nb - k) ; + Fdst -= nb * (nb - k) ; + ASSERT (Fsrc == F1 + nb*k) ; + ASSERT (Fdst == F2 + nb*k) ; + gap = nb - k ; + for (j = k-1 ; j >= 0 ; j--) + { + Fsrc -= gap ; + Fdst -= gap ; + for (i = k-1 ; i >= 0 ; i--) + { + *--Fdst = *--Fsrc ; + } + } + ASSERT (Fsrc == F1) ; + ASSERT (Fdst == F2) ; + + E [0] = (pdest + 1) - Numeric->Memory ; + + Work->Flublock = (Entry *) (Numeric->Memory + E [0]) ; + ASSERT (Work->Flublock == F2) ; + Work->Flblock = Work->Flublock + nb * nb ; + Work->Fublock = Work->Flblock + drnew * nb ; + Work->Fcblock = Work->Fublock + nb * dcnew ; + + pdest->header.prevsize = 0 ; + pdest->header.size = size ; + +#ifndef NDEBUG + DEBUG7 (("After moving compressed current frontal matrix:\n")) ; + DEBUG7 (("C block: ")) ; + UMF_dump_dense (Work->Fcblock, drnew, r, c) ; + DEBUG7 (("L block: ")) ; + UMF_dump_dense (Work->Flblock, drnew, r, k); + DEBUG7 (("U' block: ")) ; + UMF_dump_dense (Work->Fublock, dcnew, c, k) ; + DEBUG7 (("LU block: ")) ; + UMF_dump_dense (Work->Flublock, nb, k, k) ; +#endif + + } + else if (e > 0) + { + + /* -------------------------------------------------------------- */ + /* this is an element, compress and move from psrc down to pdest */ + /* -------------------------------------------------------------- */ + +#ifndef NDEBUG + DEBUG7 (("\n")) ; + DEBUG7 ((ID":: Move element "ID": from: "ID" \n", + nmark, e, (Int) (psrc-Numeric->Memory))) ; + nmark-- ; + ASSERT (e <= nel) ; + ASSERT (E [e] == 0) ; +#endif + + /* -------------------------------------------------------------- */ + /* get the element scalars, and pointers to C, Rows, and Cols: */ + /* -------------------------------------------------------------- */ + + p = psrc + 1 ; + GET_ELEMENT (epsrc, p, Cols, Rows, ncols, nrows, C) ; + nrowsleft = epsrc->nrowsleft ; + ncolsleft = epsrc->ncolsleft ; + cdeg = epsrc->cdeg ; + rdeg = epsrc->rdeg ; + +#ifndef NDEBUG + DEBUG7 ((" nrows "ID" nrowsleft "ID"\n", nrows, nrowsleft)) ; + DEBUG7 ((" ncols "ID" ncolsleft "ID"\n", ncols, ncolsleft)) ; + DEBUG8 ((" Rows:")) ; + for (i = 0 ; i < nrows ; i++) DEBUG8 ((" "ID, Rows [i])) ; + DEBUG8 (("\n Cols:")) ; + for (j = 0 ; j < ncols ; j++) DEBUG8 ((" "ID, Cols [j])) ; + DEBUG8 (("\n")) ; +#endif + + /* -------------------------------------------------------------- */ + /* determine the layout of the new element */ + /* -------------------------------------------------------------- */ + + csize = nrowsleft * ncolsleft ; + size2 = UNITS (Element, 1) + + UNITS (Int, nrowsleft + ncolsleft) + + UNITS (Entry, csize) ; + + DEBUG7 (("Old size "ID" New size "ID"\n", size, size2)) ; + + pnext = pdest ; + pnext->header.prevsize = size2 ; + pdest -= (size2 + 1) ; + + ASSERT (size2 <= size) ; + ASSERT ((unsigned Int) psrc + 1 + size <= (unsigned Int) pnext) ; + ASSERT (psrc <= pdest) ; + + p = pdest + 1 ; + epdest = (Element *) p ; + p += UNITS (Element, 1) ; + Cols2 = (Int *) p ; + Rows2 = Cols2 + ncolsleft ; + p += UNITS (Int, nrowsleft + ncolsleft) ; + C2 = (Entry *) p ; + + ASSERT (epdest >= epsrc) ; + ASSERT (Rows2 >= Rows) ; + ASSERT (Cols2 >= Cols) ; + ASSERT (C2 >= C) ; + ASSERT (p + UNITS (Entry, csize) == pnext) ; + + /* -------------------------------------------------------------- */ + /* move the contribution block */ + /* -------------------------------------------------------------- */ + + /* overlap = psrc + size + 1 > pdest ; */ + + if (nrowsleft < nrows || ncolsleft < ncols) + { + + /* ---------------------------------------------------------- */ + /* compress contribution block in place prior to moving it */ + /* ---------------------------------------------------------- */ + + DEBUG7 (("Compress C in place prior to move:\n")); +#ifndef NDEBUG + UMF_dump_dense (C, nrows, nrows, ncols) ; +#endif + C1 = C ; + C3 = C ; + for (j = 0 ; j < ncols ; j++) + { + if (Cols [j] >= 0) + { + for (i = 0 ; i < nrows ; i++) + { + if (Rows [i] >= 0) + { + *C3++ = C1 [i] ; + } + } + } + C1 += nrows ; + } + ASSERT (C3-C == csize) ; + DEBUG8 (("Newly compressed contrib. block (all in use):\n")) ; +#ifndef NDEBUG + UMF_dump_dense (C, nrowsleft, nrowsleft, ncolsleft) ; +#endif + } + + /* shift the contribution block down */ + C += csize ; + C2 += csize ; + for (i = 0 ; i < csize ; i++) + { + *--C2 = *--C ; + } + + /* -------------------------------------------------------------- */ + /* move the row indices */ + /* -------------------------------------------------------------- */ + + i2 = nrowsleft ; + for (i = nrows - 1 ; i >= 0 ; i--) + { + ASSERT (Rows2+i2 >= Rows+i) ; + if (Rows [i] >= 0) + { + Rows2 [--i2] = Rows [i] ; + } + } + ASSERT (i2 == 0) ; + + j2 = ncolsleft ; + for (j = ncols - 1 ; j >= 0 ; j--) + { + ASSERT (Cols2+j2 >= Cols+j) ; + if (Cols [j] >= 0) + { + Cols2 [--j2] = Cols [j] ; + } + } + ASSERT (j2 == 0) ; + + /* -------------------------------------------------------------- */ + /* construct the new header */ + /* -------------------------------------------------------------- */ + + /* E [0...e] is now valid */ + E [e] = (pdest + 1) - Numeric->Memory ; + epdest = (Element *) (pdest + 1) ; + + epdest->next = EMPTY ; /* destroys the son list */ + epdest->ncols = ncolsleft ; + epdest->nrows = nrowsleft ; + epdest->ncolsleft = ncolsleft ; + epdest->nrowsleft = nrowsleft ; + epdest->rdeg = rdeg ; + epdest->cdeg = cdeg ; + + ASSERT (size2 <= size) ; + pdest->header.prevsize = 0 ; + pdest->header.size = size2 ; + + DEBUG7 (("After moving it:\n")) ; +#ifndef NDEBUG + UMF_dump_element (Numeric, Work, e, FALSE) ; +#endif + } + +#ifndef NDEBUG + else + { + DEBUG8 ((" free\n")) ; + } +#endif + DEBUG7 (("psrc "ID" tail "ID"\n", + (Int) (psrc-Numeric->Memory), Numeric->itail)) ; + } + + ASSERT (psrc == Numeric->Memory + Numeric->itail) ; + ASSERT (nmark == 0) ; + + /* ---------------------------------------------------------------------- */ + /* final tail pointer */ + /* ---------------------------------------------------------------------- */ + + ASSERT (pdest >= Numeric->Memory + Numeric->itail) ; + Numeric->itail = pdest - Numeric->Memory ; + pdest->header.prevsize = 0 ; + Numeric->ibig = EMPTY ; + Numeric->tail_usage = Numeric->size - Numeric->itail ; + + /* ---------------------------------------------------------------------- */ + /* clear the unused E [nel+1 .. Work->elen - 1] */ + /* ---------------------------------------------------------------------- */ + + for (e = nel+1 ; e < Work->elen ; e++) + { + E [e] = 0 ; + } + +#ifndef NDEBUG + UMF_dump_packed_memory (Numeric, Work) ; +#endif + + DEBUG8 (("::::GARBAGE COLLECTION DONE::::\n")) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_garbage_collection.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_garbage_collection.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,14 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL void UMF_garbage_collection +( + NumericType *Numeric, + WorkType *Work, + Int drnew, + Int dcnew, + Int do_Fcpos +) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_get_memory.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_get_memory.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,222 @@ +/* ========================================================================== */ +/* === UMF_get_memory ======================================================= */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + Reallocate the workspace (Numeric->Memory) and shift elements downwards. + needunits: increase in size so that the free space is at least this many + Units (to which the tuple lengths is added). + + Return TRUE if successful, FALSE if out of memory. +*/ + +#include "umf_internal.h" +#include "umf_garbage_collection.h" +#include "umf_tuple_lengths.h" +#include "umf_build_tuples.h" +#include "umf_mem_free_tail_block.h" +#include "umf_realloc.h" + +GLOBAL Int UMF_get_memory +( + NumericType *Numeric, + WorkType *Work, + Int needunits, + Int r2, /* compact current front to r2-by-c2 */ + Int c2, + Int do_Fcpos +) +{ + double nsize, bsize, tsize ; + Int i, minsize, newsize, newmem, costly, row, col, *Row_tlen, *Col_tlen, + n_row, n_col, *Row_degree, *Col_degree ; + Unit *mnew, *p ; + + /* ---------------------------------------------------------------------- */ + /* get and check parameters */ + /* ---------------------------------------------------------------------- */ + +#ifndef NDEBUG + DEBUG1 (("::::GET MEMORY::::\n")) ; + UMF_dump_memory (Numeric) ; +#endif + + n_row = Work->n_row ; + n_col = Work->n_col ; + Row_degree = Numeric->Rperm ; /* for NON_PIVOTAL_ROW macro */ + Col_degree = Numeric->Cperm ; /* for NON_PIVOTAL_COL macro */ + Row_tlen = Numeric->Uilen ; + Col_tlen = Numeric->Lilen ; + + /* ---------------------------------------------------------------------- */ + /* initialize the tuple list lengths */ + /* ---------------------------------------------------------------------- */ + + for (row = 0 ; row < n_row ; row++) + { + if (NON_PIVOTAL_ROW (row)) + { + Row_tlen [row] = 0 ; + } + } + for (col = 0 ; col < n_col ; col++) + { + if (NON_PIVOTAL_COL (col)) + { + Col_tlen [col] = 0 ; + } + } + + /* ---------------------------------------------------------------------- */ + /* determine how much memory is needed for the tuples */ + /* ---------------------------------------------------------------------- */ + + nsize = (double) needunits + 2 ; + needunits += UMF_tuple_lengths (Numeric, Work, &tsize) ; + nsize += tsize ; + needunits += 2 ; /* add 2, so that newmem >= 2 is true if realloc'd */ + + /* note: Col_tlen and Row_tlen are updated, but the tuple lists */ + /* themselves are not. Do not attempt to scan the tuple lists. */ + /* They are now stale, and are about to be destroyed and recreated. */ + + /* ---------------------------------------------------------------------- */ + /* determine the desired new size of memory */ + /* ---------------------------------------------------------------------- */ + + DEBUG0 (("UMF_get_memory: needunits: "ID"\n", needunits)) ; + + minsize = Numeric->size + needunits ; + nsize += (double) Numeric->size ; + + bsize = ((double) Int_MAX) / sizeof (Unit) - 1 ; + + newsize = (Int) (UMF_REALLOC_INCREASE * ((double) minsize)) ; + nsize *= UMF_REALLOC_INCREASE ; + nsize += 1 ; + + if (newsize < 0 || nsize > bsize) + { + /* :: realloc Numeric->Memory int overflow :: */ + DEBUGm3 (("Realloc hit integer limit\n")) ; + newsize = (Int) bsize ; /* we cannot increase the size beyond bsize */ + } + else + { + ASSERT (newsize <= nsize) ; + newsize = MAX (newsize, minsize) ; + } + newsize = MAX (newsize, Numeric->size) ; + + DEBUG0 (( + "REALLOC MEMORY: needunits "ID" old size: "ID" new size: "ID" Units \n", + needunits, Numeric->size, newsize)) ; + + /* Forget where the biggest free block is (we no longer need it) */ + /* since garbage collection will occur shortly. */ + Numeric->ibig = EMPTY ; + + DEBUG0 (("Before realloc E [0] "ID"\n", Work->E [0])) ; + + /* ---------------------------------------------------------------------- */ + /* reallocate the memory, if possible, and make it bigger */ + /* ---------------------------------------------------------------------- */ + + mnew = (Unit *) NULL ; + while (!mnew) + { + mnew = (Unit *) UMF_realloc (Numeric->Memory, newsize, sizeof (Unit)) ; + if (!mnew) + { + if (newsize == minsize) /* last realloc attempt failed */ + { + /* We failed to get the minimum. Just stick with the */ + /* current allocation and hope that garbage collection */ + /* can recover enough space. */ + mnew = Numeric->Memory ; /* no new memory available */ + newsize = Numeric->size ; + } + else + { + /* otherwise, reduce the request and keep trying */ + newsize = (Int) (UMF_REALLOC_REDUCTION * ((double) newsize)) ; + newsize = MAX (minsize, newsize) ; + } + } + } + ASSERT (mnew != (Unit *) NULL) ; + + /* see if realloc had to copy, rather than just extend memory */ + costly = (mnew != Numeric->Memory) ; + + /* ---------------------------------------------------------------------- */ + /* extend the tail portion of memory downwards */ + /* ---------------------------------------------------------------------- */ + + Numeric->Memory = mnew ; + if (Work->E [0]) + { + Int nb, dr, dc ; + nb = Work->nb ; + dr = Work->fnr_curr ; + dc = Work->fnc_curr ; + Work->Flublock = (Entry *) (Numeric->Memory + Work->E [0]) ; + Work->Flblock = Work->Flublock + nb * nb ; + Work->Fublock = Work->Flblock + dr * nb ; + Work->Fcblock = Work->Fublock + nb * dc ; + DEBUG0 (("after realloc E [0] "ID"\n", Work->E [0])) ; + } + ASSERT (IMPLIES (!(Work->E [0]), Work->Flublock == (Entry *) NULL)) ; + + newmem = newsize - Numeric->size ; + ASSERT (newmem == 0 || newmem >= 2) ; + + if (newmem >= 2) + { + /* reallocation succeeded */ + + /* point to the old tail marker block of size 1 + header */ + p = Numeric->Memory + Numeric->size - 2 ; + + /* create a new block out of the newly extended memory */ + p->header.size = newmem - 1 ; + i = Numeric->size - 1 ; + p += newmem ; + + /* create a new tail marker block */ + p->header.prevsize = newmem - 1 ; + p->header.size = 1 ; + + Numeric->size = newsize ; + + /* free the new block */ + UMF_mem_free_tail_block (Numeric, i) ; + + Numeric->nrealloc++ ; + + if (costly) + { + Numeric->ncostly++ ; + } + + } + DEBUG1 (("Done with realloc memory\n")) ; + + /* ---------------------------------------------------------------------- */ + /* garbage collection on the tail of Numeric->memory (destroys tuples) */ + /* ---------------------------------------------------------------------- */ + + UMF_garbage_collection (Numeric, Work, r2, c2, do_Fcpos) ; + + /* ---------------------------------------------------------------------- */ + /* rebuild the tuples */ + /* ---------------------------------------------------------------------- */ + + return (UMF_build_tuples (Numeric, Work)) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_get_memory.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_get_memory.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,15 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL Int UMF_get_memory +( + NumericType *Numeric, + WorkType *Work, + Int needunits, + Int r2, + Int c2, + Int do_Fcpos +) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_grow_front.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_grow_front.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,293 @@ +/* ========================================================================== */ +/* === UMF_grow_front ======================================================= */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* Current frontal matrix is too small. Make it bigger. */ + +#include "umf_internal.h" +#include "umf_mem_free_tail_block.h" +#include "umf_mem_alloc_tail_block.h" +#include "umf_get_memory.h" + +GLOBAL Int UMF_grow_front +( + NumericType *Numeric, + Int fnr2, /* desired size is fnr2-by-fnc2 */ + Int fnc2, + WorkType *Work, + Int do_what /* -1: UMF_start_front + * 0: UMF_init_front, do not recompute Fcpos + * 1: UMF_extend_front + * 2: UMF_init_front, recompute Fcpos */ +) +{ + /* ---------------------------------------------------------------------- */ + /* local variables */ + /* ---------------------------------------------------------------------- */ + + double s ; + Entry *Fcold, *Fcnew ; + Int j, i, col, *Fcpos, *Fcols, fnrows_max, fncols_max, fnr_curr, nb, + fnrows_new, fncols_new, fnr_min, fnc_min, minsize, + newsize, fnrows, fncols, *E, eloc ; + + /* ---------------------------------------------------------------------- */ + /* get parameters */ + /* ---------------------------------------------------------------------- */ + +#ifndef NDEBUG + if (do_what != -1) UMF_debug++ ; + DEBUG0 (("\n\n====================GROW FRONT: do_what: "ID"\n", do_what)) ; + if (do_what != -1) UMF_debug-- ; + ASSERT (Work->do_grow) ; + ASSERT (Work->fnpiv == 0) ; +#endif + + Fcols = Work->Fcols ; + Fcpos = Work->Fcpos ; + E = Work->E ; + + /* ---------------------------------------------------------------------- */ + /* The current front is too small, find the new size */ + /* ---------------------------------------------------------------------- */ + + /* maximum size of frontal matrix for this chain */ + nb = Work->nb ; + fnrows_max = Work->fnrows_max + nb ; + fncols_max = Work->fncols_max + nb ; + ASSERT (fnrows_max >= 0 && (fnrows_max % 2) == 1) ; + DEBUG0 (("Max size: "ID"-by-"ID" (incl. "ID" pivot block\n", + fnrows_max, fncols_max, nb)) ; + + /* current dimensions of frontal matrix: fnr-by-fnc */ + DEBUG0 (("Current : "ID"-by-"ID" (excl "ID" pivot blocks)\n", + Work->fnr_curr, Work->fnc_curr, nb)) ; + ASSERT (Work->fnr_curr >= 0) ; + ASSERT ((Work->fnr_curr % 2 == 1) || Work->fnr_curr == 0) ; + + /* required dimensions of frontal matrix: fnr_min-by-fnc_min */ + fnrows_new = Work->fnrows_new + 1 ; + fncols_new = Work->fncols_new + 1 ; + ASSERT (fnrows_new >= 0) ; + if (fnrows_new % 2 == 0) fnrows_new++ ; + fnrows_new += nb ; + fncols_new += nb ; + fnr_min = MIN (fnrows_new, fnrows_max) ; + fnc_min = MIN (fncols_new, fncols_max) ; + minsize = fnr_min * fnc_min ; + if (INT_OVERFLOW ((double) fnr_min * (double) fnc_min * sizeof (Entry))) + { + /* :: the minimum front size is bigger than the integer maximum :: */ + return (FALSE) ; + } + ASSERT (fnr_min >= 0) ; + ASSERT (fnr_min % 2 == 1) ; + + DEBUG0 (("Min : "ID"-by-"ID"\n", fnr_min, fnc_min)) ; + + /* grow the front to fnr2-by-fnc2, but no bigger than the maximum, + * and no smaller than the minumum. */ + DEBUG0 (("Desired : ("ID"+"ID")-by-("ID"+"ID")\n", fnr2, nb, fnc2, nb)) ; + fnr2 += nb ; + fnc2 += nb ; + ASSERT (fnr2 >= 0) ; + if (fnr2 % 2 == 0) fnr2++ ; + fnr2 = MAX (fnr2, fnr_min) ; + fnc2 = MAX (fnc2, fnc_min) ; + fnr2 = MIN (fnr2, fnrows_max) ; + fnc2 = MIN (fnc2, fncols_max) ; + DEBUG0 (("Try : "ID"-by-"ID"\n", fnr2, fnc2)) ; + ASSERT (fnr2 >= 0) ; + ASSERT (fnr2 % 2 == 1) ; + + s = ((double) fnr2) * ((double) fnc2) ; + if (INT_OVERFLOW (s * sizeof (Entry))) + { + /* :: frontal matrix size int overflow :: */ + /* the desired front size is bigger than the integer maximum */ + /* compute a such that a*a*s < Int_MAX / sizeof (Entry) */ + double a = 0.9 * sqrt ((Int_MAX / sizeof (Entry)) / s) ; + fnr2 = MAX (fnr_min, a * fnr2) ; + fnc2 = MAX (fnc_min, a * fnc2) ; + /* the new frontal size is a*r*a*c = a*a*s */ + newsize = fnr2 * fnc2 ; + ASSERT (fnr2 >= 0) ; + if (fnr2 % 2 == 0) fnr2++ ; + fnc2 = newsize / fnr2 ; + } + + fnr2 = MAX (fnr2, fnr_min) ; + fnc2 = MAX (fnc2, fnc_min) ; + newsize = fnr2 * fnc2 ; + + ASSERT (fnr2 >= 0) ; + ASSERT (fnr2 % 2 == 1) ; + ASSERT (fnr2 >= fnr_min) ; + ASSERT (fnc2 >= fnc_min) ; + ASSERT (newsize >= minsize) ; + + /* ---------------------------------------------------------------------- */ + /* free the current front if it is empty of any numerical values */ + /* ---------------------------------------------------------------------- */ + + if (E [0] && do_what != 1) + { + /* free the current front, if it exists and has nothing in it */ + DEBUG0 (("Freeing empty front\n")) ; + UMF_mem_free_tail_block (Numeric, E [0]) ; + E [0] = 0 ; + Work->Flublock = (Entry *) NULL ; + Work->Flblock = (Entry *) NULL ; + Work->Fublock = (Entry *) NULL ; + Work->Fcblock = (Entry *) NULL ; + } + + /* ---------------------------------------------------------------------- */ + /* allocate the new front, doing garbage collection if necessary */ + /* ---------------------------------------------------------------------- */ + +#ifndef NDEBUG + UMF_allocfail = FALSE ; + if (UMF_gprob > 0) /* a double relop, but ignore NaN case */ + { + double rrr = ((double) (rand ( ))) / (((double) RAND_MAX) + 1) ; + DEBUG1 (("Check random %e %e\n", rrr, UMF_gprob)) ; + UMF_allocfail = rrr < UMF_gprob ; + if (UMF_allocfail) DEBUGm2 (("Random garbage collection (grow)\n")) ; + } +#endif + + DEBUG0 (("Attempt size: "ID"-by-"ID"\n", fnr2, fnc2)) ; + eloc = UMF_mem_alloc_tail_block (Numeric, UNITS (Entry, newsize)) ; + + if (!eloc) + { + /* Do garbage collection, realloc, and try again. Compact the current + * contribution block in the front to fnrows-by-fncols. Note that + * there are no pivot rows/columns in current front. Do not recompute + * Fcpos in UMF_garbage_collection. */ + DEBUGm3 (("get_memory from umf_grow_front\n")) ; + if (!UMF_get_memory (Numeric, Work, 1 + UNITS (Entry, newsize), + Work->fnrows, Work->fncols, FALSE)) + { + /* :: out of memory in umf_grow_front :: */ + return (FALSE) ; /* out of memory */ + } + DEBUG0 (("Attempt size: "ID"-by-"ID" again\n", fnr2, fnc2)) ; + eloc = UMF_mem_alloc_tail_block (Numeric, UNITS (Entry, newsize)) ; + } + + /* try again with something smaller */ + while ((fnr2 != fnr_min || fnc2 != fnc_min) && !eloc) + { + fnr2 = MIN (fnr2 - 2, fnr2 * UMF_REALLOC_REDUCTION) ; + fnc2 = MIN (fnc2 - 2, fnc2 * UMF_REALLOC_REDUCTION) ; + ASSERT (fnr_min >= 0) ; + ASSERT (fnr_min % 2 == 1) ; + fnr2 = MAX (fnr_min, fnr2) ; + fnc2 = MAX (fnc_min, fnc2) ; + ASSERT (fnr2 >= 0) ; + if (fnr2 % 2 == 0) fnr2++ ; + newsize = fnr2 * fnc2 ; + DEBUGm3 (("Attempt smaller size: "ID"-by-"ID" minsize "ID"-by-"ID"\n", + fnr2, fnc2, fnr_min, fnc_min)) ; + eloc = UMF_mem_alloc_tail_block (Numeric, UNITS (Entry, newsize)) ; + } + + /* try again with the smallest possible size */ + if (!eloc) + { + fnr2 = fnr_min ; + fnc2 = fnc_min ; + newsize = minsize ; + DEBUG0 (("Attempt minsize: "ID"-by-"ID"\n", fnr2, fnc2)) ; + eloc = UMF_mem_alloc_tail_block (Numeric, UNITS (Entry, newsize)) ; + } + + if (!eloc) + { + /* out of memory */ + return (FALSE) ; + } + + ASSERT (fnr2 >= 0) ; + ASSERT (fnr2 % 2 == 1) ; + ASSERT (fnr2 >= fnr_min && fnc2 >= fnc_min) ; + + /* ---------------------------------------------------------------------- */ + /* copy the old frontal matrix into the new one */ + /* ---------------------------------------------------------------------- */ + + /* old contribution block (if any) */ + fnr_curr = Work->fnr_curr ; /* garbage collection can change fn*_curr */ + ASSERT (fnr_curr >= 0) ; + ASSERT ((fnr_curr % 2 == 1) || fnr_curr == 0) ; + fnrows = Work->fnrows ; + fncols = Work->fncols ; + Fcold = Work->Fcblock ; + + /* remove nb from the sizes */ + fnr2 -= nb ; + fnc2 -= nb ; + + /* new frontal matrix */ + Work->Flublock = (Entry *) (Numeric->Memory + eloc) ; + Work->Flblock = Work->Flublock + nb * nb ; + Work->Fublock = Work->Flblock + nb * fnr2 ; + Work->Fcblock = Work->Fublock + nb * fnc2 ; + Fcnew = Work->Fcblock ; + + if (E [0]) + { + /* copy the old contribution block into the new one */ + for (j = 0 ; j < fncols ; j++) + { + col = Fcols [j] ; + DEBUG1 (("copy col "ID" \n",col)) ; + ASSERT (col >= 0 && col < Work->n_col) ; + for (i = 0 ; i < fnrows ; i++) + { + Fcnew [i] = Fcold [i] ; + } + Fcnew += fnr2 ; + Fcold += fnr_curr ; + DEBUG1 (("new offset col "ID" "ID"\n",col, j * fnr2)) ; + Fcpos [col] = j * fnr2 ; + } + } + else if (do_what == 2) + { + /* just find the new column offsets */ + for (j = 0 ; j < fncols ; j++) + { + col = Fcols [j] ; + DEBUG1 (("new offset col "ID" "ID"\n",col, j * fnr2)) ; + Fcpos [col] = j * fnr2 ; + } + } + + /* free the old frontal matrix */ + UMF_mem_free_tail_block (Numeric, E [0]) ; + + /* ---------------------------------------------------------------------- */ + /* new frontal matrix size */ + /* ---------------------------------------------------------------------- */ + + E [0] = eloc ; + Work->fnr_curr = fnr2 ; /* C block is fnr2-by-fnc2 */ + Work->fnc_curr = fnc2 ; + Work->fcurr_size = newsize ; /* including LU, L, U, and C blocks */ + Work->do_grow = FALSE ; /* the front has just been grown */ + + ASSERT (Work->fnr_curr >= 0) ; + ASSERT (Work->fnr_curr % 2 == 1) ; + DEBUG0 (("Newly grown front: "ID"+"ID" by "ID"+"ID"\n", Work->fnr_curr, + nb, Work->fnc_curr, nb)) ; + return (TRUE) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_grow_front.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_grow_front.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,14 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL Int UMF_grow_front +( + NumericType *Numeric, + Int fnr2, + Int fnc2, + WorkType *Work, + Int do_what +) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_init_front.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_init_front.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,267 @@ +/* ========================================================================== */ +/* === UMF_init_front ======================================================= */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +#include "umf_internal.h" +#include "umf_grow_front.h" + +/* ========================================================================== */ +/* === zero_init_front ====================================================== */ +/* ========================================================================== */ + +/* Set the initial frontal matrix to zero. */ + +PRIVATE void zero_init_front (Int m, Int n, Entry *Fcblock, Int d) +{ + Int i, j ; + Entry *F, *Fj = Fcblock ; + for (j = 0 ; j < m ; j++) + { + F = Fj ; + Fj += d ; + for (i = 0 ; i < n ; i++) + { + /* CLEAR (Fcblock [i + j*d]) ; */ + CLEAR (*F) ; + F++ ; + } + } +} + +/* ========================================================================== */ +/* === UMF_init_front ======================================================= */ +/* ========================================================================== */ + +GLOBAL Int UMF_init_front +( + NumericType *Numeric, + WorkType *Work +) +{ + /* ---------------------------------------------------------------------- */ + /* local variables */ + /* ---------------------------------------------------------------------- */ + + Int i, j, fnr_curr, row, col, *Frows, *Fcols, + *Fcpos, *Frpos, fncols, fnrows, *Wrow, fnr2, fnc2, rrdeg, ccdeg, *Wm, + fnrows_extended ; + Entry *Fcblock, *Fl, *Wy, *Wx ; + + /* ---------------------------------------------------------------------- */ + /* get current frontal matrix and check for frontal growth */ + /* ---------------------------------------------------------------------- */ + +#ifndef NDEBUG + DEBUG0 (("INIT FRONT\n")) ; + DEBUG1 (("CURR before init:\n")) ; + UMF_dump_current_front (Numeric, Work, FALSE) ; +#endif + if (Work->do_grow) + { + fnr2 = UMF_FRONTAL_GROWTH * Work->fnrows_new + 2 ; + fnc2 = UMF_FRONTAL_GROWTH * Work->fncols_new + 2 ; + if (!UMF_grow_front (Numeric, fnr2, fnc2, Work, + Work->pivrow_in_front ? 2 : 0)) + { + /* :: out of memory in umf_init_front :: */ + DEBUGm4 (("out of memory: init front\n")) ; + return (FALSE) ; + } + } +#ifndef NDEBUG + DEBUG1 (("CURR after grow:\n")) ; + UMF_dump_current_front (Numeric, Work, FALSE) ; + DEBUG1 (("fnrows new "ID" fncols new "ID"\n", + Work->fnrows_new, Work->fncols_new)) ; +#endif + ASSERT (Work->fnpiv == 0) ; + fnr_curr = Work->fnr_curr ; + ASSERT (Work->fnrows_new + 1 <= fnr_curr) ; + ASSERT (Work->fncols_new + 1 <= Work->fnc_curr) ; + ASSERT (fnr_curr >= 0) ; + ASSERT (fnr_curr % 2 == 1) ; + + /* ---------------------------------------------------------------------- */ + /* get parameters */ + /* ---------------------------------------------------------------------- */ + + /* current front is defined by pivot row and column */ + + Frows = Work->Frows ; + Fcols = Work->Fcols ; + Frpos = Work->Frpos ; + Fcpos = Work->Fcpos ; + + Work->fnzeros = 0 ; + + ccdeg = Work->ccdeg ; + rrdeg = Work->rrdeg ; + + fnrows = Work->fnrows ; + fncols = Work->fncols ; + + /* if both pivrow and pivcol are in front, then we extend the old one */ + /* in UMF_extend_front, rather than starting a new one here. */ + ASSERT (! (Work->pivrow_in_front && Work->pivcol_in_front)) ; + + /* ---------------------------------------------------------------------- */ + /* place pivot column pattern in frontal matrix */ + /* ---------------------------------------------------------------------- */ + + Fl = Work->Flblock ; + + if (Work->pivcol_in_front) + { + /* Append the pivot column extension. + * Note that all we need to do is increment the size, since the + * candidate pivot column pattern is already in place in + * Frows [0 ... fnrows-1] (the old pattern), and + * Frows [fnrows ... fnrows + Work->ccdeg - 1] (the new + * pattern). Frpos is also properly defined. */ + /* make a list of the new rows to scan */ + Work->fscan_row = fnrows ; /* only scan the new rows */ + Work->NewRows = Work->Wrp ; + Wy = Work->Wy ; + for (i = 0 ; i < fnrows ; i++) + { + Fl [i] = Wy [i] ; + } + fnrows_extended = fnrows + ccdeg ; + for (i = fnrows ; i < fnrows_extended ; i++) + { + Fl [i] = Wy [i] ; + /* flip the row index, since Wrp must be < 0 */ + row = Frows [i] ; + Work->NewRows [i] = FLIP (row) ; + } + fnrows = fnrows_extended ; + } + else + { + /* this is a completely new column */ + Work->fscan_row = 0 ; /* scan all the rows */ + Work->NewRows = Frows ; + Wm = Work->Wm ; + Wx = Work->Wx ; + for (i = 0 ; i < ccdeg ; i++) + { + Fl [i] = Wx [i] ; + row = Wm [i] ; + Frows [i] = row ; + Frpos [row] = i ; + } + fnrows = ccdeg ; + } + + Work->fnrows = fnrows ; + +#ifndef NDEBUG + DEBUG3 (("New Pivot col "ID" now in front, length "ID"\n", + Work->pivcol, fnrows)) ; + for (i = 0 ; i < fnrows ; i++) + { + DEBUG4 ((" "ID": row "ID"\n", i, Frows [i])) ; + ASSERT (Frpos [Frows [i]] == i) ; + } +#endif + + /* ---------------------------------------------------------------------- */ + /* place pivot row pattern in frontal matrix */ + /* ---------------------------------------------------------------------- */ + + Wrow = Work->Wrow ; + if (Work->pivrow_in_front) + { + /* append the pivot row extension */ + Work->fscan_col = fncols ; /* only scan the new columns */ + Work->NewCols = Work->Wp ; +#ifndef NDEBUG + for (j = 0 ; j < fncols ; j++) + { + col = Fcols [j] ; + ASSERT (col >= 0 && col < Work->n_col) ; + ASSERT (Fcpos [col] == j * fnr_curr) ; + } +#endif + /* Wrow == Fcol for the IN_IN case, and for the OUT_IN case when + * the pivrow [IN][IN] happens to be the same as pivrow [OUT][IN]. + * See UMF_local_search for more details. */ + ASSERT (IMPLIES (Work->pivcol_in_front, Wrow == Fcols)) ; + if (Wrow == Fcols) + { + for (j = fncols ; j < rrdeg ; j++) + { + col = Wrow [j] ; + /* Fcols [j] = col ; not needed */ + /* flip the col index, since Wp must be < 0 */ + Work->NewCols [j] = FLIP (col) ; + Fcpos [col] = j * fnr_curr ; + } + } + else + { + for (j = fncols ; j < rrdeg ; j++) + { + col = Wrow [j] ; + Fcols [j] = col ; + /* flip the col index, since Wp must be < 0 */ + Work->NewCols [j] = FLIP (col) ; + Fcpos [col] = j * fnr_curr ; + } + } + } + else + { + /* this is a completely new row */ + Work->fscan_col = 0 ; /* scan all the columns */ + Work->NewCols = Fcols ; + for (j = 0 ; j < rrdeg ; j++) + { + col = Wrow [j] ; + Fcols [j] = col ; + Fcpos [col] = j * fnr_curr ; + } + } + + DEBUGm1 (("rrdeg "ID" fncols "ID"\n", rrdeg, fncols)) ; + fncols = rrdeg ; + Work->fncols = fncols ; + + /* ---------------------------------------------------------------------- */ + /* clear the frontal matrix */ + /* ---------------------------------------------------------------------- */ + + ASSERT (fnrows == Work->fnrows_new + 1) ; + ASSERT (fncols == Work->fncols_new + 1) ; + + Fcblock = Work->Fcblock ; + ASSERT (Fcblock != (Entry *) NULL) ; + + zero_init_front (fncols, fnrows, Fcblock, fnr_curr) ; + +#ifndef NDEBUG + DEBUG3 (("New Pivot row "ID" now in front, length "ID" fnr_curr "ID"\n", + Work->pivrow, fncols, fnr_curr)) ; + for (j = 0 ; j < fncols ; j++) + { + DEBUG4 (("col "ID" position "ID"\n", j, Fcols [j])) ; + ASSERT (Fcpos [Fcols [j]] == j * fnr_curr) ; + } +#endif + + /* ---------------------------------------------------------------------- */ + /* current workspace usage: */ + /* ---------------------------------------------------------------------- */ + + /* Fcblock [0..fnr_curr-1, 0..fnc_curr-1]: space for the new frontal + * matrix. Fcblock (i,j) is located at Fcblock [i+j*fnr_curr] */ + + return (TRUE) ; + +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_init_front.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_init_front.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,11 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL Int UMF_init_front +( + NumericType *Numeric, + WorkType *Work +) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_internal.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_internal.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,760 @@ +/* ========================================================================== */ +/* === umf_internal.h ======================================================= */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + This file is for internal use in UMFPACK itself, and should not be included + in user code. Use umfpack.h instead. User-accessible file names and + routine names all start with the letters "umfpack_". Non-user-accessible + file names and routine names all start with "umf_". +*/ + +#ifndef _UMF_INTERNAL +#define _UMF_INTERNAL + +/* -------------------------------------------------------------------------- */ +/* ANSI standard include files */ +/* -------------------------------------------------------------------------- */ + +/* from float.h: DBL_EPSILON */ +#include + +/* from string.h: strcmp */ +#include + +/* when debugging, assert.h and the assert macro are used (see umf_dump.h) */ + +/* -------------------------------------------------------------------------- */ +/* Architecture */ +/* -------------------------------------------------------------------------- */ + +#if defined (__sun) || defined (MSOL2) || defined (ARCH_SOL2) +#define UMF_SOL2 +#define UMFPACK_ARCHITECTURE "Sun Solaris" + +#elif defined (__sgi) || defined (MSGI) || defined (ARCH_SGI) +#define UMF_SGI +#define UMFPACK_ARCHITECTURE "SGI Irix" + +#elif defined (__linux) || defined (MGLNX86) || defined (ARCH_GLNX86) +#define UMF_LINUX +#define UMFPACK_ARCHITECTURE "Linux" + +#elif defined (_AIX) || defined (MIBM_RS) || defined (ARCH_IBM_RS) +#define UMF_AIX +#define UMFPACK_ARCHITECTURE "IBM AIX" + +#elif defined (__alpha) || defined (MALPHA) || defined (ARCH_ALPHA) +#define UMF_ALPHA +#define UMFPACK_ARCHITECTURE "Compaq Alpha" + +#elif defined (__WIN32) || defined (_WIN32) || defined (_win32) || defined (__win32) || defined (WIN32) +#define UMF_WINDOWS +#define UMFPACK_ARCHITECTURE "Microsoft Windows" + +#elif defined (__hppa) || defined (__hpux) || defined (MHPUX) || defined (ARCH_HPUX) +#define UMF_HP +#define UMFPACK_ARCHITECTURE "HP Unix" + +#elif defined (__hp700) || defined (MHP700) || defined (ARCH_HP700) +#define UMF_HP +#define UMFPACK_ARCHITECTURE "HP 700 Unix" + +#else +/* If the architecture is unknown, and you call the BLAS, you may need to */ +/* define BLAS_BY_VALUE, BLAS_NO_UNDERSCORE, and/or BLAS_CHAR_ARG yourself. */ +#define UMFPACK_ARCHITECTURE "unknown" +#endif + + +/* -------------------------------------------------------------------------- */ +/* basic definitions (see also amd_internal.h) */ +/* -------------------------------------------------------------------------- */ + +#define ONES_COMPLEMENT(r) (-(r)-1) + +/* -------------------------------------------------------------------------- */ +/* AMD include file */ +/* -------------------------------------------------------------------------- */ + +/* stdio.h, stdlib.h, limits.h, and math.h, NDEBUG definition, + * assert.h, and MATLAB include files */ +#include "amd_internal.h" + +/* -------------------------------------------------------------------------- */ +/* Real/complex and int/long definitions, double relops */ +/* -------------------------------------------------------------------------- */ + +#include "umf_version.h" + +/* -------------------------------------------------------------------------- */ +/* Compile-time configurations */ +/* -------------------------------------------------------------------------- */ + +#include "umf_config.h" + +/* -------------------------------------------------------------------------- */ +/* umfpack include file */ +/* -------------------------------------------------------------------------- */ + +#include "umfpack.h" + +/* -------------------------------------------------------------------------- */ +/* for contents of Info. This must correlate with umfpack.h */ +/* -------------------------------------------------------------------------- */ + +#define ESTIMATE (UMFPACK_NUMERIC_SIZE_ESTIMATE - UMFPACK_NUMERIC_SIZE) +#define ACTUAL 0 + +/* -------------------------------------------------------------------------- */ +/* get a parameter from the Control array */ +/* -------------------------------------------------------------------------- */ + +#define GET_CONTROL(i,default) \ + ((Control != (double *) NULL) ? \ + (SCALAR_IS_NAN (Control [i]) ? default : Control [i]) \ + : default) + +/* -------------------------------------------------------------------------- */ +/* for clearing the external degree counters */ +/* -------------------------------------------------------------------------- */ + +#define MAX_MARK(n) Int_MAX - (2*(n)+1) + +/* -------------------------------------------------------------------------- */ +/* convert number of Units to MBytes */ +/* -------------------------------------------------------------------------- */ + +#define MBYTES(units) (((units) * sizeof (Unit)) / 1048576.0) + +/* -------------------------------------------------------------------------- */ +/* dense row/column macro */ +/* -------------------------------------------------------------------------- */ + +/* In order for a row or column to be treated as "dense", it must have more */ +/* entries than the value returned by this macro. n is the dimension of the */ +/* matrix, and alpha is the dense row/column control parameter. */ + +/* Note: this is not defined if alpha is NaN or Inf: */ +#define UMFPACK_DENSE_DEGREE_THRESHOLD(alpha,n) \ + ((Int) MAX (16.0, (alpha) * 16.0 * sqrt ((double) (n)))) + +/* -------------------------------------------------------------------------- */ +/* PRINTF */ +/* -------------------------------------------------------------------------- */ + +#define PRINTFk(k,params) { if (prl >= (k)) { PRINTF (params) ; } } +#define PRINTF1(params) PRINTFk (1, params) +#define PRINTF2(params) PRINTFk (2, params) +#define PRINTF3(params) PRINTFk (3, params) +#define PRINTF4(params) PRINTFk (4, params) +#define PRINTF5(params) PRINTFk (5, params) +#define PRINTF6(params) PRINTFk (6, params) + +/* -------------------------------------------------------------------------- */ +/* Fixed control parameters */ +/* -------------------------------------------------------------------------- */ + +/* maximum number of columns to consider at one time, in a single front */ +#define MAX_CANDIDATES 128 + +/* reduce Numeric->Memory request by this ratio, if allocation fails */ +#define UMF_REALLOC_REDUCTION (0.95) + +/* increase Numeric->Memory request by this ratio, if we need more */ +#define UMF_REALLOC_INCREASE (1.2) + +/* increase the dimensions of the current frontal matrix by this factor + * when it needs to grow. */ +#define UMF_FRONTAL_GROWTH (1.2) + +/* largest BLAS block size permitted */ +#define MAXNB 64 + +/* if abs (y) < RECIPROCAL_TOLERANCE, then compute x/y. Otherwise x*(1/y). + * Ignored if NRECIPROCAL is defined */ +#define RECIPROCAL_TOLERANCE 1e-12 + +/* -------------------------------------------------------------------------- */ +/* Memory allocator */ +/* -------------------------------------------------------------------------- */ + +/* The MATLAB mexFunction uses MATLAB's memory manager, while the C-callable + * AMD library uses the ANSI C malloc, free, and realloc routines. To use + * the mx* memory allocation routines, use -DNUTIL when compiling. + */ + +#undef ALLOCATE +#undef FREE +#undef REALLOC + +#ifdef MATLAB_MEX_FILE + +#ifdef NUTIL + +/* These functions simply terminate the mexFunction if they fail to allocate + * memory. That's too restrictive for UMFPACK. */ +#define ALLOCATE mxMalloc +#define FREE mxFree +#define REALLOCATE mxRealloc + +#else + +/* Use internal MATLAB memory allocation routines, used by built-in MATLAB + * functions. These are not documented, but are available for use. Their + * prototypes are in util.h, but that file is not provided to the MATLAB user. + * The advantage of using these routines is that they return NULL if out of + * memory, instead of terminating the mexFunction. UMFPACK attempts to allocate + * extra space for "elbow room", and then reduces its request if the memory is + * not available. That strategy doesn't work with the mx* routines. + */ +void *utMalloc (size_t size) ; +void utFree (void *p) ; +void *utRealloc (void *p, size_t size) ; +#define ALLOCATE utMalloc +#define FREE utFree +#define REALLOCATE utRealloc + +#endif +#else +#ifdef MATHWORKS + +/* Compiling as a built-in routine. Since out-of-memory conditions are checked + * after every allocation, we can use ut* routines here. */ +#define ALLOCATE utMalloc +#define FREE utFree +#define REALLOCATE utRealloc + +#else + +/* use the ANSI C memory allocation routines */ +#define ALLOCATE malloc +#define FREE free +#define REALLOCATE realloc + +#endif +#endif + +/* -------------------------------------------------------------------------- */ +/* Memory space definitions */ +/* -------------------------------------------------------------------------- */ + +/* for memory alignment - assume double has worst case alignment */ +typedef double Align ; + +/* get number of bytes required to hold n items of a type: */ +/* note that this will not overflow, because sizeof (type) is always */ +/* greater than or equal to sizeof (Int) >= 2 */ +#define BYTES(type,n) (sizeof (type) * (n)) + +/* ceiling of (b/u). Assumes b >= 0 and u > 0 */ +#define CEILING(b,u) (((b) + (u) - 1) / (u)) + +/* get number of Units required to hold n items of a type: */ +#define UNITS(type,n) (CEILING (BYTES (type, n), sizeof (Unit))) + +/* same as DUNITS, but use double instead of int to avoid overflow */ +#define DUNITS(type,n) (ceil (BYTES (type, (double) n) / sizeof (Unit))) + +union Unit_union +{ /* memory is allocated in multiples of Unit */ + struct + { + Int + size, /* size, in Units, of the block, excl. header block */ + /* size >= 0: block is in use */ + /* size < 0: block is free, of |size| Units */ + prevsize ; /* size, in Units, of preceding block in S->Memory */ + /* during garbage_collection, prevsize is set to -e-1 */ + /* for element e, or positive (and thus a free block) */ + /* otherwise */ + } header ; /* block header */ + Align xxxxxx ; /* force alignment of blocks (xxxxxx is never used) */ +} ; + +typedef union Unit_union Unit ; + +/* get the size of an allocated block */ +#define GET_BLOCK_SIZE(p) (((p)-1)->header.size) + +/* -------------------------------------------------------------------------- */ +/* Numeric */ +/* -------------------------------------------------------------------------- */ + +/* + NUMERIC_VALID and SYMBOLIC_VALID: + The different values of SYBOLIC_VALID and NUMERIC_VALID are chosen as a + first defense against corrupted *Symbolic or *Numeric pointers passed to an + UMFPACK routine. They also ensure that the objects are used only by the + same version that created them (umfpack_di_*, umfpack_dl_*, umfpack_zi_*, + or umfpack_zl_*). The values have also been changed since prior releases of + the code to ensure that all routines that operate on the objects are of the + same release. The values themselves are purely arbitrary. The are less + than the ANSI C required minimums of INT_MAX and LONG_MAX, respectively. +*/ + +#ifdef DINT +#define NUMERIC_VALID 15977 +#define SYMBOLIC_VALID 41937 +#endif +#ifdef DLONG +#define NUMERIC_VALID 399789720 +#define SYMBOLIC_VALID 399192713 +#endif +#ifdef ZINT +#define NUMERIC_VALID 17957 +#define SYMBOLIC_VALID 40927 +#endif +#ifdef ZLONG +#define NUMERIC_VALID 129987754 +#define SYMBOLIC_VALID 110291734 +#endif + +typedef struct /* NumericType */ +{ + double + flops, /* "true" flop count */ + relpt, /* relative pivot tolerance used */ + relpt2, /* relative pivot tolerance used for sym. */ + droptol, + alloc_init, /* initial allocation of Numeric->memory */ + front_alloc_init, /* frontal matrix allocation parameter */ + rsmin, /* smallest row sum */ + rsmax, /* largest row sum */ + min_udiag, /* smallest abs value on diagonal of D */ + max_udiag, /* smallest abs value on diagonal of D */ + rcond ; /* min (D) / max (D) */ + + Int + scale ; + + Int valid ; /* set to NUMERIC_VALID, for validity check */ + + /* Memory space for A and LU factors */ + Unit + *Memory ; /* working memory for A and LU factors */ + Int + ihead, /* pointer to tail of LU factors, in Numeric->Memory */ + itail, /* pointer to top of elements & tuples, */ + /* in Numeric->Memory */ + ibig, /* pointer to largest free block seen in tail */ + size ; /* size of Memory, in Units */ + + Int + *Rperm, /* pointer to row perm array, size: n+1 */ + /* after UMF_kernel: Rperm [new] = old */ + /* during UMF_kernel: Rperm [old] = new */ + *Cperm, /* pointer to col perm array, size: n+1 */ + /* after UMF_kernel: Cperm [new] = old */ + /* during UMF_kernel: Cperm [old] = new */ + + *Upos, /* see UMFPACK_get_numeric for a description */ + *Lpos, + *Lip, + *Lilen, + *Uip, + *Uilen, + *Upattern ; /* pattern of last row of U (if singular) */ + + Int + ulen, /* length of Upattern */ + npiv, /* number of structural pivots found (sprank approx) */ + nnzpiv ; /* number of numerical (nonzero) pivots found */ + + Entry + *D ; /* D [i] is the diagonal entry of U */ + + Int do_recip ; + double *Rs ; /* scale factors for the rows of A and b */ + /* do_recip FALSE: Divide row i by Rs [i] */ + /* do_recip TRUE: Multiply row i by Rs [i] */ + + Int + n_row, n_col, /* A is n_row-by-n_row */ + n1 ; /* number of singletons */ + + /* for information only: */ + Int + tail_usage, /* amount of memory allocated in tail */ + /* head_usage is Numeric->ihead */ + init_usage, /* memory usage just after UMF_kernel_init */ + max_usage, /* peak memory usage (excludes internal and external */ + /* fragmentation in the tail) */ + ngarbage, /* number of garbage collections performed */ + nrealloc, /* number of reallocations performed */ + ncostly, /* number of costly reallocations performed */ + isize, /* size of integer pattern of L and U */ + nLentries, /* number of entries in L, excluding diagonal */ + nUentries, /* number of entries in U, including diagonal */ + /* Some entries may be numerically zero. */ + lnz, /* number of nonzero entries in L, excl. diagonal */ + all_lnz, /* lnz plus entries dropped from L */ + unz, /* number of nonzero entries in U, excl. diagonal */ + all_unz, /* unz plus entries dropped form U */ + maxfrsize ; /* largest actual front size */ + + Int maxnrows, maxncols ; /* not the same as Symbolic->maxnrows/cols* */ + +} NumericType ; + + + +/* -------------------------------------------------------------------------- */ +/* Element tuples for connecting elements together in a matrix */ +/* -------------------------------------------------------------------------- */ + +typedef struct /* Tuple */ +{ + /* The (e,f) tuples for the element lists */ + Int + e, /* element */ + f ; /* contribution to the row/col appears at this offset */ + +} Tuple ; + +#define TUPLES(t) MAX (4, (t) + 1) + +/* Col_degree is aliased with Cperm, and Row_degree with Rperm */ +#define NON_PIVOTAL_COL(col) (Col_degree [col] >= 0) +#define NON_PIVOTAL_ROW(row) (Row_degree [row] >= 0) + +/* -------------------------------------------------------------------------- */ +/* An element */ +/* -------------------------------------------------------------------------- */ + +typedef struct /* Element */ +{ + Int + + cdeg, /* external column degree + cdeg0 offset */ + rdeg, /* external row degree + rdeg0 offset */ + nrowsleft, /* number of rows remaining */ + ncolsleft, /* number of columns remaining */ + nrows, /* number of rows */ + ncols, /* number of columns */ + next ; /* for list link of sons, used during assembly only */ + + /* followed in memory by: + Int + col [0..ncols-1], column indices of this element + row [0..nrows-1] ; row indices of this element + Entry (suitably aligned, see macro below) + C [0...nrows-1, 0...ncols-1] ; + size of C is nrows*ncols Entry's + */ + +} Element ; + +/* macros for computing pointers to row/col indices, and contribution block: */ + +#define GET_ELEMENT_SIZE(nr,nc) \ +(UNITS (Element, 1) + UNITS (Int, (nc) + (nr)) + UNITS (Entry, (nc) * (nr))) + +#define DGET_ELEMENT_SIZE(nr,nc) \ +(DUNITS (Element, 1) + DUNITS (Int, (nc) + (nr)) + DUNITS (Entry, (nc) * (nr))) + +#define GET_ELEMENT_COLS(ep,p,Cols) { \ + ASSERT (p != (Unit *) NULL) ; \ + ASSERT (p >= Numeric->Memory + Numeric->itail) ; \ + ASSERT (p <= Numeric->Memory + Numeric->size) ; \ + ep = (Element *) p ; \ + p += UNITS (Element, 1) ; \ + Cols = (Int *) p ; \ +} + +#define GET_ELEMENT_PATTERN(ep,p,Cols,Rows,ncm) { \ + GET_ELEMENT_COLS (ep, p, Cols) ; \ + ncm = ep->ncols ; \ + Rows = Cols + ncm ; \ +} + +#define GET_ELEMENT(ep,p,Cols,Rows,ncm,nrm,C) { \ + GET_ELEMENT_PATTERN (ep, p, Cols, Rows, ncm) ; \ + nrm = ep->nrows ; \ + p += UNITS (Int, ncm + nrm) ; \ + C = (Entry *) p ; \ +} + +/* -------------------------------------------------------------------------- */ +/* Work data structure */ +/* -------------------------------------------------------------------------- */ + +/* + This data structure holds items needed only during factorization. + All of this is freed when UMFPACK_numeric completes. Note that some of + it is stored in the tail end of Numeric->S (namely, the Tuples and the + Elements). +*/ + +typedef struct /* WorkType */ +{ + + /* ---------------------------------------------------------------------- */ + /* information about each row and col of A */ + /* ---------------------------------------------------------------------- */ + + /* + Row_tuples: pointer to tuple list (alias with Numeric->Uip) + Row_tlen: number of tuples (alias with Numeric->Uilen) + Col_tuples: pointer to tuple list (alias with Numeric->Lip) + Col_tlen: number of tuples (alias with Numeric->Lilen) + Row_degree: degree of the row or column (alias Numeric->Rperm) + Col_degree: degree of the row or column (alias Numeric->Cperm) + + The Row_degree and Col_degree are MATLAB-style colmmd approximations, + are equal to the sum of the sizes of the elements (contribution blocks) + in each row and column. They are maintained when elements are created + and assembled. They are used only during the pivot row and column + search. They are not needed to represent the pattern of the remaining + matrix. + */ + + /* ---------------------------------------------------------------------- */ + /* information about each element */ + /* ---------------------------------------------------------------------- */ + + Int *E ; /* E [0 .. Work->elen-1] element "pointers" */ + /* (offsets in Numeric->Memory) */ + + /* ---------------------------------------------------------------------- */ + /* generic workspace */ + /* ---------------------------------------------------------------------- */ + + Entry *Wx, *Wy ; /* each of size maxnrows+1 */ + + Int /* Sizes: nn = MAX (n_row, n_col) */ + *Wp, /* nn+1 */ + *Wrp, /* n_col+1 */ + *Wm, /* maxnrows+1 */ + *Wio, /* maxncols+1 */ + *Woi, /* maxncols+1 */ + *Woo, /* MAX (maxnrows,maxncols)+1 */ + *Wrow, /* pointer to Fcols, Wio, or Woi */ + *NewRows, /* list of rows to scan */ + *NewCols ; /* list of cols to scan */ + + /* ---------------------------------------------------------------------- */ + + Int + *Lpattern, /* pattern of column of L, for one Lchain */ + *Upattern, /* pattern of row of U, for one Uchain */ + ulen, llen ; /* length of Upattern and Lpattern */ + + Int + *Diagonal_map, /* used for symmetric pivoting, of size nn+1 */ + *Diagonal_imap ;/* used for symmetric pivoting, of size nn+1 */ + + /* ---------------------------------------------------------------------- */ + + Int + n_row, n_col, /* matrix is n_row-by-n_col */ + nz, /* nonzeros in the elements for this matrix */ + n1, /* number of row and col singletons */ + elen, /* max possible number of elements */ + npiv, /* number of pivot rows and columns so far */ + ndiscard, /* number of discarded pivot columns */ + Wrpflag, + nel, /* elements in use are in the range 1..nel */ + noff_diagonal, + prior_element, + rdeg0, cdeg0, + rrdeg, ccdeg, + Candidates [MAX_CANDIDATES], /* current candidate pivot columns */ + nCandidates, /* number of candidates in Candidate set */ + ksuper, + firstsuper, + jsuper, + ncand, /* number of candidates (some not in Candidates[ ]) */ + nextcand, /* next candidate to place in Candidate search set */ + lo, + hi, + pivrow, /* current pivot row */ + pivcol, /* current pivot column */ + do_extend, /* true if the next pivot extends the current front */ + do_update, /* true if update should be applied */ + nforced, /* number of forced updates because of frontal growth */ + any_skip, + do_scan2row, + do_scan2col, + do_grow, + pivot_case, + frontid, /* id of current frontal matrix */ + nfr ; /* number of frontal matrices */ + + /* ---------------------------------------------------------------------- */ + /* For row-merge tree */ + /* ---------------------------------------------------------------------- */ + + Int + *Front_new1strow ; + + /* ---------------------------------------------------------------------- */ + /* current frontal matrix, F */ + /* ---------------------------------------------------------------------- */ + + Int Pivrow [MAXNB], + Pivcol [MAXNB] ; + + Entry + *Flublock, /* LU block, nb-by-nb */ + *Flblock, /* L block, fnr_curr-by-nb */ + *Fublock, /* U block, nb-by-fnc_curr, or U' fnc_curr-by-nb */ + *Fcblock ; /* C block, fnr_curr-by-fnc_curr */ + + Int + *Frows, /* Frows [0.. ]: row indices of F */ + + *Fcols, /* Fcols [0.. ]: column indices of F */ + + *Frpos, /* position of row indices in F, or -1 if not present */ + /* if Frows[i] == row, then Frpos[row] == i */ + + *Fcpos, /* position of col indices in F, or -1 if not present */ + /* if Fcols[j] == col, then */ + /* Fcpos[col] == j*Work->fnr_curr */ + + fnrows, /* number of rows in contribution block in F */ + fncols, /* number of columns in contribution block in F */ + fnr_curr, /* maximum # of rows in F (leading dimension) */ + fnc_curr, /* maximum # of columns in F */ + fcurr_size, /* current size of F */ + fnrows_max, /* max possible column-dimension (max # of rows) of F */ + fncols_max, /* max possible row-dimension (max # of columns) of F */ + nb, + fnpiv, /* number of pivots in F */ + fnzeros, /* number of explicit zero entries in LU block */ + fscan_row, /* where to start scanning rows of F in UMF_assemble */ + fscan_col, /* where to start scanning cols of F in UMF_assemble */ + fnrows_new, /* number of new row indices in F after pivot added */ + fncols_new, /* number of new col indices in F after pivot added */ + pivrow_in_front, /* true if current pivot row in Frows */ + pivcol_in_front ; /* true if current pivot column in Fcols */ + + /* ---------------------------------------------------------------------- + * Current frontal matrix + * ---------------------------------------------------------------------- + * The current frontal matrix is held as a single block of memory allocated + * from the "tail" end of Numeric->Memory. It is subdivided into four + * parts: an LU block, an L block, a U block, and a C block. + * + * Let k = fnpiv, r = fnrows, and c = fncols for the following discussion. + * Let dr = fnr_curr and dc = fnc_curr. Note that r <= dr and c <= dc. + * + * The LU block is of dimension nb-by-nb. The first k-by-k part holds the + * "diagonal" part of the LU factors for these k pivot rows and columns. + * The k pivot row and column indices in this part are Pivrow [0..k-1] and + * Pivcol [0..k-1], respectively. + * + * The L block is of dimension dr-by-nb. It holds the k pivot columns, + * except for the leading k-by-k part in the LU block. Only the leading + * r-by-k part is in use. + * + * The U block is of dimension dc-by-nb. It holds the k pivot rows, + * except for the leading k-by-k part in the LU block. It is stored in + * row-oriented form. Only the leading c-by-k part is in use. + * + * The C block is of dimension dr-by-dc. It holds the current contribution + * block. Only the leading r-by-c part is in use. The column indices in + * the C block are Fcols [0..c-1], and the row indices are Frows [0..r-1]. + * + * dr is always odd, to avoid bad cache behavior. + */ + +} WorkType ; + + +/* -------------------------------------------------------------------------- */ +/* Symbolic */ +/* -------------------------------------------------------------------------- */ + +/* + This is is constructed by UMFPACK_symbolic, and is needed by UMFPACK_numeric + to factor the matrix. +*/ + +typedef struct /* SymbolicType */ +{ + + double + num_mem_usage_est, /* estimated max Numeric->Memory size */ + num_mem_size_est, /* estimated final Numeric->Memory size */ + peak_sym_usage, /* peak Symbolic and SymbolicWork usage */ + sym, /* symmetry of pattern */ + dnum_mem_init_usage, /* min Numeric->Memory for UMF_kernel_init */ + amd_lunz, /* nz in LU for AMD, with symmetric pivoting */ + lunz_bound ; /* max nx in LU, for arbitrary row pivoting */ + + Int valid, /* set to SYMBOLIC_VALID, for validity check */ + max_nchains, + nchains, + *Chain_start, + *Chain_maxrows, + *Chain_maxcols, + maxnrows, /* largest number of rows in any front */ + maxncols, /* largest number of columns in any front */ + *Front_npivcol, /* Front_npivcol [j] = size of jth supercolumn*/ + *Front_1strow, /* first row index in front j */ + *Front_leftmostdesc, /* leftmost desc of front j */ + *Front_parent, /* super-column elimination tree */ + *Cperm_init, /* initial column ordering */ + *Rperm_init, /* initial row ordering */ + *Cdeg, *Rdeg, + *Esize, + dense_row_threshold, + n1, /* number of singletons */ + nempty, /* MIN (nempty_row, nempty_col) */ + *Diagonal_map, /* initial "diagonal" (after 2by2) */ + esize, /* size of Esize array */ + nfr, + n_row, n_col, /* matrix A is n_row-by-n_col */ + nz, /* nz of original matrix */ + nb, /* block size for BLAS 3 */ + num_mem_init_usage, /* min Numeric->Memory for UMF_kernel_init */ + nempty_row, nempty_col, + + strategy, + ordering, + fixQ, + prefer_diagonal, + nzaat, + nzdiag, + amd_dmax ; + +} SymbolicType ; + + +/* -------------------------------------------------------------------------- */ +/* for debugging only: */ +/* -------------------------------------------------------------------------- */ + +#include "umf_dump.h" + +/* -------------------------------------------------------------------------- */ +/* for statement coverage testing only: */ +/* -------------------------------------------------------------------------- */ + +#ifdef TESTING + +/* for testing integer overflow: */ +#ifdef TEST_FOR_INTEGER_OVERFLOW +#undef MAX_MARK +#define MAX_MARK(n) (3*(n)) +#endif + +/* for testing out-of-memory conditions: */ +#define UMF_TCOV_TEST +GLOBAL extern int umf_fail, umf_fail_lo, umf_fail_hi ; +GLOBAL extern int umf_realloc_fail, umf_realloc_lo, umf_realloc_hi ; + +/* for testing malloc count: */ +#define UMF_MALLOC_COUNT + +#endif + +#endif diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_is_permutation.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_is_permutation.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,55 @@ +/* ========================================================================== */ +/* === UMF_is_permutation =================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* Return TRUE if P is a r-permutation vector, FALSE otherwise */ +/* P [0..r-1] must be an r-permutation of 0..n-1 */ + +#include "umf_internal.h" + +GLOBAL Int UMF_is_permutation +( + const Int P [ ], /* permutation of size r */ + Int W [ ], /* workspace of size n */ + Int n, + Int r +) +{ + Int i, k ; + + if (!P) + { + /* if P is (Int *) NULL, this is the identity permutation */ + return (TRUE) ; + } + + ASSERT (W != (Int *) NULL) ; + + for (i = 0 ; i < n ; i++) + { + W [i] = FALSE ; + } + for (k = 0 ; k < r ; k++) + { + i = P [k] ; + DEBUG5 (("k "ID" i "ID"\n", k, i)) ; + if (i < 0 || i >= n) + { + DEBUG0 (("i out of range "ID" "ID"\n", i, n)) ; + return (FALSE) ; + } + if (W [i]) + { + DEBUG0 (("i duplicate "ID"\n", i)) ; + return (FALSE) ; + } + W [i] = TRUE ; + } + return (TRUE) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_is_permutation.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_is_permutation.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,13 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL Int UMF_is_permutation +( + const Int P [ ], + Int W [ ], + Int n, + Int r +) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_kernel.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_kernel.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,299 @@ +/* ========================================================================== */ +/* === UMF_kernel =========================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + Primary factorization routine. Called by UMFPACK_numeric. + Returns: + UMFPACK_OK if successful, + UMFPACK_ERROR_out_of_memory if out of memory, or + UMFPACK_ERROR_different_pattern if pattern of matrix (Ap and/or Ai) + has changed since the call to UMFPACK_*symbolic. +*/ + +#include "umf_internal.h" +#include "umf_kernel_init.h" +#include "umf_init_front.h" +#include "umf_start_front.h" +#include "umf_assemble.h" +#include "umf_scale_column.h" +#include "umf_local_search.h" +#include "umf_create_element.h" +#include "umf_extend_front.h" +#include "umf_blas3_update.h" +#include "umf_store_lu.h" +#include "umf_kernel_wrapup.h" + +/* perform an action, and return if out of memory */ +#define DO(action) { if (! (action)) { return (UMFPACK_ERROR_out_of_memory) ; }} + +GLOBAL Int UMF_kernel +( + const Int Ap [ ], + const Int Ai [ ], + const double Ax [ ], +#ifdef COMPLEX + const double Az [ ], +#endif + NumericType *Numeric, + WorkType *Work, + SymbolicType *Symbolic +) +{ + + /* ---------------------------------------------------------------------- */ + /* local variables */ + /* ---------------------------------------------------------------------- */ + + Int j, f1, f2, chain, nchains, *Chain_start, status, fixQ, evaporate, + *Front_npivcol, jmax, nb, drop ; + + /* ---------------------------------------------------------------------- */ + /* initialize memory space and load the matrix. Optionally scale. */ + /* ---------------------------------------------------------------------- */ + + if (!UMF_kernel_init (Ap, Ai, Ax, +#ifdef COMPLEX + Az, +#endif + Numeric, Work, Symbolic)) + { + /* UMF_kernel_init is guaranteed to succeed, since UMFPACK_numeric */ + /* either allocates enough space or if not, UMF_kernel does not get */ + /* called. So running out of memory here is a fatal error, and means */ + /* that the user changed Ap and/or Ai since the call to */ + /* UMFPACK_*symbolic. */ + DEBUGm4 (("kernel init failed\n")) ; + return (UMFPACK_ERROR_different_pattern) ; + } + + /* ---------------------------------------------------------------------- */ + /* get the symbolic factorization */ + /* ---------------------------------------------------------------------- */ + + nchains = Symbolic->nchains ; + Chain_start = Symbolic->Chain_start ; + Front_npivcol = Symbolic->Front_npivcol ; + nb = Symbolic->nb ; + fixQ = Symbolic->fixQ ; + drop = Numeric->droptol > 0.0 ; + +#ifndef NDEBUG + for (chain = 0 ; chain < nchains ; chain++) + { + Int i ; + f1 = Chain_start [chain] ; + f2 = Chain_start [chain+1] - 1 ; + DEBUG1 (("\nCHain: "ID" start "ID" end "ID"\n", chain, f1, f2)) ; + for (i = f1 ; i <= f2 ; i++) + { + DEBUG1 (("Front "ID", npivcol "ID"\n", i, Front_npivcol [i])) ; + } + } +#endif + + /* ---------------------------------------------------------------------- */ + /* factorize each chain of frontal matrices */ + /* ---------------------------------------------------------------------- */ + + for (chain = 0 ; chain < nchains ; chain++) + { + f1 = Chain_start [chain] ; + f2 = Chain_start [chain+1] - 1 ; + + /* ------------------------------------------------------------------ */ + /* get the initial frontal matrix size for this chain */ + /* ------------------------------------------------------------------ */ + + DO (UMF_start_front (chain, Numeric, Work, Symbolic)) ; + + /* ------------------------------------------------------------------ */ + /* factorize each front in the chain */ + /* ------------------------------------------------------------------ */ + + for (Work->frontid = f1 ; Work->frontid <= f2 ; Work->frontid++) + { + + /* -------------------------------------------------------------- */ + /* Initialize the pivot column candidate set */ + /* -------------------------------------------------------------- */ + + Work->ncand = Front_npivcol [Work->frontid] ; + Work->lo = Work->nextcand ; + Work->hi = Work->nextcand + Work->ncand - 1 ; + jmax = MIN (MAX_CANDIDATES, Work->ncand) ; + DEBUGm1 ((">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Starting front " + ID", npivcol: "ID"\n", Work->frontid, Work->ncand)) ; + if (fixQ) + { + /* do not modify the column order */ + jmax = 1 ; + } + DEBUGm1 (("Initial candidates: ")) ; + for (j = 0 ; j < jmax ; j++) + { + DEBUGm1 ((" "ID, Work->nextcand)) ; + ASSERT (Work->nextcand <= Work->hi) ; + Work->Candidates [j] = Work->nextcand++ ; + } + Work->nCandidates = jmax ; + DEBUGm1 (("\n")) ; + + /* -------------------------------------------------------------- */ + /* Assemble and factorize the current frontal matrix */ + /* -------------------------------------------------------------- */ + + while (Work->ncand > 0) + { + + /* ---------------------------------------------------------- */ + /* get the pivot row and column */ + /* ---------------------------------------------------------- */ + + status = UMF_local_search (Numeric, Work, Symbolic) ; + if (status == UMFPACK_ERROR_different_pattern) + { + /* :: pattern change detected in umf_local_search :: */ + /* input matrix has changed since umfpack_*symbolic */ + DEBUGm4 (("local search failed\n")) ; + return (UMFPACK_ERROR_different_pattern) ; + } + if (status == UMFPACK_WARNING_singular_matrix) + { + /* no pivot found, discard and try again */ + continue ; + } + + /* ---------------------------------------------------------- */ + /* update if front not extended or too many zeros in L,U */ + /* ---------------------------------------------------------- */ + + if (Work->do_update) + { + UMF_blas3_update (Work) ; + if (drop) + { + DO (UMF_store_lu_drop (Numeric, Work)) ; + } + else + { + DO (UMF_store_lu (Numeric, Work)) ; + } + } + + /* ---------------------------------------------------------- */ + /* extend the frontal matrix, or start a new one */ + /* ---------------------------------------------------------- */ + + if (Work->do_extend) + { + /* extend the current front */ + DO (UMF_extend_front (Numeric, Work)) ; + } + else + { + /* finish the current front (if any) and start a new one */ + DO (UMF_create_element (Numeric, Work, Symbolic)) ; + DO (UMF_init_front (Numeric, Work)) ; + } + + /* ---------------------------------------------------------- */ + /* Numerical & symbolic assembly into current frontal matrix */ + /* ---------------------------------------------------------- */ + + if (fixQ) + { + UMF_assemble_fixq (Numeric, Work) ; + } + else + { + UMF_assemble (Numeric, Work) ; + } + + /* ---------------------------------------------------------- */ + /* scale the pivot column */ + /* ---------------------------------------------------------- */ + + UMF_scale_column (Numeric, Work) ; + + /* ---------------------------------------------------------- */ + /* Numerical update if enough pivots accumulated */ + /* ---------------------------------------------------------- */ + + evaporate = Work->fnrows == 0 || Work->fncols == 0 ; + if (Work->fnpiv >= nb || evaporate) + { + UMF_blas3_update (Work) ; + if (drop) + { + DO (UMF_store_lu_drop (Numeric, Work)) ; + } + else + { + DO (UMF_store_lu (Numeric, Work)) ; + } + + } + + Work->pivrow_in_front = FALSE ; + Work->pivcol_in_front = FALSE ; + + /* ---------------------------------------------------------- */ + /* If front is empty, evaporate it */ + /* ---------------------------------------------------------- */ + + if (evaporate) + { + /* This does not create an element, just evaporates it. + * It ensures that a front is not 0-by-c or r-by-0. No + * memory is allocated, so it is guaranteed to succeed. */ + (void) UMF_create_element (Numeric, Work, Symbolic) ; + Work->fnrows = 0 ; + Work->fncols = 0 ; + } + } + } + + /* ------------------------------------------------------------------ + * Wrapup the current frontal matrix. This is the last in a chain + * in the column elimination tree. The next frontal matrix + * cannot overlap with the current one, which will be its sibling + * in the column etree. + * ------------------------------------------------------------------ */ + + UMF_blas3_update (Work) ; + if (drop) + { + DO (UMF_store_lu_drop (Numeric, Work)) ; + } + else + { + DO (UMF_store_lu (Numeric, Work)) ; + } + Work->fnrows_new = Work->fnrows ; + Work->fncols_new = Work->fncols ; + DO (UMF_create_element (Numeric, Work, Symbolic)) ; + + /* ------------------------------------------------------------------ */ + /* current front is now empty */ + /* ------------------------------------------------------------------ */ + + Work->fnrows = 0 ; + Work->fncols = 0 ; + } + + /* ---------------------------------------------------------------------- */ + /* end the last Lchain and Uchain and finalize the LU factors */ + /* ---------------------------------------------------------------------- */ + + UMF_kernel_wrapup (Numeric, Symbolic, Work) ; + + /* note that the matrix may be singular (this is OK) */ + return (UMFPACK_OK) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_kernel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_kernel.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,18 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL Int UMF_kernel +( + const Int Ap [ ], + const Int Ai [ ], + const double Ax [ ], +#ifdef COMPLEX + const double Az [ ], +#endif + NumericType *Numeric, + WorkType *Work, + SymbolicType *Symbolic +) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_kernel_init.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_kernel_init.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,1056 @@ +/* ========================================================================== */ +/* === UMF_kernel_init ====================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + Initialize the kernel: scale the matrix, load the initial elements, and + build the tuple lists. + + Returns TRUE if successful, FALSE if out of memory or if the pattern has + changed since UMFPACK_*symbolic. UMFPACK_numeric allocates at least enough + space for UMF_kernel_init to succeed; otherwise it does not call + UMF_kernel_init. So an out-of-memory condition means that the pattern must + have gotten larger. +*/ + +#include "umf_internal.h" +#include "umf_tuple_lengths.h" +#include "umf_build_tuples.h" +#include "umf_mem_init_memoryspace.h" +#include "umf_mem_alloc_element.h" +#include "umf_mem_alloc_head_block.h" +#include "umf_mem_alloc_tail_block.h" +#include "umf_mem_free_tail_block.h" +#include "umf_scale.h" + +/* ========================================================================== */ +/* === packsp =============================================================== */ +/* ========================================================================== */ + +/* remove zero or small entries from a column of L or a row of U */ + +PRIVATE Int packsp /* returns new value of pnew */ +( + Int pnew, /* index into Memory of next free space */ + Int *p_p, /* ptr to index of old pattern in Memory on input, + new pattern on output */ + Int *p_len, /* ptr to length of old pattern on input, + new pattern on output */ + Int drop, /* TRUE if small nonzero entries are to be dropped */ + double droptol, /* the drop tolerance */ + Unit *Memory /* contains the sparse vector on input and output */ +) +{ + Entry x ; + double s ; + Entry *Bx, *Bx2 ; + Int p, i, len, len_new, *Bi, *Bi2 ; + + /* get the pointers to the sparse vector, and its length */ + p = *p_p ; + len = *p_len ; + Bi = (Int *) (Memory + p) ; p += UNITS (Int, len) ; + Bx = (Entry *) (Memory + p) ; p += UNITS (Entry, len) ; + DEBUGm4 ((" p "ID" len "ID" pnew "ID"\n", p, len, pnew)) ; + + /* the vector resides in Bi [0..len-1] and Bx [0..len-1] */ + + /* first, compact the vector in place */ + len_new = 0 ; + for (p = 0 ; p < len ; p++) + { + i = Bi [p] ; + x = Bx [p] ; + DEBUGm4 ((" old vector: i "ID" value: ", i)) ; + EDEBUGk (-4, x) ; + DEBUGm4 (("\n")) ; + ASSERT (i >= 0) ; + /* skip if zero or below drop tolerance */ + if (IS_ZERO (x)) continue ; + if (drop) + { + APPROX_ABS (s, x) ; + if (s <= droptol) continue ; + } + /* store the value back into the vector */ + if (len_new != p) + { + Bi [len_new] = i ; + Bx [len_new] = x ; + } + len_new++ ; + } + ASSERT (len_new <= len) ; + + /* the vector is now in Bi [0..len_new-1] and Bx [0..len_new-1] */ + +#ifndef NDEBUG + for (p = 0 ; p < len_new ; p++) + { + DEBUGm4 ((" new vector: i "ID" value: ", Bi [p])) ; + EDEBUGk (-4, Bx [p]) ; + DEBUGm4 (("\n")) ; + ASSERT (Bi [p] >= 0) ; + } +#endif + + /* allocate new space for the compacted vector */ + *p_p = pnew ; + *p_len = len_new ; + Bi2 = (Int *) (Memory + pnew) ; pnew += UNITS (Int, len_new) ; + Bx2 = (Entry *) (Memory + pnew) ; pnew += UNITS (Entry, len_new) ; + DEBUGm4 ((" pnew "ID" len_new "ID"\n", pnew, len_new)) ; + + /* shift the vector upwards, into its new space */ + for (p = 0 ; p < len_new ; p++) + { + Bi2 [p] = Bi [p] ; + } + for (p = 0 ; p < len_new ; p++) + { + Bx2 [p] = Bx [p] ; + } + +#ifndef NDEBUG + for (p = 0 ; p < len_new ; p++) + { + DEBUGm4 ((" packed vec: i "ID" value: ", Bi2 [p])) ; + EDEBUGk (-4, Bx2 [p]) ; + DEBUGm4 (("\n")) ; + ASSERT (Bi2 [p] >= 0) ; + } +#endif + + /* return the pointer to the space just after the new vector */ + return (pnew) ; +} + + +/* ========================================================================== */ +/* === UMF_kernel_init ====================================================== */ +/* ========================================================================== */ + +GLOBAL Int UMF_kernel_init +( + const Int Ap [ ], /* user's input matrix (not modified) */ + const Int Ai [ ], + const double Ax [ ], +#ifdef COMPLEX + const double Az [ ], +#endif + NumericType *Numeric, + WorkType *Work, + SymbolicType *Symbolic +) +{ + /* ---------------------------------------------------------------------- */ + /* local variables */ + /* ---------------------------------------------------------------------- */ + + Entry x, pivot_value ; + double unused = 0, rsmin, rsmax, rs, droptol ; + Entry *D, *C, *Lval, **Rpx ; + double *Rs ; + Int row, k, oldcol, size, e, p1, p2, p, nz, *Rows, *Cols, *E, i, *Upos, + *Lpos, n_row, n_col, *Wp, *Cperm_init, *Frpos, *Fcpos, *Row_degree, nn, + *Row_tlen, *Col_degree, *Col_tlen, oldrow, newrow, ilast, *Wrp, + *Rperm_init, col, n_inner, prefer_diagonal, *Diagonal_map, nempty, + *Diagonal_imap, fixQ, rdeg, cdeg, nempty_col, *Esize, esize, pnew, + *Lip, *Uip, *Lilen, *Uilen, llen, pa, *Cdeg, *Rdeg, n1, clen, do_scale, + lnz, unz, lip, uip, k1, *Rperm, *Cperm, pivcol, *Li, lilen, drop, + **Rpi, nempty_row, dense_row_threshold, empty_elements, rpi, rpx ; + Element *ep ; + Unit *Memory ; +#ifdef COMPLEX + Int split = SPLIT (Az) ; +#endif +#ifndef NRECIPROCAL + Int do_recip = FALSE ; +#endif + + /* ---------------------------------------------------------------------- */ + /* get parameters */ + /* ---------------------------------------------------------------------- */ + + DEBUG0 (("KERNEL INIT\n")) ; + + n_row = Symbolic->n_row ; + n_col = Symbolic->n_col ; + nn = MAX (n_row, n_col) ; + n_inner = MIN (n_row, n_col) ; + nempty_col = Symbolic->nempty_col ; + nempty_row = Symbolic->nempty_row ; + nempty = MIN (nempty_row, nempty_col) ; + ASSERT (n_row > 0 && n_col > 0) ; + Cperm_init = Symbolic->Cperm_init ; + Rperm_init = Symbolic->Rperm_init ; + Cdeg = Symbolic->Cdeg ; + Rdeg = Symbolic->Rdeg ; + n1 = Symbolic->n1 ; + dense_row_threshold = Symbolic->dense_row_threshold ; + DEBUG0 (("Singletons: "ID"\n", n1)) ; + Work->nforced = 0 ; + Work->ndiscard = 0 ; + Work->noff_diagonal = 0 ; + + nz = Ap [n_col] ; + if (nz < 0 || Ap [0] != 0 || nz != Symbolic->nz) + { + DEBUGm4 (("nz or Ap [0] bad\n")) ; + return (FALSE) ; /* pattern changed */ + } + + prefer_diagonal = Symbolic->prefer_diagonal ; + Diagonal_map = Work->Diagonal_map ; + Diagonal_imap = Work->Diagonal_imap ; + + /* ---------------------------------------------------------------------- */ + /* initialize the Numeric->Memory space for LU, elements, and tuples */ + /* ---------------------------------------------------------------------- */ + + UMF_mem_init_memoryspace (Numeric) ; + DEBUG1 (("Kernel init head usage, before allocs: "ID"\n", Numeric->ihead)) ; + + /* ---------------------------------------------------------------------- */ + /* initialize the Work and Numeric objects */ + /* ---------------------------------------------------------------------- */ + + /* current front is empty */ + Work->fnpiv = 0 ; + Work->fncols = 0 ; + Work->fnrows = 0 ; + Work->fncols_max = 0 ; + Work->fnrows_max = 0 ; + Work->fnzeros = 0 ; + Work->fcurr_size = 0 ; + Work->fnr_curr = 0 ; + Work->fnc_curr = 0 ; + + Work->nz = nz ; + Work->prior_element = EMPTY ; + Work->ulen = 0 ; + Work->llen = 0 ; + Work->npiv = n1 ; + Work->frontid = 0 ; + Work->nextcand = n1 ; + + Memory = Numeric->Memory ; + Rperm = Numeric->Rperm ; + Cperm = Numeric->Cperm ; + Row_degree = Numeric->Rperm ; + Col_degree = Numeric->Cperm ; + /* Row_tuples = Numeric->Uip ; not needed */ + Row_tlen = Numeric->Uilen ; + /* Col_tuples = Numeric->Lip ; not needed */ + Col_tlen = Numeric->Lilen ; + + Lip = Numeric->Lip ; + Uip = Numeric->Uip ; + Lilen = Numeric->Lilen ; + Uilen = Numeric->Uilen ; + + Frpos = Work->Frpos ; + Fcpos = Work->Fcpos ; + Wp = Work->Wp ; + Wrp = Work->Wrp ; + + D = Numeric->D ; + Upos = Numeric->Upos ; + Lpos = Numeric->Lpos ; + for (k = 0 ; k < n_inner ; k++) + { + CLEAR (D [k]) ; + } + + Rs = Numeric->Rs ; + + for (row = 0 ; row <= n_row ; row++) + { + Lpos [row] = EMPTY ; + /* Row_tuples [row] = 0 ; set in UMF_build_tuples */ + /* Row_degree [row] = 0 ; initialized below */ + Row_tlen [row] = 0 ; + /* Frpos [row] = EMPTY ; do this later */ + } + + for (col = 0 ; col <= n_col ; col++) + { + Upos [col] = EMPTY ; + /* Col_tuples [col] = 0 ; set in UMF_build_tuples */ + /* Col_degree [col] = 0 ; initialized below */ + Col_tlen [col] = 0 ; + Fcpos [col] = EMPTY ; + Wrp [col] = 0 ; + } + Work->Wrpflag = 1 ; + + /* When cleared, Wp [0..nn] is < 0 */ + for (i = 0 ; i <= nn ; i++) + { + Wp [i] = EMPTY ; + } + /* In col search, Wp [row] is set to a position, which is >= 0. */ + + /* When cleared, Wrp [0..n_col] is < Wrpflag */ + /* In row search, Wrp [col] is set to Wrpflag. */ + + /* no need to initialize Wm, Wio, Woi, and Woo */ + + /* clear the external degree counters */ + Work->cdeg0 = 1 ; + Work->rdeg0 = 1 ; + + fixQ = Symbolic->fixQ ; + + E = Work->E ; + + Numeric->n_row = n_row ; + Numeric->n_col = n_col ; + Numeric->npiv = 0 ; + Numeric->nnzpiv = 0 ; + Numeric->min_udiag = 0.0 ; + Numeric->max_udiag = 0.0 ; + Numeric->rcond = 0.0 ; + Numeric->isize = 0 ; + Numeric->nLentries = 0 ; + Numeric->nUentries = 0 ; + Numeric->lnz = 0 ; + Numeric->unz = 0 ; + Numeric->all_lnz = 0 ; + Numeric->all_unz = 0 ; + Numeric->maxfrsize = 0 ; + Numeric->maxnrows = 0 ; + Numeric->maxncols = 0 ; + Numeric->flops = 0. ; + Numeric->n1 = n1 ; + droptol = Numeric->droptol ; + drop = (droptol > 0) ; + + /* ---------------------------------------------------------------------- */ + /* compute the scale factors, if requested, and check the input matrix */ + /* ---------------------------------------------------------------------- */ + + /* UMFPACK_SCALE_SUM: Rs [i] = sum of the absolute values in row i. + * UMFPACK_SCALE_MAX: Rs [i] = max of the absolute values in row i. + * + * If A is complex, an approximate abs is used (|xreal| + |ximag|). + * + * If min (Rs [0..n_row]) >= RECIPROCAL_TOLERANCE, then the scale + * factors are inverted, and the rows of A are multiplied by the scale + * factors. Otherwise, the rows are divided by the scale factors. If + * NRECIPROCAL is defined, then the rows are always divided by the scale + * factors. + * + * For MATLAB (either built-in routine or mexFunction), or for gcc, + * the rows are always divided by the scale factors. + */ + + do_scale = (Numeric->scale != UMFPACK_SCALE_NONE) ; + + if (do_scale) + { + int do_max = Numeric->scale == UMFPACK_SCALE_MAX ; + for (row = 0 ; row < n_row ; row++) + { + Rs [row] = 0.0 ; + } + for (col = 0 ; col < n_col ; col++) + { + ilast = EMPTY ; + p1 = Ap [col] ; + p2 = Ap [col+1] ; + if (p1 > p2) + { + /* invalid matrix */ + DEBUGm4 (("invalid matrix (Ap)\n")) ; + return (FALSE) ; + } + for (p = p1 ; p < p2 ; p++) + { + Entry aij ; + double value ; + row = Ai [p] ; + if (row <= ilast || row >= n_row) + { + /* invalid matrix, columns must be sorted, no duplicates */ + DEBUGm4 (("invalid matrix (Ai)\n")) ; + return (FALSE) ; + } + ASSIGN (aij, Ax, Az, p, split) ; + APPROX_ABS (value, aij) ; + rs = Rs [row] ; + if (!SCALAR_IS_NAN (rs)) + { + if (SCALAR_IS_NAN (value)) + { + /* if any entry in the row is NaN, then the scale factor + * is NaN too (for now) and then set to 1.0 below */ + Rs [row] = value ; + } + else if (do_max) + { + Rs [row] = MAX (rs, value) ; + } + else + { + Rs [row] += value ; + } + } + DEBUG4 (("i "ID" j "ID" value %g, Rs[i]: %g\n", + row, col, value, Rs[row])) ; + ilast = row ; + } + } + DEBUG2 (("Rs[0] = %30.20e\n", Rs [0])) ; + for (row = 0 ; row < n_row ; row++) + { + rs = Rs [row] ; + if (SCALAR_IS_ZERO (rs) || SCALAR_IS_NAN (rs)) + { + /* don't scale a completely zero row, or one with NaN's */ + Rs [row] = 1.0 ; + } + } + rsmin = Rs [0] ; + rsmax = Rs [0] ; + for (row = 0 ; row < n_row ; row++) + { + DEBUG2 (("sum %30.20e ", Rs [row])) ; + rsmin = MIN (rsmin, Rs [row]) ; + rsmax = MAX (rsmax, Rs [row]) ; + DEBUG2 (("Rs["ID"] = %30.20e\n", row, Rs [row])) ; + } +#ifndef NRECIPROCAL + /* multiply by the reciprocal if Rs is not too small */ + do_recip = (rsmin >= RECIPROCAL_TOLERANCE) ; + if (do_recip) + { + /* invert the scale factors */ + for (row = 0 ; row < n_row ; row++) + { + Rs [row] = 1.0 / Rs [row] ; + } + } +#endif + } + else + { + /* no scaling, rsmin and rsmax not computed */ + rsmin = -1 ; + rsmax = -1 ; +#ifndef NRECIPROCAL + do_recip = FALSE ; +#endif + /* check the input matrix */ + if (!AMD_valid (n_row, n_col, Ap, Ai)) + { + /* matrix is invalid */ + return (FALSE) ; + } + } + + Numeric->rsmin = rsmin ; + Numeric->rsmax = rsmax ; +#ifndef NRECIPROCAL + Numeric->do_recip = do_recip ; +#else + Numeric->do_recip = FALSE ; +#endif + + /* ---------------------------------------------------------------------- */ + /* construct the inverse row Rperm_init permutation (use Frpos as temp) */ + /* ---------------------------------------------------------------------- */ + + DEBUG3 (("\n\n===================LOAD_MATRIX:\n")) ; + + for (newrow = 0 ; newrow < n_row ; newrow++) + { + oldrow = Rperm_init [newrow] ; + ASSERT (oldrow >= 0 && oldrow < n_row) ; + Frpos [oldrow] = newrow ; + } + + /* ---------------------------------------------------------------------- */ + /* construct the diagonal imap if doing symmetric pivoting */ + /* ---------------------------------------------------------------------- */ + + if (prefer_diagonal) + { + ASSERT (n_row == n_col) ; + ASSERT (nempty_col == Symbolic->nempty_row) ; + ASSERT (nempty_col == nempty) ; + for (i = 0 ; i < nn ; i++) + { + Diagonal_map [i] = EMPTY ; + Diagonal_imap [i] = EMPTY ; + } + for (k = n1 ; k < nn - nempty ; k++) + { + newrow = Symbolic->Diagonal_map [k] ; + Diagonal_map [k] = newrow ; + Diagonal_imap [newrow] = k ; + } + } + + /* ---------------------------------------------------------------------- */ + /* allocate O (n_row) workspace at the tail end of Memory */ + /* ---------------------------------------------------------------------- */ + + rpi = UMF_mem_alloc_tail_block (Numeric, UNITS (Int *, n_row+1)) ; + rpx = UMF_mem_alloc_tail_block (Numeric, UNITS (Entry *, n_row+1)) ; + if (!rpi || !rpx) + { + /* :: pattern change (out of memory for Rpx, Rpx) :: */ + /* out of memory, which can only mean that the pattern has changed */ + return (FALSE) ; /* pattern changed */ + } + Rpi = (Int **) (Memory + rpx) ; + Rpx = (Entry **) (Memory + rpi) ; + + /* ---------------------------------------------------------------------- */ + /* allocate the LU factors for the columns of the singletons */ + /* ---------------------------------------------------------------------- */ + + DEBUG1 (("Allocating singletons:\n")) ; + for (k = 0 ; k < n1 ; k++) + { + lnz = Cdeg [k] - 1 ; + unz = Rdeg [k] - 1 ; + + DEBUG1 (("Singleton k "ID" pivrow "ID" pivcol "ID" cdeg "ID" rdeg " + ID"\n", k, Rperm_init [k], Cperm_init [k], Cdeg [k], Rdeg [k])) ; + ASSERT (unz >= 0 && lnz >= 0 && (lnz == 0 || unz == 0)) ; + DEBUG1 ((" lnz "ID" unz "ID"\n", lnz, unz)) ; + + size = UNITS (Int, lnz) + UNITS (Entry, lnz) + + UNITS (Int, unz) + UNITS (Entry, unz) ; + p = UMF_mem_alloc_head_block (Numeric, size) ; + DEBUG1 (("Kernel init head usage: "ID"\n", Numeric->ihead)) ; + if (!p) + { + /* :: pattern change (out of memory for singletons) :: */ + DEBUG0 (("Pattern has gotten larger - kernel init failed\n")) ; + return (FALSE) ; /* pattern changed */ + } + + Numeric->all_lnz += lnz ; + Numeric->all_unz += unz ; + + /* allocate the column of L */ + lip = p ; + p += UNITS (Int, lnz) ; + p += UNITS (Entry, lnz) ; + + /* allocate the row of U */ + uip = p ; + Rpi [k] = (Int *) (Memory + p) ; + p += UNITS (Int, unz) ; + Rpx [k] = (Entry *) (Memory + p) ; + /* p += UNITS (Entry, unz) ; (not needed) */ + + /* a single column of L (no Lchains) */ + Lip [k] = lip ; + Lilen [k] = lnz ; + + /* a single row of L (no Uchains) */ + Uip [k] = uip ; + Uilen [k] = unz ; + + Wp [k] = unz ; + + /* save row and column inverse permutation */ + k1 = ONES_COMPLEMENT (k) ; + Rperm [k] = k1 ; /* aliased with Row_degree */ + Cperm [k] = k1 ; /* aliased with Col_degree */ + } + + /* ---------------------------------------------------------------------- */ + /* current frontal matrix is empty */ + /* ---------------------------------------------------------------------- */ + + e = 0 ; + E [e] = 0 ; + Work->Flublock = (Entry *) NULL ; + Work->Flblock = (Entry *) NULL ; + Work->Fublock = (Entry *) NULL ; + Work->Fcblock = (Entry *) NULL ; + + /* ---------------------------------------------------------------------- */ + /* allocate the column elements */ + /* ---------------------------------------------------------------------- */ + + Esize = Symbolic->Esize ; + empty_elements = FALSE ; + for (k = n1 ; k < n_col - nempty_col ; k++) + { + e = k - n1 + 1 ; + ASSERT (e < Work->elen) ; + esize = Esize ? Esize [k-n1] : Cdeg [k] ; + if (esize > 0) + { + /* allocate an element for this column */ + E [e] = UMF_mem_alloc_element (Numeric, esize, 1, &Rows, &Cols, &C, + &size, &ep) ; + if (E [e] <= 0) + { + /* :: pattern change (out of memory for column elements) :: */ + return (FALSE) ; /* pattern has changed */ + } + Cols [0] = k ; + DEBUG0 (("Got column element e "ID" esize "ID"\n", e, esize)) ; + } + else + { + /* all rows in this column are dense, or empty */ + E [e] = 0 ; + empty_elements = TRUE ; + DEBUG0 (("column element e is empty "ID"\n", e)) ; + } + } + DEBUG0 (("e "ID" n_col "ID" nempty_col "ID" n1 "ID"\n", e, n_col, + nempty_col, n1)) ; + ASSERT (e == n_col - nempty_col - n1) ; + + /* ---------------------------------------------------------------------- */ + /* allocate the row elements for dense rows of A (if any) */ + /* ---------------------------------------------------------------------- */ + + if (Esize) + { + for (k = n1 ; k < n_row - nempty_row ; k++) + { + rdeg = Rdeg [k] ; + if (rdeg > dense_row_threshold) + { + /* allocate an element for this dense row */ + e++ ; + ASSERT (e < Work->elen) ; + E [e] = UMF_mem_alloc_element (Numeric, 1, rdeg, &Rows, &Cols, + &C, &size, &ep) ; + if (E [e] <= 0) + { + /* :: pattern change (out of memory for row elements) :: */ + return (FALSE) ; /* pattern has changed */ + } + Rows [0] = k ; + Rpi [k] = Cols ; + Rpx [k] = C ; + Wp [k] = rdeg ; + DEBUG0 (("Got row element e "ID" rdeg "ID"\n", e, rdeg)) ; + } + } + } + + /* elements are currently in the range 0 to e */ + Work->nel = e ; + + /* ---------------------------------------------------------------------- */ + /* create the first n1 columns of L and U */ + /* ---------------------------------------------------------------------- */ + + for (k = 0 ; k < n1 ; k++) + { + pivcol = Cperm_init [k] ; + p2 = Ap [pivcol+1] ; + + /* get the kth column of L */ + p = Lip [k] ; + Li = (Int *) (Memory + p) ; + lilen = Lilen [k] ; + p += UNITS (Int, lilen) ; + Lval = (Entry *) (Memory + p) ; + + llen = 0 ; + + for (pa = Ap [pivcol] ; pa < p2 ; pa++) + { + oldrow = Ai [pa] ; + newrow = Frpos [oldrow] ; + ASSIGN (x, Ax, Az, pa, split) ; + + /* scale the value using the scale factors, Rs */ + if (do_scale) + { +#ifndef NRECIPROCAL + if (do_recip) + { + SCALE (x, Rs [oldrow]) ; + } + else +#endif + { + SCALE_DIV (x, Rs [oldrow]) ; + } + } + + if (newrow == k) + { + /* this is the pivot entry itself */ + ASSERT (oldrow == Rperm_init [k]) ; + D [k] = x ; + } + else if (newrow < k) + { + /* this entry goes in a row of U */ + DEBUG1 (("Singleton row of U: k "ID" newrow "ID"\n", + k, newrow)) ; + if (--(Wp [newrow]) < 0) + { + /* :: pattern change (singleton row too long) :: */ + DEBUGm4 (("bad U singleton row (too long)\n")) ; + return (FALSE) ; /* pattern changed */ + } + *(Rpi [newrow]++) = k ; + *(Rpx [newrow]++) = x ; + } + else + { + /* this entry goes in a column of L */ + DEBUG1 (("Singleton col of L: k "ID" newrow "ID"\n", + k, newrow)) ; + if (llen >= lilen) + { + DEBUGm4 (("bad L singleton col (too long)\n")) ; + return (FALSE) ; /* pattern changed */ + } + Li [llen] = newrow ; + Lval [llen] = x ; + llen++ ; + } + } + + if (llen != lilen) + { + /* :: pattern change (singleton column too long) :: */ + DEBUGm4 (("bad L singleton col (too short)\n")) ; + return (FALSE) ; /* pattern changed */ + } + + /* scale the column of L */ + if (llen > 0) + { + pivot_value = D [k] ; + UMF_scale (llen, pivot_value, Lval) ; + } + + } + + /* ---------------------------------------------------------------------- */ + /* allocate the elements and copy the columns of A */ + /* ---------------------------------------------------------------------- */ + + /* also apply the row and column pre-ordering. */ + for (k = n1 ; k < n_col ; k++) + { + /* The newcol is k, which is what the name of the column is in the + * UMFPACK kernel. The user's name for the column is oldcol. */ + oldcol = Cperm_init [k] ; + + ASSERT (oldcol >= 0 && oldcol < n_col) ; + + p2 = Ap [oldcol+1] ; + + cdeg = Cdeg [k] ; + ASSERT (cdeg >= 0) ; + ASSERT (IMPLIES ( + (Symbolic->ordering != UMFPACK_ORDERING_GIVEN) && n1 > 0, + cdeg > 1 || cdeg == 0)) ; + + /* if fixQ: set Col_degree to 0 for the NON_PIVOTAL_COL macro */ + Col_degree [k] = fixQ ? 0 : cdeg ; + + /* get the element for this column (if any) */ + e = k - n1 + 1 ; + if (k < n_col - nempty_col) + { + esize = Esize ? Esize [k-n1] : cdeg ; + if (E [e]) + { + Int ncols, nrows ; + Unit *pp ; + pp = Memory + E [e] ; + GET_ELEMENT (ep, pp, Cols, Rows, ncols, nrows, C) ; + ASSERT (ncols == 1) ; + ASSERT (nrows == esize) ; + ASSERT (Cols [0] == k) ; + } + } + else + { + ASSERT (cdeg == 0) ; + esize = 0 ; + } + + clen = 0 ; + + for (pa = Ap [oldcol] ; pa < p2 ; pa++) + { + oldrow = Ai [pa] ; + newrow = Frpos [oldrow] ; + ASSIGN (x, Ax, Az, pa, split) ; + + /* scale the value using the scale factors, Rs */ + if (do_scale) + { +#ifndef NRECIPROCAL + if (do_recip) + { + /* multiply by the reciprocal */ + SCALE (x, Rs [oldrow]) ; + } + else +#endif + { + /* divide instead */ + SCALE_DIV (x, Rs [oldrow]) ; + } + } + + rdeg = Rdeg [newrow] ; + if (newrow < n1 || rdeg > dense_row_threshold) + { + /* this entry goes in a row of U or into a dense row */ + DEBUG1 (("Singleton/dense row of U: k "ID" newrow "ID"\n", + k, newrow)) ; + if (--(Wp [newrow]) < 0) + { + DEBUGm4 (("bad row of U or A (too long)\n")) ; + return (FALSE) ; /* pattern changed */ + } + *(Rpi [newrow]++) = k ; + *(Rpx [newrow]++) = x ; + } + else + { + /* this entry goes in an initial element */ + DEBUG1 (("In element k "ID" e "ID" newrow "ID"\n", + k, e, newrow)) ; + if (clen >= esize) + { + DEBUGm4 (("bad A column (too long)\n")) ; + return (FALSE) ; /* pattern changed */ + } + ASSERT (E [e]) ; + ASSERT (k < n_col - nempty_col) ; + Rows [clen] = newrow ; + C [clen] = x ; + clen++ ; +#ifndef NDEBUG + if (Diagonal_map && (newrow == Diagonal_map [k])) + { + DEBUG0 (("Diagonal: old: row "ID" col "ID" : " + "new: row "ID" col "ID" : ", + oldrow, oldcol, newrow, k)) ; + EDEBUGk (0, x) ; + } +#endif + } + } + + if (clen != esize) + { + /* :: pattern change (singleton column too short) :: */ + DEBUGm4 (("bad A column (too short)\n")) ; + return (FALSE) ; /* pattern changed */ + } + } + + /* ---------------------------------------------------------------------- */ + /* free the Rpi and Rpx workspace at the tail end of memory */ + /* ---------------------------------------------------------------------- */ + + UMF_mem_free_tail_block (Numeric, rpi) ; + UMF_mem_free_tail_block (Numeric, rpx) ; + + /* ---------------------------------------------------------------------- */ + /* prune zeros and small entries from the singleton rows and columns */ + /* ---------------------------------------------------------------------- */ + + if (n1 > 0) + { + pnew = Lip [0] ; + ASSERT (pnew == 1) ; + for (k = 0 ; k < n1 ; k++) + { + DEBUGm4 (("\nPrune singleton L col "ID"\n", k)) ; + pnew = packsp (pnew, &Lip [k], &Lilen [k], drop, droptol, Memory) ; + Numeric->lnz += Lilen [k] ; + DEBUGm4 (("\nPrune singleton U row "ID"\n", k)) ; + pnew = packsp (pnew, &Uip [k], &Uilen [k], drop, droptol, Memory) ; + Numeric->unz += Uilen [k] ; + } + /* free the unused space at the head of memory */ + Numeric->ihead = pnew ; + } + + /* ---------------------------------------------------------------------- */ + /* initialize row degrees */ + /* ---------------------------------------------------------------------- */ + + for (k = 0 ; k < n1 ; k++) + { + if (Wp [k] != 0) + { + /* :: pattern change (singleton row too short) :: */ + DEBUGm4 (("bad U singleton row (too short)\n")) ; + return (FALSE) ; /* pattern changed */ + } + } + + for (k = n1 ; k < n_row ; k++) + { + DEBUG1 (("Initial row degree k "ID" oldrow "ID" Rdeg "ID"\n", + k, Rperm_init [k], Rdeg [k])) ; + rdeg = Rdeg [k] ; + Row_degree [k] = rdeg ; + if (rdeg > dense_row_threshold && Wp [k] != 0) + { + /* :: pattern change (dense row too short) :: */ + DEBUGm4 (("bad dense row (too short)\n")) ; + return (FALSE) ; /* pattern changed */ + } + } + +#ifndef NDEBUG + if (prefer_diagonal) + { + Entry aij ; + Int *InvCperm, newcol ; + UMF_dump_diagonal_map (Diagonal_map, Diagonal_imap, n1, nn, nempty) ; + InvCperm = (Int *) malloc (n_col * sizeof (Int)) ; + ASSERT (InvCperm != (Int *) NULL) ; + for (newcol = 0 ; newcol < n_col ; newcol++) + { + oldcol = Cperm_init [newcol] ; + InvCperm [oldcol] = newcol ; + } + DEBUGm3 (("Diagonal of P2*A:\n")) ; + for (oldcol = 0 ; oldcol < n_col ; oldcol++) + { + newcol = InvCperm [oldcol] ; + for (p = Ap [oldcol] ; p < Ap [oldcol+1] ; p++) + { + oldrow = Ai [p] ; + newrow = Frpos [oldrow] ; + ASSIGN (aij, Ax, Az, p, split) ; + if (newrow == Diagonal_map [newcol]) + { + DEBUG0 (("old row "ID" col "ID" new row "ID" col "ID, + oldrow, oldcol, newrow, newcol)) ; + EDEBUGk (0, aij) ; + DEBUG0 ((" scaled ")) ; + if (do_scale) + { +#ifndef NRECIPROCAL + if (do_recip) + { + SCALE (aij, Rs [oldrow]) ; + } + else +#endif + { + SCALE_DIV (aij, Rs [oldrow]) ; + } + } + EDEBUGk (0, aij) ; + DEBUG0 (("\n")) ; + } + } + } + free (InvCperm) ; + } +#endif + + Col_degree [n_col] = 0 ; + + /* ---------------------------------------------------------------------- */ + /* pack the element name space */ + /* ---------------------------------------------------------------------- */ + + if (empty_elements) + { + Int e2 = 0 ; + DEBUG0 (("\n\n============= Packing element space\n")) ; + for (e = 1 ; e <= Work->nel ; e++) + { + if (E [e]) + { + e2++ ; + E [e2] = E [e] ; + } + } + Work->nel = e2 ; + } + +#ifndef NDEBUG + DEBUG0 (("Number of initial elements: "ID"\n", Work->nel)) ; + for (e = 0 ; e <= Work->nel ; e++) UMF_dump_element (Numeric, Work,e,TRUE) ; +#endif + + for (e = Work->nel + 1 ; e < Work->elen ; e++) + { + E [e] = 0 ; + } + + /* Frpos no longer needed */ + for (row = 0 ; row <= n_row ; row++) + { + Frpos [row] = EMPTY ; + } + + /* clear Wp */ + for (i = 0 ; i <= nn ; i++) + { + Wp [i] = EMPTY ; + } + + DEBUG1 (("Kernel init head usage: "ID"\n", Numeric->ihead)) ; + + /* ---------------------------------------------------------------------- */ + /* build the tuple lists */ + /* ---------------------------------------------------------------------- */ + + /* if the memory usage changes, then the pattern has changed */ + + (void) UMF_tuple_lengths (Numeric, Work, &unused) ; + if (!UMF_build_tuples (Numeric, Work)) + { + /* :: pattern change (out of memory in umf_build_tuples) :: */ + /* We ran out of memory, which can only mean that */ + /* the pattern (Ap and or Ai) has changed (gotten larger). */ + DEBUG0 (("Pattern has gotten larger - build tuples failed\n")) ; + return (FALSE) ; /* pattern changed */ + } + + Numeric->init_usage = Numeric->max_usage ; + + /* ---------------------------------------------------------------------- */ + /* construct the row merge sets */ + /* ---------------------------------------------------------------------- */ + + for (i = 0 ; i <= Symbolic->nfr ; i++) + { + Work->Front_new1strow [i] = Symbolic->Front_1strow [i] ; + } + +#ifndef NDEBUG + UMF_dump_rowmerge (Numeric, Symbolic, Work) ; + DEBUG6 (("Column form of original matrix:\n")) ; + UMF_dump_col_matrix (Ax, +#ifdef COMPLEX + Az, +#endif + Ai, Ap, n_row, n_col, nz) ; + UMF_dump_memory (Numeric) ; + UMF_dump_matrix (Numeric, Work, FALSE) ; + DEBUG0 (("kernel init done...\n")) ; +#endif + + return (TRUE) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_kernel_init.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_kernel_init.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,18 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL Int UMF_kernel_init +( + const Int Ap [ ], + const Int Ai [ ], + const double Ax [ ], +#ifdef COMPLEX + const double Az [ ], +#endif + NumericType *Numeric, + WorkType *Work, + SymbolicType *Symbolic +) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_kernel_wrapup.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_kernel_wrapup.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,466 @@ +/* ========================================================================== */ +/* === UMF_kernel_wrapup ==================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* The matrix is factorized. Finish the LU data structure. */ + +#include "umf_internal.h" + +GLOBAL void UMF_kernel_wrapup +( + NumericType *Numeric, + SymbolicType *Symbolic, + WorkType *Work +) +{ + + /* ---------------------------------------------------------------------- */ + /* local variables */ + /* ---------------------------------------------------------------------- */ + + Entry pivot_value ; + double d ; + Entry *D ; + Int i, k, col, row, llen, ulen, *ip, *Rperm, *Cperm, *Lilen, npiv, lp, + *Uilen, *Lip, *Uip, *Cperm_init, up, pivrow, pivcol, *Lpos, *Upos, *Wr, + *Wc, *Wp, *Frpos, *Fcpos, *Row_degree, *Col_degree, *Rperm_init, + n_row, n_col, n_inner, zero_pivot, nan_pivot, n1 ; + +#ifndef NDEBUG + UMF_dump_matrix (Numeric, Work, FALSE) ; +#endif + + DEBUG0 (("Kernel complete, Starting Kernel wrapup\n")) ; + n_row = Symbolic->n_row ; + n_col = Symbolic->n_col ; + n_inner = MIN (n_row, n_col) ; + Rperm = Numeric->Rperm ; + Cperm = Numeric->Cperm ; + Lilen = Numeric->Lilen ; + Uilen = Numeric->Uilen ; + Upos = Numeric->Upos ; + Lpos = Numeric->Lpos ; + Lip = Numeric->Lip ; + Uip = Numeric->Uip ; + D = Numeric->D ; + + npiv = Work->npiv ; + Numeric->npiv = npiv ; + Numeric->ulen = Work->ulen ; + + ASSERT (n_row == Numeric->n_row) ; + ASSERT (n_col == Symbolic->n_col) ; + DEBUG0 (("Wrap-up: npiv "ID" ulen "ID"\n", npiv, Numeric->ulen)) ; + ASSERT (npiv <= n_inner) ; + + /* this will be nonzero only if matrix is singular or rectangular */ + ASSERT (IMPLIES (npiv == n_col, Work->ulen == 0)) ; + + /* ---------------------------------------------------------------------- */ + /* find the smallest and largest entries in D */ + /* ---------------------------------------------------------------------- */ + + for (k = 0 ; k < npiv ; k++) + { + pivot_value = D [k] ; + ABS (d, pivot_value) ; + zero_pivot = SCALAR_IS_ZERO (d) ; + nan_pivot = SCALAR_IS_NAN (d) ; + + if (!zero_pivot) + { + /* the pivot is nonzero, but might be Inf or NaN */ + Numeric->nnzpiv++ ; + } + + if (k == 0) + { + Numeric->min_udiag = d ; + Numeric->max_udiag = d ; + } + else + { + /* min (abs (diag (U))) behaves as follows: If any entry is zero, + then the result is zero (regardless of the presence of NaN's). + Otherwise, if any entry is NaN, then the result is NaN. + Otherwise, the result is the smallest absolute value on the + diagonal of U. + */ + + if (SCALAR_IS_NONZERO (Numeric->min_udiag)) + { + if (zero_pivot || nan_pivot) + { + Numeric->min_udiag = d ; + } + else if (!SCALAR_IS_NAN (Numeric->min_udiag)) + { + /* d and min_udiag are both non-NaN */ + Numeric->min_udiag = MIN (Numeric->min_udiag, d) ; + } + } + + /* + max (abs (diag (U))) behaves as follows: If any entry is NaN + then the result is NaN. Otherise, the result is the largest + absolute value on the diagonal of U. + */ + + if (nan_pivot) + { + Numeric->max_udiag = d ; + } + else if (!SCALAR_IS_NAN (Numeric->max_udiag)) + { + /* d and max_udiag are both non-NaN */ + Numeric->max_udiag = MAX (Numeric->max_udiag, d) ; + } + } + } + + /* ---------------------------------------------------------------------- */ + /* check if matrix is singular or rectangular */ + /* ---------------------------------------------------------------------- */ + + Col_degree = Cperm ; /* for NON_PIVOTAL_COL macro */ + Row_degree = Rperm ; /* for NON_PIVOTAL_ROW macro */ + + if (npiv < n_row) + { + /* finalize the row permutation */ + k = npiv ; + DEBUGm3 (("Singular pivot rows "ID" to "ID"\n", k, n_row-1)) ; + for (row = 0 ; row < n_row ; row++) + { + if (NON_PIVOTAL_ROW (row)) + { + Rperm [row] = ONES_COMPLEMENT (k) ; + DEBUGm3 (("Singular row "ID" is k: "ID" pivot row\n", row, k)) ; + ASSERT (!NON_PIVOTAL_ROW (row)) ; + Lpos [row] = EMPTY ; + Uip [row] = EMPTY ; + Uilen [row] = 0 ; + k++ ; + } + } + ASSERT (k == n_row) ; + } + + if (npiv < n_col) + { + /* finalize the col permutation */ + k = npiv ; + DEBUGm3 (("Singular pivot cols "ID" to "ID"\n", k, n_col-1)) ; + for (col = 0 ; col < n_col ; col++) + { + if (NON_PIVOTAL_COL (col)) + { + Cperm [col] = ONES_COMPLEMENT (k) ; + DEBUGm3 (("Singular col "ID" is k: "ID" pivot row\n", col, k)) ; + ASSERT (!NON_PIVOTAL_COL (col)) ; + Upos [col] = EMPTY ; + Lip [col] = EMPTY ; + Lilen [col] = 0 ; + k++ ; + } + } + ASSERT (k == n_col) ; + } + + if (npiv < n_inner) + { + /* finalize the diagonal of U */ + DEBUGm3 (("Diag of U is zero, "ID" to "ID"\n", npiv, n_inner-1)) ; + for (k = npiv ; k < n_inner ; k++) + { + CLEAR (D [k]) ; + } + } + + /* save the pattern of the last row of U */ + if (Numeric->ulen > 0) + { + DEBUGm3 (("Last row of U is not empty\n")) ; + Numeric->Upattern = Work->Upattern ; + Work->Upattern = (Int *) NULL ; + } + + DEBUG2 (("Nnzpiv: "ID" npiv "ID"\n", Numeric->nnzpiv, npiv)) ; + ASSERT (Numeric->nnzpiv <= npiv) ; + if (Numeric->nnzpiv < n_inner && !SCALAR_IS_NAN (Numeric->min_udiag)) + { + /* the rest of the diagonal is zero, so min_udiag becomes 0, + * unless it is already NaN. */ + Numeric->min_udiag = 0.0 ; + } + + /* ---------------------------------------------------------------------- */ + /* size n_row, n_col workspaces that can be used here: */ + /* ---------------------------------------------------------------------- */ + + Frpos = Work->Frpos ; /* of size n_row+1 */ + Fcpos = Work->Fcpos ; /* of size n_col+1 */ + Wp = Work->Wp ; /* of size MAX(n_row,n_col)+1 */ + /* Work->Upattern ; cannot be used (in Numeric) */ + Wr = Work->Lpattern ; /* of size n_row+1 */ + Wc = Work->Wrp ; /* of size n_col+1 or bigger */ + + /* ---------------------------------------------------------------------- */ + /* construct Rperm from inverse permutations */ + /* ---------------------------------------------------------------------- */ + + /* use Frpos for temporary copy of inverse row permutation [ */ + + for (pivrow = 0 ; pivrow < n_row ; pivrow++) + { + k = Rperm [pivrow] ; + ASSERT (k < 0) ; + k = ONES_COMPLEMENT (k) ; + ASSERT (k >= 0 && k < n_row) ; + Wp [k] = pivrow ; + Frpos [pivrow] = k ; + } + for (k = 0 ; k < n_row ; k++) + { + Rperm [k] = Wp [k] ; + } + + /* ---------------------------------------------------------------------- */ + /* construct Cperm from inverse permutation */ + /* ---------------------------------------------------------------------- */ + + /* use Fcpos for temporary copy of inverse column permutation [ */ + + for (pivcol = 0 ; pivcol < n_col ; pivcol++) + { + k = Cperm [pivcol] ; + ASSERT (k < 0) ; + k = ONES_COMPLEMENT (k) ; + ASSERT (k >= 0 && k < n_col) ; + Wp [k] = pivcol ; + /* save a copy of the inverse column permutation in Fcpos */ + Fcpos [pivcol] = k ; + } + for (k = 0 ; k < n_col ; k++) + { + Cperm [k] = Wp [k] ; + } + +#ifndef NDEBUG + for (k = 0 ; k < n_col ; k++) + { + col = Cperm [k] ; + ASSERT (col >= 0 && col < n_col) ; + ASSERT (Fcpos [col] == k) ; /* col is the kth pivot */ + } + for (k = 0 ; k < n_row ; k++) + { + row = Rperm [k] ; + ASSERT (row >= 0 && row < n_row) ; + ASSERT (Frpos [row] == k) ; /* row is the kth pivot */ + } +#endif + +#ifndef NDEBUG + UMF_dump_lu (Numeric) ; +#endif + + /* ---------------------------------------------------------------------- */ + /* permute Lpos, Upos, Lilen, Lip, Uilen, and Uip */ + /* ---------------------------------------------------------------------- */ + + for (k = 0 ; k < npiv ; k++) + { + pivrow = Rperm [k] ; + Wr [k] = Uilen [pivrow] ; + Wp [k] = Uip [pivrow] ; + } + + for (k = 0 ; k < npiv ; k++) + { + Uilen [k] = Wr [k] ; + Uip [k] = Wp [k] ; + } + + for (k = 0 ; k < npiv ; k++) + { + pivrow = Rperm [k] ; + Wp [k] = Lpos [pivrow] ; + } + + for (k = 0 ; k < npiv ; k++) + { + Lpos [k] = Wp [k] ; + } + + for (k = 0 ; k < npiv ; k++) + { + pivcol = Cperm [k] ; + Wc [k] = Lilen [pivcol] ; + Wp [k] = Lip [pivcol] ; + } + + for (k = 0 ; k < npiv ; k++) + { + Lilen [k] = Wc [k] ; + Lip [k] = Wp [k] ; + } + + for (k = 0 ; k < npiv ; k++) + { + pivcol = Cperm [k] ; + Wp [k] = Upos [pivcol] ; + } + + for (k = 0 ; k < npiv ; k++) + { + Upos [k] = Wp [k] ; + } + + /* ---------------------------------------------------------------------- */ + /* terminate the last Uchain and last Lchain */ + /* ---------------------------------------------------------------------- */ + + Upos [npiv] = EMPTY ; + Lpos [npiv] = EMPTY ; + Uip [npiv] = EMPTY ; + Lip [npiv] = EMPTY ; + Uilen [npiv] = 0 ; + Lilen [npiv] = 0 ; + + /* ---------------------------------------------------------------------- */ + /* convert U to the new pivot order */ + /* ---------------------------------------------------------------------- */ + + n1 = Symbolic->n1 ; + + for (k = 0 ; k < n1 ; k++) + { + /* this is a singleton row of U */ + ulen = Uilen [k] ; + DEBUG4 (("K "ID" New U. ulen "ID" Singleton 1\n", k, ulen)) ; + if (ulen > 0) + { + up = Uip [k] ; + ip = (Int *) (Numeric->Memory + up) ; + for (i = 0 ; i < ulen ; i++) + { + col = *ip ; + DEBUG4 ((" old col "ID" new col "ID"\n", col, Fcpos [col])); + ASSERT (col >= 0 && col < n_col) ; + *ip++ = Fcpos [col] ; + } + } + } + + for (k = n1 ; k < npiv ; k++) + { + up = Uip [k] ; + if (up < 0) + { + /* this is the start of a new Uchain (with a pattern) */ + ulen = Uilen [k] ; + DEBUG4 (("K "ID" New U. ulen "ID" End_Uchain 1\n", k, ulen)) ; + if (ulen > 0) + { + up = -up ; + ip = (Int *) (Numeric->Memory + up) ; + for (i = 0 ; i < ulen ; i++) + { + col = *ip ; + DEBUG4 ((" old col "ID" new col "ID"\n", col, Fcpos [col])); + ASSERT (col >= 0 && col < n_col) ; + *ip++ = Fcpos [col] ; + } + } + } + } + + ulen = Numeric->ulen ; + if (ulen > 0) + { + /* convert last pivot row of U to the new pivot order */ + DEBUG4 (("K "ID" (last)\n", k)) ; + for (i = 0 ; i < ulen ; i++) + { + col = Numeric->Upattern [i] ; + DEBUG4 ((" old col "ID" new col "ID"\n", col, Fcpos [col])) ; + Numeric->Upattern [i] = Fcpos [col] ; + } + } + + /* Fcpos no longer needed ] */ + + /* ---------------------------------------------------------------------- */ + /* convert L to the new pivot order */ + /* ---------------------------------------------------------------------- */ + + for (k = 0 ; k < n1 ; k++) + { + llen = Lilen [k] ; + DEBUG4 (("K "ID" New L. llen "ID" Singleton col\n", k, llen)) ; + if (llen > 0) + { + lp = Lip [k] ; + ip = (Int *) (Numeric->Memory + lp) ; + for (i = 0 ; i < llen ; i++) + { + row = *ip ; + DEBUG4 ((" old row "ID" new row "ID"\n", row, Frpos [row])) ; + ASSERT (row >= 0 && row < n_row) ; + *ip++ = Frpos [row] ; + } + } + } + + for (k = n1 ; k < npiv ; k++) + { + llen = Lilen [k] ; + DEBUG4 (("K "ID" New L. llen "ID" \n", k, llen)) ; + if (llen > 0) + { + lp = Lip [k] ; + if (lp < 0) + { + /* this starts a new Lchain */ + lp = -lp ; + } + ip = (Int *) (Numeric->Memory + lp) ; + for (i = 0 ; i < llen ; i++) + { + row = *ip ; + DEBUG4 ((" old row "ID" new row "ID"\n", row, Frpos [row])) ; + ASSERT (row >= 0 && row < n_row) ; + *ip++ = Frpos [row] ; + } + } + } + + /* Frpos no longer needed ] */ + + /* ---------------------------------------------------------------------- */ + /* combine symbolic and numeric permutations */ + /* ---------------------------------------------------------------------- */ + + Cperm_init = Symbolic->Cperm_init ; + Rperm_init = Symbolic->Rperm_init ; + + for (k = 0 ; k < n_row ; k++) + { + Rperm [k] = Rperm_init [Rperm [k]] ; + } + + for (k = 0 ; k < n_col ; k++) + { + Cperm [k] = Cperm_init [Cperm [k]] ; + } + + /* Work object will be freed immediately upon return (to UMF_kernel */ + /* and then to UMFPACK_numeric). */ +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_kernel_wrapup.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_kernel_wrapup.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,12 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL void UMF_kernel_wrapup +( + NumericType *Numeric, + SymbolicType *Symbolic, + WorkType *Work +) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_local_search.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_local_search.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,1947 @@ +/* ========================================================================== */ +/* === UMF_local_search ===================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + Perform pivot search to find pivot row and pivot column. + The pivot column is selected from the candidate set. The candidate set + corresponds to a supercolumn from colamd or UMF_analyze. The pivot column + is then removed from that set. Constructs the pivot column pattern and + values. Called by umf_kernel. Returns UMFPACK_OK if successful, or + UMFPACK_WARNING_singular_matrix or UMFPACK_ERROR_different_pattern if not. +*/ + +#include "umf_internal.h" +#include "umf_row_search.h" +#include "umf_mem_free_tail_block.h" + +/* relaxed amalgamation control parameters are fixed at compile time */ +#define RELAX1 0.25 +#define SYM_RELAX1 0.0 +#define RELAX2 0.1 +#define RELAX3 0.125 + +/* ========================================================================== */ +/* === remove_candidate ===================================================== */ +/* ========================================================================== */ + +/* Remove a column from the set of candidate pivot columns. */ + +PRIVATE void remove_candidate (Int jj, WorkType *Work, SymbolicType *Symbolic) +{ + +#ifndef NDEBUG + Int j ; + DEBUGm2 (("pivot column Candidates before remove: nCand "ID" ncand "ID + " lo "ID" hi "ID" jj "ID"\n", Work->nCandidates, Work->ncand, + Work->lo, Work->hi, jj)) ; + for (j = 0 ; j < Work->nCandidates ; j++) + { + Int col = Work->Candidates [j] ; + DEBUGm2 ((ID" ", col)); + ASSERT (col >= 0 && col < Work->n_col) ; + /* ASSERT (NON_PIVOTAL_COL (col)) ; */ + ASSERT (col >= Work->lo && col <= Work->hi) ; + } + DEBUGm2 (("\n")) ; +#endif + + if (Symbolic->fixQ) + { + DEBUGm2 (("FixQ\n")) ; + /* do not modify the column ordering */ + ASSERT (Work->nCandidates == 1) ; + ASSERT (jj == 0) ; + if (Work->ncand > 1) + { + Work->Candidates [0] = Work->nextcand++ ; + } + else + { + Work->nCandidates = 0 ; + } + } + else + { + /* place the next candidate in the set */ + if (Work->ncand > MAX_CANDIDATES) + { + Work->Candidates [jj] = Work->nextcand++ ; + } + else + { + ASSERT (Work->nCandidates == Work->ncand) ; + Work->Candidates [jj] = Work->Candidates [Work->ncand - 1] ; + Work->Candidates [Work->ncand - 1] = EMPTY ; + Work->nCandidates-- ; + } + } + Work->ncand-- ; + +#ifndef NDEBUG + DEBUGm2 (("pivot column Candidates after remove: nCand "ID" ncand "ID + " lo "ID" hi "ID" jj "ID"\n", Work->nCandidates, Work->ncand, Work->lo, + Work->hi, jj)) ; + for (j = 0 ; j < Work->nCandidates ; j++) + { + Int col = Work->Candidates [j] ; + DEBUGm2 ((ID" ", col)); + ASSERT (col >= 0 && col < Work->n_col) ; + /* ASSERT (NON_PIVOTAL_COL (col)) ; */ + ASSERT (col >= Work->lo && col <= Work->hi) ; + } + DEBUGm2 (("\n")) ; + ASSERT (Work->ncand >= 0) ; + ASSERT (Work->nCandidates <= Work->ncand) ; +#endif +} + +/* ========================================================================== */ +/* === UMF_local_search ===================================================== */ +/* ========================================================================== */ + +GLOBAL Int UMF_local_search +( + NumericType *Numeric, + WorkType *Work, + SymbolicType *Symbolic +) +{ + /* ---------------------------------------------------------------------- */ + /* local variables */ + /* ---------------------------------------------------------------------- */ + + double relax1 ; + Entry *Flblock, *Fublock, *Fs, *Fcblock, *C, *Wx, *Wy, *Fu, *Flublock, + *Flu ; + Int pos, nrows, *Cols, *Rows, e, f, status, max_cdeg, fnzeros, nb, j, col, + i, row, cdeg_in, rdeg [2][2], fnpiv, nothing [2], new_LUsize, + pivrow [2][2], pivcol [2], *Wp, *Fcpos, *Frpos, new_fnzeros, cdeg_out, + *Wm, *Wio, *Woi, *Woo, *Frows, *Fcols, fnrows, fncols, *E, deg, nr_in, + nc, thiscost, bestcost, nr_out, do_update, extra_cols, extra_rows, + extra_zeros, relaxed_front, do_extend, fnr_curr, fnc_curr, tpi, + *Col_tuples, *Col_degree, *Col_tlen, jj, jcand [2], freebie [2], + did_rowmerge, fnrows_new [2][2], fncols_new [2][2], search_pivcol_out, + *Diagonal_map, *Diagonal_imap, row2, col2 ; + Unit *Memory, *p ; + Tuple *tp, *tpend, *tp1, *tp2 ; + Element *ep ; + +#ifndef NDEBUG + Int debug_ok, n_row, n_col, *Row_degree ; + Row_degree = Numeric->Rperm ; /* for NON_PIVOTAL_ROW macro only */ +#endif + + /* ---------------------------------------------------------------------- */ + /* get parameters */ + /* ---------------------------------------------------------------------- */ + + Memory = Numeric->Memory ; + E = Work->E ; + Col_degree = Numeric->Cperm ; + + Col_tuples = Numeric->Lip ; + Col_tlen = Numeric->Lilen ; + + Wx = Work->Wx ; + Wy = Work->Wy ; + Wp = Work->Wp ; + Wm = Work->Wm ; + Woi = Work->Woi ; + Wio = Work->Wio ; + Woo = Work->Woo ; + Fcpos = Work->Fcpos ; + Frpos = Work->Frpos ; + Frows = Work->Frows ; + Fcols = Work->Fcols ; + fnrows = Work->fnrows ; + fncols = Work->fncols ; + nb = Work->nb ; + fnr_curr = Work->fnr_curr ; + fnc_curr = Work->fnc_curr ; + fnpiv = Work->fnpiv ; + nothing [0] = EMPTY ; + nothing [1] = EMPTY ; + relax1 = (Symbolic->prefer_diagonal) ? SYM_RELAX1 : RELAX1 ; + fnzeros = Work->fnzeros ; + new_fnzeros = fnzeros ; + jj = EMPTY ; + + Fcblock = Work->Fcblock ; /* current contribution block */ + Flblock = Work->Flblock ; /* current L block */ + Fublock = Work->Fublock ; /* current U block */ + Flublock = Work->Flublock ; /* current LU block */ + + /* The pivot column degree cannot exceed max_cdeg */ + max_cdeg = Work->fnrows_max ; + ASSERT (Work->fnrows_max <= Symbolic->maxnrows) ; + ASSERT (Work->fncols_max <= Symbolic->maxncols) ; + + if (fnrows == 0 && fncols == 0) + { + /* frontal matrix is empty */ + Work->firstsuper = Work->ksuper ; + } + +#ifndef NDEBUG + n_row = Work->n_row ; + n_col = Work->n_col ; + DEBUG2 (("\n========LOCAL SEARCH: current frontal matrix: ========= \n")) ; + UMF_dump_current_front (Numeric, Work, TRUE) ; + if (UMF_debug > 0 || MAX (n_row, n_col) < 1000) + { + for (i = 0 ; i < MAX (n_row, n_col) ; i++) + { + ASSERT (Wp [i] < 0) ; + } + } + + DEBUGm2 ((ID" pivot column Candidates: lo "ID" hi "ID"\n", + Work->nCandidates, Work->lo, Work->hi)) ; + for (j = 0 ; j < Work->nCandidates ; j++) + { + col = Work->Candidates [j] ; + DEBUGm2 ((ID" ", col)); + ASSERT (col >= 0 && col < n_col) ; + ASSERT (NON_PIVOTAL_COL (col)) ; + ASSERT (col >= Work->lo && col <= Work->hi) ; + } + + DEBUGm2 (("\n")) ; + /* there are no 0-by-c or r-by-0 fronts, where c and r are > 0 */ + /* a front is either 0-by-0, or r-by-c */ + DEBUG2 (("\n\n::: "ID" : Npiv: "ID" + fnpiv "ID" = "ID". " + "size "ID"-by-"ID"\n", Work->frontid, + Work->npiv, Work->fnpiv, Work->npiv + Work->fnpiv, fnrows, fncols)) ; + ASSERT ((fnrows == 0 && fncols == 0) ||(fnrows != 0 && fncols != 0)) ; +#endif + + /* ====================================================================== */ + /* === PIVOT SEARCH ===================================================== */ + /* ====================================================================== */ + + /* initialize */ + + pivcol [IN] = EMPTY ; + pivcol [OUT] = EMPTY ; + + cdeg_in = Int_MAX ; + cdeg_out = Int_MAX ; + + pivrow [IN][IN] = EMPTY ; + pivrow [IN][OUT] = EMPTY ; + pivrow [OUT][IN] = EMPTY ; + pivrow [OUT][OUT] = EMPTY ; + + rdeg [IN][IN] = Int_MAX ; + rdeg [IN][OUT] = Int_MAX ; + rdeg [OUT][IN] = Int_MAX ; + rdeg [OUT][OUT] = Int_MAX ; + + freebie [IN] = FALSE ; + freebie [OUT] = FALSE ; + + Work->pivot_case = EMPTY ; + bestcost = EMPTY ; + + nr_out = EMPTY ; + nr_in = EMPTY ; + + jcand [IN] = EMPTY ; + jcand [OUT] = EMPTY ; + + fnrows_new [IN][IN] = EMPTY ; + fnrows_new [IN][OUT] = EMPTY ; + fnrows_new [OUT][IN] = EMPTY ; + fnrows_new [OUT][OUT] = EMPTY ; + + fncols_new [IN][IN] = EMPTY ; + fncols_new [IN][OUT] = EMPTY ; + fncols_new [OUT][IN] = EMPTY ; + fncols_new [OUT][OUT] = EMPTY ; + +#ifndef NDEBUG + /* check Frpos */ + DEBUG4 (("Check Frpos : fnrows "ID" col "ID" maxcdeg "ID"\n", + fnrows, pivcol [IN], max_cdeg)) ; + for (i = 0 ; i < fnrows ; i++) + { + row = Frows [i] ; + DEBUG4 ((" row: "ID"\n", row)) ; + ASSERT (row >= 0 && row < n_row) ; + ASSERT (Frpos [row] == i) ; + } + DEBUG4 (("All:\n")) ; + if (UMF_debug > 0 || n_row < 1000) + { + Int cnt = fnrows ; + for (row = 0 ; row < n_row ; row++) + { + if (Frpos [row] == EMPTY) + { + cnt++ ; + } + else + { + DEBUG4 ((" row: "ID" pos "ID"\n", row, Frpos [row])) ; + } + } + ASSERT (cnt == n_row) ; + } +#endif + + /* ---------------------------------------------------------------------- */ + /* find shortest column in the front, and shortest column not in the */ + /* front, from the candidate pivot column set */ + /* ---------------------------------------------------------------------- */ + + /* If there are too many candidates, then only look at the first */ + /* MAX_CANDIDATES of them. Otherwise, if there are O(n) candidates, */ + /* this code could take O(n^2) time. */ + + /* ------------------------------------------------------------------ */ + /* look in the candidate set for the best column */ + /* ------------------------------------------------------------------ */ + + DEBUG2 (("Max candidates %d, Work->ncand "ID" jmax "ID"\n", + MAX_CANDIDATES, Work->ncand, Work->nCandidates)) ; + col = Work->Candidates [0] ; + ASSERT (Work->nCandidates > 0) ; + DEBUG3 (("Pivot column candidate: "ID" j = "ID"\n", col, j)) ; + ASSERT (col >= 0 && col < n_col) ; + + /* there is no Col_degree if fixQ is true */ + deg = Symbolic->fixQ ? EMPTY : Col_degree [col] ; + +#ifndef NDEBUG + DEBUG3 (("Pivot column candidate: "ID" cost: "ID" Fcpos[col] "ID"\n", + col, deg, Fcpos [col])) ; + UMF_dump_rowcol (1, Numeric, Work, col, !Symbolic->fixQ) ; + if (Symbolic->fixQ) + { + DEBUG1 (("FIXQ: Candidates "ID" pivcol "ID" npiv "ID" fnpiv "ID + " ndiscard "ID "\n", Work->nCandidates, col, Work->npiv, + Work->fnpiv, Work->ndiscard)) ; + ASSERT (Work->nCandidates == 1) ; + ASSERT (col == Work->npiv + Work->fnpiv + Work->ndiscard) ; + } +#endif + + if (Fcpos [col] >= 0) + { + /* best column in front, so far */ + pivcol [IN] = col ; + cdeg_in = deg ; /* ignored, if fixQ is true */ + jcand [IN] = 0 ; + } + else + { + /* best column not in front, so far */ + pivcol [OUT] = col ; + cdeg_out = deg ; /* ignored, if fixQ is true */ + jcand [OUT] = 0 ; + } + + /* look at the rest of the candidates */ + for (j = 1 ; j < Work->nCandidates ; j++) + { + col = Work->Candidates [j] ; + + DEBUG3 (("Pivot col candidate: "ID" j = "ID"\n", col, j)) ; + ASSERT (col >= 0 && col < n_col) ; + ASSERT (!Symbolic->fixQ) ; + deg = Col_degree [col] ; +#ifndef NDEBUG + DEBUG3 (("Pivot col candidate: "ID" cost: "ID" Fcpos[col] "ID"\n", + col, deg, Fcpos [col])) ; + UMF_dump_rowcol (1, Numeric, Work, col, !Symbolic->fixQ) ; +#endif + if (Fcpos [col] >= 0) + { +#ifndef NDEBUG + Int fs ; + fs = Fcpos [col] / fnr_curr ; + ASSERT (fs >= 0 && fs < fncols) ; +#endif + if (deg < cdeg_in || (deg == cdeg_in && col < pivcol [IN])) + { + /* best column in front, so far */ + pivcol [IN] = col ; + cdeg_in = deg ; + jcand [IN] = j ; + } + } + else + { + if (deg < cdeg_out || (deg == cdeg_out && col < pivcol [OUT])) + { + /* best column not in front, so far */ + pivcol [OUT] = col ; + cdeg_out = deg ; + jcand [OUT] = j ; + } + } + } + + DEBUG2 (("Pivcol in "ID" out "ID"\n", pivcol [IN], pivcol [OUT])) ; + ASSERT ((pivcol [IN] >= 0 && pivcol [IN] < n_col) + || (pivcol [OUT] >= 0 && pivcol [OUT] < n_col)) ; + + cdeg_in = EMPTY ; + cdeg_out = EMPTY ; + + /* ---------------------------------------------------------------------- */ + /* construct candidate column in front, and search for pivot rows */ + /* ---------------------------------------------------------------------- */ + +#ifndef NDEBUG + /* check Frpos */ + DEBUG4 (("Prior to col update: fnrows "ID" col "ID" maxcdeg "ID"\n", + fnrows, pivcol [IN], max_cdeg)) ; + for (i = 0 ; i < fnrows ; i++) + { + row = Frows [i] ; + DEBUG4 ((" row: "ID"\n", row)) ; + ASSERT (row >= 0 && row < n_row) ; + ASSERT (Frpos [row] == i) ; + } + DEBUG4 (("All:\n")) ; + if (UMF_debug > 0 || n_row < 1000) + { + Int cnt = fnrows ; + for (row = 0 ; row < n_row ; row++) + { + if (Frpos [row] == EMPTY) + { + cnt++ ; + } + else + { + DEBUG4 ((" row: "ID" pos "ID"\n", row, Frpos [row])) ; + } + } + ASSERT (cnt == n_row) ; + } +#endif + + if (pivcol [IN] != EMPTY) + { + +#ifndef NDEBUG + DEBUG2 (("col[IN] column "ID" in front at position = "ID"\n", + pivcol [IN], Fcpos [pivcol [IN]])) ; + UMF_dump_rowcol (1, Numeric, Work, pivcol [IN], !Symbolic->fixQ) ; +#endif + + /* the only way we can have a pivcol[IN] is if the front is not empty */ + ASSERT (fnrows > 0 && fncols > 0) ; + + DEBUG4 (("Update pivot column:\n")) ; + Fs = Fcblock + Fcpos [pivcol [IN]] ; + Fu = Fublock + (Fcpos [pivcol [IN]] / fnr_curr) ; + Flu = Flublock + fnpiv * nb ; + + /* ------------------------------------------------------------------ */ + /* copy the pivot column from the U block into the LU block */ + /* ------------------------------------------------------------------ */ + + /* This copy is permanent if the pivcol [IN] is chosen. */ + for (i = 0 ; i < fnpiv ; i++) + { + Flu [i] = Fu [i*fnc_curr] ; + } + + /* ------------------------------------------------------------------ */ + /* update the pivot column in the LU block using a triangular solve */ + /* ------------------------------------------------------------------ */ + + /* This work will be discarded if the pivcol [OUT] is chosen instead. + * It is permanent if the pivcol [IN] is chosen. */ + + if (fnpiv > 1) + { + /* solve Lx=b, where b = U (:,k), stored in the LU block */ + +#ifdef USE_NO_BLAS + + /* no BLAS available - use plain C code instead */ + Entry *Flub = Flublock ; + for (j = 0 ; j < fnpiv ; j++) + { + Entry Fuj = Flu [j] ; +#pragma ivdep + for (i = j+1 ; i < fnpiv ; i++) + { + /* Flu [i] -= Flublock [i + j*nb] * Flu [j] ; */ + MULT_SUB (Flu [i], Flub [i], Fuj) ; + } + Flub += nb ; + } + +#else + BLAS_TRSV (fnpiv, Flublock, Flu, nb) ; +#endif + + } + + /* ------------------------------------------------------------------ */ + /* copy the pivot column from the C block into Wy */ + /* ------------------------------------------------------------------ */ + + for (i = 0 ; i < fnrows ; i++) + { + Wy [i] = Fs [i] ; + } + + /* ------------------------------------------------------------------ */ + /* update the pivot column of L using a matrix-vector multiply */ + /* ------------------------------------------------------------------ */ + + /* this work will be discarded if the pivcol [OUT] is chosen instead */ + +#ifdef USE_NO_BLAS + /* no BLAS available - use plain C code instead */ + for (j = 0 ; j < fnpiv ; j++) + { + Entry Fuj, *Flub = Flblock + j * fnr_curr ; + Fuj = Flu [j] ; + if (IS_NONZERO (Fuj)) + { +#pragma ivdep + for (i = 0 ; i < fnrows ; i++) + { + /* Wy [i] -= Flblock [i+j*fnr_curr] * Fuj ; */ + MULT_SUB (Wy [i], Flub [i], Fuj) ; + } + } + /* Flblock += fnr_curr ; */ + } +#else + /* Using 1-based notation: + * Wy (1:fnrows) -= Flblock (1:fnrows,1:fnpiv) * Flu (1:fnpiv) */ + BLAS_GEMV (fnrows, fnpiv, Flblock, Flu, Wy, fnr_curr) ; +#endif + + /* ------------------------------------------------------------------ */ + +#ifndef NDEBUG + DEBUG2 (("Wy after update: fnrows="ID"\n", fnrows)) ; + DEBUG4 ((" fnpiv="ID" \n", fnpiv)) ; + for (i = 0 ; i < fnrows ; i++) + { + DEBUG4 ((ID" "ID" "ID, i, Frows [i], Frpos [Frows [i]])) ; + EDEBUG4 (Wy [i]) ; + DEBUG4 (("\n")) ; + } +#endif + + /* ------------------------------------------------------------------ */ + /* construct the candidate column */ + /* ------------------------------------------------------------------ */ + + cdeg_in = fnrows ; + +#ifndef NDEBUG + /* check Frpos */ + DEBUG4 (("After col update: fnrows "ID" col "ID" maxcdeg "ID"\n", + fnrows, pivcol [IN], max_cdeg)) ; + for (i = 0 ; i < fnrows ; i++) + { + row = Frows [i] ; + DEBUG4 ((" row: "ID"\n", row)) ; + ASSERT (row >= 0 && row < n_row) ; + ASSERT (Frpos [row] == i) ; + } + DEBUG4 (("All:\n")) ; + if (UMF_debug > 0 || n_row < 1000) + { + Int cnt = fnrows ; + for (row = 0 ; row < n_row ; row++) + { + if (Frpos [row] == EMPTY) + { + cnt++ ; + } + else + { + DEBUG4 ((" row: "ID" pos "ID"\n", row, Frpos [row])) ; + } + } + ASSERT (cnt == n_row) ; + } +#endif + +#ifndef NDEBUG + /* check Frpos */ + DEBUG4 (("COL ASSEMBLE: cdeg "ID"\nREDUCE COL in "ID" max_cdeg "ID"\n", + cdeg_in, pivcol [IN], max_cdeg)) ; + for (i = 0 ; i < cdeg_in ; i++) + { + row = Frows [i] ; + ASSERT (row >= 0 && row < n_row) ; + ASSERT (Frpos [row] == i) ; + } + if (UMF_debug > 0 || n_row < 1000) + { + Int cnt = cdeg_in ; + for (row = 0 ; row < n_row ; row++) + { + if (Frpos [row] == EMPTY) cnt++ ; + } + ASSERT (cnt == n_row) ; + } +#endif + + /* assemble column into Wy */ + + ASSERT (pivcol [IN] >= 0 && pivcol [IN] < n_col) ; + ASSERT (NON_PIVOTAL_COL (pivcol [IN])) ; + + tpi = Col_tuples [pivcol [IN]] ; + if (tpi) + { + tp = (Tuple *) (Memory + tpi) ; + tp1 = tp ; + tp2 = tp ; + tpend = tp + Col_tlen [pivcol [IN]] ; + for ( ; tp < tpend ; tp++) + { + e = tp->e ; + ASSERT (e > 0 && e <= Work->nel) ; + if (!E [e]) continue ; /* element already deallocated */ + f = tp->f ; + p = Memory + E [e] ; + ep = (Element *) p ; + p += UNITS (Element, 1) ; + Cols = (Int *) p ; + if (Cols [f] == EMPTY) continue ; /* column already assembled */ + ASSERT (pivcol [IN] == Cols [f]) ; + + Rows = Cols + ep->ncols ; + nrows = ep->nrows ; + p += UNITS (Int, ep->ncols + nrows) ; + C = ((Entry *) p) + f * nrows ; + + for (i = 0 ; i < nrows ; i++) + { + row = Rows [i] ; + if (row >= 0) /* skip this if already gone from element */ + { + ASSERT (row < n_row) ; + pos = Frpos [row] ; + if (pos < 0) + { + /* new entry in the pattern - save Frpos */ + ASSERT (cdeg_in < n_row) ; + if (cdeg_in >= max_cdeg) + { + /* :: pattern change (cdeg in failure) :: */ + DEBUGm4 (("cdeg_in failure\n")) ; + return (UMFPACK_ERROR_different_pattern) ; + } + Frpos [row] = cdeg_in ; + Frows [cdeg_in] = row ; + Wy [cdeg_in++] = C [i] ; + } + else + { + /* entry already in pattern - sum values in Wy */ + /* Wy [pos] += C [i] ; */ + ASSERT (pos < max_cdeg) ; + ASSEMBLE (Wy [pos], C [i]) ; + } + } + } + *tp2++ = *tp ; /* leave the tuple in the list */ + } + Col_tlen [pivcol [IN]] = tp2 - tp1 ; + } + + /* ------------------------------------------------------------------ */ + +#ifndef NDEBUG + /* check Frpos again */ + DEBUG4 (("COL DONE: cdeg "ID"\nREDUCE COL in "ID" max_cdeg "ID"\n", + cdeg_in, pivcol [IN], max_cdeg)) ; + for (i = 0 ; i < cdeg_in ; i++) + { + row = Frows [i] ; + ASSERT (row >= 0 && row < n_row) ; + ASSERT (Frpos [row] == i) ; + } + if (UMF_debug > 0 || n_row < 1000) + { + Int cnt = cdeg_in ; + for (row = 0 ; row < n_row ; row++) + { + if (Frpos [row] == EMPTY) cnt++ ; + } + ASSERT (cnt == n_row) ; + } +#endif + +#ifndef NDEBUG + DEBUG4 (("Reduced column: cdeg in "ID" fnrows_max "ID"\n", + cdeg_in, Work->fnrows_max)) ; + for (i = 0 ; i < cdeg_in ; i++) + { + DEBUG4 ((" "ID" "ID" "ID, i, Frows [i], Frpos [Frows [i]])) ; + EDEBUG4 (Wy [i]) ; + DEBUG4 (("\n")) ; + ASSERT (i == Frpos [Frows [i]]) ; + } + ASSERT (cdeg_in <= Work->fnrows_max) ; +#endif + + /* ------------------------------------------------------------------ */ + /* cdeg_in is now the exact degree of this column */ + /* ------------------------------------------------------------------ */ + + nr_in = cdeg_in - fnrows ; + + /* since there are no 0-by-x fronts, if there is a pivcol [IN] the */ + /* front must have at least one row. */ + ASSERT (cdeg_in > 0) ; + + /* new degree of pivcol [IN], excluding current front is nr_in */ + /* column expands by nr_in rows */ + + /* ------------------------------------------------------------------ */ + /* search for two candidate pivot rows */ + /* ------------------------------------------------------------------ */ + + /* for the IN_IN pivot row (if any), */ + /* extend the pattern in place, using Fcols */ + status = UMF_row_search (Numeric, Work, Symbolic, + fnrows, cdeg_in, Frows, Frpos, /* pattern of column to search */ + pivrow [IN], rdeg [IN], Fcols, Wio, nothing, Wy, + pivcol [IN], freebie) ; + ASSERT (!freebie [IN] && !freebie [OUT]) ; + + /* ------------------------------------------------------------------ */ + /* fatal error if matrix pattern has changed since symbolic analysis */ + /* ------------------------------------------------------------------ */ + + if (status == UMFPACK_ERROR_different_pattern) + { + /* :: pattern change (row search IN failure) :: */ + DEBUGm4 (("row search IN failure\n")) ; + return (UMFPACK_ERROR_different_pattern) ; + } + + /* ------------------------------------------------------------------ */ + /* we now must have a structural pivot */ + /* ------------------------------------------------------------------ */ + + /* Since the pivcol[IN] exists, there must be at least one row in the */ + /* current frontal matrix, and so we must have found a structural */ + /* pivot. The numerical value might be zero, of course. */ + + ASSERT (status != UMFPACK_WARNING_singular_matrix) ; + + /* ------------------------------------------------------------------ */ + /* evaluate IN_IN option */ + /* ------------------------------------------------------------------ */ + + if (pivrow [IN][IN] != EMPTY) + { + /* The current front would become an (implicit) LUson. + * Both candidate pivot row and column are in the current front. + * Cost is how much the current front would expand */ + + /* pivrow[IN][IN] candidates are not found via row merge search */ + + ASSERT (fnrows >= 0 && fncols >= 0) ; + + ASSERT (cdeg_in > 0) ; + nc = rdeg [IN][IN] - fncols ; + + thiscost = + /* each column in front (except pivot column) grows by nr_in: */ + (nr_in * (fncols - 1)) + + /* new columns not in old front: */ + (nc * (cdeg_in - 1)) ; + + /* no extra cost to relaxed amalgamation */ + + ASSERT (fnrows + nr_in == cdeg_in) ; + ASSERT (fncols + nc == rdeg [IN][IN]) ; + + /* size of relaxed front (after pivot row column removed): */ + fnrows_new [IN][IN] = (fnrows-1) + nr_in ; + fncols_new [IN][IN] = (fncols-1) + nc ; + /* relaxed_front = fnrows_new [IN][IN] * fncols_new [IN][IN] ; */ + + do_extend = TRUE ; + + DEBUG2 (("Evaluating option IN-IN:\n")) ; + DEBUG2 (("Work->fnzeros "ID" fnpiv "ID" nr_in "ID" nc "ID"\n", + Work->fnzeros, fnpiv, nr_in, nc)) ; + DEBUG2 (("fncols "ID" fnrows "ID"\n", fncols, fnrows)) ; + + /* determine if BLAS-3 update should be applied before extending. */ + /* update if too many zero entries accumulate in the LU block */ + fnzeros = Work->fnzeros + fnpiv * (nr_in + nc) ; + + DEBUG2 (("fnzeros "ID"\n", fnzeros)) ; + + new_LUsize = (fnpiv+1) * (fnrows + nr_in + fncols + nc) ; + + DEBUG2 (("new_LUsize "ID"\n", new_LUsize)) ; + + /* There are fnpiv pivots currently in the front. This one + * will be the (fnpiv+1)st pivot, if it is extended. */ + + /* RELAX2 parameter uses a double relop, but ignore NaN case: */ + do_update = fnpiv > 0 && + (((double) fnzeros) / ((double) new_LUsize)) > RELAX2 ; + + DEBUG2 (("do_update "ID"\n", do_update)) + + DEBUG2 (("option IN IN : nr "ID" nc "ID" cost "ID"(0) relax "ID + "\n", nr_in, nc, thiscost, do_extend)) ; + + /* this is the best option seen so far */ + Work->pivot_case = IN_IN ; + bestcost = thiscost ; + + /* do the amalgamation and extend the front */ + Work->do_extend = do_extend ; + Work->do_update = do_update ; + new_fnzeros = fnzeros ; + + } + + /* ------------------------------------------------------------------ */ + /* evaluate IN_OUT option */ + /* ------------------------------------------------------------------ */ + + if (pivrow [IN][OUT] != EMPTY) + { + /* The current front would become a Uson of the new front. + * Candidate pivot column is in the current front, but the + * candidate pivot row is not. */ + + ASSERT (fnrows >= 0 && fncols > 0) ; + ASSERT (cdeg_in > 0) ; + + /* must be at least one row outside the front */ + /* (the pivrow [IN][OUT] itself) */ + ASSERT (nr_in >= 1) ; + + /* count columns not in current front */ + nc = 0 ; +#ifndef NDEBUG + debug_ok = FALSE ; +#endif + for (i = 0 ; i < rdeg [IN][OUT] ; i++) + { + col = Wio [i] ; + DEBUG4 (("counting col "ID" Fcpos[] = "ID"\n", col, + Fcpos [col])) ; + ASSERT (col >= 0 && col < n_col && NON_PIVOTAL_COL (col)) ; + if (Fcpos [col] < 0) nc++ ; +#ifndef NDEBUG + /* we must see the pivot column somewhere */ + if (col == pivcol [IN]) + { + ASSERT (Fcpos [col] >= 0) ; + debug_ok = TRUE ; + } +#endif + } + ASSERT (debug_ok) ; + + thiscost = + /* each row in front grows by nc: */ + (nc * fnrows) + + /* new rows not affected by front: */ + ((nr_in-1) * (rdeg [IN][OUT]-1)) ; + + /* check the cost of relaxed IN_OUT amalgamation */ + + extra_cols = ((fncols-1) + nc ) - (rdeg [IN][OUT] - 1) ; + ASSERT (extra_cols >= 0) ; + ASSERT (fncols + nc == extra_cols + rdeg [IN][OUT]) ; + extra_zeros = (nr_in-1) * extra_cols ; /* symbolic fill-in */ + + ASSERT (fnrows + nr_in == cdeg_in) ; + ASSERT (fncols + nc == rdeg [IN][OUT] + extra_cols) ; + + /* size of relaxed front (after pivot column removed): */ + fnrows_new [IN][OUT] = fnrows + (nr_in-1) ; + fncols_new [IN][OUT] = (fncols-1) + nc ; + relaxed_front = fnrows_new [IN][OUT] * fncols_new [IN][OUT] ; + + /* do relaxed amalgamation if the extra zeros are no more */ + /* than a fraction (default 0.25) of the relaxed front */ + /* if relax = 0: no extra zeros allowed */ + /* if relax = +inf: always amalgamate */ + + /* relax parameter uses a double relop, but ignore NaN case: */ + if (extra_zeros == 0) + { + do_extend = TRUE ; + } + else + { + do_extend = ((double) extra_zeros) < + (relax1 * (double) relaxed_front) ; + } + + if (do_extend) + { + /* count the cost of relaxed amalgamation */ + thiscost += extra_zeros ; + + DEBUG2 (("Evaluating option IN-OUT:\n")) ; + DEBUG2 (("Work->fnzeros "ID" fnpiv "ID" nr_in "ID" nc "ID"\n", + Work->fnzeros, fnpiv, nr_in, nc)) ; + DEBUG2 (("fncols "ID" fnrows "ID"\n", fncols, fnrows)) ; + + /* determine if BLAS-3 update to be applied before extending. */ + /* update if too many zero entries accumulate in the LU block */ + fnzeros = Work->fnzeros + fnpiv * (nr_in + nc) ; + + DEBUG2 (("fnzeros "ID"\n", fnzeros)) ; + + new_LUsize = (fnpiv+1) * (fnrows + nr_in + fncols + nc) ; + + DEBUG2 (("new_LUsize "ID"\n", new_LUsize)) ; + + /* RELAX3 parameter uses a double relop, ignore NaN case: */ + do_update = fnpiv > 0 && + (((double) fnzeros) / ((double) new_LUsize)) > RELAX3 ; + DEBUG2 (("do_update "ID"\n", do_update)) + + } + else + { + /* the current front would not be extended */ + do_update = fnpiv > 0 ; + fnzeros = 0 ; + DEBUG2 (("IN-OUT do_update forced true: "ID"\n", do_update)) ; + + /* The new front would be just big enough to hold the new + * pivot row and column. */ + fnrows_new [IN][OUT] = cdeg_in - 1 ; + fncols_new [IN][OUT] = rdeg [IN][OUT] - 1 ; + + } + + DEBUG2 (("option IN OUT: nr "ID" nc "ID" cost "ID"("ID") relax "ID + "\n", nr_in, nc, thiscost, extra_zeros, do_extend)) ; + + if (bestcost == EMPTY || thiscost < bestcost) + { + /* this is the best option seen so far */ + Work->pivot_case = IN_OUT ; + bestcost = thiscost ; + Work->do_extend = do_extend ; + Work->do_update = do_update ; + new_fnzeros = fnzeros ; + } + } + } + + /* ---------------------------------------------------------------------- */ + /* construct candidate column not in front, and search for pivot rows */ + /* ---------------------------------------------------------------------- */ + + search_pivcol_out = (bestcost != 0 && pivcol [OUT] != EMPTY) ; + if (Symbolic->prefer_diagonal) + { + search_pivcol_out = search_pivcol_out && (pivrow [IN][IN] == EMPTY) ; + } + + if (search_pivcol_out) + { + +#ifndef NDEBUG + DEBUG2 (("out_col column "ID" NOT in front at position = "ID"\n", + pivcol [OUT], Fcpos [pivcol [OUT]])) ; + UMF_dump_rowcol (1, Numeric, Work, pivcol [OUT], !Symbolic->fixQ) ; + DEBUG2 (("fncols "ID" fncols_max "ID"\n", fncols, Work->fncols_max)) ; + ASSERT (fncols < Work->fncols_max) ; +#endif + + /* Use Wx as temporary workspace to construct the pivcol [OUT] */ + + + /* ------------------------------------------------------------------ */ + /* construct the candidate column (currently not in the front) */ + /* ------------------------------------------------------------------ */ + + /* Construct the column in Wx, Wm, using Wp for the positions: */ + /* Wm [0..cdeg_out-1] list of row indices in the column */ + /* Wx [0..cdeg_out-1] list of corresponding numerical values */ + /* Wp [0..n-1] starts as all negative, and ends that way too. */ + + cdeg_out = 0 ; + +#ifndef NDEBUG + /* check Wp */ + DEBUG4 (("COL ASSEMBLE: cdeg 0\nREDUCE COL out "ID"\n", pivcol [OUT])) ; + if (UMF_debug > 0 || MAX (n_row, n_col) < 1000) + { + for (i = 0 ; i < MAX (n_row, n_col) ; i++) + { + ASSERT (Wp [i] < 0) ; + } + } + DEBUG4 (("max_cdeg: "ID"\n", max_cdeg)) ; +#endif + + ASSERT (pivcol [OUT] >= 0 && pivcol [OUT] < n_col) ; + ASSERT (NON_PIVOTAL_COL (pivcol [OUT])) ; + + tpi = Col_tuples [pivcol [OUT]] ; + if (tpi) + { + tp = (Tuple *) (Memory + tpi) ; + tp1 = tp ; + tp2 = tp ; + tpend = tp + Col_tlen [pivcol [OUT]] ; + for ( ; tp < tpend ; tp++) + { + e = tp->e ; + ASSERT (e > 0 && e <= Work->nel) ; + if (!E [e]) continue ; /* element already deallocated */ + f = tp->f ; + p = Memory + E [e] ; + ep = (Element *) p ; + p += UNITS (Element, 1) ; + Cols = (Int *) p ; + if (Cols [f] == EMPTY) continue ; /* column already assembled */ + ASSERT (pivcol [OUT] == Cols [f]) ; + + Rows = Cols + ep->ncols ; + nrows = ep->nrows ; + p += UNITS (Int, ep->ncols + nrows) ; + C = ((Entry *) p) + f * nrows ; + + for (i = 0 ; i < nrows ; i++) + { + row = Rows [i] ; + if (row >= 0) /* skip this if already gone from element */ + { + ASSERT (row < n_row) ; + pos = Wp [row] ; + if (pos < 0) + { + /* new entry in the pattern - save Wp */ + ASSERT (cdeg_out < n_row) ; + if (cdeg_out >= max_cdeg) + { + /* :: pattern change (cdeg out failure) :: */ + DEBUGm4 (("cdeg out failure\n")) ; + return (UMFPACK_ERROR_different_pattern) ; + } + Wp [row] = cdeg_out ; + Wm [cdeg_out] = row ; + Wx [cdeg_out++] = C [i] ; + } + else + { + /* entry already in pattern - sum the values */ + /* Wx [pos] += C [i] ; */ + ASSEMBLE (Wx [pos], C [i]) ; + } + } + } + *tp2++ = *tp ; /* leave the tuple in the list */ + } + Col_tlen [pivcol [OUT]] = tp2 - tp1 ; + } + + /* ------------------------------------------------------------------ */ + +#ifndef NDEBUG + DEBUG4 (("Reduced column: cdeg out "ID"\n", cdeg_out)) ; + for (i = 0 ; i < cdeg_out ; i++) + { + DEBUG4 ((" "ID" "ID" "ID, i, Wm [i], Wp [Wm [i]])) ; + EDEBUG4 (Wx [i]) ; + DEBUG4 (("\n")) ; + ASSERT (i == Wp [Wm [i]]) ; + } +#endif + + /* ------------------------------------------------------------------ */ + /* new degree of pivcol [OUT] is cdeg_out */ + /* ------------------------------------------------------------------ */ + + /* search for two candidate pivot rows */ + status = UMF_row_search (Numeric, Work, Symbolic, + 0, cdeg_out, Wm, Wp, /* pattern of column to search */ + pivrow [OUT], rdeg [OUT], Woi, Woo, pivrow [IN], Wx, + pivcol [OUT], freebie) ; + + /* ------------------------------------------------------------------ */ + /* fatal error if matrix pattern has changed since symbolic analysis */ + /* ------------------------------------------------------------------ */ + + if (status == UMFPACK_ERROR_different_pattern) + { + /* :: pattern change detected in umf_local_search :: */ + return (UMFPACK_ERROR_different_pattern) ; + } + + /* ------------------------------------------------------------------ */ + /* Clear Wp */ + /* ------------------------------------------------------------------ */ + + for (i = 0 ; i < cdeg_out ; i++) + { + Wp [Wm [i]] = EMPTY ; /* clear Wp */ + } + + /* ------------------------------------------------------------------ */ + /* check for rectangular, singular matrix */ + /* ------------------------------------------------------------------ */ + + if (status == UMFPACK_WARNING_singular_matrix) + { + /* Pivot column is empty, and row-merge set is empty too. The + * matrix is structurally singular. The current frontal matrix must + * be empty, too. It it weren't, and pivcol [OUT] exists, then + * there would be at least one row that could be selected. Since + * the current front is empty, pivcol [IN] must also be EMPTY. + */ + + DEBUGm4 (("Note: pivcol [OUT]: "ID" discard\n", pivcol [OUT])) ; + ASSERT ((Work->fnrows == 0 && Work->fncols == 0)) ; + ASSERT (pivcol [IN] == EMPTY) ; + + /* remove the failed pivcol [OUT] from candidate set */ + ASSERT (pivcol [OUT] == Work->Candidates [jcand [OUT]]) ; + remove_candidate (jcand [OUT], Work, Symbolic) ; + Work->ndiscard++ ; + + /* delete all of the tuples, and all contributions to this column */ + DEBUG1 (("Prune tuples of dead outcol: "ID"\n", pivcol [OUT])) ; + Col_tlen [pivcol [OUT]] = 0 ; + UMF_mem_free_tail_block (Numeric, Col_tuples [pivcol [OUT]]) ; + Col_tuples [pivcol [OUT]] = 0 ; + + /* no pivot found at all */ + return (UMFPACK_WARNING_singular_matrix) ; + } + + /* ------------------------------------------------------------------ */ + + if (freebie [IN]) + { + /* the "in" row is the same as the "in" row for the "in" column */ + Woi = Fcols ; + rdeg [OUT][IN] = rdeg [IN][IN] ; + DEBUG4 (("Freebie in, row "ID"\n", pivrow [IN][IN])) ; + } + + if (freebie [OUT]) + { + /* the "out" row is the same as the "out" row for the "in" column */ + Woo = Wio ; + rdeg [OUT][OUT] = rdeg [IN][OUT] ; + DEBUG4 (("Freebie out, row "ID"\n", pivrow [IN][OUT])) ; + } + + /* ------------------------------------------------------------------ */ + /* evaluate OUT_IN option */ + /* ------------------------------------------------------------------ */ + + if (pivrow [OUT][IN] != EMPTY) + { + /* The current front would become an Lson of the new front. + * The candidate pivot row is in the current front, but the + * candidate pivot column is not. */ + + ASSERT (fnrows > 0 && fncols >= 0) ; + + did_rowmerge = (cdeg_out == 0) ; + if (did_rowmerge) + { + /* pivrow [OUT][IN] was found via row merge search */ + /* it is not (yet) in the pivot column pattern (add it now) */ + DEBUGm4 (("did row merge OUT col, IN row\n")) ; + Wm [0] = pivrow [OUT][IN] ; + CLEAR (Wx [0]) ; + cdeg_out = 1 ; + ASSERT (nr_out == EMPTY) ; + } + + nc = rdeg [OUT][IN] - fncols ; + ASSERT (nc >= 1) ; + + /* count rows not in current front */ + nr_out = 0 ; +#ifndef NDEBUG + debug_ok = FALSE ; +#endif + for (i = 0 ; i < cdeg_out ; i++) + { + row = Wm [i] ; + ASSERT (row >= 0 && row < n_row && NON_PIVOTAL_ROW (row)) ; + if (Frpos [row] < 0 || Frpos [row] >= fnrows) nr_out++ ; +#ifndef NDEBUG + /* we must see the pivot row somewhere */ + if (row == pivrow [OUT][IN]) + { + ASSERT (Frpos [row] >= 0) ; + debug_ok = TRUE ; + } +#endif + } + ASSERT (debug_ok) ; + + thiscost = + /* each column in front grows by nr_out: */ + (nr_out * fncols) + + /* new cols not affected by front: */ + ((nc-1) * (cdeg_out-1)) ; + + /* check the cost of relaxed OUT_IN amalgamation */ + + extra_rows = ((fnrows-1) + nr_out) - (cdeg_out - 1) ; + ASSERT (extra_rows >= 0) ; + ASSERT (fnrows + nr_out == extra_rows + cdeg_out) ; + extra_zeros = (nc-1) * extra_rows ; /* symbolic fill-in */ + + ASSERT (fnrows + nr_out == cdeg_out + extra_rows) ; + ASSERT (fncols + nc == rdeg [OUT][IN]) ; + + /* size of relaxed front (after pivot row removed): */ + fnrows_new [OUT][IN] = (fnrows-1) + nr_out ; + fncols_new [OUT][IN] = fncols + (nc-1) ; + relaxed_front = fnrows_new [OUT][IN] * fncols_new [OUT][IN] ; + + /* do relaxed amalgamation if the extra zeros are no more */ + /* than a fraction (default 0.25) of the relaxed front */ + /* if relax = 0: no extra zeros allowed */ + /* if relax = +inf: always amalgamate */ + if (did_rowmerge) + { + do_extend = FALSE ; + } + else + { + /* relax parameter uses a double relop, but ignore NaN case: */ + if (extra_zeros == 0) + { + do_extend = TRUE ; + } + else + { + do_extend = ((double) extra_zeros) < + (relax1 * (double) relaxed_front) ; + } + } + + if (do_extend) + { + /* count the cost of relaxed amalgamation */ + thiscost += extra_zeros ; + + DEBUG2 (("Evaluating option OUT-IN:\n")) ; + DEBUG2 ((" Work->fnzeros "ID" fnpiv "ID" nr_out "ID" nc "ID"\n", + Work->fnzeros, fnpiv, nr_out, nc)) ; + DEBUG2 (("fncols "ID" fnrows "ID"\n", fncols, fnrows)) ; + + /* determine if BLAS-3 update to be applied before extending. */ + /* update if too many zero entries accumulate in the LU block */ + fnzeros = Work->fnzeros + fnpiv * (nr_out + nc) ; + + DEBUG2 (("fnzeros "ID"\n", fnzeros)) ; + + new_LUsize = (fnpiv+1) * (fnrows + nr_out + fncols + nc) ; + + DEBUG2 (("new_LUsize "ID"\n", new_LUsize)) ; + + /* RELAX3 parameter uses a double relop, ignore NaN case: */ + do_update = fnpiv > 0 && + (((double) fnzeros) / ((double) new_LUsize)) > RELAX3 ; + DEBUG2 (("do_update "ID"\n", do_update)) + } + else + { + /* the current front would not be extended */ + do_update = fnpiv > 0 ; + fnzeros = 0 ; + DEBUG2 (("OUT-IN do_update forced true: "ID"\n", do_update)) ; + + /* The new front would be just big enough to hold the new + * pivot row and column. */ + fnrows_new [OUT][IN] = cdeg_out - 1 ; + fncols_new [OUT][IN] = rdeg [OUT][IN] - 1 ; + } + + DEBUG2 (("option OUT IN : nr "ID" nc "ID" cost "ID"("ID") relax "ID + "\n", nr_out, nc, thiscost, extra_zeros, do_extend)) ; + + if (bestcost == EMPTY || thiscost < bestcost) + { + /* this is the best option seen so far */ + Work->pivot_case = OUT_IN ; + bestcost = thiscost ; + Work->do_extend = do_extend ; + Work->do_update = do_update ; + new_fnzeros = fnzeros ; + } + } + + /* ------------------------------------------------------------------ */ + /* evaluate OUT_OUT option */ + /* ------------------------------------------------------------------ */ + + if (pivrow [OUT][OUT] != EMPTY) + { + /* Neither the candidate pivot row nor the candidate pivot column + * are in the current front. */ + + ASSERT (fnrows >= 0 && fncols >= 0) ; + + did_rowmerge = (cdeg_out == 0) ; + if (did_rowmerge) + { + /* pivrow [OUT][OUT] was found via row merge search */ + /* it is not (yet) in the pivot column pattern (add it now) */ + DEBUGm4 (("did row merge OUT col, OUT row\n")) ; + Wm [0] = pivrow [OUT][OUT] ; + CLEAR (Wx [0]) ; + cdeg_out = 1 ; + ASSERT (nr_out == EMPTY) ; + nr_out = 1 ; + } + + if (fnrows == 0 && fncols == 0) + { + /* the current front is completely empty */ + ASSERT (fnpiv == 0) ; + nc = rdeg [OUT][OUT] ; + extra_cols = 0 ; + nr_out = cdeg_out ; + extra_rows = 0 ; + extra_zeros = 0 ; + + thiscost = (nc-1) * (cdeg_out-1) ; /* new columns only */ + + /* size of new front: */ + fnrows_new [OUT][OUT] = nr_out-1 ; + fncols_new [OUT][OUT] = nc-1 ; + relaxed_front = fnrows_new [OUT][OUT] * fncols_new [OUT][OUT] ; + } + else + { + + /* count rows not in current front */ + if (nr_out == EMPTY) + { + nr_out = 0 ; +#ifndef NDEBUG + debug_ok = FALSE ; +#endif + for (i = 0 ; i < cdeg_out ; i++) + { + row = Wm [i] ; + ASSERT (row >= 0 && row < n_row) ; + ASSERT (NON_PIVOTAL_ROW (row)) ; + if (Frpos [row] < 0 || Frpos [row] >= fnrows) nr_out++ ; +#ifndef NDEBUG + /* we must see the pivot row somewhere */ + if (row == pivrow [OUT][OUT]) + { + ASSERT (Frpos [row] < 0 || Frpos [row] >= fnrows) ; + debug_ok = TRUE ; + } +#endif + } + ASSERT (debug_ok) ; + } + + /* count columns not in current front */ + nc = 0 ; +#ifndef NDEBUG + debug_ok = FALSE ; +#endif + for (i = 0 ; i < rdeg [OUT][OUT] ; i++) + { + col = Woo [i] ; + ASSERT (col >= 0 && col < n_col && NON_PIVOTAL_COL (col)) ; + if (Fcpos [col] < 0) nc++ ; +#ifndef NDEBUG + /* we must see the pivot column somewhere */ + if (col == pivcol [OUT]) + { + ASSERT (Fcpos [col] < 0) ; + debug_ok = TRUE ; + } +#endif + } + ASSERT (debug_ok) ; + + extra_cols = (fncols + (nc-1)) - (rdeg [OUT][OUT] - 1) ; + extra_rows = (fnrows + (nr_out-1)) - (cdeg_out - 1) ; + ASSERT (extra_rows >= 0) ; + ASSERT (extra_cols >= 0) ; + extra_zeros = ((nc-1) * extra_rows) + ((nr_out-1) * extra_cols); + + ASSERT (fnrows + nr_out == cdeg_out + extra_rows) ; + ASSERT (fncols + nc == rdeg [OUT][OUT] + extra_cols) ; + + thiscost = + /* new columns: */ + ((nc-1) * (cdeg_out-1)) + + /* old columns in front grow by nr_out-1: */ + ((nr_out-1) * (fncols - extra_cols)) ; + + /* size of relaxed front: */ + fnrows_new [OUT][OUT] = fnrows + (nr_out-1) ; + fncols_new [OUT][OUT] = fncols + (nc-1) ; + relaxed_front = fnrows_new [OUT][OUT] * fncols_new [OUT][OUT] ; + + } + + /* do relaxed amalgamation if the extra zeros are no more */ + /* than a fraction (default 0.25) of the relaxed front */ + /* if relax = 0: no extra zeros allowed */ + /* if relax = +inf: always amalgamate */ + if (did_rowmerge) + { + do_extend = FALSE ; + } + else + { + /* relax parameter uses a double relop, but ignore NaN case: */ + if (extra_zeros == 0) + { + do_extend = TRUE ; + } + else + { + do_extend = ((double) extra_zeros) < + (relax1 * (double) relaxed_front) ; + } + } + + if (do_extend) + { + /* count the cost of relaxed amalgamation */ + thiscost += extra_zeros ; + + DEBUG2 (("Evaluating option OUT-OUT:\n")) ; + DEBUG2 (("Work->fnzeros "ID" fnpiv "ID" nr_out "ID" nc "ID"\n", + Work->fnzeros, fnpiv, nr_out, nc)) ; + DEBUG2 (("fncols "ID" fnrows "ID"\n", fncols, fnrows)) ; + + /* determine if BLAS-3 update to be applied before extending. */ + /* update if too many zero entries accumulate in the LU block */ + fnzeros = Work->fnzeros + fnpiv * (nr_out + nc) ; + + DEBUG2 (("fnzeros "ID"\n", fnzeros)) ; + + new_LUsize = (fnpiv+1) * (fnrows + nr_out + fncols + nc) ; + + DEBUG2 (("new_LUsize "ID"\n", new_LUsize)) ; + + /* RELAX3 parameter uses a double relop, ignore NaN case: */ + do_update = fnpiv > 0 && + (((double) fnzeros) / ((double) new_LUsize)) > RELAX3 ; + DEBUG2 (("do_update "ID"\n", do_update)) + } + else + { + /* the current front would not be extended */ + do_update = fnpiv > 0 ; + fnzeros = 0 ; + DEBUG2 (("OUT-OUT do_update forced true: "ID"\n", do_update)) ; + + /* The new front would be just big enough to hold the new + * pivot row and column. */ + fnrows_new [OUT][OUT] = cdeg_out - 1 ; + fncols_new [OUT][OUT] = rdeg [OUT][OUT] - 1 ; + } + + DEBUG2 (("option OUT OUT: nr "ID" nc "ID" cost "ID"\n", + rdeg [OUT][OUT], cdeg_out, thiscost)) ; + + if (bestcost == EMPTY || thiscost < bestcost) + { + /* this is the best option seen so far */ + Work->pivot_case = OUT_OUT ; + bestcost = thiscost ; + Work->do_extend = do_extend ; + Work->do_update = do_update ; + new_fnzeros = fnzeros ; + } + } + } + + /* At this point, a structural pivot has been found. */ + /* It may be numerically zero, however. */ + ASSERT (Work->pivot_case != EMPTY) ; + DEBUG2 (("local search, best option "ID", best cost "ID"\n", + Work->pivot_case, bestcost)) ; + + /* ====================================================================== */ + /* Pivot row and column, and extension, now determined */ + /* ====================================================================== */ + + Work->fnzeros = new_fnzeros ; + + /* ---------------------------------------------------------------------- */ + /* finalize the pivot row and column */ + /* ---------------------------------------------------------------------- */ + + switch (Work->pivot_case) + { + case IN_IN: + DEBUG2 (("IN-IN option selected\n")) ; + ASSERT (fnrows > 0 && fncols > 0) ; + Work->pivcol_in_front = TRUE ; + Work->pivrow_in_front = TRUE ; + Work->pivcol = pivcol [IN] ; + Work->pivrow = pivrow [IN][IN] ; + Work->ccdeg = nr_in ; + Work->Wrow = Fcols ; + Work->rrdeg = rdeg [IN][IN] ; + jj = jcand [IN] ; + Work->fnrows_new = fnrows_new [IN][IN] ; + Work->fncols_new = fncols_new [IN][IN] ; + break ; + + case IN_OUT: + DEBUG2 (("IN-OUT option selected\n")) ; + ASSERT (fnrows >= 0 && fncols > 0) ; + Work->pivcol_in_front = TRUE ; + Work->pivrow_in_front = FALSE ; + Work->pivcol = pivcol [IN] ; + Work->pivrow = pivrow [IN][OUT] ; + Work->ccdeg = nr_in ; + Work->Wrow = Wio ; + Work->rrdeg = rdeg [IN][OUT] ; + jj = jcand [IN] ; + Work->fnrows_new = fnrows_new [IN][OUT] ; + Work->fncols_new = fncols_new [IN][OUT] ; + break ; + + case OUT_IN: + DEBUG2 (("OUT-IN option selected\n")) ; + ASSERT (fnrows > 0 && fncols >= 0) ; + Work->pivcol_in_front = FALSE ; + Work->pivrow_in_front = TRUE ; + Work->pivcol = pivcol [OUT] ; + Work->pivrow = pivrow [OUT][IN] ; + Work->ccdeg = cdeg_out ; + /* Wrow might be equivalenced to Fcols (Freebie in): */ + Work->Wrow = Woi ; + Work->rrdeg = rdeg [OUT][IN] ; + /* Work->Wrow[0..fncols-1] is not there. See Fcols instead */ + jj = jcand [OUT] ; + Work->fnrows_new = fnrows_new [OUT][IN] ; + Work->fncols_new = fncols_new [OUT][IN] ; + break ; + + case OUT_OUT: + DEBUG2 (("OUT-OUT option selected\n")) ; + ASSERT (fnrows >= 0 && fncols >= 0) ; + Work->pivcol_in_front = FALSE ; + Work->pivrow_in_front = FALSE ; + Work->pivcol = pivcol [OUT] ; + Work->pivrow = pivrow [OUT][OUT] ; + Work->ccdeg = cdeg_out ; + /* Wrow might be equivalenced to Wio (Freebie out): */ + Work->Wrow = Woo ; + Work->rrdeg = rdeg [OUT][OUT] ; + jj = jcand [OUT] ; + Work->fnrows_new = fnrows_new [OUT][OUT] ; + Work->fncols_new = fncols_new [OUT][OUT] ; + break ; + + } + + ASSERT (IMPLIES (fnrows == 0 && fncols == 0, Work->pivot_case == OUT_OUT)) ; + + if (!Work->pivcol_in_front && pivcol [IN] != EMPTY) + { + /* clear Frpos if pivcol [IN] was searched, but not selected */ + for (i = fnrows ; i < cdeg_in ; i++) + { + Frpos [Frows [i]] = EMPTY; + } + } + + /* ---------------------------------------------------------------------- */ + /* Pivot row and column have been found */ + /* ---------------------------------------------------------------------- */ + + /* ---------------------------------------------------------------------- */ + /* remove pivot column from candidate pivot column set */ + /* ---------------------------------------------------------------------- */ + + ASSERT (jj >= 0 && jj < Work->nCandidates) ; + ASSERT (Work->pivcol == Work->Candidates [jj]) ; + remove_candidate (jj, Work, Symbolic) ; + + /* ---------------------------------------------------------------------- */ + /* check for frontal matrix growth */ + /* ---------------------------------------------------------------------- */ + + DEBUG1 (("Check frontal growth:\n")) ; + DEBUG1 (("fnrows_new "ID" + 1 = "ID", fnr_curr "ID"\n", + Work->fnrows_new, Work->fnrows_new + 1, fnr_curr)) ; + DEBUG1 (("fncols_new "ID" + 1 = "ID", fnc_curr "ID"\n", + Work->fncols_new, Work->fncols_new + 1, fnc_curr)) ; + + Work->do_grow = (Work->fnrows_new + 1 > fnr_curr + || Work->fncols_new + 1 > fnc_curr) ; + if (Work->do_grow) + { + DEBUG0 (("\nNeed to grow frontal matrix, force do_update true\n")) ; + /* If the front must grow, then apply the pending updates and remove + * the current pivot rows/columns from the front prior to growing the + * front. This frees up as much space as possible for the new front. */ + if (!Work->do_update && fnpiv > 0) + { + /* This update would not have to be done if the current front + * was big enough. */ + Work->nforced++ ; + Work->do_update = TRUE ; + } + } + + /* ---------------------------------------------------------------------- */ + /* current pivot column */ + /* ---------------------------------------------------------------------- */ + + /* + c1) If pivot column index is in the current front: + + The pivot column pattern is in Frows [0 .. fnrows-1] and + the extension is in Frows [fnrows ... fnrows+ccdeg-1]. + + Frpos [Frows [0 .. fnrows+ccdeg-1]] is + equal to 0 .. fnrows+ccdeg-1. Wm is not needed. + + The values are in Wy [0 .. fnrows+ccdeg-1]. + + c2) Otherwise, if the pivot column index is not in the current front: + + c2a) If the front is being extended, old row indices in the the + pivot column pattern are in Frows [0 .. fnrows-1]. + + All entries are in Wm [0 ... ccdeg-1], with values in + Wx [0 .. ccdeg-1]. These may include entries already in + Frows [0 .. fnrows-1]. + + Frpos [Frows [0 .. fnrows-1]] is equal to 0 .. fnrows-1. + Frpos [Wm [0 .. ccdeg-1]] for new entries is < 0. + + c2b) If the front is not being extended, then the entire pivot + column pattern is in Wm [0 .. ccdeg-1]. It includes + the pivot row index. It is does not contain the pattern + Frows [0..fnrows-1]. The intersection of these two + sets may or may not be empty. The values are in Wx [0..ccdeg-1] + + In both cases c1 and c2, Frpos [Frows [0 .. fnrows-1]] is equal + to 0 .. fnrows-1, which is the pattern of the current front. + Any entry of Frpos that is not specified above is < 0. + */ + + +#ifndef NDEBUG + DEBUG2 (("\n\nSEARCH DONE: Pivot col "ID" in: ("ID") pivot row "ID" in: ("ID + ") extend: "ID"\n\n", Work->pivcol, Work->pivcol_in_front, + Work->pivrow, Work->pivrow_in_front, Work->do_extend)) ; + UMF_dump_rowcol (1, Numeric, Work, Work->pivcol, !Symbolic->fixQ) ; + DEBUG2 (("Pivot col "ID": fnrows "ID" ccdeg "ID"\n", Work->pivcol, fnrows, + Work->ccdeg)) ; + if (Work->pivcol_in_front) /* case c1 */ + { + Int found = FALSE ; + DEBUG3 (("Pivcol in front\n")) ; + for (i = 0 ; i < fnrows ; i++) + { + row = Frows [i] ; + DEBUG3 ((ID": row:: "ID" in front ", i, row)) ; + ASSERT (row >= 0 && row < n_row && NON_PIVOTAL_ROW (row)) ; + ASSERT (Frpos [row] == i) ; + EDEBUG3 (Wy [i]) ; + if (row == Work->pivrow) + { + DEBUG3 ((" <- pivrow")) ; + found = TRUE ; + } + DEBUG3 (("\n")) ; + } + ASSERT (found == Work->pivrow_in_front) ; + found = FALSE ; + for (i = fnrows ; i < fnrows + Work->ccdeg ; i++) + { + row = Frows [i] ; + DEBUG3 ((ID": row:: "ID" (new)", i, row)) ; + ASSERT (row >= 0 && row < n_row && NON_PIVOTAL_ROW (row)) ; + ASSERT (Frpos [row] == i) ; + EDEBUG3 (Wy [i]) ; + if (row == Work->pivrow) + { + DEBUG3 ((" <- pivrow")) ; + found = TRUE ; + } + DEBUG3 (("\n")) ; + } + ASSERT (found == !Work->pivrow_in_front) ; + } + else + { + if (Work->do_extend) + { + Int found = FALSE ; + DEBUG3 (("Pivcol not in front (extend)\n")) ; + for (i = 0 ; i < fnrows ; i++) + { + row = Frows [i] ; + DEBUG3 ((ID": row:: "ID" in front ", i, row)) ; + ASSERT (row >= 0 && row < n_row && NON_PIVOTAL_ROW (row)) ; + ASSERT (Frpos [row] == i) ; + if (row == Work->pivrow) + { + DEBUG3 ((" <- pivrow")) ; + found = TRUE ; + } + DEBUG3 (("\n")) ; + } + ASSERT (found == Work->pivrow_in_front) ; + found = FALSE ; + DEBUG3 (("----\n")) ; + for (i = 0 ; i < Work->ccdeg ; i++) + { + row = Wm [i] ; + ASSERT (row >= 0 && row < n_row && NON_PIVOTAL_ROW (row)) ; + DEBUG3 ((ID": row:: "ID" ", i, row)) ; + EDEBUG3 (Wx [i]) ; + if (Frpos [row] < 0) + { + DEBUG3 ((" (new) ")) ; + } + if (row == Work->pivrow) + { + DEBUG3 ((" <- pivrow")) ; + found = TRUE ; + /* ... */ + if (Work->pivrow_in_front) ASSERT (Frpos [row] >= 0) ; + else ASSERT (Frpos [row] < 0) ; + } + DEBUG3 (("\n")) ; + } + ASSERT (found) ; + } + else + { + Int found = FALSE ; + DEBUG3 (("Pivcol not in front (no extend)\n")) ; + for (i = 0 ; i < Work->ccdeg ; i++) + { + row = Wm [i] ; + ASSERT (row >= 0 && row < n_row && NON_PIVOTAL_ROW (row)) ; + DEBUG3 ((ID": row:: "ID" ", i, row)) ; + EDEBUG3 (Wx [i]) ; + DEBUG3 ((" (new) ")) ; + if (row == Work->pivrow) + { + DEBUG3 ((" <- pivrow")) ; + found = TRUE ; + } + DEBUG3 (("\n")) ; + } + ASSERT (found) ; + } + } +#endif + + /* ---------------------------------------------------------------------- */ + /* current pivot row */ + /* ---------------------------------------------------------------------- */ + + /* + r1) If the pivot row index is in the current front: + + The pivot row pattern is in Fcols [0..fncols-1] and the extenson is + in Wrow [fncols .. rrdeg-1]. If the pivot column is in the current + front, then Fcols and Wrow are equivalenced. + + r2) If the pivot row index is not in the current front: + + r2a) If the front is being extended, the pivot row pattern is in + Fcols [0 .. fncols-1]. New entries are in Wrow [0 .. rrdeg-1], + but these may include entries already in Fcols [0 .. fncols-1]. + + r2b) Otherwise, the pivot row pattern is Wrow [0 .. rrdeg-1]. + + Fcpos [Fcols [0..fncols-1]] is (0..fncols-1) * fnr_curr. + All other entries in Fcpos are < 0. + + These conditions are asserted below. + + ------------------------------------------------------------------------ + Other items in Work structure that are relevant: + + pivcol: the pivot column index + pivrow: the pivot column index + + rrdeg: + ccdeg: + + fnrows: the number of rows in the currnt contribution block + fncols: the number of columns in the current contribution block + + fnrows_new: the number of rows in the new contribution block + fncols_new: the number of rows in the new contribution block + + ------------------------------------------------------------------------ + */ + + +#ifndef NDEBUG + UMF_dump_rowcol (0, Numeric, Work, Work->pivrow, TRUE) ; + DEBUG2 (("Pivot row "ID":\n", Work->pivrow)) ; + if (Work->pivrow_in_front) + { + Int found = FALSE ; + for (i = 0 ; i < fncols ; i++) + { + col = Fcols [i] ; + DEBUG3 ((" col:: "ID" in front\n", col)) ; + ASSERT (col >= 0 && col < n_col && NON_PIVOTAL_COL (col)) ; + ASSERT (Fcpos [col] == i * fnr_curr) ; + if (col == Work->pivcol) found = TRUE ; + } + ASSERT (found == Work->pivcol_in_front) ; + found = FALSE ; + ASSERT (IMPLIES (Work->pivcol_in_front, Fcols == Work->Wrow)) ; + for (i = fncols ; i < Work->rrdeg ; i++) + { + col = Work->Wrow [i] ; + ASSERT (col >= 0 && col < n_col && NON_PIVOTAL_COL (col)) ; + ASSERT (Fcpos [col] < 0) ; + if (col == Work->pivcol) found = TRUE ; + else DEBUG3 ((" col:: "ID" (new)\n", col)) ; + } + ASSERT (found == !Work->pivcol_in_front) ; + } + else + { + if (Work->do_extend) + { + Int found = FALSE ; + for (i = 0 ; i < fncols ; i++) + { + col = Fcols [i] ; + DEBUG3 ((" col:: "ID" in front\n", col)) ; + ASSERT (col >= 0 && col < n_col && NON_PIVOTAL_COL (col)) ; + ASSERT (Fcpos [col] == i * fnr_curr) ; + if (col == Work->pivcol) found = TRUE ; + } + ASSERT (found == Work->pivcol_in_front) ; + found = FALSE ; + for (i = 0 ; i < Work->rrdeg ; i++) + { + col = Work->Wrow [i] ; + ASSERT (col >= 0 && col < n_col && NON_PIVOTAL_COL (col)) ; + if (Fcpos [col] >= 0) continue ; + if (col == Work->pivcol) found = TRUE ; + else DEBUG3 ((" col:: "ID" (new, extend)\n", col)) ; + } + ASSERT (found == !Work->pivcol_in_front) ; + } + else + { + Int found = FALSE ; + for (i = 0 ; i < Work->rrdeg ; i++) + { + col = Work->Wrow [i] ; + ASSERT (col >= 0 && col < n_col && NON_PIVOTAL_COL (col)) ; + if (col == Work->pivcol) found = TRUE ; + else DEBUG3 ((" col:: "ID" (all new)\n", col)) ; + } + ASSERT (found) ; + } + } +#endif + + /* ---------------------------------------------------------------------- */ + /* determine whether to do scan2-row and scan2-col */ + /* ---------------------------------------------------------------------- */ + + if (Work->do_extend) + { + Work->do_scan2row = (fncols > 0) ; + Work->do_scan2col = (fnrows > 0) ; + } + else + { + Work->do_scan2row = (fncols > 0) && Work->pivrow_in_front ; + Work->do_scan2col = (fnrows > 0) && Work->pivcol_in_front ; + } + + /* ---------------------------------------------------------------------- */ + + DEBUG2 (("LOCAL SEARCH DONE: pivot column "ID" pivot row: "ID"\n", + Work->pivcol, Work->pivrow)) ; + DEBUG2 (("do_extend: "ID"\n", Work->do_extend)) ; + DEBUG2 (("do_update: "ID"\n", Work->do_update)) ; + DEBUG2 (("do_grow: "ID"\n", Work->do_grow)) ; + + /* ---------------------------------------------------------------------- */ + /* keep track of the diagonal */ + /* ---------------------------------------------------------------------- */ + + if (Symbolic->prefer_diagonal + && Work->pivcol < Work->n_col - Symbolic->nempty_col) + { + Diagonal_map = Work->Diagonal_map ; + Diagonal_imap = Work->Diagonal_imap ; + ASSERT (Diagonal_map != (Int *) NULL) ; + ASSERT (Diagonal_imap != (Int *) NULL) ; + + row2 = Diagonal_map [Work->pivcol] ; + col2 = Diagonal_imap [Work->pivrow] ; + + if (row2 < 0) + { + /* this was an off-diagonal pivot row */ + Work->noff_diagonal++ ; + row2 = UNFLIP (row2) ; + } + + ASSERT (Diagonal_imap [row2] == Work->pivcol) ; + ASSERT (UNFLIP (Diagonal_map [col2]) == Work->pivrow) ; + + if (row2 != Work->pivrow) + { + /* swap the diagonal map to attempt to maintain symmetry later on. + * Also mark the map for col2 (via FLIP) to denote that the entry + * now on the diagonal is not the original entry on the diagonal. */ + + DEBUG0 (("Unsymmetric pivot\n")) ; + Diagonal_map [Work->pivcol] = FLIP (Work->pivrow) ; + Diagonal_imap [Work->pivrow] = Work->pivcol ; + + Diagonal_map [col2] = FLIP (row2) ; + Diagonal_imap [row2] = col2 ; + + } + ASSERT (n_row == n_col) ; +#ifndef NDEBUG + UMF_dump_diagonal_map (Diagonal_map, Diagonal_imap, Symbolic->n1, + Symbolic->n_col, Symbolic->nempty_col) ; +#endif + } + + return (UMFPACK_OK) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_local_search.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_local_search.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,12 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL Int UMF_local_search +( + NumericType *Numeric, + WorkType *Work, + SymbolicType *Symbolic +) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_lsolve.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_lsolve.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,151 @@ +/* ========================================================================== */ +/* === UMF_lsolve =========================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* solves Lx = b, where L is the lower triangular factor of a matrix */ +/* B is overwritten with the solution X. */ +/* Returns the floating point operation count */ + +#include "umf_internal.h" + +GLOBAL double UMF_lsolve +( + NumericType *Numeric, + Entry X [ ], /* b on input, solution x on output */ + Int Pattern [ ] /* a work array of size n */ +) +{ + Entry xk ; + Entry *xp, *Lval ; + Int k, deg, *ip, j, row, *Lpos, *Lilen, *Lip, llen, lp, newLchain, + pos, npiv, n1, *Li ; + + /* ---------------------------------------------------------------------- */ + + if (Numeric->n_row != Numeric->n_col) return (0.) ; + npiv = Numeric->npiv ; + Lpos = Numeric->Lpos ; + Lilen = Numeric->Lilen ; + Lip = Numeric->Lip ; + n1 = Numeric->n1 ; + +#ifndef NDEBUG + DEBUG4 (("Lsolve start:\n")) ; + for (j = 0 ; j < Numeric->n_row ; j++) + { + DEBUG4 (("Lsolve start "ID": ", j)) ; + EDEBUG4 (X [j]) ; + DEBUG4 (("\n")) ; + } +#endif + + /* ---------------------------------------------------------------------- */ + /* singletons */ + /* ---------------------------------------------------------------------- */ + + for (k = 0 ; k < n1 ; k++) + { + DEBUG4 (("Singleton k "ID"\n", k)) ; + xk = X [k] ; + deg = Lilen [k] ; + if (deg > 0 && IS_NONZERO (xk)) + { + lp = Lip [k] ; + Li = (Int *) (Numeric->Memory + lp) ; + lp += UNITS (Int, deg) ; + Lval = (Entry *) (Numeric->Memory + lp) ; + for (j = 0 ; j < deg ; j++) + { + DEBUG4 ((" row "ID" k "ID" value", Li [j], k)) ; + EDEBUG4 (Lval [j]) ; + DEBUG4 (("\n")) ; + /* X [Li [j]] -= xk * Lval [j] ; */ + MULT_SUB (X [Li [j]], xk, Lval [j]) ; + } + } + } + + /* ---------------------------------------------------------------------- */ + /* rest of L */ + /* ---------------------------------------------------------------------- */ + + deg = 0 ; + + for (k = n1 ; k < npiv ; k++) + { + + /* ------------------------------------------------------------------ */ + /* make column of L in Pattern [0..deg-1] */ + /* ------------------------------------------------------------------ */ + + lp = Lip [k] ; + newLchain = (lp < 0) ; + if (newLchain) + { + lp = -lp ; + deg = 0 ; + DEBUG4 (("start of chain for column of L\n")) ; + } + + /* remove pivot row */ + pos = Lpos [k] ; + if (pos != EMPTY) + { + DEBUG4 ((" k "ID" removing row "ID" at position "ID"\n", + k, Pattern [pos], pos)) ; + ASSERT (!newLchain) ; + ASSERT (deg > 0) ; + ASSERT (pos >= 0 && pos < deg) ; + ASSERT (Pattern [pos] == k) ; + Pattern [pos] = Pattern [--deg] ; + } + + /* concatenate the pattern */ + ip = (Int *) (Numeric->Memory + lp) ; + llen = Lilen [k] ; + for (j = 0 ; j < llen ; j++) + { + row = *ip++ ; + DEBUG4 ((" row "ID" k "ID"\n", row, k)) ; + ASSERT (row > k) ; + Pattern [deg++] = row ; + } + + /* ------------------------------------------------------------------ */ + /* use column k of L */ + /* ------------------------------------------------------------------ */ + + xk = X [k] ; + if (IS_NONZERO (xk)) + { + xp = (Entry *) (Numeric->Memory + lp + UNITS (Int, llen)) ; + for (j = 0 ; j < deg ; j++) + { + DEBUG4 ((" row "ID" k "ID" value", Pattern [j], k)) ; + EDEBUG4 (*xp) ; + DEBUG4 (("\n")) ; + /* X [Pattern [j]] -= xk * (*xp) ; */ + MULT_SUB (X [Pattern [j]], xk, *xp) ; + xp++ ; + } + } + } + +#ifndef NDEBUG + for (j = 0 ; j < Numeric->n_row ; j++) + { + DEBUG4 (("Lsolve done "ID": ", j)) ; + EDEBUG4 (X [j]) ; + DEBUG4 (("\n")) ; + } + DEBUG4 (("Lsolve done.\n")) ; +#endif + + return (MULTSUB_FLOPS * ((double) Numeric->lnz)) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_lsolve.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_lsolve.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,12 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL double UMF_lsolve +( + NumericType *Numeric, + Entry X [ ], + Int Pattern [ ] +) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_ltsolve.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_ltsolve.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,225 @@ +/* ========================================================================== */ +/* === UMF_ltsolve ========================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* Solves L'x = b or L.'x=b, where L is the lower triangular factor of a */ +/* matrix. B is overwritten with the solution X. */ +/* Returns the floating point operation count */ + +#include "umf_internal.h" + +GLOBAL double +#ifdef CONJUGATE_SOLVE +UMF_lhsolve /* solve L'x=b (complex conjugate transpose) */ +#else +UMF_ltsolve /* solve L.'x=b (array transpose) */ +#endif +( + NumericType *Numeric, + Entry X [ ], /* b on input, solution x on output */ + Int Pattern [ ] /* a work array of size n */ +) +{ + Entry xk ; + Entry *xp, *Lval ; + Int k, deg, *ip, j, row, *Lpos, *Lilen, kstart, kend, *Lip, llen, + lp, pos, npiv, n1, *Li ; + + /* ---------------------------------------------------------------------- */ + + if (Numeric->n_row != Numeric->n_col) return (0.) ; + npiv = Numeric->npiv ; + Lpos = Numeric->Lpos ; + Lilen = Numeric->Lilen ; + Lip = Numeric->Lip ; + kstart = npiv ; + n1 = Numeric->n1 ; + +#ifndef NDEBUG + DEBUG4 (("Ltsolve start:\n")) ; + for (j = 0 ; j < Numeric->n_row ; j++) + { + DEBUG4 (("Ltsolve start "ID": ", j)) ; + EDEBUG4 (X [j]) ; + DEBUG4 (("\n")) ; + } +#endif + + /* ---------------------------------------------------------------------- */ + /* non-singletons */ + /* ---------------------------------------------------------------------- */ + + for (kend = npiv-1 ; kend >= n1 ; kend = kstart-1) + { + + /* ------------------------------------------------------------------ */ + /* find the start of this Lchain */ + /* ------------------------------------------------------------------ */ + + /* for (kstart = kend ; kstart >= 0 && Lip [kstart] > 0 ; kstart--) ; */ + kstart = kend ; + while (kstart >= 0 && Lip [kstart] > 0) + { + kstart-- ; + } + + /* the Lchain goes from kstart to kend */ + + /* ------------------------------------------------------------------ */ + /* scan the whole chain to find the pattern of the last column of L */ + /* ------------------------------------------------------------------ */ + + deg = 0 ; + DEBUG4 (("start of chain for column of L\n")) ; + for (k = kstart ; k <= kend ; k++) + { + ASSERT (k >= 0 && k < npiv) ; + + /* -------------------------------------------------------------- */ + /* make column k of L in Pattern [0..deg-1] */ + /* -------------------------------------------------------------- */ + + /* remove pivot row */ + pos = Lpos [k] ; + if (pos != EMPTY) + { + DEBUG4 ((" k "ID" removing row "ID" at position "ID"\n", + k, Pattern [pos], pos)) ; + ASSERT (k != kstart) ; + ASSERT (deg > 0) ; + ASSERT (pos >= 0 && pos < deg) ; + ASSERT (Pattern [pos] == k) ; + Pattern [pos] = Pattern [--deg] ; + } + + /* concatenate the pattern */ + lp = Lip [k] ; + if (k == kstart) + { + lp = -lp ; + } + ASSERT (lp > 0) ; + ip = (Int *) (Numeric->Memory + lp) ; + llen = Lilen [k] ; + for (j = 0 ; j < llen ; j++) + { + row = *ip++ ; + DEBUG4 ((" row "ID" k "ID"\n", row, k)) ; + ASSERT (row > k) ; + Pattern [deg++] = row ; + } + + } + /* Pattern [0..deg-1] is now the pattern of column kend */ + + /* ------------------------------------------------------------------ */ + /* solve using this chain, in reverse order */ + /* ------------------------------------------------------------------ */ + + DEBUG4 (("Unwinding Lchain\n")) ; + for (k = kend ; k >= kstart ; k--) + { + + /* -------------------------------------------------------------- */ + /* use column k of L */ + /* -------------------------------------------------------------- */ + + ASSERT (k >= 0 && k < npiv) ; + lp = Lip [k] ; + if (k == kstart) + { + lp = -lp ; + } + ASSERT (lp > 0) ; + llen = Lilen [k] ; + xp = (Entry *) (Numeric->Memory + lp + UNITS (Int, llen)) ; + xk = X [k] ; + for (j = 0 ; j < deg ; j++) + { + DEBUG4 ((" row "ID" k "ID" value", Pattern [j], k)) ; + EDEBUG4 (*xp) ; + DEBUG4 (("\n")) ; + +#ifdef CONJUGATE_SOLVE + /* xk -= X [Pattern [j]] * conjugate (*xp) ; */ + MULT_SUB_CONJ (xk, X [Pattern [j]], *xp) ; +#else + /* xk -= X [Pattern [j]] * (*xp) ; */ + MULT_SUB (xk, X [Pattern [j]], *xp) ; +#endif + + xp++ ; + } + X [k] = xk ; + + /* -------------------------------------------------------------- */ + /* construct column k-1 of L */ + /* -------------------------------------------------------------- */ + + /* un-concatenate the pattern */ + deg -= llen ; + + /* add pivot row */ + pos = Lpos [k] ; + if (pos != EMPTY) + { + DEBUG4 ((" k "ID" adding row "ID" at position "ID"\n", + k, k, pos)) ; + ASSERT (k != kstart) ; + ASSERT (pos >= 0 && pos <= deg) ; + Pattern [deg++] = Pattern [pos] ; + Pattern [pos] = k ; + } + } + } + + /* ---------------------------------------------------------------------- */ + /* singletons */ + /* ---------------------------------------------------------------------- */ + + for (k = n1 - 1 ; k >= 0 ; k--) + { + DEBUG4 (("Singleton k "ID"\n", k)) ; + deg = Lilen [k] ; + if (deg > 0) + { + xk = X [k] ; + lp = Lip [k] ; + Li = (Int *) (Numeric->Memory + lp) ; + lp += UNITS (Int, deg) ; + Lval = (Entry *) (Numeric->Memory + lp) ; + for (j = 0 ; j < deg ; j++) + { + DEBUG4 ((" row "ID" k "ID" value", Li [j], k)) ; + EDEBUG4 (Lval [j]) ; + DEBUG4 (("\n")) ; +#ifdef CONJUGATE_SOLVE + /* xk -= X [Li [j]] * conjugate (Lval [j]) ; */ + MULT_SUB_CONJ (xk, X [Li [j]], Lval [j]) ; +#else + /* xk -= X [Li [j]] * Lval [j] ; */ + MULT_SUB (xk, X [Li [j]], Lval [j]) ; +#endif + } + X [k] = xk ; + } + } + +#ifndef NDEBUG + for (j = 0 ; j < Numeric->n_row ; j++) + { + DEBUG4 (("Ltsolve done "ID": ", j)) ; + EDEBUG4 (X [j]) ; + DEBUG4 (("\n")) ; + } + DEBUG4 (("Ltsolve done.\n")) ; +#endif + + return (MULTSUB_FLOPS * ((double) Numeric->lnz)) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_ltsolve.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_ltsolve.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,19 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL double UMF_ltsolve +( + NumericType *Numeric, + Entry X [ ], + Int Pattern [ ] +) ; + +GLOBAL double UMF_lhsolve +( + NumericType *Numeric, + Entry X [ ], + Int Pattern [ ] +) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_malloc.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_malloc.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,91 @@ +/* ========================================================================== */ +/* === UMF_malloc =========================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + Allocate a block of n objects, each of a given size. This routine does not + handle the case when the size is 1 (allocating char's) because of potential + integer overflow. UMFPACK never does that. + Also maintains the UMFPACK malloc count. +*/ + +#include "umf_internal.h" + +#if defined (UMF_MALLOC_COUNT) || !defined (NDEBUG) + +/* + UMF_malloc_count is a count of the objects malloc'd by UMFPACK. If you + suspect a memory leak in your program (caused by not properly destroying + the Symbolic and Numeric objects) then compile with -DUMF_MALLOC_COUNT and + check value of UMF_malloc_count. By default, UMF_MALLOC_COUNT is not + defined, and thus UMFPACK has no global variables. +*/ + +GLOBAL Int UMF_malloc_count = 0 ; + +#endif + +#ifdef UMF_TCOV_TEST +/* For exhaustive statement coverage testing only! */ +GLOBAL int umf_fail, umf_fail_lo, umf_fail_hi ; +GLOBAL int umf_realloc_fail, umf_realloc_lo, umf_realloc_hi ; +#endif + +GLOBAL void *UMF_malloc +( + Int n_objects, + size_t size_of_object +) +{ + size_t size ; + void *p ; + +#ifdef UMF_TCOV_TEST + /* For exhaustive statement coverage testing only! */ + /* Pretend to fail, to test out-of-memory conditions. */ + umf_fail-- ; + if (umf_fail <= umf_fail_hi && umf_fail >= umf_fail_lo) + { + DEBUG0 (("umf_malloc: Pretend to fail %d %d %d\n", + umf_fail, umf_fail_hi, umf_fail_lo)) ; + return ((void *) NULL) ; + } +#endif + + DEBUG0 (("UMF_malloc: ")) ; + + /* make sure that we allocate something */ + n_objects = MAX (1, n_objects) ; + + size = (size_t) n_objects ; + ASSERT (size_of_object > 1) ; + if (size > Int_MAX / size_of_object) + { + /* object is too big for integer pointer arithmetic */ + return ((void *) NULL) ; + } + size *= size_of_object ; + + /* see umf_config.h for the memory allocator selection */ + p = ALLOCATE (size) ; + + DEBUG0 ((ID"\n", (Int) p)) ; + +#if defined (UMF_MALLOC_COUNT) || !defined (NDEBUG) + if (p) + { + /* One more object has been malloc'ed. Keep track of the count. */ + /* (purely for sanity checks). */ + UMF_malloc_count++ ; + DEBUG0 ((" successful, new malloc count: "ID"\n", UMF_malloc_count)) ; + } +#endif + + return (p) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_malloc.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_malloc.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,20 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +#ifndef _UMF_MALLOC +#define _UMF_MALLOC + +#if defined (UMF_MALLOC_COUNT) || !defined (NDEBUG) +GLOBAL extern Int UMF_malloc_count ; +#endif + +GLOBAL void *UMF_malloc +( + Int n_objects, + size_t size_of_object +) ; + +#endif diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_mem_alloc_element.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_mem_alloc_element.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,82 @@ +/* ========================================================================== */ +/* === UMF_mem_alloc_element ================================================ */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* The UMF_mem_* routines manage the Numeric->Memory memory space. */ + +/* Allocate a nrows-by-ncols element, and initialize it. */ +/* Returns the index into Numeric->Memory if successful, or 0 on failure. */ + +#include "umf_internal.h" +#include "umf_mem_alloc_tail_block.h" + +GLOBAL Int UMF_mem_alloc_element +( + NumericType *Numeric, + Int nrows, + Int ncols, + Int **Rows, + Int **Cols, + Entry **C, + Int *size, + Element **epout +) +{ + + Element *ep ; + Unit *p ; + Int i ; + + ASSERT (Numeric != (NumericType *) NULL) ; + ASSERT (Numeric->Memory != (Unit *) NULL) ; + + *size = GET_ELEMENT_SIZE (nrows, ncols) ; + if (INT_OVERFLOW (DGET_ELEMENT_SIZE (nrows, ncols) + 1)) + { + /* :: allocate element, int overflow :: */ + return (0) ; /* problem is too large */ + } + + i = UMF_mem_alloc_tail_block (Numeric, *size) ; + (*size)++ ; + if (!i) + { + DEBUG0 (("alloc element failed - out of memory\n")) ; + return (0) ; /* out of memory */ + } + p = Numeric->Memory + i ; + + ep = (Element *) p ; + + DEBUG2 (("alloc_element done ("ID" x "ID"): p: "ID" i "ID"\n", + nrows, ncols, (Int) (p-Numeric->Memory), i)) ; + + /* Element data structure, in order: */ + p += UNITS (Element, 1) ; /* (1) Element header */ + *Cols = (Int *) p ; /* (2) col [0..ncols-1] indices */ + *Rows = *Cols + ncols ; /* (3) row [0..nrows-1] indices */ + p += UNITS (Int, ncols + nrows) ; + *C = (Entry *) p ; /* (4) C [0..nrows-1, 0..ncols-1] */ + + ep->nrows = nrows ; /* initialize the header information */ + ep->ncols = ncols ; + ep->nrowsleft = nrows ; + ep->ncolsleft = ncols ; + ep->cdeg = 0 ; + ep->rdeg = 0 ; + ep->next = EMPTY ; + + DEBUG2 (("new block size: "ID" ", GET_BLOCK_SIZE (Numeric->Memory + i))) ; + DEBUG2 (("Element size needed "ID"\n", GET_ELEMENT_SIZE (nrows, ncols))) ; + + *epout = ep ; + + /* return the offset into Numeric->Memory */ + return (i) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_mem_alloc_element.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_mem_alloc_element.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,17 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL Int UMF_mem_alloc_element +( + NumericType *Numeric, + Int nrows, + Int ncols, + Int **Rows, + Int **Cols, + Entry **C, + Int *size, + Element **epout +) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_mem_alloc_head_block.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_mem_alloc_head_block.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,54 @@ +/* ========================================================================== */ +/* === UMF_mem_alloc_head_block ============================================= */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* The UMF_mem_* routines manage the Numeric->Memory memory space. */ + +/* allocate nunits from head of Numeric->Memory. No header allocated. */ +/* Returns the index into Numeric->Memory if successful, or 0 on failure. */ + +#include "umf_internal.h" + +GLOBAL Int UMF_mem_alloc_head_block +( + NumericType *Numeric, + Int nunits +) +{ + Int p, usage ; + DEBUG2 (("GET BLOCK: from head, size "ID" ", nunits)) ; + + ASSERT (Numeric != (NumericType *) NULL) ; + ASSERT (Numeric->Memory != (Unit *) NULL) ; + +#ifndef NDEBUG + if (UMF_allocfail) + { + /* pretend to fail, to test garbage_collection */ + DEBUGm2 (("UMF_mem_alloc_head_block: pretend to fail\n")) ; + UMF_allocfail = FALSE ; /* don't fail the next time */ + return (0) ; + } +#endif + + if (nunits > (Numeric->itail - Numeric->ihead)) + { + DEBUG2 ((" failed\n")) ; + return (0) ; + } + + /* return p as an offset from Numeric->Memory */ + p = Numeric->ihead ; + Numeric->ihead += nunits ; + + DEBUG2 (("p: "ID"\n", p)) ; + usage = Numeric->ihead + Numeric->tail_usage ; + Numeric->max_usage = MAX (Numeric->max_usage, usage) ; + return (p) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_mem_alloc_head_block.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_mem_alloc_head_block.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,11 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL Int UMF_mem_alloc_head_block +( + NumericType *Numeric, + Int nunits +) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_mem_alloc_tail_block.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_mem_alloc_tail_block.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,133 @@ +/* ========================================================================== */ +/* === UMF_mem_alloc_tail_block ============================================= */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* The UMF_mem_* routines manage the Numeric->Memory memory space. */ + +#include "umf_internal.h" + +/* allocate nunits from tail of Numeric->Memory */ +/* (requires nunits+1, for header). */ +/* Returns the index into Numeric->Memory if successful, or 0 on failure. */ + +GLOBAL Int UMF_mem_alloc_tail_block +( + NumericType *Numeric, + Int nunits +) +{ + Int bigsize, usage ; + Unit *p, *pnext, *pbig ; + + ASSERT (Numeric != (NumericType *) NULL) ; + ASSERT (Numeric->Memory != (Unit *) NULL) ; + +#ifndef NDEBUG + if (UMF_allocfail) + { + /* pretend to fail, to test garbage_collection */ + DEBUGm2 (("UMF_mem_alloc_tail_block: pretend to fail\n")) ; + UMF_allocfail = FALSE ; /* don't fail the next time */ + return (0) ; + } + DEBUG2 (("UMF_mem_alloc_tail_block, size: "ID" + 1 = "ID": ", + nunits, nunits+1)) ; +#endif + + bigsize = 0 ; + pbig = (Unit *) NULL ; + + ASSERT (nunits > 0) ; /* size must be positive */ + if (Numeric->ibig != EMPTY) + { + ASSERT (Numeric->ibig > Numeric->itail) ; + ASSERT (Numeric->ibig < Numeric->size) ; + pbig = Numeric->Memory + Numeric->ibig ; + bigsize = -pbig->header.size ; + ASSERT (bigsize > 0) ; /* Numeric->ibig is free */ + ASSERT (pbig->header.prevsize >= 0) ; /* prev. is not free */ + } + + if (pbig && bigsize >= nunits) + { + + /* use the biggest block, somewhere in middle of memory */ + p = pbig ; + pnext = p + 1 + bigsize ; + /* next is in range */ + ASSERT (pnext < Numeric->Memory + Numeric->size) ; + /* prevsize of next = this size */ + ASSERT (pnext->header.prevsize == bigsize) ; + /* next is not free */ + ASSERT (pnext->header.size > 0) ; + bigsize -= nunits + 1 ; + + if (bigsize < 4) + { + /* internal fragmentation would be too small */ + /* allocate the entire free block */ + p->header.size = -p->header.size ; + DEBUG2 (("GET BLOCK: p: "ID" size: "ID", all of big: "ID" size: " + ID"\n", (Int) (p-Numeric->Memory), nunits, Numeric->ibig, + p->header.size)) ; + /* no more biggest block */ + Numeric->ibig = EMPTY ; + + } + else + { + + /* allocate just the first nunits Units of the free block */ + p->header.size = nunits ; + /* make a new free block */ + Numeric->ibig += nunits + 1 ; + pbig = Numeric->Memory + Numeric->ibig ; + pbig->header.size = -bigsize ; + pbig->header.prevsize = nunits ; + pnext->header.prevsize = bigsize ; + DEBUG2 (("GET BLOCK: p: "ID" size: "ID", some of big: "ID" left: " + ID"\n", (Int) (p-Numeric->Memory), nunits, Numeric->ibig, + bigsize)) ; + } + + } + else + { + + /* allocate from the top of tail */ + pnext = Numeric->Memory + Numeric->itail ; + DEBUG2 (("GET BLOCK: from tail ")) ; + if ((nunits + 1) > (Numeric->itail - Numeric->ihead)) + { + DEBUG2 (("\n")) ; + return (0) ; + } + Numeric->itail -= (nunits + 1) ; + p = Numeric->Memory + Numeric->itail ; + p->header.size = nunits ; + p->header.prevsize = 0 ; + pnext->header.prevsize = nunits ; + DEBUG2 (("p: "ID" size: "ID", new tail "ID"\n", + (Int) (p-Numeric->Memory), nunits, Numeric->itail)) ; + } + + Numeric->tail_usage += p->header.size + 1 ; + usage = Numeric->ihead + Numeric->tail_usage ; + Numeric->max_usage = MAX (Numeric->max_usage, usage) ; + +#ifndef NDEBUG + UMF_debug -= 10 ; + UMF_dump_memory (Numeric) ; + UMF_debug += 10 ; +#endif + + /* p points to the header. Add one to point to the usable block itself. */ + /* return the offset into Numeric->Memory */ + return ((p - Numeric->Memory) + 1) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_mem_alloc_tail_block.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_mem_alloc_tail_block.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,11 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL Int UMF_mem_alloc_tail_block +( + NumericType *Numeric, + Int nunits +) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_mem_free_tail_block.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_mem_free_tail_block.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,142 @@ +/* ========================================================================== */ +/* === UMF_mem_free_tail_block ============================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* The UMF_mem_* routines manage the Numeric->Memory memory space. */ + +/* free a block from the tail of Numeric->memory */ + +#include "umf_internal.h" + +GLOBAL void UMF_mem_free_tail_block +( + NumericType *Numeric, + Int i +) +{ + Unit *pprev, *pnext, *p, *pbig ; + Int sprev ; + + ASSERT (Numeric != (NumericType *) NULL) ; + ASSERT (Numeric->Memory != (Unit *) NULL) ; + if (i == EMPTY || i == 0) return ; /* already deallocated */ + + /* ---------------------------------------------------------------------- */ + /* get the block */ + /* ---------------------------------------------------------------------- */ + + p = Numeric->Memory + i ; + + p-- ; /* get the corresponding header */ + DEBUG2 (("free block: p: "ID, (Int) (p-Numeric->Memory))) ; + ASSERT (p >= Numeric->Memory + Numeric->itail) ; + ASSERT (p < Numeric->Memory + Numeric->size) ; + ASSERT (p->header.size > 0) ; /* block not already free */ + ASSERT (p->header.prevsize >= 0) ; + + Numeric->tail_usage -= p->header.size + 1 ; + + /* ---------------------------------------------------------------------- */ + /* merge with next free block, if any */ + /* ---------------------------------------------------------------------- */ + + pnext = p + 1 + p->header.size ; + DEBUG2 (("size: "ID" next: "ID" ", p->header.size, + (Int) (pnext-Numeric->Memory))) ; + ASSERT (pnext < Numeric->Memory + Numeric->size) ; + ASSERT (pnext->header.prevsize == p->header.size) ; + ASSERT (pnext->header.size != 0) ; + + if (pnext->header.size < 0) + { + /* next block is also free - merge with current block */ + p->header.size += (-(pnext->header.size)) + 1 ; + DEBUG2 ((" NEXT FREE ")) ; + } + + /* ---------------------------------------------------------------------- */ + /* merge with previous free block, if any */ + /* ---------------------------------------------------------------------- */ + +#ifndef NDEBUG + if (p == Numeric->Memory + Numeric->itail) + { + DEBUG2 ((" at top of tail ")) ; + ASSERT (p->header.prevsize == 0) ; + } +#endif + + if (p > Numeric->Memory + Numeric->itail) + { + ASSERT (p->header.prevsize > 0) ; + pprev = p - 1 - p->header.prevsize ; + DEBUG2 ((" prev: "ID" ", (Int) (pprev-Numeric->Memory))) ; + ASSERT (pprev >= Numeric->Memory + Numeric->itail) ; + sprev = pprev->header.size ; + if (sprev < 0) + { + /* previous block is also free - merge it with current block */ + ASSERT (p->header.prevsize == -sprev) ; + pprev->header.size = p->header.size + (-sprev) + 1 ; + p = pprev ; + DEBUG2 ((" PREV FREE ")) ; + /* note that p may now point to Numeric->itail */ + } +#ifndef NDEBUG + else + { + ASSERT (p->header.prevsize == sprev) ; + } +#endif + } + + /* ---------------------------------------------------------------------- */ + /* free the block, p */ + /* ---------------------------------------------------------------------- */ + + pnext = p + 1 + p->header.size ; + ASSERT (pnext < Numeric->Memory + Numeric->size) ; + + if (p == Numeric->Memory + Numeric->itail) + { + /* top block in list is freed */ + Numeric->itail = pnext - Numeric->Memory ; + pnext->header.prevsize = 0 ; + DEBUG2 ((" NEW TAIL : "ID" ", Numeric->itail)) ; + ASSERT (pnext->header.size > 0) ; + if (Numeric->ibig != EMPTY && Numeric->ibig <= Numeric->itail) + { + /* the big free block is now above the tail */ + Numeric->ibig = EMPTY ; + } + } + else + { + /* keep track of the biggest free block seen */ + if (Numeric->ibig == EMPTY) + { + Numeric->ibig = p - Numeric->Memory ; + } + else + { + pbig = Numeric->Memory + Numeric->ibig ; + if (-(pbig->header.size) < p->header.size) + { + Numeric->ibig = p - Numeric->Memory ; + } + } + /* flag the block as free, somewhere in the middle of the tail */ + pnext->header.prevsize = p->header.size ; + p->header.size = -(p->header.size) ; + } + + DEBUG2 (("new p: "ID" freesize: "ID"\n", (Int) (p-Numeric->Memory), + -(p->header.size))) ; + +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_mem_free_tail_block.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_mem_free_tail_block.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,11 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL void UMF_mem_free_tail_block +( + NumericType *Numeric, + Int i +) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_mem_init_memoryspace.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_mem_init_memoryspace.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,64 @@ +/* ========================================================================== */ +/* === UMF_mem_init_memoryspace ============================================= */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* The UMF_mem_* routines manage the Numeric->Memory memory space. */ + +#include "umf_internal.h" + +/* initialize the LU and element workspace (Numeric->Memory) */ + +GLOBAL void UMF_mem_init_memoryspace +( + NumericType *Numeric +) +{ + Unit *p ; + + ASSERT (Numeric != (NumericType *) NULL) ; + ASSERT (Numeric->Memory != (Unit *) NULL) ; + ASSERT (Numeric->size >= 3) ; + DEBUG0 (("Init memory space, size "ID"\n", Numeric->size)) ; + + Numeric->ngarbage = 0 ; + Numeric->nrealloc = 0 ; + Numeric->ncostly = 0 ; + Numeric->ibig = EMPTY ; + Numeric->ihead = 0 ; + Numeric->itail = Numeric->size ; + +#ifndef NDEBUG + UMF_allocfail = FALSE ; +#endif + + /* allocate the 2-unit tail marker block and initialize it */ + Numeric->itail -= 2 ; + p = Numeric->Memory + Numeric->itail ; + DEBUG2 (("p "ID" tail "ID"\n", (Int) (p-Numeric->Memory), Numeric->itail)) ; + Numeric->tail_usage = 2 ; + p->header.prevsize = 0 ; + p->header.size = 1 ; + + /* allocate a 1-unit head marker block at the head of memory */ + /* this is done so that an offset of zero is treated as a NULL pointer */ + Numeric->ihead++ ; + + /* initial usage in Numeric->Memory */ + Numeric->max_usage = 3 ; + Numeric->init_usage = Numeric->max_usage ; + + /* Note that UMFPACK_*symbolic ensures that Numeric->Memory is of size */ + /* at least 3, so this initialization will always succeed. */ + +#ifndef NDEBUG + DEBUG2 (("init_memoryspace, all free (except one unit at head\n")) ; + UMF_dump_memory (Numeric) ; +#endif + +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_mem_init_memoryspace.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_mem_init_memoryspace.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,10 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL void UMF_mem_init_memoryspace +( + NumericType *Numeric +) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_multicompile.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_multicompile.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,58 @@ +/* ========================================================================== */ +/* === UMF_multicompile ===================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* This file is not needed if you have the Unix/Linux "make" command for + * compiling UMFPACK. Microsoft Visual Studio cannot be configured to compile + * one file multiple times, with different -D flags. In this case, you can + * use this file instead. To use this file, see the Demo/simple_compile file. + * + * This file includes the following source files: + * + * umf_ltsolve.c + * umf_utsolve.c + * umf_triplet.c + * umf_assemble.c + * umf_store_lu.c + * umfpack_solve.c + * + * This file simply compiles the above files with different pre-#define'd flags, + * by defining the flags and then #include'ing the source files themselves. + * This is a rather unconventional approach, since by convention #include is + * supposed to be used with *.h files not *.c. However, it is one way of + * working around the limitations of Microsoft Visual Studio. + * + * You still need to compile all files separately as well, with none of the + * pre-#define'd terms listed below. + */ + +/* compile the complex conjugate forward/backsolves */ +#define CONJUGATE_SOLVE +#include "umf_ltsolve.c" +#include "umf_utsolve.c" + +/* compile umf_triplet with DO_MAP, DO_VALUES and DO_MAP, and just DO_VALUES */ +#define DO_MAP +#include "umf_triplet.c" +#define DO_VALUES +#include "umf_triplet.c" +#undef DO_MAP +#include "umf_triplet.c" + +/* compile the FIXQ version of umf_assemble */ +#define FIXQ +#include "umf_assemble.c" + +/* compile the DROP version of umf_store_lu */ +#define DROP +#include "umf_store_lu.c" + +/* compile umfpack_wsolve */ +#define WSOLVE +#include "umfpack_solve.c" diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_realloc.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_realloc.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,75 @@ +/* ========================================================================== */ +/* === UMF_realloc ========================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + Realloc a block previously allocated by UMF_malloc. + Return NULL on failure (in which case the block is still allocated, and will + be kept at is present size). This routine is only used for Numeric->Memory. +*/ + +#include "umf_internal.h" + +#if defined (UMF_MALLOC_COUNT) || !defined (NDEBUG) +#include "umf_malloc.h" +#endif + +GLOBAL void *UMF_realloc +( + void *p, + Int n_objects, + size_t size_of_object +) +{ + size_t size ; + void *p2 ; + +#ifdef UMF_TCOV_TEST + /* For exhaustive statement coverage testing only! */ + /* Pretend to fail, to test out-of-memory conditions. */ + umf_realloc_fail-- ; + if (umf_realloc_fail <= umf_realloc_hi && + umf_realloc_fail >= umf_realloc_lo) + { + return ((void *) NULL) ; + } +#endif + + /* make sure that we allocate something */ + n_objects = MAX (1, n_objects) ; + + size = (size_t) n_objects ; + ASSERT (size_of_object > 1) ; + if (size > Int_MAX / size_of_object) + { + /* :: int overflow in umf_realloc :: */ + return ((void *) NULL) ; + } + size *= size_of_object ; + + DEBUG0 (("UMF_realloc: "ID" n_objects "ID" size_of_object "ID"\n", + (Int) p, n_objects, (Int) size_of_object)) ; + + /* see umf_config.h for the memory allocator selection */ + p2 = REALLOCATE (p, size) ; + +#if defined (UMF_MALLOC_COUNT) || !defined (NDEBUG) + /* If p didn't exist on input, and p2 exists, then a new object has been + * allocated. */ + if (p == (void *) NULL && p2 != (void *) NULL) + { + UMF_malloc_count++ ; + } +#endif + + DEBUG0 (("UMF_realloc: "ID" new malloc count "ID"\n", + (Int) p2, UMF_malloc_count)) ; + + return (p2) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_realloc.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_realloc.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,12 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL void *UMF_realloc +( + void *p, + Int n_objects, + size_t size_of_object +) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_report_perm.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_report_perm.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,85 @@ +/* ========================================================================== */ +/* === UMF_report_perm ====================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +#include "umf_internal.h" + +#define PRINTF4U(params) { if (user || prl >= 4) PRINTF (params) ; } + +GLOBAL Int UMF_report_perm +( + Int n, + const Int P [ ], + Int W [ ], /* workspace of size n */ + Int prl, + Int user +) +{ + Int i, k, valid, prl1 ; + + ASSERT (prl >= 3) ; + + PRINTF4U (("permutation vector, n = "ID". ", n)) ; + + if (n <= 0) + { + PRINTF (("ERROR: length of permutation is <= 0\n\n")) ; + return (UMFPACK_ERROR_n_nonpositive) ; + } + + if (!P) + { + /* if P is (Int *) NULL, this is the identity permutation */ + PRINTF (("(not present)\n\n")) ; + return (UMFPACK_OK) ; + } + + if (!W) + { + PRINTF (("ERROR: out of memory\n\n")) ; + return (UMFPACK_ERROR_out_of_memory) ; + } + + PRINTF4 (("\n")) ; + + for (i = 0 ; i < n ; i++) + { + W [i] = TRUE ; + } + + prl1 = prl ; + for (k = 0 ; k < n ; k++) + { + i = P [k] ; + PRINTF4 ((" "ID" : "ID" ", INDEX (k), INDEX (i))) ; + valid = (i >= 0 && i < n) ; + if (valid) + { + valid = W [i] ; + W [i] = FALSE ; + } + if (!valid) + { + /* out of range or duplicate entry */ + PRINTF (("ERROR: invalid\n\n")) ; + return (UMFPACK_ERROR_invalid_permutation) ; + } + PRINTF4 (("\n")) ; + if (prl == 4 && k == 9 && n > 10) + { + PRINTF ((" ...\n")) ; + prl-- ; + } + } + prl = prl1 ; + + PRINTF4 ((" permutation vector ")) ; + PRINTF4U (("OK\n\n")) ; + return (UMFPACK_OK) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_report_perm.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_report_perm.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,14 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL Int UMF_report_perm +( + Int n, + const Int P [ ], + Int W [ ], + Int prl, + Int user +) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_report_vector.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_report_vector.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,110 @@ +/* ========================================================================== */ +/* === UMF_report_vector ==================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +#include "umf_internal.h" + +/* ========================================================================== */ +/* === print_value ========================================================== */ +/* ========================================================================== */ + +PRIVATE void print_value +( + Int i, + const double Xx [ ], + const double Xz [ ], /* used for complex case only */ + Int scalar /* if true, then print real part only */ +) +{ + Entry xi ; + /* if Xz is null, then X is in "merged" format (compatible with Entry, */ + /* and ANSI C99 double _Complex type). */ + PRINTF ((" "ID" :", INDEX (i))) ; + if (scalar) + { + PRINT_SCALAR (Xx [i]) ; + } + else + { + ASSIGN (xi, Xx, Xz, i, SPLIT (Xz)) ; + PRINT_ENTRY (xi) ; + } + PRINTF (("\n")) ; +} + +/* ========================================================================== */ +/* === UMF_report_vector ==================================================== */ +/* ========================================================================== */ + +GLOBAL Int UMF_report_vector +( + Int n, + const double Xx [ ], + const double Xz [ ], + Int prl, + Int user, + Int scalar +) +{ + Int n2, i ; + + if (user || prl >= 4) + { + PRINTF (("dense vector, n = "ID". ", n)) ; + } + + if (user) + { + if (!Xx) + { + PRINTF (("ERROR: vector not present\n\n")) ; + return (UMFPACK_ERROR_argument_missing) ; + } + if (n < 0) + { + PRINTF (("ERROR: length of vector is < 0\n\n")) ; + return (UMFPACK_ERROR_n_nonpositive) ; + } + } + + if (user || prl >= 4) + { + PRINTF4 (("\n")) ; + } + + if (prl == 4) + { + /* print level of 4 */ + n2 = MIN (10, n) ; + for (i = 0 ; i < n2 ; i++) + { + print_value (i, Xx, Xz, scalar) ; + } + if (n2 < n) + { + PRINTF ((" ...\n")) ; + print_value (n-1, Xx, Xz, scalar) ; + } + } + else if (prl > 4) + { + /* print level 4 or more */ + for (i = 0 ; i < n ; i++) + { + print_value (i, Xx, Xz, scalar) ; + } + } + + PRINTF4 ((" dense vector ")) ; + if (user || prl >= 4) + { + PRINTF (("OK\n\n")) ; + } + return (UMFPACK_OK) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_report_vector.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_report_vector.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,15 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL Int UMF_report_vector +( + Int n, + const double Xx [ ], + const double Xz [ ], + Int prl, + Int user, + Int scalar +) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_row_search.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_row_search.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,837 @@ +/* ========================================================================== */ +/* === UMF_row_search ======================================================= */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + Find two candidate pivot rows in a column: the best one in the front, + and the best one not in the front. Return the two pivot row patterns and + their exact degrees. Called by UMF_local_search. + + Returns UMFPACK_OK if successful, or UMFPACK_WARNING_singular_matrix or + UMFPACK_ERROR_different_pattern if not. + +*/ + +#include "umf_internal.h" +#include "umf_row_search.h" + +GLOBAL Int UMF_row_search +( + NumericType *Numeric, + WorkType *Work, + SymbolicType *Symbolic, + Int cdeg0, /* length of column in Front */ + Int cdeg1, /* length of column outside Front */ + const Int Pattern [ ], /* pattern of column, Pattern [0..cdeg1 -1] */ + const Int Pos [ ], /* Pos [Pattern [0..cdeg1 -1]] = 0..cdeg1 -1 */ + Int pivrow [2], /* pivrow [IN] and pivrow [OUT] */ + Int rdeg [2], /* rdeg [IN] and rdeg [OUT] */ + Int W_i [ ], /* pattern of pivrow [IN], */ + /* either Fcols or Woi */ + Int W_o [ ], /* pattern of pivrow [OUT], */ + /* either Wio or Woo */ + Int prior_pivrow [2], /* the two other rows just scanned, if any */ + const Entry Wxy [ ], /* numerical values Wxy [0..cdeg1-1], + either Wx or Wy */ + + Int pivcol, /* the candidate column being searched */ + Int freebie [ ] +) +{ + + /* ---------------------------------------------------------------------- */ + /* local variables */ + /* ---------------------------------------------------------------------- */ + + double maxval, toler, toler2, value, pivot [2] ; + Int i, row, deg, col, *Frpos, fnrows, *E, j, ncols, *Cols, *Rows, + e, f, Wrpflag, *Fcpos, fncols, tpi, max_rdeg, nans_in_col, was_offdiag, + diag_row, prefer_diagonal, *Wrp, found, *Diagonal_map ; + Tuple *tp, *tpend, *tp1, *tp2 ; + Unit *Memory, *p ; + Element *ep ; + Int *Row_tuples, *Row_degree, *Row_tlen ; + +#ifndef NDEBUG + Int *Col_degree ; + DEBUG2 (("Row_search:\n")) ; + for (i = 0 ; i < cdeg1 ; i++) + { + row = Pattern [i] ; + DEBUG4 ((" row: "ID"\n", row)) ; + ASSERT (row >= 0 && row < Numeric->n_row) ; + ASSERT (i == Pos [row]) ; + } + /* If row is not in Pattern [0..cdeg1-1], then Pos [row] == EMPTY */ + if (UMF_debug > 0 || Numeric->n_row < 1000) + { + Int cnt = cdeg1 ; + DEBUG4 (("Scan all rows:\n")) ; + for (row = 0 ; row < Numeric->n_row ; row++) + { + if (Pos [row] < 0) + { + cnt++ ; + } + else + { + DEBUG4 ((" row: "ID" pos "ID"\n", row, Pos [row])) ; + } + } + ASSERT (cnt == Numeric->n_row) ; + } + Col_degree = Numeric->Cperm ; /* for NON_PIVOTAL_COL macro only */ + ASSERT (pivcol >= 0 && pivcol < Work->n_col) ; + ASSERT (NON_PIVOTAL_COL (pivcol)) ; +#endif + + pivot [IN] = 0. ; + pivot [OUT] = 0. ; + + /* ---------------------------------------------------------------------- */ + /* get parameters */ + /* ---------------------------------------------------------------------- */ + + Row_degree = Numeric->Rperm ; + Row_tuples = Numeric->Uip ; + Row_tlen = Numeric->Uilen ; + Wrp = Work->Wrp ; + Frpos = Work->Frpos ; + E = Work->E ; + Memory = Numeric->Memory ; + fnrows = Work->fnrows ; + + prefer_diagonal = Symbolic->prefer_diagonal ; + Diagonal_map = Work->Diagonal_map ; + + if (Diagonal_map) + { + diag_row = Diagonal_map [pivcol] ; + was_offdiag = diag_row < 0 ; + if (was_offdiag) + { + /* the "diagonal" entry in this column was permuted here by an + * earlier pivot choice. The tighter off-diagonal tolerance will + * be used instead of the symmetric tolerance. */ + diag_row = FLIP (diag_row) ; + } + ASSERT (diag_row >= 0 && diag_row < Numeric->n_row) ; + } + else + { + diag_row = EMPTY ; /* unused */ + was_offdiag = EMPTY ; /* unused */ + } + + /* pivot row degree cannot exceed max_rdeg */ + max_rdeg = Work->fncols_max ; + + /* ---------------------------------------------------------------------- */ + /* scan pivot column for candidate rows */ + /* ---------------------------------------------------------------------- */ + + maxval = 0.0 ; + nans_in_col = FALSE ; + + for (i = 0 ; i < cdeg1 ; i++) + { + APPROX_ABS (value, Wxy [i]) ; + if (SCALAR_IS_NAN (value)) + { + nans_in_col = TRUE ; + maxval = value ; + break ; + } + /* This test can now ignore the NaN case: */ + maxval = MAX (maxval, value) ; + } + + /* if maxval is zero, the matrix is numerically singular */ + + toler = Numeric->relpt * maxval ; + toler2 = Numeric->relpt2 * maxval ; + toler2 = was_offdiag ? toler : toler2 ; + + DEBUG5 (("Row_search begins [ maxval %g toler %g %g\n", + maxval, toler, toler2)) ; + if (SCALAR_IS_NAN (toler) || SCALAR_IS_NAN (toler2)) + { + nans_in_col = TRUE ; + } + + if (!nans_in_col) + { + + /* look for the diagonal entry, if it exists */ + found = FALSE ; + ASSERT (!SCALAR_IS_NAN (toler)) ; + + if (prefer_diagonal) + { + ASSERT (diag_row != EMPTY) ; + i = Pos [diag_row] ; + if (i >= 0) + { + double a ; + ASSERT (i < cdeg1) ; + ASSERT (diag_row == Pattern [i]) ; + + APPROX_ABS (a, Wxy [i]) ; + + ASSERT (!SCALAR_IS_NAN (a)) ; + ASSERT (!SCALAR_IS_NAN (toler2)) ; + + if (SCALAR_IS_NONZERO (a) && a >= toler2) + { + /* found it! */ + DEBUG3 (("Symmetric pivot: "ID" "ID"\n", pivcol, diag_row)); + found = TRUE ; + if (Frpos [diag_row] >= 0 && Frpos [diag_row] < fnrows) + { + pivrow [IN] = diag_row ; + pivrow [OUT] = EMPTY ; + } + else + { + pivrow [IN] = EMPTY ; + pivrow [OUT] = diag_row ; + } + } + } + } + + /* either no diagonal found, or we didn't look for it */ + if (!found) + { + if (cdeg0 > 0) + { + + /* this is a column in the front */ + for (i = 0 ; i < cdeg0 ; i++) + { + double a ; + APPROX_ABS (a, Wxy [i]) ; + ASSERT (!SCALAR_IS_NAN (a)) ; + ASSERT (!SCALAR_IS_NAN (toler)) ; + if (SCALAR_IS_NONZERO (a) && a >= toler) + { + row = Pattern [i] ; + deg = Row_degree [row] ; +#ifndef NDEBUG + DEBUG6 ((ID" candidate row "ID" deg "ID" absval %g\n", + i, row, deg, a)) ; + UMF_dump_rowcol (0, Numeric, Work, row, TRUE) ; +#endif + ASSERT (Frpos [row] >= 0 && Frpos [row] < fnrows) ; + ASSERT (Frpos [row] == i) ; + /* row is in the current front */ + DEBUG4 ((" in front\n")) ; + if (deg < rdeg [IN] + /* break ties by picking the largest entry: */ + || (deg == rdeg [IN] && a > pivot [IN]) + /* break ties by picking the diagonal entry: */ + /* || (deg == rdeg [IN] && row == diag_row) */ + ) + { + /* best row in front, so far */ + pivrow [IN] = row ; + rdeg [IN] = deg ; + pivot [IN] = a ; + } + } + } + for ( ; i < cdeg1 ; i++) + { + double a ; + APPROX_ABS (a, Wxy [i]) ; + ASSERT (!SCALAR_IS_NAN (a)) ; + ASSERT (!SCALAR_IS_NAN (toler)) ; + if (SCALAR_IS_NONZERO (a) && a >= toler) + { + row = Pattern [i] ; + deg = Row_degree [row] ; +#ifndef NDEBUG + DEBUG6 ((ID" candidate row "ID" deg "ID" absval %g\n", + i, row, deg, a)) ; + UMF_dump_rowcol (0, Numeric, Work, row, TRUE) ; +#endif + ASSERT (Frpos [row] == i) ; + /* row is not in the current front */ + DEBUG4 ((" NOT in front\n")) ; + if (deg < rdeg [OUT] + /* break ties by picking the largest entry: */ + || (deg == rdeg [OUT] && a > pivot [OUT]) + /* break ties by picking the diagonal entry: */ + /* || (deg == rdeg [OUT] && row == diag_row) */ + ) + { + /* best row not in front, so far */ + pivrow [OUT] = row ; + rdeg [OUT] = deg ; + pivot [OUT] = a ; + } + } + } + + } + else + { + + /* this column is not in the front */ + for (i = 0 ; i < cdeg1 ; i++) + { + double a ; + APPROX_ABS (a, Wxy [i]) ; + ASSERT (!SCALAR_IS_NAN (a)) ; + ASSERT (!SCALAR_IS_NAN (toler)) ; + if (SCALAR_IS_NONZERO (a) && a >= toler) + { + row = Pattern [i] ; + deg = Row_degree [row] ; +#ifndef NDEBUG + DEBUG6 ((ID" candidate row "ID" deg "ID" absval %g\n", + i, row, deg, a)) ; + UMF_dump_rowcol (0, Numeric, Work, row, TRUE) ; +#endif + if (Frpos [row] >= 0 && Frpos [row] < fnrows) + { + /* row is in the current front */ + DEBUG4 ((" in front\n")) ; + if (deg < rdeg [IN] + /* break ties by picking the largest entry: */ + || (deg == rdeg [IN] && a > pivot [IN]) + /* break ties by picking the diagonal entry: */ + /* || (deg == rdeg [IN] && row == diag_row) */ + ) + { + /* best row in front, so far */ + pivrow [IN] = row ; + rdeg [IN] = deg ; + pivot [IN] = a ; + } + } + else + { + /* row is not in the current front */ + DEBUG4 ((" NOT in front\n")) ; + if (deg < rdeg [OUT] + /* break ties by picking the largest entry: */ + || (deg == rdeg[OUT] && a > pivot [OUT]) + /* break ties by picking the diagonal entry: */ + /* || (deg == rdeg[OUT] && row == diag_row) */ + ) + { + /* best row not in front, so far */ + pivrow [OUT] = row ; + rdeg [OUT] = deg ; + pivot [OUT] = a ; + } + } + } + } + } + } + } + + /* ---------------------------------------------------------------------- */ + /* NaN handling */ + /* ---------------------------------------------------------------------- */ + + /* if cdeg1 > 0 then we must have found a pivot row ... unless NaN's */ + /* exist. Try with no numerical tests if no pivot found. */ + + if (cdeg1 > 0 && pivrow [IN] == EMPTY && pivrow [OUT] == EMPTY) + { + /* cleanup for the NaN case */ + DEBUG0 (("Found a NaN in pivot column!\n")) ; + + /* grab the first entry in the pivot column, ignoring degree, */ + /* numerical stability, and symmetric preference */ + row = Pattern [0] ; + deg = Row_degree [row] ; + if (Frpos [row] >= 0 && Frpos [row] < fnrows) + { + /* row is in the current front */ + DEBUG4 ((" in front\n")) ; + pivrow [IN] = row ; + rdeg [IN] = deg ; + } + else + { + /* row is not in the current front */ + DEBUG4 ((" NOT in front\n")) ; + pivrow [OUT] = row ; + rdeg [OUT] = deg ; + } + + /* We are now guaranteed to have a pivot, no matter how broken */ + /* (non-IEEE compliant) the underlying numerical operators are. */ + /* This is particularly a problem for Microsoft compilers (they do */ + /* not handle NaN's properly). Now try to find a sparser pivot, if */ + /* possible. */ + + for (i = 1 ; i < cdeg1 ; i++) + { + row = Pattern [i] ; + deg = Row_degree [row] ; + + if (Frpos [row] >= 0 && Frpos [row] < fnrows) + { + /* row is in the current front */ + DEBUG4 ((" in front\n")) ; + if (deg < rdeg [IN] || (deg == rdeg [IN] && row == diag_row)) + { + /* best row in front, so far */ + pivrow [IN] = row ; + rdeg [IN] = deg ; + } + } + else + { + /* row is not in the current front */ + DEBUG4 ((" NOT in front\n")) ; + if (deg < rdeg [OUT] || (deg == rdeg [OUT] && row == diag_row)) + { + /* best row not in front, so far */ + pivrow [OUT] = row ; + rdeg [OUT] = deg ; + } + } + } + } + + /* We found a pivot if there are entries (even zero ones) in pivot col */ + ASSERT (IMPLIES (cdeg1 > 0, pivrow[IN] != EMPTY || pivrow[OUT] != EMPTY)) ; + + /* If there are no entries in the pivot column, then no pivot is found */ + ASSERT (IMPLIES (cdeg1 == 0, pivrow[IN] == EMPTY && pivrow[OUT] == EMPTY)) ; + + /* ---------------------------------------------------------------------- */ + /* check for singular matrix */ + /* ---------------------------------------------------------------------- */ + + if (cdeg1 == 0) + { + if (fnrows > 0) + { + /* + Get the pivrow [OUT][IN] from the current front. + The frontal matrix looks like this: + + pivcol[OUT] + | + v + x x x x 0 <- so grab this row as the pivrow [OUT][IN]. + x x x x 0 + x x x x 0 + 0 0 0 0 0 + + The current frontal matrix has some rows in it. The degree + of the pivcol[OUT] is zero. The column is empty, and the + current front does not contribute to it. + + */ + pivrow [IN] = Work->Frows [0] ; + DEBUGm4 (("Got zero pivrow[OUT][IN] "ID" from current front\n", + pivrow [IN])) ; + } + else + { + + /* + Get a pivot row from the row-merge tree, use as + pivrow [OUT][OUT]. pivrow [IN] remains EMPTY. + This can only happen if the current front is 0-by-0. + */ + + Int *Front_leftmostdesc, *Front_1strow, *Front_new1strow, row1, + row2, fleftmost, nfr, n_row, frontid ; + + ASSERT (Work->fncols == 0) ; + + Front_leftmostdesc = Symbolic->Front_leftmostdesc ; + Front_1strow = Symbolic->Front_1strow ; + Front_new1strow = Work->Front_new1strow ; + nfr = Symbolic->nfr ; + n_row = Numeric->n_row ; + frontid = Work->frontid ; + + DEBUGm4 (("Note: pivcol: "ID" is empty front "ID"\n", + pivcol, frontid)) ; +#ifndef NDEBUG + DEBUG1 (("Calling dump rowmerge\n")) ; + UMF_dump_rowmerge (Numeric, Symbolic, Work) ; +#endif + + /* Row-merge set is the non-pivotal rows in the range */ + /* Front_new1strow [Front_leftmostdesc [frontid]] to */ + /* Front_1strow [frontid+1] - 1. */ + /* If this is empty, then use the empty rows, in the range */ + /* Front_new1strow [nfr] to n_row-1. */ + /* If this too is empty, then pivrow [OUT] will be empty. */ + /* In both cases, update Front_new1strow [...]. */ + + fleftmost = Front_leftmostdesc [frontid] ; + row1 = Front_new1strow [fleftmost] ; + row2 = Front_1strow [frontid+1] - 1 ; + DEBUG1 (("Leftmost: "ID" Rows ["ID" to "ID"] srch ["ID" to "ID"]\n", + fleftmost, Front_1strow [frontid], row2, row1, row2)) ; + + /* look in the range row1 ... row2 */ + for (row = row1 ; row <= row2 ; row++) + { + DEBUG3 ((" Row: "ID"\n", row)) ; + if (NON_PIVOTAL_ROW (row)) + { + /* found it */ + DEBUG3 ((" Row: "ID" found\n", row)) ; + ASSERT (Frpos [row] == EMPTY) ; + pivrow [OUT] = row ; + DEBUGm4 (("got row merge pivrow %d\n", pivrow [OUT])) ; + break ; + } + } + Front_new1strow [fleftmost] = row ; + + if (pivrow [OUT] == EMPTY) + { + /* not found, look in empty row set in "dummy" front */ + row1 = Front_new1strow [nfr] ; + row2 = n_row-1 ; + DEBUG3 (("Empty: "ID" Rows ["ID" to "ID"] srch["ID" to "ID"]\n", + nfr, Front_1strow [nfr], row2, row1, row2)) ; + + /* look in the range row1 ... row2 */ + for (row = row1 ; row <= row2 ; row++) + { + DEBUG3 ((" Empty Row: "ID"\n", row)) ; + if (NON_PIVOTAL_ROW (row)) + { + /* found it */ + DEBUG3 ((" Empty Row: "ID" found\n", row)) ; + ASSERT (Frpos [row] == EMPTY) ; + pivrow [OUT] = row ; + DEBUGm4 (("got dummy row pivrow %d\n", pivrow [OUT])) ; + break ; + } + } + Front_new1strow [nfr] = row ; + } + + if (pivrow [OUT] == EMPTY) + { + /* Row-merge set is empty. We can just discard */ + /* the candidate pivot column. */ + DEBUG0 (("Note: row-merge set empty\n")) ; + DEBUGm4 (("got no pivrow \n")) ; + return (UMFPACK_WARNING_singular_matrix) ; + } + } + } + + /* ---------------------------------------------------------------------- */ + /* construct the candidate row in the front, if any */ + /* ---------------------------------------------------------------------- */ + +#ifndef NDEBUG + /* check Wrp */ + ASSERT (Work->Wrpflag > 0) ; + if (UMF_debug > 0 || Work->n_col < 1000) + { + for (i = 0 ; i < Work->n_col ; i++) + { + ASSERT (Wrp [i] < Work->Wrpflag) ; + } + } +#endif + +#ifndef NDEBUG + DEBUG4 (("pivrow [IN]: "ID"\n", pivrow [IN])) ; + UMF_dump_rowcol (0, Numeric, Work, pivrow [IN], TRUE) ; +#endif + + if (pivrow [IN] != EMPTY) + { + + /* the row merge candidate row is not pivrow [IN] */ + freebie [IN] = (pivrow [IN] == prior_pivrow [IN]) && (cdeg1 > 0) ; + ASSERT (cdeg1 >= 0) ; + + if (!freebie [IN]) + { + /* include current front in the degree of this row */ + + Fcpos = Work->Fcpos ; + fncols = Work->fncols ; + + Wrpflag = Work->Wrpflag ; + + /* -------------------------------------------------------------- */ + /* construct the pattern of the IN row */ + /* -------------------------------------------------------------- */ + +#ifndef NDEBUG + /* check Fcols */ + DEBUG5 (("ROW ASSEMBLE: rdeg "ID"\nREDUCE ROW "ID"\n", + fncols, pivrow [IN])) ; + for (j = 0 ; j < fncols ; j++) + { + col = Work->Fcols [j] ; + ASSERT (col >= 0 && col < Work->n_col) ; + ASSERT (Fcpos [col] >= 0) ; + } + if (UMF_debug > 0 || Work->n_col < 1000) + { + Int cnt = fncols ; + for (col = 0 ; col < Work->n_col ; col++) + { + if (Fcpos [col] < 0) cnt++ ; + } + ASSERT (cnt == Work->n_col) ; + } +#endif + + rdeg [IN] = fncols ; + + ASSERT (pivrow [IN] >= 0 && pivrow [IN] < Work->n_row) ; + ASSERT (NON_PIVOTAL_ROW (pivrow [IN])) ; + + /* add the pivot column itself */ + ASSERT (Wrp [pivcol] != Wrpflag) ; + if (Fcpos [pivcol] < 0) + { + DEBUG3 (("Adding pivot col to pivrow [IN] pattern\n")) ; + if (rdeg [IN] >= max_rdeg) + { + /* :: pattern change (in) :: */ + return (UMFPACK_ERROR_different_pattern) ; + } + Wrp [pivcol] = Wrpflag ; + W_i [rdeg [IN]++] = pivcol ; + } + + tpi = Row_tuples [pivrow [IN]] ; + if (tpi) + { + tp = (Tuple *) (Memory + tpi) ; + tp1 = tp ; + tp2 = tp ; + tpend = tp + Row_tlen [pivrow [IN]] ; + for ( ; tp < tpend ; tp++) + { + e = tp->e ; + ASSERT (e > 0 && e <= Work->nel) ; + if (!E [e]) + { + continue ; /* element already deallocated */ + } + f = tp->f ; + p = Memory + E [e] ; + ep = (Element *) p ; + p += UNITS (Element, 1) ; + Cols = (Int *) p ; + ncols = ep->ncols ; + Rows = Cols + ncols ; + if (Rows [f] == EMPTY) + { + continue ; /* row already assembled */ + } + ASSERT (pivrow [IN] == Rows [f]) ; + + for (j = 0 ; j < ncols ; j++) + { + col = Cols [j] ; + ASSERT (col >= EMPTY && col < Work->n_col) ; + if ((col >= 0) && (Wrp [col] != Wrpflag) + && Fcpos [col] <0) + { + ASSERT (NON_PIVOTAL_COL (col)) ; + if (rdeg [IN] >= max_rdeg) + { + /* :: pattern change (rdeg in failure) :: */ + DEBUGm4 (("rdeg [IN] >= max_rdeg failure\n")) ; + return (UMFPACK_ERROR_different_pattern) ; + } + Wrp [col] = Wrpflag ; + W_i [rdeg [IN]++] = col ; + } + } + + *tp2++ = *tp ; /* leave the tuple in the list */ + } + Row_tlen [pivrow [IN]] = tp2 - tp1 ; + } + +#ifndef NDEBUG + DEBUG4 (("Reduced IN row:\n")) ; + for (j = 0 ; j < fncols ; j++) + { + DEBUG6 ((" "ID" "ID" "ID"\n", + j, Work->Fcols [j], Fcpos [Work->Fcols [j]])) ; + ASSERT (Fcpos [Work->Fcols [j]] >= 0) ; + } + for (j = fncols ; j < rdeg [IN] ; j++) + { + DEBUG6 ((" "ID" "ID" "ID"\n", j, W_i [j], Wrp [W_i [j]])); + ASSERT (W_i [j] >= 0 && W_i [j] < Work->n_col) ; + ASSERT (Wrp [W_i [j]] == Wrpflag) ; + } + /* mark the end of the pattern in case we scan it by mistake */ + /* Note that this means W_i must be of size >= fncols_max + 1 */ + W_i [rdeg [IN]] = EMPTY ; +#endif + + /* rdeg [IN] is now the exact degree of the IN row */ + + /* clear Work->Wrp. */ + Work->Wrpflag++ ; + /* All Wrp [0..n_col] is now < Wrpflag */ + } + } + +#ifndef NDEBUG + /* check Wrp */ + if (UMF_debug > 0 || Work->n_col < 1000) + { + for (i = 0 ; i < Work->n_col ; i++) + { + ASSERT (Wrp [i] < Work->Wrpflag) ; + } + } +#endif + + /* ---------------------------------------------------------------------- */ + /* construct the candidate row not in the front, if any */ + /* ---------------------------------------------------------------------- */ + +#ifndef NDEBUG + DEBUG4 (("pivrow [OUT]: "ID"\n", pivrow [OUT])) ; + UMF_dump_rowcol (0, Numeric, Work, pivrow [OUT], TRUE) ; +#endif + + /* If this is a candidate row from the row merge set, force it to be */ + /* scanned (ignore prior_pivrow [OUT]). */ + + if (pivrow [OUT] != EMPTY) + { + freebie [OUT] = (pivrow [OUT] == prior_pivrow [OUT]) && cdeg1 > 0 ; + ASSERT (cdeg1 >= 0) ; + + if (!freebie [OUT]) + { + + Wrpflag = Work->Wrpflag ; + + /* -------------------------------------------------------------- */ + /* construct the pattern of the row */ + /* -------------------------------------------------------------- */ + + rdeg [OUT] = 0 ; + + ASSERT (pivrow [OUT] >= 0 && pivrow [OUT] < Work->n_row) ; + ASSERT (NON_PIVOTAL_ROW (pivrow [OUT])) ; + + /* add the pivot column itself */ + ASSERT (Wrp [pivcol] != Wrpflag) ; + DEBUG3 (("Adding pivot col to pivrow [OUT] pattern\n")) ; + if (rdeg [OUT] >= max_rdeg) + { + /* :: pattern change (out) :: */ + return (UMFPACK_ERROR_different_pattern) ; + } + Wrp [pivcol] = Wrpflag ; + W_o [rdeg [OUT]++] = pivcol ; + + tpi = Row_tuples [pivrow [OUT]] ; + if (tpi) + { + tp = (Tuple *) (Memory + tpi) ; + tp1 = tp ; + tp2 = tp ; + tpend = tp + Row_tlen [pivrow [OUT]] ; + for ( ; tp < tpend ; tp++) + { + e = tp->e ; + ASSERT (e > 0 && e <= Work->nel) ; + if (!E [e]) + { + continue ; /* element already deallocated */ + } + f = tp->f ; + p = Memory + E [e] ; + ep = (Element *) p ; + p += UNITS (Element, 1) ; + Cols = (Int *) p ; + ncols = ep->ncols ; + Rows = Cols + ncols ; + if (Rows [f] == EMPTY) + { + continue ; /* row already assembled */ + } + ASSERT (pivrow [OUT] == Rows [f]) ; + + for (j = 0 ; j < ncols ; j++) + { + col = Cols [j] ; + ASSERT (col >= EMPTY && col < Work->n_col) ; + if ((col >= 0) && (Wrp [col] != Wrpflag)) + { + ASSERT (NON_PIVOTAL_COL (col)) ; + if (rdeg [OUT] >= max_rdeg) + { + /* :: pattern change (rdeg out failure) :: */ + DEBUGm4 (("rdeg [OUT] failure\n")) ; + return (UMFPACK_ERROR_different_pattern) ; + } + Wrp [col] = Wrpflag ; + W_o [rdeg [OUT]++] = col ; + } + } + *tp2++ = *tp ; /* leave the tuple in the list */ + } + Row_tlen [pivrow [OUT]] = tp2 - tp1 ; + } + +#ifndef NDEBUG + DEBUG4 (("Reduced row OUT:\n")) ; + for (j = 0 ; j < rdeg [OUT] ; j++) + { + DEBUG6 ((" "ID" "ID" "ID"\n", j, W_o [j], Wrp [W_o [j]])) ; + ASSERT (W_o [j] >= 0 && W_o [j] < Work->n_col) ; + ASSERT (Wrp [W_o [j]] == Wrpflag) ; + } + /* mark the end of the pattern in case we scan it by mistake */ + /* Note that this means W_o must be of size >= fncols_max + 1 */ + W_o [rdeg [OUT]] = EMPTY ; +#endif + + /* rdeg [OUT] is now the exact degree of the row */ + + /* clear Work->Wrp. */ + Work->Wrpflag++ ; + /* All Wrp [0..n] is now < Wrpflag */ + + } + + } + DEBUG5 (("Row_search end ] \n")) ; + +#ifndef NDEBUG + /* check Wrp */ + if (UMF_debug > 0 || Work->n_col < 1000) + { + for (i = 0 ; i < Work->n_col ; i++) + { + ASSERT (Wrp [i] < Work->Wrpflag) ; + } + } +#endif + + return (UMFPACK_OK) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_row_search.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_row_search.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,32 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL Int UMF_row_search +( + NumericType *Numeric, + WorkType *Work, + SymbolicType *Symbolic, + Int cdeg0, + Int cdeg1, + const Int Pattern [ ], + const Int Pos [ ], + Int pivrow [2], + Int rdeg [2], + Int W_i [ ], + Int W_o [ ], + Int prior_pivrow [2], + const Entry Wxy [ ], + Int pivcol, + Int freebie [2] +) ; + +#define IN 0 +#define OUT 1 + +#define IN_IN 0 +#define IN_OUT 1 +#define OUT_IN 2 +#define OUT_OUT 3 diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_scale.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_scale.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,127 @@ +/* ========================================================================== */ +/* === UMF_scale ============================================================ */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* Divide a vector of stride 1 by the pivot value. */ + +#include "umf_internal.h" + +GLOBAL void UMF_scale +( + Int n, + Entry pivot, + Entry X [ ] +) +{ + Entry x ; + double s ; + Int i ; + + /* ---------------------------------------------------------------------- */ + /* compute the approximate absolute value of the pivot, and select method */ + /* ---------------------------------------------------------------------- */ + + APPROX_ABS (s, pivot) ; + + if (s < RECIPROCAL_TOLERANCE || IS_NAN (pivot)) + { + /* ------------------------------------------------------------------ */ + /* tiny, or zero, pivot case */ + /* ------------------------------------------------------------------ */ + + /* The pivot is tiny, or NaN. Do not divide zero by the pivot value, + * and do not multiply by 1/pivot, either. */ + + for (i = 0 ; i < n ; i++) + { + /* X [i] /= pivot ; */ + x = X [i] ; + +#ifndef NO_DIVIDE_BY_ZERO + if (IS_NONZERO (x)) + { + DIV (X [i], x, pivot) ; + } +#else + /* Do not divide by zero */ + if (IS_NONZERO (x) && IS_NONZERO (pivot)) + { + DIV (X [i], x, pivot) ; + } +#endif + + } + + } + else + { + + /* ------------------------------------------------------------------ */ + /* normal case. select the x/pivot or x * (1/pivot) method */ + /* ------------------------------------------------------------------ */ + + /* The pivot is not tiny, and is not NaN. Don't bother to check for + * zeros in the pivot column, X. */ + +#if !defined (NRECIPROCAL) && !(defined (__GNUC__) && defined (COMPLEX)) + + /* -------------------------------------------------------------- */ + /* multiply x by (1/pivot) */ + /* -------------------------------------------------------------- */ + + /* Slightly less accurate, but faster. It allows the use of + * the level-1 BLAS dscal or zscal routine. This not used when + * UMFPACK is used in MATLAB (either as a built-in routine, or as + * a mexFunction). + * + * Using gcc version 3.2 can cause the following code to fail for + * some complex matrices (not all), with or without the BLAS. This + * was found in Red Hat Linux 7.3 on a Dell Latitude C840 with a + * Pentium 4M. Thus, this code is not used when gcc is used, for + * the complex case. + * + * It works just fine with Intel's icc compiler, version 7.0. + */ + + /* pivot = 1 / pivot */ + RECIPROCAL (pivot) ; + +#if defined (USE_NO_BLAS) + for (i = 0 ; i < n ; i++) + { + /* X [i] *= pivot ; */ + x = X [i] ; + MULT (X [i], x, pivot) ; + } +#else + BLAS_SCAL (n, pivot, X) ; +#endif + +#else + + /* -------------------------------------------------------------- */ + /* divide x by the pivot */ + /* -------------------------------------------------------------- */ + + /* This is slightly more accurate, particularly if the pivot column + * consists of only IEEE subnormals. Always do this if UMFPACK is + * being compiled as a built-in routine or mexFunction in MATLAB, + * or if gcc is being used with complex matrices. */ + + for (i = 0 ; i < n ; i++) + { + /* X [i] /= pivot ; */ + x = X [i] ; + DIV (X [i], x, pivot) ; + } + +#endif + + } +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_scale.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_scale.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,12 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL void UMF_scale +( + Int n, + Entry alpha, + Entry X [ ] +) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_scale_column.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_scale_column.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,433 @@ +/* ========================================================================== */ +/* === UMF_scale_column ===================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + Scale the current pivot column, move the pivot row and column into place, + and log the permutation. +*/ + +#include "umf_internal.h" +#include "umf_mem_free_tail_block.h" +#include "umf_scale.h" + +/* ========================================================================== */ +/* === shift_pivot_row ====================================================== */ +/* ========================================================================== */ + +/* Except for the BLAS, most of the time is typically spent in the following + * shift_pivot_row routine. It copies the pivot row into the U block, and + * then fills in the whole in the C block by shifting the last row of C into + * the row vacated by the pivot row. + */ + +PRIVATE void shift_pivot_row (Entry *Fd, Entry *Fs, Entry *Fe, Int len, Int d) +{ + Int j ; +#pragma ivdep + for (j = 0 ; j < len ; j++) + { + Fd [j] = Fs [j*d] ; + Fs [j*d] = Fe [j*d] ; + } +} + +/* ========================================================================== */ +/* === UMF_scale_column ===================================================== */ +/* ========================================================================== */ + +GLOBAL void UMF_scale_column +( + NumericType *Numeric, + WorkType *Work +) +{ + /* ---------------------------------------------------------------------- */ + /* local variables */ + /* ---------------------------------------------------------------------- */ + + Entry pivot_value ; + Entry *Fcol, *Flublock, *Flblock, *Fublock, *Fcblock ; + Int k, k1, fnr_curr, fnrows, fncols, *Frpos, *Fcpos, pivrow, pivcol, + *Frows, *Fcols, fnc_curr, fnpiv, *Row_tuples, nb, + *Col_tuples, *Rperm, *Cperm, fspos, col2, row2 ; +#ifndef NDEBUG + Int *Col_degree, *Row_degree ; +#endif + + /* ---------------------------------------------------------------------- */ + /* get parameters */ + /* ---------------------------------------------------------------------- */ + + fnrows = Work->fnrows ; + fncols = Work->fncols ; + fnpiv = Work->fnpiv ; + + /* ---------------------------------------------------------------------- */ + + Rperm = Numeric->Rperm ; + Cperm = Numeric->Cperm ; + + /* ---------------------------------------------------------------------- */ + + Flublock = Work->Flublock ; + Flblock = Work->Flblock ; + Fublock = Work->Fublock ; + Fcblock = Work->Fcblock ; + + fnr_curr = Work->fnr_curr ; + fnc_curr = Work->fnc_curr ; + Frpos = Work->Frpos ; + Fcpos = Work->Fcpos ; + Frows = Work->Frows ; + Fcols = Work->Fcols ; + pivrow = Work->pivrow ; + pivcol = Work->pivcol ; + + ASSERT (pivrow >= 0 && pivrow < Work->n_row) ; + ASSERT (pivcol >= 0 && pivcol < Work->n_col) ; + +#ifndef NDEBUG + Col_degree = Numeric->Cperm ; /* for NON_PIVOTAL_COL macro */ + Row_degree = Numeric->Rperm ; /* for NON_PIVOTAL_ROW macro */ +#endif + + Row_tuples = Numeric->Uip ; + Col_tuples = Numeric->Lip ; + nb = Work->nb ; + +#ifndef NDEBUG + ASSERT (fnrows == Work->fnrows_new + 1) ; + ASSERT (fncols == Work->fncols_new + 1) ; + DEBUG1 (("SCALE COL: fnrows "ID" fncols "ID"\n", fnrows, fncols)) ; + DEBUG2 (("\nFrontal matrix, including all space:\n" + "fnr_curr "ID" fnc_curr "ID" nb "ID"\n" + "fnrows "ID" fncols "ID" fnpiv "ID"\n", + fnr_curr, fnc_curr, nb, fnrows, fncols, fnpiv)) ; + DEBUG2 (("\nJust the active part:\n")) ; + DEBUG7 (("C block: ")) ; + UMF_dump_dense (Fcblock, fnr_curr, fnrows, fncols) ; + DEBUG7 (("L block: ")) ; + UMF_dump_dense (Flblock, fnr_curr, fnrows, fnpiv); + DEBUG7 (("U' block: ")) ; + UMF_dump_dense (Fublock, fnc_curr, fncols, fnpiv) ; + DEBUG7 (("LU block: ")) ; + UMF_dump_dense (Flublock, nb, fnpiv, fnpiv) ; +#endif + + /* ====================================================================== */ + /* === Shift pivot row and column ======================================= */ + /* ====================================================================== */ + + /* ---------------------------------------------------------------------- */ + /* move pivot column into place */ + /* ---------------------------------------------------------------------- */ + + /* Note that the pivot column is already in place. Just shift the last + * column into the position vacated by the pivot column. */ + + fspos = Fcpos [pivcol] ; + + /* one less column in the contribution block */ + fncols = --(Work->fncols) ; + + if (fspos != fncols * fnr_curr) + { + + Int fs = fspos / fnr_curr ; + + DEBUG6 (("Shift pivot column in front\n")) ; + DEBUG6 (("fspos: "ID" flpos: "ID"\n", fspos, fncols * fnr_curr)) ; + + /* ------------------------------------------------------------------ */ + /* move Fe => Fs */ + /* ------------------------------------------------------------------ */ + + /* column of the contribution block: */ + { + /* Fs: current position of pivot column in contribution block */ + /* Fe: position of last column in contribution block */ + Int i ; + Entry *Fs, *Fe ; + Fs = Fcblock + fspos ; + Fe = Fcblock + fncols * fnr_curr ; +#pragma ivdep + for (i = 0 ; i < fnrows ; i++) + { + Fs [i] = Fe [i] ; + } + } + + /* column of the U2 block */ + { + /* Fs: current position of pivot column in U block */ + /* Fe: last column in U block */ + Int i ; + Entry *Fs, *Fe ; + Fs = Fublock + fs ; + Fe = Fublock + fncols ; +#pragma ivdep + for (i = 0 ; i < fnpiv ; i++) + { + Fs [i * fnc_curr] = Fe [i * fnc_curr] ; + } + } + + /* move column Fe to Fs in the Fcols pattern */ + col2 = Fcols [fncols] ; + Fcols [fs] = col2 ; + Fcpos [col2] = fspos ; + } + + /* pivot column is no longer in the frontal matrix */ + Fcpos [pivcol] = EMPTY ; + +#ifndef NDEBUG + DEBUG2 (("\nFrontal matrix after col swap, including all space:\n" + "fnr_curr "ID" fnc_curr "ID" nb "ID"\n" + "fnrows "ID" fncols "ID" fnpiv "ID"\n", + fnr_curr, fnc_curr, nb, + fnrows, fncols, fnpiv)) ; + DEBUG2 (("\nJust the active part:\n")) ; + DEBUG7 (("C block: ")) ; + UMF_dump_dense (Fcblock, fnr_curr, fnrows, fncols) ; + DEBUG7 (("L block: ")) ; + UMF_dump_dense (Flblock, fnr_curr, fnrows, fnpiv+1); + DEBUG7 (("U' block: ")) ; + UMF_dump_dense (Fublock, fnc_curr, fncols, fnpiv) ; + DEBUG7 (("LU block: ")) ; + UMF_dump_dense (Flublock, nb, fnpiv, fnpiv+1) ; +#endif + + /* ---------------------------------------------------------------------- */ + /* move pivot row into place */ + /* ---------------------------------------------------------------------- */ + + fspos = Frpos [pivrow] ; + + /* one less row in the contribution block */ + fnrows = --(Work->fnrows) ; + + DEBUG6 (("Swap/shift pivot row in front:\n")) ; + DEBUG6 (("fspos: "ID" flpos: "ID"\n", fspos, fnrows)) ; + + if (fspos == fnrows) + { + + /* ------------------------------------------------------------------ */ + /* move Fs => Fd */ + /* ------------------------------------------------------------------ */ + + DEBUG6 (("row case 1\n")) ; + + /* row of the contribution block: */ + { + Int j ; + Entry *Fd, *Fs ; + Fd = Fublock + fnpiv * fnc_curr ; + Fs = Fcblock + fspos ; +#pragma ivdep + for (j = 0 ; j < fncols ; j++) + { + Fd [j] = Fs [j * fnr_curr] ; + } + } + + /* row of the L2 block: */ + if (Work->pivrow_in_front) + { + Int j ; + Entry *Fd, *Fs ; + Fd = Flublock + fnpiv ; + Fs = Flblock + fspos ; +#pragma ivdep + for (j = 0 ; j <= fnpiv ; j++) + { + Fd [j * nb] = Fs [j * fnr_curr] ; + } + } + else + { + Int j ; + Entry *Fd, *Fs ; + Fd = Flublock + fnpiv ; + Fs = Flblock + fspos ; +#pragma ivdep + for (j = 0 ; j < fnpiv ; j++) + { + ASSERT (IS_ZERO (Fs [j * fnr_curr])) ; + CLEAR (Fd [j * nb]) ; + } + Fd [fnpiv * nb] = Fs [fnpiv * fnr_curr] ; + } + } + else + { + + /* ------------------------------------------------------------------ */ + /* move Fs => Fd */ + /* move Fe => Fs */ + /* ------------------------------------------------------------------ */ + + DEBUG6 (("row case 2\n")) ; + /* this is the most common case, by far */ + + /* row of the contribution block: */ + { + /* Fd: destination of pivot row on U block */ + /* Fs: current position of pivot row in contribution block */ + /* Fe: position of last row in contribution block */ + Entry *Fd, *Fs, *Fe ; + Fd = Fublock + fnpiv * fnc_curr ; + Fs = Fcblock + fspos ; + Fe = Fcblock + fnrows ; + shift_pivot_row (Fd, Fs, Fe, fncols, fnr_curr) ; + } + + /* row of the L2 block: */ + if (Work->pivrow_in_front) + { + /* Fd: destination of pivot row in LU block */ + /* Fs: current position of pivot row in L block */ + /* Fe: last row in L block */ + Int j ; + Entry *Fd, *Fs, *Fe ; + Fd = Flublock + fnpiv ; + Fs = Flblock + fspos ; + Fe = Flblock + fnrows ; +#pragma ivdep + for (j = 0 ; j <= fnpiv ; j++) + { + Fd [j * nb] = Fs [j * fnr_curr] ; + Fs [j * fnr_curr] = Fe [j * fnr_curr] ; + } + } + else + { + Int j ; + Entry *Fd, *Fs, *Fe ; + Fd = Flublock + fnpiv ; + Fs = Flblock + fspos ; + Fe = Flblock + fnrows ; +#pragma ivdep + for (j = 0 ; j < fnpiv ; j++) + { + ASSERT (IS_ZERO (Fs [j * fnr_curr])) ; + CLEAR (Fd [j * nb]) ; + Fs [j * fnr_curr] = Fe [j * fnr_curr] ; + } + Fd [fnpiv * nb] = Fs [fnpiv * fnr_curr] ; + Fs [fnpiv * fnr_curr] = Fe [fnpiv * fnr_curr] ; + } + + /* move row Fe to Fs in the Frows pattern */ + row2 = Frows [fnrows] ; + Frows [fspos] = row2 ; + Frpos [row2] = fspos ; + + } + /* pivot row is no longer in the frontal matrix */ + Frpos [pivrow] = EMPTY ; + +#ifndef NDEBUG + DEBUG2 (("\nFrontal matrix after row swap, including all space:\n" + "fnr_curr "ID" fnc_curr "ID" nb "ID"\n" + "fnrows "ID" fncols "ID" fnpiv "ID"\n", + Work->fnr_curr, Work->fnc_curr, Work->nb, + Work->fnrows, Work->fncols, Work->fnpiv)) ; + DEBUG2 (("\nJust the active part:\n")) ; + DEBUG7 (("C block: ")) ; + UMF_dump_dense (Fcblock, fnr_curr, fnrows, fncols) ; + DEBUG7 (("L block: ")) ; + UMF_dump_dense (Flblock, fnr_curr, fnrows, fnpiv+1); + DEBUG7 (("U' block: ")) ; + UMF_dump_dense (Fublock, fnc_curr, fncols, fnpiv+1) ; + DEBUG7 (("LU block: ")) ; + UMF_dump_dense (Flublock, nb, fnpiv+1, fnpiv+1) ; +#endif + + /* ---------------------------------------------------------------------- */ + /* Frpos [row] >= 0 for each row in pivot column pattern. */ + /* offset into pattern is given by: */ + /* Frpos [row] == offset - 1 */ + /* Frpos [pivrow] is EMPTY */ + + /* Fcpos [col] >= 0 for each col in pivot row pattern. */ + /* Fcpos [col] == (offset - 1) * fnr_curr */ + /* Fcpos [pivcol] is EMPTY */ + + /* Fcols [0..fncols-1] is the pivot row pattern (excl pivot cols) */ + /* Frows [0..fnrows-1] is the pivot col pattern (excl pivot rows) */ + + /* ====================================================================== */ + /* === scale pivot column =============================================== */ + /* ====================================================================== */ + + /* pivot column (except for pivot entry itself) */ + Fcol = Flblock + fnpiv * fnr_curr ; + /* fnpiv-th pivot in frontal matrix located in Flublock (fnpiv, fnpiv) */ + pivot_value = Flublock [fnpiv + fnpiv * nb] ; + + /* this is the kth global pivot */ + k = Work->npiv + fnpiv ; + + DEBUG4 (("Pivot value: ")) ; + EDEBUG4 (pivot_value) ; + DEBUG4 (("\n")) ; + + UMF_scale (fnrows, pivot_value, Fcol) ; + + /* ---------------------------------------------------------------------- */ + /* deallocate the pivot row and pivot column tuples */ + /* ---------------------------------------------------------------------- */ + + UMF_mem_free_tail_block (Numeric, Row_tuples [pivrow]) ; + UMF_mem_free_tail_block (Numeric, Col_tuples [pivcol]) ; + + Row_tuples [pivrow] = 0 ; + Col_tuples [pivcol] = 0 ; + + DEBUG5 (("number of pivots prior to this one: "ID"\n", k)) ; + ASSERT (NON_PIVOTAL_ROW (pivrow)) ; + ASSERT (NON_PIVOTAL_COL (pivcol)) ; + + /* save row and column inverse permutation */ + k1 = ONES_COMPLEMENT (k) ; + Rperm [pivrow] = k1 ; /* aliased with Row_degree */ + Cperm [pivcol] = k1 ; /* aliased with Col_degree */ + + ASSERT (!NON_PIVOTAL_ROW (pivrow)) ; + ASSERT (!NON_PIVOTAL_COL (pivcol)) ; + + /* ---------------------------------------------------------------------- */ + /* Keep track of the pivot order. This is the kth pivot row and column. */ + /* ---------------------------------------------------------------------- */ + + /* keep track of pivot rows and columns in the LU, L, and U blocks */ + ASSERT (fnpiv < MAXNB) ; + Work->Pivrow [fnpiv] = pivrow ; + Work->Pivcol [fnpiv] = pivcol ; + + /* ====================================================================== */ + /* === one step in the factorization is done ============================ */ + /* ====================================================================== */ + + /* One more step is done, except for pending updates to the U and C blocks + * of this frontal matrix. Those are saved up, and applied by + * UMF_blas3_update when enough pivots have accumulated. Also, the + * LU factors for these pending pivots have not yet been stored. */ + + Work->fnpiv++ ; + +#ifndef NDEBUG + DEBUG7 (("Current frontal matrix: (after pivcol scale)\n")) ; + UMF_dump_current_front (Numeric, Work, TRUE) ; +#endif + +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_scale_column.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_scale_column.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,11 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL void UMF_scale_column +( + NumericType *Numeric, + WorkType *Work +) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_set_stats.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_set_stats.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,133 @@ +/* ========================================================================== */ +/* === UMF_set_stats ======================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + Sets statistics in Info array. Calculates everything in double precision, + rather than Int or size_t, so that usage estimates can be computed even if + the problem is so large that it would cause integer overflow. + + This routine has many double relop's, but the NaN case is ignored. +*/ + +#include "umf_internal.h" +#include "umf_symbolic_usage.h" + +GLOBAL void UMF_set_stats +( + double Info [ ], + SymbolicType *Symbolic, + double max_usage, /* peak size of Numeric->Memory, in Units */ + double num_mem_size, /* final size of Numeric->Memory, in Units */ + double flops, /* "true flops" */ + double lnz, /* nz in L */ + double unz, /* nz in U */ + double maxfrsize, /* largest front size */ + double ulen, /* size of Numeric->Upattern */ + double npiv, /* number of pivots found */ + double maxnrows, /* largest #rows in front */ + double maxncols, /* largest #cols in front */ + Int scale, /* true if scaling the rows of A */ + Int prefer_diagonal, /* true if diagonal pivoting (only square A) */ + Int what /* ESTIMATE or ACTUAL */ +) +{ + + double sym_size, work_usage, nn, n_row, n_col, n_inner, num_On_size1, + num_On_size2, num_usage, sym_maxncols, sym_maxnrows, elen, n1 ; + + n_col = Symbolic->n_col ; + n_row = Symbolic->n_row ; + n1 = Symbolic->n1 ; + nn = MAX (n_row, n_col) ; + n_inner = MIN (n_row, n_col) ; + sym_maxncols = MIN (Symbolic->maxncols + Symbolic->nb, n_col) ; + sym_maxnrows = MIN (Symbolic->maxnrows + Symbolic->nb, n_row) ; + elen = (n_col - n1) + (n_row - n1) + MIN (n_col - n1, n_row - n1) + 1 ; + + /* final Symbolic object size */ + sym_size = UMF_symbolic_usage (Symbolic->n_row, Symbolic->n_col, + Symbolic->nchains, Symbolic->nfr, Symbolic->esize, prefer_diagonal) ; + + /* size of O(n) part of Numeric object during factorization, */ + /* except Numeric->Memory and Numeric->Upattern */ + num_On_size1 = + DUNITS (NumericType, 1) /* Numeric structure */ + + DUNITS (Entry, n_inner+1) /* D */ + + 4 * DUNITS (Int, n_row+1) /* Rperm, Lpos, Uilen, Uip */ + + 4 * DUNITS (Int, n_col+1) /* Cperm, Upos, Lilen, Lip */ + + (scale ? DUNITS (Entry, n_row) : 0) ; /* Rs, row scale factors */ + + /* size of O(n) part of Numeric object after factorization, */ + /* except Numeric->Memory and Numeric->Upattern */ + num_On_size2 = + DUNITS (NumericType, 1) /* Numeric structure */ + + DUNITS (Entry, n_inner+1) /* D */ + + DUNITS (Int, n_row+1) /* Rperm */ + + DUNITS (Int, n_col+1) /* Cperm */ + + 6 * DUNITS (Int, npiv+1) /* Lpos, Uilen, Uip, Upos, Lilen, Lip */ + + (scale ? DUNITS (Entry, n_row) : 0) ; /* Rs, row scale factors */ + + DEBUG1 (("num O(n) size2: %g\n", num_On_size2)) ; + + /* peak size of Numeric->Memory, including LU factors, current frontal + * matrix, elements, and tuple lists. */ + Info [UMFPACK_VARIABLE_PEAK + what] = max_usage ; + + /* final size of Numeric->Memory (LU factors only) */ + Info [UMFPACK_VARIABLE_FINAL + what] = num_mem_size ; + + /* final size of Numeric object, including Numeric->Memory and ->Upattern */ + Info [UMFPACK_NUMERIC_SIZE + what] = + num_On_size2 + + num_mem_size /* final Numeric->Memory size */ + + DUNITS (Int, ulen+1) ;/* Numeric->Upattern (from Work->Upattern) */ + + DEBUG1 (("num mem size: %g\n", num_mem_size)) ; + DEBUG1 (("ulen units %g\n", DUNITS (Int, ulen))) ; + DEBUG1 (("numeric size %g\n", Info [UMFPACK_NUMERIC_SIZE + what])) ; + + /* largest front size (working array size, or actual size used) */ + Info [UMFPACK_MAX_FRONT_SIZE + what] = maxfrsize ; + Info [UMFPACK_MAX_FRONT_NROWS + what] = maxnrows ; + Info [UMFPACK_MAX_FRONT_NCOLS + what] = maxncols ; + DEBUGm4 (("maxnrows %g maxncols %g\n", maxnrows, maxncols)) ; + DEBUGm4 (("maxfrsize %g\n", maxfrsize)) ; + + /* UMF_kernel usage, from work_alloc routine in umf_kernel.c */ + work_usage = + /* Work-> arrays, except for current frontal matrix which is allocated + * inside Numeric->Memory. */ + 2 * DUNITS (Entry, sym_maxnrows + 1) /* Wx, Wy */ + + 2 * DUNITS (Int, n_row+1) /* Frpos, Lpattern */ + + 2 * DUNITS (Int, n_col+1) /* Fcpos, Upattern */ + + DUNITS (Int, nn + 1) /* Wp */ + + DUNITS (Int, MAX (n_col, sym_maxnrows) + 1) /* Wrp */ + + 2 * DUNITS (Int, sym_maxnrows + 1) /* Frows, Wm */ + + 3 * DUNITS (Int, sym_maxncols + 1) /* Fcols, Wio, Woi */ + + DUNITS (Int, MAX (sym_maxnrows, sym_maxncols) + 1) /* Woo */ + + DUNITS (Int, elen) /* E */ + + DUNITS (Int, Symbolic->nfr + 1) /* Front_new1strow */ + + ((n_row == n_col) ? (2 * DUNITS (Int, nn)) : 0) ; /* Diag map,imap */ + + /* Peak memory for just UMFPACK_numeric. */ + num_usage = + sym_size /* size of Symbolic object */ + + num_On_size1 /* O(n) part of Numeric object (excl. Upattern) */ + + work_usage /* Work-> arrays (including Upattern) */ + + max_usage ; /* peak size of Numeric->Memory */ + + /* peak memory usage for both UMFPACK_*symbolic and UMFPACK_numeric. */ + Info [UMFPACK_PEAK_MEMORY + what] = + MAX (Symbolic->peak_sym_usage, num_usage) ; + + Info [UMFPACK_FLOPS + what] = flops ; + Info [UMFPACK_LNZ + what] = lnz ; + Info [UMFPACK_UNZ + what] = unz ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_set_stats.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_set_stats.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,24 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL void UMF_set_stats +( + double Info [ ], + SymbolicType *Symbolic, + double max_usage, + double num_mem_size, + double flops, + double lnz, + double unz, + double maxfrsize, + double ulen, + double npiv, + double maxnrows, + double maxncols, + Int scale, + Int prefer_diagonal, + Int what +) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_singletons.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_singletons.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,915 @@ +/* ========================================================================== */ +/* === UMF_singletons ======================================================= */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* Find and order the row and column singletons of a matrix A. If there are + * row and column singletons, the output is a row and column permutation such + * that the matrix is in the following form: + * + * x x x x x x x x x + * 0 x x x x x x x x + * 0 0 x x x x x x x + * 0 0 0 x 0 0 0 0 0 + * 0 0 0 x x 0 0 0 0 + * 0 0 0 x x s s s s + * 0 0 0 x x s s s s + * 0 0 0 x x s s s s + * 0 0 0 x x s s s s + * + * The above example has 3 column singletons (the first three columns and + * their corresponding pivot rows) and 2 row singletons. The singletons are + * ordered first, because they have zero Markowitz cost. The LU factorization + * for these first five rows and columns is free - there is no work to do + * (except to scale the pivot columns for the 2 row singletons), and no + * fill-in occurs. * The remaining * submatrix (4-by-4 in the above example) + * has no rows or columns with degree one. It may have empty rows or columns. + * + * This algorithm does not perform a full permutation to block triangular + * form. If there are one or more singletons, then the matrix can be + * permuted to block triangular form, but UMFPACK does not perform the full + * BTF permutation (see also "dmperm" in MATLAB). + */ + +#include "umf_internal.h" + +#ifndef NDEBUG + +/* ========================================================================== */ +/* === debug routines ======================================================= */ +/* ========================================================================== */ + +/* Dump the singleton queue */ + +PRIVATE void dump_singletons +( + Int head, /* head of the queue */ + Int tail, /* tail of the queue */ + Int Next [ ], /* Next [i] is the next object after i */ + char *name, /* "row" or "col" */ + Int Deg [ ], /* Deg [i] is the degree of object i */ + Int n /* objects are in the range 0 to n-1 */ +) +{ + Int i, next, cnt ; + DEBUG6 (("%s Singleton list: head "ID" tail "ID"\n", name, head, tail)) ; + i = head ; + ASSERT (head >= EMPTY && head < n) ; + ASSERT (tail >= EMPTY && tail < n) ; + cnt = 0 ; + while (i != EMPTY) + { + DEBUG7 ((" "ID": "ID" deg: "ID"\n", cnt, i, Deg [i])) ; + ASSERT (i >= 0 && i < n) ; + next = Next [i] ; + if (i == tail) ASSERT (next == EMPTY) ; + i = next ; + cnt++ ; + ASSERT (cnt <= n) ; + } +} + +PRIVATE void dump_mat +( + char *xname, + char *yname, + Int nx, + Int ny, + const Int Xp [ ], + const Int Xi [ ], + Int Xdeg [ ], + Int Ydeg [ ] +) +{ + Int x, y, p, p1, p2, xdeg, do_xdeg, ydeg ; + DEBUG6 (("\n ==== Dump %s mat:\n", xname)) ; + for (x = 0 ; x < nx ; x++) + { + p1 = Xp [x] ; + p2 = Xp [x+1] ; + xdeg = Xdeg [x] ; + DEBUG6 (("Dump %s "ID" p1 "ID" p2 "ID" deg "ID"\n", + xname, x, p1, p2, xdeg)) ; + do_xdeg = (xdeg >= 0) ; + for (p = p1 ; p < p2 ; p++) + { + y = Xi [p] ; + DEBUG7 ((" %s "ID" deg: ", yname, y)) ; + ASSERT (y >= 0 && y < ny) ; + ydeg = Ydeg [y] ; + DEBUG7 ((ID"\n", ydeg)) ; + if (do_xdeg && ydeg >= 0) + { + xdeg-- ; + } + } + ASSERT (IMPLIES (do_xdeg, xdeg == 0)) ; + } +} +#endif + +/* ========================================================================== */ +/* === create_row_form ====================================================== */ +/* ========================================================================== */ + +/* Create the row-form R of the column-form input matrix A. This could be done + * by UMF_transpose, except that Rdeg has already been computed. + */ + +PRIVATE void create_row_form +( + /* input, not modified: */ + Int n_row, /* A is n_row-by-n_col, nz = Ap [n_col] */ + Int n_col, + const Int Ap [ ], /* Ap [0..n_col]: column pointers for A */ + const Int Ai [ ], /* Ai [0..nz-1]: row indices for A */ + Int Rdeg [ ], /* Rdeg [0..n_row-1]: row degrees */ + + /* output, not defined on input: */ + Int Rp [ ], /* Rp [0..n_row]: row pointers for R */ + Int Ri [ ], /* Ri [0..nz-1]: column indices for R */ + + /* workspace, not defined on input or output */ + Int W [ ] /* size n_row */ +) +{ + Int row, col, p, p2 ; + + /* create the row pointers */ + Rp [0] = 0 ; + W [0] = 0 ; + for (row = 0 ; row < n_row ; row++) + { + Rp [row+1] = Rp [row] + Rdeg [row] ; + W [row] = Rp [row] ; + } + + /* create the indices for the row-form */ + for (col = 0 ; col < n_col ; col++) + { + p2 = Ap [col+1] ; + for (p = Ap [col] ; p < p2 ; p++) + { + Ri [W [Ai [p]]++] = col ; + } + } +} + +/* ========================================================================== */ +/* === order_singletons ===================================================== */ +/* ========================================================================== */ + +PRIVATE int order_singletons /* return new number of singletons */ +( + Int k, /* the number of singletons so far */ + Int head, + Int tail, + Int Next [ ], + Int Xdeg [ ], Int Xperm [ ], const Int Xp [ ], const Int Xi [ ], + Int Ydeg [ ], Int Yperm [ ], const Int Yp [ ], const Int Yi [ ] +#ifndef NDEBUG + , char *xname, char *yname, Int nx, Int ny +#endif +) +{ + Int xpivot, x, y, ypivot, p, p2, deg ; + +#ifndef NDEBUG + Int i, k1 = k ; + dump_singletons (head, tail, Next, xname, Xdeg, nx) ; + dump_mat (xname, yname, nx, ny, Xp, Xi, Xdeg, Ydeg) ; + dump_mat (yname, xname, ny, nx, Yp, Yi, Ydeg, Xdeg) ; +#endif + + while (head != EMPTY) + { + /* remove the singleton at the head of the queue */ + xpivot = head ; + DEBUG1 (("------ Order %s singleton: "ID"\n", xname, xpivot)) ; + head = Next [xpivot] ; + if (head == EMPTY) tail = EMPTY ; + +#ifndef NDEBUG + if (k % 100 == 0) dump_singletons (head, tail, Next, xname, Xdeg, nx) ; +#endif + + ASSERT (Xdeg [xpivot] >= 0) ; + if (Xdeg [xpivot] != 1) + { + /* This row/column x is empty. The matrix is singular. + * x will be ordered last in Xperm. */ + DEBUG1 (("empty %s, after singletons removed\n", xname)) ; + continue ; + } + + /* find the ypivot to match with this xpivot */ +#ifndef NDEBUG + /* there can only be one ypivot, since the degree of x is 1 */ + deg = 0 ; + p2 = Xp [xpivot+1] ; + for (p = Xp [xpivot] ; p < p2 ; p++) + { + y = Xi [p] ; + DEBUG1 (("%s: "ID"\n", yname, y)) ; + if (Ydeg [y] >= 0) + { + /* this is a live index in this xpivot vector */ + deg++ ; + } + } + ASSERT (deg == 1) ; +#endif + + ypivot = EMPTY ; + p2 = Xp [xpivot+1] ; + for (p = Xp [xpivot] ; p < p2 ; p++) + { + y = Xi [p] ; + DEBUG1 (("%s: "ID"\n", yname, y)) ; + if (Ydeg [y] >= 0) + { + /* this is a live index in this xpivot vector */ + ypivot = y ; + break ; + } + } + + DEBUG1 (("Pivot %s: "ID"\n", yname, ypivot)) ; + ASSERT (ypivot != EMPTY) ; + DEBUG1 (("deg "ID"\n", Ydeg [ypivot])) ; + ASSERT (Ydeg [ypivot] >= 0) ; + + /* decrement the degrees after removing this singleton */ + DEBUG1 (("p1 "ID"\n", Yp [ypivot])) ; + DEBUG1 (("p2 "ID"\n", Yp [ypivot+1])) ; + p2 = Yp [ypivot+1] ; + for (p = Yp [ypivot] ; p < p2 ; p++) + { + x = Yi [p] ; + DEBUG1 ((" %s: "ID" deg: "ID"\n", xname, x, Xdeg [x])) ; + if (Xdeg [x] < 0) continue ; + ASSERT (Xdeg [x] > 0) ; + if (x == xpivot) continue ; + deg = --(Xdeg [x]) ; + ASSERT (Xdeg [x] >= 0) ; + if (deg == 1) + { + /* this is a new singleton, put at the end of the queue */ + Next [x] = EMPTY ; + if (head == EMPTY) + { + head = x ; + } + else + { + ASSERT (tail != EMPTY) ; + Next [tail] = x ; + } + tail = x ; + DEBUG1 ((" New %s singleton: "ID"\n", xname, x)) ; +#ifndef NDEBUG + if (k % 100 == 0) + { + dump_singletons (head, tail, Next, xname, Xdeg, nx) ; + } +#endif + } + } + + /* flag the xpivot and ypivot by FLIP'ing the degrees */ + Xdeg [xpivot] = FLIP (1) ; + Ydeg [ypivot] = FLIP (Ydeg [ypivot]) ; + + /* keep track of the pivot row and column */ + Xperm [k] = xpivot ; + Yperm [k] = ypivot ; + k++ ; + +#ifndef NDEBUG + if (k % 1000 == 0) + { + dump_mat (xname, yname, nx, ny, Xp, Xi, Xdeg, Ydeg) ; + dump_mat (yname, xname, ny, nx, Yp, Yi, Ydeg, Xdeg) ; + } +#endif + } + +#ifndef NDEBUG + DEBUGm4 (("%s singletons: k = "ID"\n", xname, k)) ; + for (i = k1 ; i < k ; i++) + { + DEBUG1 ((" %s: "ID" %s: "ID"\n", xname, Xperm [i], yname, Yperm [i])) ; + } + ASSERT (k > 0) ; +#endif + + return (k) ; +} + +/* ========================================================================== */ +/* === find_any_singletons ================================================== */ +/* ========================================================================== */ + +PRIVATE Int find_any_singletons /* returns # of singletons found */ +( + /* input, not modified: */ + Int n_row, + Int n_col, + const Int Ap [ ], /* size n_col+1 */ + const Int Ai [ ], /* size nz = Ap [n_col] */ + + /* input, modified on output: */ + Int Cdeg [ ], /* size n_col */ + Int Rdeg [ ], /* size n_row */ + + /* output, not defined on input: */ + Int Cperm [ ], /* size n_col */ + Int Rperm [ ], /* size n_row */ + Int *p_n1r, /* # of row singletons */ + Int *p_n1c, /* # of col singletons */ + + /* workspace, not defined on input or output */ + Int Rp [ ], /* size n_row+1 */ + Int Ri [ ], /* size nz */ + Int W [ ], /* size n_row */ + Int Next [ ] /* size MAX (n_row, n_col) */ +) +{ + Int n1, col, row, row_form, head, tail, n1r, n1c ; + + /* ---------------------------------------------------------------------- */ + /* eliminate column singletons */ + /* ---------------------------------------------------------------------- */ + + n1 = 0 ; + n1r = 0 ; + n1c = 0 ; + row_form = FALSE ; + + head = EMPTY ; + tail = EMPTY ; + for (col = n_col-1 ; col >= 0 ; col--) + { + if (Cdeg [col] == 1) + { + /* put the column singleton in the queue */ + if (head == EMPTY) tail = col ; + Next [col] = head ; + head = col ; + DEBUG1 (("Column singleton: "ID"\n", col)) ; + } + } + + if (head != EMPTY) + { + + /* ------------------------------------------------------------------ */ + /* create the row-form of A */ + /* ------------------------------------------------------------------ */ + + create_row_form (n_row, n_col, Ap, Ai, Rdeg, Rp, Ri, W) ; + row_form = TRUE ; + + /* ------------------------------------------------------------------ */ + /* find and order the column singletons */ + /* ------------------------------------------------------------------ */ + + n1 = order_singletons (0, head, tail, Next, + Cdeg, Cperm, Ap, Ai, + Rdeg, Rperm, Rp, Ri +#ifndef NDEBUG + , "col", "row", n_col, n_row +#endif + ) ; + n1c = n1 ; + } + + /* ---------------------------------------------------------------------- */ + /* eliminate row singletons */ + /* ---------------------------------------------------------------------- */ + + head = EMPTY ; + tail = EMPTY ; + for (row = n_row-1 ; row >= 0 ; row--) + { + if (Rdeg [row] == 1) + { + /* put the row singleton in the queue */ + if (head == EMPTY) tail = row ; + Next [row] = head ; + head = row ; + DEBUG1 (("Row singleton: "ID"\n", row)) ; + } + } + + if (head != EMPTY) + { + + /* ------------------------------------------------------------------ */ + /* create the row-form of A, if not already created */ + /* ------------------------------------------------------------------ */ + + if (!row_form) + { + create_row_form (n_row, n_col, Ap, Ai, Rdeg, Rp, Ri, W) ; + } + + /* ------------------------------------------------------------------ */ + /* find and order the row singletons */ + /* ------------------------------------------------------------------ */ + + n1 = order_singletons (n1, head, tail, Next, + Rdeg, Rperm, Rp, Ri, + Cdeg, Cperm, Ap, Ai +#ifndef NDEBUG + , "row", "col", n_row, n_col +#endif + ) ; + n1r = n1 - n1c ; + } + + DEBUG0 (("n1 "ID"\n", n1)) ; + *p_n1r = n1r ; + *p_n1c = n1c ; + return (n1) ; +} + +/* ========================================================================== */ +/* === find_user_singletons ================================================= */ +/* ========================================================================== */ + +PRIVATE Int find_user_singletons /* returns # singletons found */ +( + /* input, not modified: */ + Int n_row, + Int n_col, + const Int Ap [ ], /* size n_col+1 */ + const Int Ai [ ], /* size nz = Ap [n_col] */ + const Int Quser [ ], /* size n_col if present */ + + /* input, modified on output: */ + Int Cdeg [ ], /* size n_col */ + Int Rdeg [ ], /* size n_row */ + + /* output, not defined on input */ + Int Cperm [ ], /* size n_col */ + Int Rperm [ ], /* size n_row */ + Int *p_n1r, /* # of row singletons */ + Int *p_n1c, /* # of col singletons */ + + /* workspace, not defined on input or output */ + Int Rp [ ], /* size n_row+1 */ + Int Ri [ ], /* size nz */ + Int W [ ] /* size n_row */ +) +{ + Int n1, col, row, p, p2, pivcol, pivrow, found, k, n1r, n1c ; + + n1 = 0 ; + n1r = 0 ; + n1c = 0 ; + *p_n1r = 0 ; + *p_n1c = 0 ; + + /* find singletons in the user column permutation, Quser */ + pivcol = Quser [0] ; + found = (Cdeg [pivcol] == 1) ; + DEBUG0 (("Is first col: "ID" a col singleton?: "ID"\n", pivcol, found)) ; + if (!found) + { + /* the first column is not a column singleton, check for a row + * singleton in the first column. */ + for (p = Ap [pivcol] ; p < Ap [pivcol+1] ; p++) + { + if (Rdeg [Ai [p]] == 1) + { + DEBUG0 (("Row singleton in first col: "ID" row: "ID"\n", + pivcol, Ai [p])) ; + found = TRUE ; + break ; + } + } + } + + if (!found) + { + /* no singletons in the leading part of A (:,Quser) */ + return (0) ; + } + + /* there is at least one row or column singleton. Look for more. */ + create_row_form (n_row, n_col, Ap, Ai, Rdeg, Rp, Ri, W) ; + + n1 = 0 ; + + for (k = 0 ; k < n_col ; k++) + { + pivcol = Quser [k] ; + pivrow = EMPTY ; + + /* ------------------------------------------------------------------ */ + /* check if col is a column singleton, or contains a row singleton */ + /* ------------------------------------------------------------------ */ + + found = (Cdeg [pivcol] == 1) ; + + if (found) + { + + /* -------------------------------------------------------------- */ + /* pivcol is a column singleton */ + /* -------------------------------------------------------------- */ + + DEBUG0 (("Found a col singleton: k "ID" pivcol "ID"\n", k, pivcol)); + + /* find the pivrow to match with this pivcol */ +#ifndef NDEBUG + /* there can only be one pivrow, since the degree of pivcol is 1 */ + { + Int deg = 0 ; + p2 = Ap [pivcol+1] ; + for (p = Ap [pivcol] ; p < p2 ; p++) + { + row = Ai [p] ; + DEBUG1 (("row: "ID"\n", row)) ; + if (Rdeg [row] >= 0) + { + /* this is a live index in this column vector */ + deg++ ; + } + } + ASSERT (deg == 1) ; + } +#endif + + p2 = Ap [pivcol+1] ; + for (p = Ap [pivcol] ; p < p2 ; p++) + { + row = Ai [p] ; + DEBUG1 (("row: "ID"\n", row)) ; + if (Rdeg [row] >= 0) + { + /* this is a live index in this pivcol vector */ + pivrow = row ; + break ; + } + } + + DEBUG1 (("Pivot row: "ID"\n", pivrow)) ; + ASSERT (pivrow != EMPTY) ; + DEBUG1 (("deg "ID"\n", Rdeg [pivrow])) ; + ASSERT (Rdeg [pivrow] >= 0) ; + + /* decrement the degrees after removing this col singleton */ + DEBUG1 (("p1 "ID"\n", Rp [pivrow])) ; + DEBUG1 (("p2 "ID"\n", Rp [pivrow+1])) ; + p2 = Rp [pivrow+1] ; + for (p = Rp [pivrow] ; p < p2 ; p++) + { + col = Ri [p] ; + DEBUG1 ((" col: "ID" deg: "ID"\n", col, Cdeg [col])) ; + if (Cdeg [col] < 0) continue ; + ASSERT (Cdeg [col] > 0) ; + Cdeg [col]-- ; + ASSERT (Cdeg [col] >= 0) ; + } + + /* flag the pivcol and pivrow by FLIP'ing the degrees */ + Cdeg [pivcol] = FLIP (1) ; + Rdeg [pivrow] = FLIP (Rdeg [pivrow]) ; + n1c++ ; + + } + else + { + + /* -------------------------------------------------------------- */ + /* pivcol may contain a row singleton */ + /* -------------------------------------------------------------- */ + + p2 = Ap [pivcol+1] ; + for (p = Ap [pivcol] ; p < p2 ; p++) + { + pivrow = Ai [p] ; + if (Rdeg [pivrow] == 1) + { + DEBUG0 (("Row singleton in pivcol: "ID" row: "ID"\n", + pivcol, pivrow)) ; + found = TRUE ; + break ; + } + } + + if (!found) + { + DEBUG0 (("End of user singletons\n")) ; + break ; + } + +#ifndef NDEBUG + /* there can only be one pivrow, since the degree of pivcol is 1 */ + { + Int deg = 0 ; + p2 = Rp [pivrow+1] ; + for (p = Rp [pivrow] ; p < p2 ; p++) + { + col = Ri [p] ; + DEBUG1 (("col: "ID" cdeg::: "ID"\n", col, Cdeg [col])) ; + if (Cdeg [col] >= 0) + { + /* this is a live index in this column vector */ + ASSERT (col == pivcol) ; + deg++ ; + } + } + ASSERT (deg == 1) ; + } +#endif + + DEBUG1 (("Pivot row: "ID"\n", pivrow)) ; + DEBUG1 (("pivcol deg "ID"\n", Cdeg [pivcol])) ; + ASSERT (Cdeg [pivcol] > 1) ; + + /* decrement the degrees after removing this row singleton */ + DEBUG1 (("p1 "ID"\n", Ap [pivcol])) ; + DEBUG1 (("p2 "ID"\n", Ap [pivcol+1])) ; + p2 = Ap [pivcol+1] ; + for (p = Ap [pivcol] ; p < p2 ; p++) + { + row = Ai [p] ; + DEBUG1 ((" row: "ID" deg: "ID"\n", row, Rdeg [row])) ; + if (Rdeg [row] < 0) continue ; + ASSERT (Rdeg [row] > 0) ; + Rdeg [row]-- ; + ASSERT (Rdeg [row] >= 0) ; + } + + /* flag the pivcol and pivrow by FLIP'ing the degrees */ + Cdeg [pivcol] = FLIP (Cdeg [pivcol]) ; + Rdeg [pivrow] = FLIP (1) ; + n1r++ ; + } + + /* keep track of the pivot row and column */ + Cperm [k] = pivcol ; + Rperm [k] = pivrow ; + n1++ ; + +#ifndef NDEBUG + dump_mat ("col", "row", n_col, n_row, Ap, Ai, Cdeg, Rdeg) ; + dump_mat ("row", "col", n_row, n_col, Rp, Ri, Rdeg, Cdeg) ; +#endif + + } + + DEBUGm4 (("User singletons found: "ID"\n", n1)) ; + ASSERT (n1 > 0) ; + + *p_n1r = n1r ; + *p_n1c = n1c ; + return (n1) ; +} + +/* ========================================================================== */ +/* === finish_permutation =================================================== */ +/* ========================================================================== */ + +/* Complete the permutation for the pruned submatrix. The singletons are + * already ordered, but remove their flags. Place rows/columns that are empty + * in the pruned submatrix at the end of the output permutation. This can only + * occur if the matrix is singular. + */ + +PRIVATE Int finish_permutation +( + Int n1, + Int nx, + Int Xdeg [ ], + const Int Xuser [ ], + Int Xperm [ ], + Int *p_max_deg +) +{ + Int nempty, x, deg, s, max_deg, k ; + nempty = 0 ; + s = n1 ; + max_deg = 0 ; + DEBUG0 (("n1 "ID" nempty "ID"\n", n1, nempty)) ; + for (k = 0 ; k < nx ; k++) + { + x = (Xuser != (Int *) NULL) ? Xuser [k] : k ; + DEBUG0 (("finish perm k "ID" x "ID" nx "ID"\n", k, x, nx)) ; + deg = Xdeg [x] ; + if (deg == 0) + { + /* this row/col is empty in the pruned submatrix */ + ASSERT (s < nx - nempty) ; + DEBUG0 (("empty k "ID"\n", k)) ; + nempty++ ; + Xperm [nx - nempty] = x ; + } + else if (deg > 0) + { + /* this row/col is nonempty in the pruned submatrix */ + ASSERT (s < nx - nempty) ; + Xperm [s++] = x ; + max_deg = MAX (max_deg, deg) ; + } + else + { + /* This is a singleton row/column - it is already ordered. + * Just clear the flag. */ + Xdeg [x] = FLIP (deg) ; + } + } + ASSERT (s == nx - nempty) ; + *p_max_deg = max_deg ; + return (nempty) ; +} + +/* ========================================================================== */ +/* === UMF_singletons ======================================================= */ +/* ========================================================================== */ + +GLOBAL Int UMF_singletons +( + + /* input, not modified: */ + Int n_row, + Int n_col, + const Int Ap [ ], /* size n_col+1 */ + const Int Ai [ ], /* size nz = Ap [n_col] */ + const Int Quser [ ], /* size n_col if present */ + Int strategy, /* strategy requested by user */ + + /* output, not defined on input: */ + Int Cdeg [ ], /* size n_col */ + Int Cperm [ ], /* size n_col */ + Int Rdeg [ ], /* size n_row */ + Int Rperm [ ], /* size n_row */ + Int InvRperm [ ], /* size n_row, the inverse of Rperm */ + Int *p_n1, /* # of col and row singletons */ + Int *p_n1c, /* # of col singletons */ + Int *p_n1r, /* # of row singletons */ + Int *p_nempty_col, /* # of empty columns in pruned submatrix */ + Int *p_nempty_row, /* # of empty columns in pruned submatrix */ + Int *p_is_sym, /* TRUE if pruned submatrix is square and has been + * symmetrically permuted by Cperm and Rperm */ + Int *p_max_rdeg, /* maximum Rdeg in pruned submatrix */ + + /* workspace, not defined on input or output */ + Int Rp [ ], /* size n_row+1 */ + Int Ri [ ], /* size nz */ + Int W [ ], /* size n_row */ + Int Next [ ] /* size MAX (n_row, n_col) */ +) +{ + Int n1, s, col, row, p, p1, p2, cdeg, last_row, is_sym, k, + nempty_row, nempty_col, max_cdeg, max_rdeg, n1c, n1r ; + + /* ---------------------------------------------------------------------- */ + /* initializations */ + /* ---------------------------------------------------------------------- */ + +#ifndef NDEBUG + UMF_dump_start ( ) ; + DEBUGm4 (("Starting umf_singletons\n")) ; +#endif + + /* ---------------------------------------------------------------------- */ + /* scan the columns, check for errors and count row degrees */ + /* ---------------------------------------------------------------------- */ + + if (Ap [0] != 0 || Ap [n_col] < 0) + { + return (UMFPACK_ERROR_invalid_matrix) ; + } + for (row = 0 ; row < n_row ; row++) + { + Rdeg [row] = 0 ; + } + for (col = 0 ; col < n_col ; col++) + { + p1 = Ap [col] ; + p2 = Ap [col+1] ; + cdeg = p2 - p1 ; + if (cdeg < 0) + { + return (UMFPACK_ERROR_invalid_matrix) ; + } + last_row = EMPTY ; + for (p = p1 ; p < p2 ; p++) + { + row = Ai [p] ; + if (row <= last_row || row >= n_row) + { + return (UMFPACK_ERROR_invalid_matrix) ; + } + Rdeg [row]++ ; + last_row = row ; + } + Cdeg [col] = cdeg ; + } + + /* ---------------------------------------------------------------------- */ + /* find singletons */ + /* ---------------------------------------------------------------------- */ + + if (Quser != (Int *) NULL) + { + /* user has provided an input column ordering */ + if (strategy == UMFPACK_STRATEGY_UNSYMMETRIC) + { + /* look for singletons, but respect the user's input permutation */ + n1 = find_user_singletons (n_row, n_col, Ap, Ai, Quser, + Cdeg, Rdeg, Cperm, Rperm, &n1r, &n1c, Rp, Ri, W) ; + } + else + { + /* do not look for singletons if Quser given and strategy is + * not unsymmetric */ + n1 = 0 ; + n1r = 0 ; + n1c = 0 ; + } + } + else + { + /* look for singletons anywhere */ + n1 = find_any_singletons (n_row, n_col, Ap, Ai, + Cdeg, Rdeg, Cperm, Rperm, &n1r, &n1c, Rp, Ri, W, Next) ; + } + + /* ---------------------------------------------------------------------- */ + /* eliminate empty columns and complete the column permutation */ + /* ---------------------------------------------------------------------- */ + + nempty_col = finish_permutation (n1, n_col, Cdeg, Quser, Cperm, &max_cdeg) ; + + /* ---------------------------------------------------------------------- */ + /* eliminate empty rows and complete the row permutation */ + /* ---------------------------------------------------------------------- */ + + if (Quser != (Int *) NULL && strategy == UMFPACK_STRATEGY_SYMMETRIC) + { + /* rows should be symmetrically permuted according to Quser */ + ASSERT (n_row == n_col) ; + nempty_row = finish_permutation (n1, n_row, Rdeg, Quser, Rperm, + &max_rdeg) ; + } + else + { + /* rows should not be symmetrically permuted according to Quser */ + nempty_row = finish_permutation (n1, n_row, Rdeg, (Int *) NULL, Rperm, + &max_rdeg) ; + } + + /* ---------------------------------------------------------------------- */ + /* compute the inverse of Rperm */ + /* ---------------------------------------------------------------------- */ + + for (k = 0 ; k < n_row ; k++) + { + ASSERT (Rperm [k] >= 0 && Rperm [k] < n_row) ; + InvRperm [Rperm [k]] = k ; + } + + /* ---------------------------------------------------------------------- */ + /* see if pruned submatrix is square and has been symmetrically permuted */ + /* ---------------------------------------------------------------------- */ + + if (n_row == n_col && nempty_row == nempty_col) + { + /* is_sym is true if the submatrix is square, and + * Rperm [n1..n_row-nempty_row-1] = Cperm [n1..n_col-nempty_col-1] */ + is_sym = TRUE ; + for (s = n1 ; s < n_col - nempty_col ; s++) + { + if (Cperm [s] != Rperm [s]) + { + is_sym = FALSE ; + break ; + } + } + } + else + { + is_sym = FALSE ; + } + DEBUGm4 (("Submatrix square and symmetrically permuted? "ID"\n", is_sym)) ; + DEBUGm4 (("singletons "ID" row "ID" col "ID"\n", n1, n1r, n1c)) ; + DEBUGm4 (("Empty cols "ID" rows "ID"\n", nempty_col, nempty_row)) ; + *p_n1 = n1 ; + *p_n1r = n1r ; + *p_n1c = n1c ; + *p_is_sym = is_sym ; + *p_nempty_col = nempty_col ; + *p_nempty_row = nempty_row ; + *p_max_rdeg = max_rdeg ; + return (UMFPACK_OK) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_singletons.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_singletons.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,31 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL Int UMF_singletons +( + Int n_row, + Int n_col, + const Int Ap [ ], + const Int Ai [ ], + const Int Quser [ ], + Int strategy, + Int Cdeg [ ], + Int Cperm [ ], + Int Rdeg [ ], + Int Rperm [ ], + Int InvRperm [ ], + Int *n1, + Int *n1c, + Int *n1r, + Int *nempty_col, + Int *nempty_row, + Int *is_sym, + Int *max_rdeg, + Int Rp [ ], + Int Ri [ ], + Int W [ ], + Int Next [ ] +) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_solve.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_solve.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,1392 @@ +/* ========================================================================== */ +/* === UMF_solve ============================================================ */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + Not user-callable. Solves a linear system using the numerical factorization + computed by UMFPACK_numeric. No workspace is dynamically allocated. Counts + flops, but excludes floating-point comparisons (thus real abs (...) are + zero flops, but complex abs (...) takes 6 flops). + + Returns UMFPACK_OK if successful, UMFPACK_ERROR_argument_missing if + required arguments are missing, UMFPACK_ERROR_invalid_system if the sys + string is not valid or if the matrix A is not square. + + Uses the sparse backward error method of Arioli, Demmel, and Duff + (Solving sparse linear systems with sparse backward error, SIAM J. Matrix + Analysis and Applic., vol 10, pp. 165-190). +*/ + +#include "umf_internal.h" +#include "umf_lsolve.h" +#include "umf_usolve.h" +#include "umf_ltsolve.h" +#include "umf_utsolve.h" +#include "umf_report_vector.h" + +PRIVATE Int do_step +( + double omega [3], + Int step, + const double B2 [ ], + Entry X [ ], + const Entry W [ ], + const double Y [ ], + const double Z2 [ ], + Entry S [ ], + Int n, + double Info [UMFPACK_INFO] +) ; + +/* ========================================================================== */ +/* === UMF_solve ============================================================ */ +/* ========================================================================== */ + +GLOBAL Int UMF_solve +( + Int sys, + const Int Ap [ ], + const Int Ai [ ], + const double Ax [ ], + double Xx [ ], + const double Bx [ ], +#ifdef COMPLEX + const double Az [ ], + double Xz [ ], + const double Bz [ ], +#endif + NumericType *Numeric, + Int irstep, + double Info [UMFPACK_INFO], + Int Pattern [ ], /* size n */ + double SolveWork [ ] /* if irstep>0 real: size 5*n. complex:10*n */ + /* otherwise real: size n. complex: 4*n */ +) +{ + /* ---------------------------------------------------------------------- */ + /* local variables */ + /* ---------------------------------------------------------------------- */ + + Entry axx, wi, xj, zi, xi, aij, bi ; + double omega [3], d, z2i, yi, flops ; + Entry *W, *Z, *S, *X ; + double *Z2, *Y, *B2, *Rs ; + Int *Rperm, *Cperm, i, n, p, step, j, nz, status, p2, do_scale ; +#ifdef COMPLEX + Int AXsplit ; + Int Bsplit ; +#endif +#ifndef NRECIPROCAL + Int do_recip = Numeric->do_recip ; +#endif + + /* ---------------------------------------------------------------------- */ + /* initializations */ + /* ---------------------------------------------------------------------- */ + +#ifndef NDEBUG + UMF_dump_lu (Numeric) ; + ASSERT (Numeric && Xx && Bx && Pattern && SolveWork && Info) ; +#endif + + nz = 0 ; + omega [0] = 0. ; + omega [1] = 0. ; + omega [2] = 0. ; + Rperm = Numeric->Rperm ; + Cperm = Numeric->Cperm ; + Rs = Numeric->Rs ; /* row scale factors */ + do_scale = (Rs != (double *) NULL) ; + flops = 0 ; + Info [UMFPACK_SOLVE_FLOPS] = 0 ; + Info [UMFPACK_IR_TAKEN] = 0 ; + Info [UMFPACK_IR_ATTEMPTED] = 0 ; + + /* UMFPACK_solve does not call this routine if A is rectangular */ + ASSERT (Numeric->n_row == Numeric->n_col) ; + n = Numeric->n_row ; + if (Numeric->nnzpiv < n + || SCALAR_IS_ZERO (Numeric->rcond) || SCALAR_IS_NAN (Numeric->rcond)) + { + /* Note that systems involving just L return UMFPACK_OK, even if */ + /* A is singular (L is always has a unit diagonal). */ + DEBUGm4 (("Note, matrix is singular in umf_solve\n")) ; + status = UMFPACK_WARNING_singular_matrix ; + irstep = 0 ; + } + else + { + status = UMFPACK_OK ; + } + irstep = MAX (0, irstep) ; /* make sure irstep is >= 0 */ + + W = (Entry *) SolveWork ; /* Entry W [0..n-1] */ + + Z = (Entry *) NULL ; /* unused if no iterative refinement */ + S = (Entry *) NULL ; + Y = (double *) NULL ; + Z2 = (double *) NULL ; + B2 = (double *) NULL ; + +#ifdef COMPLEX + if (irstep > 0) + { + if (!Ap || !Ai || !Ax) + { + return (UMFPACK_ERROR_argument_missing) ; + } + /* A, B, and X in split format if Az, Bz, and Xz present */ + AXsplit = SPLIT (Az) || SPLIT(Xz); + Z = (Entry *) (SolveWork + 4*n) ; /* Entry Z [0..n-1] */ + S = (Entry *) (SolveWork + 6*n) ; /* Entry S [0..n-1] */ + Y = (double *) (SolveWork + 8*n) ; /* double Y [0..n-1] */ + B2 = (double *) (SolveWork + 9*n) ; /* double B2 [0..n-1] */ + Z2 = (double *) Z ; /* double Z2 [0..n-1], equiv. to Z */ + } + else + { + /* A is ignored, only look at X for split/packed cases */ + AXsplit = SPLIT(Xz); + } + Bsplit = SPLIT (Bz); + + if (AXsplit) + { + X = (Entry *) (SolveWork + 2*n) ; /* Entry X [0..n-1] */ + } + else + { + X = (Entry *) Xx ; /* Entry X [0..n-1] */ + } +#else + X = (Entry *) Xx ; /* Entry X [0..n-1] */ + if (irstep > 0) + { + if (!Ap || !Ai || !Ax) + { + return (UMFPACK_ERROR_argument_missing) ; + } + Z = (Entry *) (SolveWork + n) ; /* Entry Z [0..n-1] */ + S = (Entry *) (SolveWork + 2*n) ; /* Entry S [0..n-1] */ + Y = (double *) (SolveWork + 3*n) ; /* double Y [0..n-1] */ + B2 = (double *) (SolveWork + 4*n) ; /* double B2 [0..n-1] */ + Z2 = (double *) Z ; /* double Z2 [0..n-1], equiv. to Z */ + } +#endif + + /* ---------------------------------------------------------------------- */ + /* determine which system to solve */ + /* ---------------------------------------------------------------------- */ + + if (sys == UMFPACK_A) + { + + /* ------------------------------------------------------------------ */ + /* solve A x = b with optional iterative refinement */ + /* ------------------------------------------------------------------ */ + + if (irstep > 0) + { + + /* -------------------------------------------------------------- */ + /* using iterative refinement: compute Y and B2 */ + /* -------------------------------------------------------------- */ + + nz = Ap [n] ; + Info [UMFPACK_NZ] = nz ; + + /* A is stored by column */ + /* Y (i) = ||R A_i||, 1-norm of row i of R A */ + for (i = 0 ; i < n ; i++) + { + Y [i] = 0. ; + } + flops += (ABS_FLOPS + 1) * nz ; + p2 = Ap [n] ; + for (p = 0 ; p < p2 ; p++) + { + /* Y [Ai [p]] += ABS (Ax [p]) ; */ + ASSIGN (aij, Ax, Az, p, AXsplit) ; + ABS (d, aij) ; + Y [Ai [p]] += d ; + } + + /* B2 = abs (B) */ + flops += ABS_FLOPS * n ; + for (i = 0 ; i < n ; i++) + { + /* B2 [i] = ABS (B [i]) ; */ + ASSIGN (bi, Bx, Bz, i, Bsplit) ; + ABS (B2 [i], bi) ; + } + + /* scale Y and B2. */ + if (do_scale) + { + /* Y = R Y */ + /* B2 = R B2 */ +#ifndef NRECIPROCAL + if (do_recip) + { + /* multiply by the scale factors */ + for (i = 0 ; i < n ; i++) + { + Y [i] *= Rs [i] ; + B2 [i] *= Rs [i] ; + } + } + else +#endif + { + /* divide by the scale factors */ + for (i = 0 ; i < n ; i++) + { + Y [i] /= Rs [i] ; + B2 [i] /= Rs [i] ; + } + } + + flops += 2 * n ; + } + + } + + for (step = 0 ; step <= irstep ; step++) + { + + /* -------------------------------------------------------------- */ + /* Solve A x = b (step 0): */ + /* x = Q (U \ (L \ (P R b))) */ + /* and then perform iterative refinement (step > 0): */ + /* x = x + Q (U \ (L \ (P R (b - A x)))) */ + /* -------------------------------------------------------------- */ + + if (step == 0) + { + if (do_scale) + { + /* W = P R b, using X as workspace, since Z is not + * allocated if irstep = 0. */ +#ifndef NRECIPROCAL + if (do_recip) + { + /* multiply by the scale factors */ + for (i = 0 ; i < n ; i++) + { + ASSIGN (X [i], Bx, Bz, i, Bsplit) ; + SCALE (X [i], Rs [i]) ; + } + } + else +#endif + { + /* divide by the scale factors */ + for (i = 0 ; i < n ; i++) + { + ASSIGN (X [i], Bx, Bz, i, Bsplit) ; + SCALE_DIV (X [i], Rs [i]) ; + } + } + flops += SCALE_FLOPS * n ; + for (i = 0 ; i < n ; i++) + { + W [i] = X [Rperm [i]] ; + } + } + else + { + /* W = P b, since the row scaling R = I */ + for (i = 0 ; i < n ; i++) + { + /* W [i] = B [Rperm [i]] ; */ + ASSIGN (W [i], Bx, Bz, Rperm [i], Bsplit) ; + } + } + } + else + { + for (i = 0 ; i < n ; i++) + { + /* Z [i] = B [i] ; */ + ASSIGN (Z [i], Bx, Bz, i, Bsplit) ; + } + flops += MULTSUB_FLOPS * nz ; + for (i = 0 ; i < n ; i++) + { + xi = X [i] ; + p2 = Ap [i+1] ; + for (p = Ap [i] ; p < p2 ; p++) + { + /* Z [Ai [p]] -= Ax [p] * xi ; */ + ASSIGN (aij, Ax, Az, p, AXsplit) ; + MULT_SUB (Z [Ai [p]], aij, xi) ; + } + } + /* scale, Z = R Z */ + if (do_scale) + { +#ifndef NRECIPROCAL + if (do_recip) + { + /* multiply by the scale factors */ + for (i = 0 ; i < n ; i++) + { + SCALE (Z [i], Rs [i]) ; + } + } + else +#endif + { + /* divide by the scale factors */ + for (i = 0 ; i < n ; i++) + { + SCALE_DIV (Z [i], Rs [i]) ; + } + } + flops += SCALE_FLOPS * n ; + } + for (i = 0 ; i < n ; i++) + { + W [i] = Z [Rperm [i]] ; + } + } + + flops += UMF_lsolve (Numeric, W, Pattern) ; + flops += UMF_usolve (Numeric, W, Pattern) ; + + if (step == 0) + { + for (i = 0 ; i < n ; i++) + { + X [Cperm [i]] = W [i] ; + } + } + else + { + flops += ASSEMBLE_FLOPS * n ; + for (i = 0 ; i < n ; i++) + { + /* X [Cperm [i]] += W [i] ; */ + ASSEMBLE (X [Cperm [i]], W [i]) ; + } + } + + /* -------------------------------------------------------------- */ + /* sparse backward error estimate */ + /* -------------------------------------------------------------- */ + + if (irstep > 0) + { + + /* ---------------------------------------------------------- */ + /* A is stored by column */ + /* W (i) = R (b - A x)_i, residual */ + /* Z2 (i) = R (|A||x|)_i */ + /* ---------------------------------------------------------- */ + + for (i = 0 ; i < n ; i++) + { + /* W [i] = B [i] ; */ + ASSIGN (W [i], Bx, Bz, i, Bsplit) ; + Z2 [i] = 0. ; + } + flops += (MULT_FLOPS + DECREMENT_FLOPS + ABS_FLOPS + 1) * nz ; + for (j = 0 ; j < n ; j++) + { + xj = X [j] ; + p2 = Ap [j+1] ; + for (p = Ap [j] ; p < p2 ; p++) + { + i = Ai [p] ; + + /* axx = Ax [p] * xj ; */ + ASSIGN (aij, Ax, Az, p, AXsplit) ; + MULT (axx, aij, xj) ; + + /* W [i] -= axx ; */ + DECREMENT (W [i], axx) ; + + /* Z2 [i] += ABS (axx) ; */ + ABS (d, axx) ; + Z2 [i] += d ; + } + } + + /* scale W and Z2 */ + if (do_scale) + { + /* Z2 = R Z2 */ + /* W = R W */ +#ifndef NRECIPROCAL + if (do_recip) + { + /* multiply by the scale factors */ + for (i = 0 ; i < n ; i++) + { + SCALE (W [i], Rs [i]) ; + Z2 [i] *= Rs [i] ; + } + } + else +#endif + { + /* divide by the scale factors */ + for (i = 0 ; i < n ; i++) + { + SCALE_DIV (W [i], Rs [i]) ; + Z2 [i] /= Rs [i] ; + } + } + flops += (SCALE_FLOPS + 1) * n ; + } + + flops += (2*ABS_FLOPS + 5) * n ; + if (do_step (omega, step, B2, X, W, Y, Z2, S, n, Info)) + { + /* iterative refinement is done */ + break ; + } + + } + + } + + } + else if (sys == UMFPACK_At) + { + + /* ------------------------------------------------------------------ */ + /* solve A' x = b with optional iterative refinement */ + /* ------------------------------------------------------------------ */ + + /* A' is the complex conjugate transpose */ + + if (irstep > 0) + { + + /* -------------------------------------------------------------- */ + /* using iterative refinement: compute Y */ + /* -------------------------------------------------------------- */ + + nz = Ap [n] ; + Info [UMFPACK_NZ] = nz ; + + /* A' is stored by row */ + /* Y (i) = ||(A' R)_i||, 1-norm of row i of A' R */ + + if (do_scale) + { + flops += (ABS_FLOPS + 2) * nz ; +#ifndef NRECIPROCAL + if (do_recip) + { + /* multiply by the scale factors */ + for (i = 0 ; i < n ; i++) + { + yi = 0. ; + p2 = Ap [i+1] ; + for (p = Ap [i] ; p < p2 ; p++) + { + /* yi += ABS (Ax [p]) * Rs [Ai [p]] ; */ + /* note that abs (aij) is the same as + * abs (conj (aij)) */ + ASSIGN (aij, Ax, Az, p, AXsplit) ; + ABS (d, aij) ; + yi += (d * Rs [Ai [p]]) ; + } + Y [i] = yi ; + } + } + else +#endif + { + /* divide by the scale factors */ + for (i = 0 ; i < n ; i++) + { + yi = 0. ; + p2 = Ap [i+1] ; + for (p = Ap [i] ; p < p2 ; p++) + { + /* yi += ABS (Ax [p]) / Rs [Ai [p]] ; */ + /* note that abs (aij) is the same as + * abs (conj (aij)) */ + ASSIGN (aij, Ax, Az, p, AXsplit) ; + ABS (d, aij) ; + yi += (d / Rs [Ai [p]]) ; + } + Y [i] = yi ; + } + } + } + else + { + /* no scaling */ + flops += (ABS_FLOPS + 1) * nz ; + for (i = 0 ; i < n ; i++) + { + yi = 0. ; + p2 = Ap [i+1] ; + for (p = Ap [i] ; p < p2 ; p++) + { + /* yi += ABS (Ax [p]) ; */ + /* note that abs (aij) is the same as + * abs (conj (aij)) */ + ASSIGN (aij, Ax, Az, p, AXsplit) ; + ABS (d, aij) ; + yi += d ; + } + Y [i] = yi ; + } + } + + /* B2 = abs (B) */ + for (i = 0 ; i < n ; i++) + { + /* B2 [i] = ABS (B [i]) ; */ + ASSIGN (bi, Bx, Bz, i, Bsplit) ; + ABS (B2 [i], bi) ; + } + + } + + for (step = 0 ; step <= irstep ; step++) + { + + /* -------------------------------------------------------------- */ + /* Solve A' x = b (step 0): */ + /* x = R P' (L' \ (U' \ (Q' b))) */ + /* and then perform iterative refinement (step > 0): */ + /* x = x + R P' (L' \ (U' \ (Q' (b - A' x)))) */ + /* -------------------------------------------------------------- */ + + if (step == 0) + { + /* W = Q' b */ + for (i = 0 ; i < n ; i++) + { + /* W [i] = B [Cperm [i]] ; */ + ASSIGN (W [i], Bx, Bz, Cperm [i], Bsplit) ; + } + } + else + { + /* Z = b - A' x */ + for (i = 0 ; i < n ; i++) + { + /* Z [i] = B [i] ; */ + ASSIGN (Z [i], Bx, Bz, i, Bsplit) ; + } + flops += MULTSUB_FLOPS * nz ; + for (i = 0 ; i < n ; i++) + { + zi = Z [i] ; + p2 = Ap [i+1] ; + for (p = Ap [i] ; p < p2 ; p++) + { + /* zi -= conjugate (Ax [p]) * X [Ai [p]] ; */ + ASSIGN (aij, Ax, Az, p, Bsplit) ; + MULT_SUB_CONJ (zi, X [Ai [p]], aij) ; + } + Z [i] = zi ; + } + /* W = Q' Z */ + for (i = 0 ; i < n ; i++) + { + W [i] = Z [Cperm [i]] ; + } + } + + flops += UMF_uhsolve (Numeric, W, Pattern) ; + flops += UMF_lhsolve (Numeric, W, Pattern) ; + + if (step == 0) + { + + /* X = R P' W */ + /* do not use Z, since it isn't allocated if irstep = 0 */ + + /* X = P' W */ + for (i = 0 ; i < n ; i++) + { + X [Rperm [i]] = W [i] ; + } + if (do_scale) + { + /* X = R X */ +#ifndef NRECIPROCAL + if (do_recip) + { + /* multiply by the scale factors */ + for (i = 0 ; i < n ; i++) + { + SCALE (X [i], Rs [i]) ; + } + } + else +#endif + { + /* divide by the scale factors */ + for (i = 0 ; i < n ; i++) + { + SCALE_DIV (X [i], Rs [i]) ; + } + } + flops += SCALE_FLOPS * n ; + } + + } + else + { + + /* Z = P' W */ + for (i = 0 ; i < n ; i++) + { + Z [Rperm [i]] = W [i] ; + } + if (do_scale) + { + /* Z = R Z */ +#ifndef NRECIPROCAL + if (do_recip) + { + /* multiply by the scale factors */ + for (i = 0 ; i < n ; i++) + { + SCALE (Z [i], Rs [i]) ; + } + } + else +#endif + { + /* divide by the scale factors */ + for (i = 0 ; i < n ; i++) + { + SCALE_DIV (Z [i], Rs [i]) ; + } + } + flops += SCALE_FLOPS * n ; + } + + flops += ASSEMBLE_FLOPS * n ; + /* X += Z */ + for (i = 0 ; i < n ; i++) + { + /* X [i] += Z [i] ; was +=W[i] in v4.3, which is wrong */ + ASSEMBLE (X [i], Z [i]) ; /* bug fix, v4.3.1 */ + } + } + + /* -------------------------------------------------------------- */ + /* sparse backward error estimate */ + /* -------------------------------------------------------------- */ + + if (irstep > 0) + { + + /* ---------------------------------------------------------- */ + /* A' is stored by row */ + /* W (i) = (b - A' x)_i, residual */ + /* Z2 (i) = (|A'||x|)_i */ + /* ---------------------------------------------------------- */ + + flops += (MULT_FLOPS + DECREMENT_FLOPS + ABS_FLOPS + 1) * nz ; + for (i = 0 ; i < n ; i++) + { + /* wi = B [i] ; */ + ASSIGN (wi, Bx, Bz, i, Bsplit) ; + z2i = 0. ; + p2 = Ap [i+1] ; + for (p = Ap [i] ; p < p2 ; p++) + { + /* axx = conjugate (Ax [p]) * X [Ai [p]] ; */ + ASSIGN (aij, Ax, Az, p, AXsplit) ; + MULT_CONJ (axx, X [Ai [p]], aij) ; + + /* wi -= axx ; */ + DECREMENT (wi, axx) ; + + /* z2i += ABS (axx) ; */ + ABS (d, axx) ; + z2i += d ; + } + W [i] = wi ; + Z2 [i] = z2i ; + } + + flops += (2*ABS_FLOPS + 5) * n ; + if (do_step (omega, step, B2, X, W, Y, Z2, S, n, Info)) + { + /* iterative refinement is done */ + break ; + } + + } + + } + + } + else if (sys == UMFPACK_Aat) + { + + /* ------------------------------------------------------------------ */ + /* solve A.' x = b with optional iterative refinement */ + /* ------------------------------------------------------------------ */ + + /* A' is the array transpose */ + + if (irstep > 0) + { + + /* -------------------------------------------------------------- */ + /* using iterative refinement: compute Y */ + /* -------------------------------------------------------------- */ + + nz = Ap [n] ; + Info [UMFPACK_NZ] = nz ; + + /* A.' is stored by row */ + /* Y (i) = ||(A.' R)_i||, 1-norm of row i of A.' R */ + + if (do_scale) + { + flops += (ABS_FLOPS + 2) * nz ; +#ifndef NRECIPROCAL + if (do_recip) + { + /* multiply by the scale factors */ + for (i = 0 ; i < n ; i++) + { + yi = 0. ; + p2 = Ap [i+1] ; + for (p = Ap [i] ; p < p2 ; p++) + { + /* yi += ABS (Ax [p]) * Rs [Ai [p]] ; */ + /* note that A.' is the array transpose, + * so no conjugate */ + ASSIGN (aij, Ax, Az, p, AXsplit) ; + ABS (d, aij) ; + yi += (d * Rs [Ai [p]]) ; + } + Y [i] = yi ; + } + } + else +#endif + { + /* divide by the scale factors */ + for (i = 0 ; i < n ; i++) + { + yi = 0. ; + p2 = Ap [i+1] ; + for (p = Ap [i] ; p < p2 ; p++) + { + /* yi += ABS (Ax [p]) / Rs [Ai [p]] ; */ + /* note that A.' is the array transpose, + * so no conjugate */ + ASSIGN (aij, Ax, Az, p, AXsplit) ; + ABS (d, aij) ; + yi += (d / Rs [Ai [p]]) ; + } + Y [i] = yi ; + } + } + } + else + { + /* no scaling */ + flops += (ABS_FLOPS + 1) * nz ; + for (i = 0 ; i < n ; i++) + { + yi = 0. ; + p2 = Ap [i+1] ; + for (p = Ap [i] ; p < p2 ; p++) + { + /* yi += ABS (Ax [p]) */ + /* note that A.' is the array transpose, + * so no conjugate */ + ASSIGN (aij, Ax, Az, p, AXsplit) ; + ABS (d, aij) ; + yi += d ; + } + Y [i] = yi ; + } + } + + /* B2 = abs (B) */ + for (i = 0 ; i < n ; i++) + { + /* B2 [i] = ABS (B [i]) ; */ + ASSIGN (bi, Bx, Bz, i, Bsplit) ; + ABS (B2 [i], bi) ; + } + + } + + for (step = 0 ; step <= irstep ; step++) + { + + /* -------------------------------------------------------------- */ + /* Solve A.' x = b (step 0): */ + /* x = R P' (L.' \ (U.' \ (Q' b))) */ + /* and then perform iterative refinement (step > 0): */ + /* x = x + R P' (L.' \ (U.' \ (Q' (b - A.' x)))) */ + /* -------------------------------------------------------------- */ + + if (step == 0) + { + /* W = Q' b */ + for (i = 0 ; i < n ; i++) + { + /* W [i] = B [Cperm [i]] ; */ + ASSIGN (W [i], Bx, Bz, Cperm [i], Bsplit) ; + } + } + else + { + /* Z = b - A.' x */ + for (i = 0 ; i < n ; i++) + { + /* Z [i] = B [i] ; */ + ASSIGN (Z [i], Bx, Bz, i, Bsplit) ; + } + flops += MULTSUB_FLOPS * nz ; + for (i = 0 ; i < n ; i++) + { + zi = Z [i] ; + p2 = Ap [i+1] ; + for (p = Ap [i] ; p < p2 ; p++) + { + /* zi -= Ax [p] * X [Ai [p]] ; */ + ASSIGN (aij, Ax, Az, p, AXsplit) ; + MULT_SUB (zi, aij, X [Ai [p]]) ; + } + Z [i] = zi ; + } + /* W = Q' Z */ + for (i = 0 ; i < n ; i++) + { + W [i] = Z [Cperm [i]] ; + } + } + + flops += UMF_utsolve (Numeric, W, Pattern) ; + flops += UMF_ltsolve (Numeric, W, Pattern) ; + + if (step == 0) + { + + /* X = R P' W */ + /* do not use Z, since it isn't allocated if irstep = 0 */ + + /* X = P' W */ + for (i = 0 ; i < n ; i++) + { + X [Rperm [i]] = W [i] ; + } + if (do_scale) + { + /* X = R X */ +#ifndef NRECIPROCAL + if (do_recip) + { + /* multiply by the scale factors */ + for (i = 0 ; i < n ; i++) + { + SCALE (X [i], Rs [i]) ; + } + } + else +#endif + { + /* divide by the scale factors */ + for (i = 0 ; i < n ; i++) + { + SCALE_DIV (X [i], Rs [i]) ; + } + } + flops += SCALE_FLOPS * n ; + } + + } + else + { + + /* Z = P' W */ + for (i = 0 ; i < n ; i++) + { + Z [Rperm [i]] = W [i] ; + } + if (do_scale) + { + /* Z = R Z */ +#ifndef NRECIPROCAL + if (do_recip) + { + /* multiply by the scale factors */ + for (i = 0 ; i < n ; i++) + { + SCALE (Z [i], Rs [i]) ; + } + } + else +#endif + { + /* divide by the scale factors */ + for (i = 0 ; i < n ; i++) + { + SCALE_DIV (Z [i], Rs [i]) ; + } + } + flops += SCALE_FLOPS * n ; + } + + flops += ASSEMBLE_FLOPS * n ; + /* X += Z */ + for (i = 0 ; i < n ; i++) + { + /* X [i] += Z [i] ; was +=W[i] in v4.3, which is wrong */ + ASSEMBLE (X [i], Z [i]) ; /* bug fix, v4.3.1 */ + } + } + + /* -------------------------------------------------------------- */ + /* sparse backward error estimate */ + /* -------------------------------------------------------------- */ + + if (irstep > 0) + { + + /* ---------------------------------------------------------- */ + /* A.' is stored by row */ + /* W (i) = (b - A.' x)_i, residual */ + /* Z (i) = (|A.'||x|)_i */ + /* ---------------------------------------------------------- */ + + flops += (MULT_FLOPS + DECREMENT_FLOPS + ABS_FLOPS + 1) * nz ; + for (i = 0 ; i < n ; i++) + { + /* wi = B [i] ; */ + ASSIGN (wi, Bx, Bz, i, Bsplit) ; + z2i = 0. ; + p2 = Ap [i+1] ; + for (p = Ap [i] ; p < p2 ; p++) + { + /* axx = Ax [p] * X [Ai [p]] ; */ + ASSIGN (aij, Ax, Az, p, AXsplit) ; + MULT (axx, aij, X [Ai [p]]) ; + + /* wi -= axx ; */ + DECREMENT (wi, axx) ; + + /* z2i += ABS (axx) ; */ + ABS (d, axx) ; + z2i += d ; + } + W [i] = wi ; + Z2 [i] = z2i ; + } + + flops += (2*ABS_FLOPS + 5) * n ; + if (do_step (omega, step, B2, X, W, Y, Z2, S, n, Info)) + { + /* iterative refinement is done */ + break ; + } + + } + + } + + } + else if (sys == UMFPACK_Pt_L) + { + + /* ------------------------------------------------------------------ */ + /* Solve P'Lx=b: x = L \ Pb */ + /* ------------------------------------------------------------------ */ + + for (i = 0 ; i < n ; i++) + { + /* X [i] = B [Rperm [i]] ; */ + ASSIGN (X [i], Bx, Bz, Rperm [i], Bsplit) ; + } + flops = UMF_lsolve (Numeric, X, Pattern) ; + status = UMFPACK_OK ; + + } + else if (sys == UMFPACK_L) + { + + /* ------------------------------------------------------------------ */ + /* Solve Lx=b: x = L \ b */ + /* ------------------------------------------------------------------ */ + + for (i = 0 ; i < n ; i++) + { + /* X [i] = B [i] ; */ + ASSIGN (X [i], Bx, Bz, i, Bsplit) ; + } + flops = UMF_lsolve (Numeric, X, Pattern) ; + status = UMFPACK_OK ; + + } + else if (sys == UMFPACK_Lt_P) + { + + /* ------------------------------------------------------------------ */ + /* Solve L'Px=b: x = P' (L' \ b) */ + /* ------------------------------------------------------------------ */ + + for (i = 0 ; i < n ; i++) + { + /* W [i] = B [i] ; */ + ASSIGN (W [i], Bx, Bz, i, Bsplit) ; + } + flops = UMF_lhsolve (Numeric, W, Pattern) ; + for (i = 0 ; i < n ; i++) + { + X [Rperm [i]] = W [i] ; + } + status = UMFPACK_OK ; + + } + else if (sys == UMFPACK_Lat_P) + { + + /* ------------------------------------------------------------------ */ + /* Solve L.'Px=b: x = P' (L.' \ b) */ + /* ------------------------------------------------------------------ */ + + for (i = 0 ; i < n ; i++) + { + /* W [i] = B [i] ; */ + ASSIGN (W [i], Bx, Bz, i, Bsplit) ; + } + flops = UMF_ltsolve (Numeric, W, Pattern) ; + for (i = 0 ; i < n ; i++) + { + X [Rperm [i]] = W [i] ; + } + status = UMFPACK_OK ; + + } + else if (sys == UMFPACK_Lt) + { + + /* ------------------------------------------------------------------ */ + /* Solve L'x=b: x = L' \ b */ + /* ------------------------------------------------------------------ */ + + for (i = 0 ; i < n ; i++) + { + /* X [i] = B [i] ; */ + ASSIGN (X [i], Bx, Bz, i, Bsplit) ; + } + flops = UMF_lhsolve (Numeric, X, Pattern) ; + status = UMFPACK_OK ; + + } + else if (sys == UMFPACK_Lat) + { + + /* ------------------------------------------------------------------ */ + /* Solve L.'x=b: x = L.' \ b */ + /* ------------------------------------------------------------------ */ + + for (i = 0 ; i < n ; i++) + { + /* X [i] = B [i] ; */ + ASSIGN (X [i], Bx, Bz, i, Bsplit) ; + } + flops = UMF_ltsolve (Numeric, X, Pattern) ; + status = UMFPACK_OK ; + + } + else if (sys == UMFPACK_U_Qt) + { + + /* ------------------------------------------------------------------ */ + /* Solve UQ'x=b: x = Q (U \ b) */ + /* ------------------------------------------------------------------ */ + + for (i = 0 ; i < n ; i++) + { + /* W [i] = B [i] ; */ + ASSIGN (W [i], Bx, Bz, i, Bsplit) ; + } + flops = UMF_usolve (Numeric, W, Pattern) ; + for (i = 0 ; i < n ; i++) + { + X [Cperm [i]] = W [i] ; + } + + } + else if (sys == UMFPACK_U) + { + + /* ------------------------------------------------------------------ */ + /* Solve Ux=b: x = U \ b */ + /* ------------------------------------------------------------------ */ + + for (i = 0 ; i < n ; i++) + { + /* X [i] = B [i] ; */ + ASSIGN (X [i], Bx, Bz, i, Bsplit) ; + } + flops = UMF_usolve (Numeric, X, Pattern) ; + + } + else if (sys == UMFPACK_Q_Ut) + { + + /* ------------------------------------------------------------------ */ + /* Solve QU'x=b: x = U' \ Q'b */ + /* ------------------------------------------------------------------ */ + + for (i = 0 ; i < n ; i++) + { + /* X [i] = B [Cperm [i]] ; */ + ASSIGN (X [i], Bx, Bz, Cperm [i], Bsplit) ; + } + flops = UMF_uhsolve (Numeric, X, Pattern) ; + + } + else if (sys == UMFPACK_Q_Uat) + { + + /* ------------------------------------------------------------------ */ + /* Solve QU.'x=b: x = U.' \ Q'b */ + /* ------------------------------------------------------------------ */ + + for (i = 0 ; i < n ; i++) + { + /* X [i] = B [Cperm [i]] ; */ + ASSIGN (X [i], Bx, Bz, Cperm [i], Bsplit) ; + } + flops = UMF_utsolve (Numeric, X, Pattern) ; + + } + else if (sys == UMFPACK_Ut) + { + + /* ------------------------------------------------------------------ */ + /* Solve U'x=b: x = U' \ b */ + /* ------------------------------------------------------------------ */ + + for (i = 0 ; i < n ; i++) + { + /* X [i] = B [i] ; */ + ASSIGN (X [i], Bx, Bz, i, Bsplit) ; + } + flops = UMF_uhsolve (Numeric, X, Pattern) ; + + } + else if (sys == UMFPACK_Uat) + { + + /* ------------------------------------------------------------------ */ + /* Solve U'x=b: x = U' \ b */ + /* ------------------------------------------------------------------ */ + + for (i = 0 ; i < n ; i++) + { + /* X [i] = B [i] ; */ + ASSIGN (X [i], Bx, Bz, i, Bsplit) ; + } + flops = UMF_utsolve (Numeric, X, Pattern) ; + + } + else + { + return (UMFPACK_ERROR_invalid_system) ; + } + +#ifdef COMPLEX + /* copy the solution back, from Entry X [ ] to double Xx [ ] and Xz [ ] */ + if (AXsplit) + { + for (i = 0 ; i < n ; i++) + { + Xx [i] = REAL_COMPONENT (X [i]) ; + Xz [i] = IMAG_COMPONENT (X [i]) ; + } + } +#endif + + /* return UMFPACK_OK, or UMFPACK_WARNING_singular_matrix */ + /* Note that systems involving just L will return UMFPACK_OK */ + Info [UMFPACK_SOLVE_FLOPS] = flops ; + return (status) ; +} + + +/* ========================================================================== */ +/* === do_step ============================================================== */ +/* ========================================================================== */ + +/* Perform one step of iterative refinement, for A x = b or A' x = b */ + +PRIVATE Int do_step /* return TRUE if iterative refinement done */ +( + double omega [3], + Int step, /* which step of iterative refinement to do */ + const double B2 [ ], /* abs (B) */ + Entry X [ ], + const Entry W [ ], + const double Y [ ], + const double Z2 [ ], + Entry S [ ], + Int n, + double Info [UMFPACK_INFO] +) +{ + double last_omega [3], tau, nctau, d1, wd1, d2, wd2, xi, yix, wi, xnorm ; + Int i ; + + /* DBL_EPSILON is a standard ANSI C term defined in */ + /* It is the smallest positive x such that 1.0+x != 1.0 */ + + nctau = 1000 * n * DBL_EPSILON ; + DEBUG0 (("do_step start: nctau = %30.20e\n", nctau)) ; + ASSERT (UMF_report_vector (n, (double *) X, (double *) NULL, UMF_debug, + FALSE, FALSE) == UMFPACK_OK) ; + + /* for approximate flop count, assume d1 > tau is always true */ + /* flops += (2*ABS_FLOPS + 5) * n ; (done in UMF_solve, above) */ + + /* ---------------------------------------------------------------------- */ + /* save the last iteration in case we need to reinstate it */ + /* ---------------------------------------------------------------------- */ + + last_omega [0] = omega [0] ; + last_omega [1] = omega [1] ; + last_omega [2] = omega [2] ; + + /* ---------------------------------------------------------------------- */ + /* compute sparse backward errors: omega [1] and omega [2] */ + /* ---------------------------------------------------------------------- */ + + /* xnorm = ||x|| maxnorm */ + xnorm = 0.0 ; + for (i = 0 ; i < n ; i++) + { + /* xi = ABS (X [i]) ; */ + ABS (xi, X [i]) ; + if (SCALAR_IS_NAN (xi)) + { + xnorm = xi ; + break ; + } + /* no NaN's to consider here: */ + xnorm = MAX (xnorm, xi) ; + } + + omega [1] = 0. ; + omega [2] = 0. ; + for (i = 0 ; i < n ; i++) + { + yix = Y [i] * xnorm ; + tau = (yix + B2 [i]) * nctau ; + d1 = Z2 [i] + B2 [i] ; + /* wi = ABS (W [i]) ; */ + ABS (wi, W [i]) ; + if (SCALAR_IS_NAN (d1)) + { + omega [1] = d1 ; + omega [2] = d1 ; + break ; + } + if (SCALAR_IS_NAN (tau)) + { + omega [1] = tau ; + omega [2] = tau ; + break ; + } + if (d1 > tau) /* a double relop, but no NaN's here */ + { + wd1 = wi / d1 ; + omega [1] = MAX (omega [1], wd1) ; + } + else if (tau > 0.0) /* a double relop, but no NaN's here */ + { + d2 = Z2 [i] + yix ; + wd2 = wi / d2 ; + omega [2] = MAX (omega [2], wd2) ; + } + } + + omega [0] = omega [1] + omega [2] ; + Info [UMFPACK_OMEGA1] = omega [1] ; + Info [UMFPACK_OMEGA2] = omega [2] ; + + /* ---------------------------------------------------------------------- */ + /* stop the iterations if the backward error is small, or NaN */ + /* ---------------------------------------------------------------------- */ + + Info [UMFPACK_IR_TAKEN] = step ; + Info [UMFPACK_IR_ATTEMPTED] = step ; + + if (SCALAR_IS_NAN (omega [0])) + { + DEBUG0 (("omega[0] is NaN - done.\n")) ; + ASSERT (UMF_report_vector (n, (double *) X, (double *) NULL, UMF_debug, + FALSE, FALSE) == UMFPACK_OK) ; + return (TRUE) ; + } + + if (omega [0] < DBL_EPSILON) /* double relop, but no NaN case here */ + { + DEBUG0 (("omega[0] too small - done.\n")) ; + ASSERT (UMF_report_vector (n, (double *) X, (double *) NULL, UMF_debug, + FALSE, FALSE) == UMFPACK_OK) ; + return (TRUE) ; + } + + /* ---------------------------------------------------------------------- */ + /* stop if insufficient decrease in omega */ + /* ---------------------------------------------------------------------- */ + + /* double relop, but no NaN case here: */ + if (step > 0 && omega [0] > last_omega [0] / 2) + { + DEBUG0 (("stop refinement\n")) ; + if (omega [0] > last_omega [0]) + { + /* last iteration better than this one, reinstate it */ + DEBUG0 (("last iteration better\n")) ; + for (i = 0 ; i < n ; i++) + { + X [i] = S [i] ; + } + Info [UMFPACK_OMEGA1] = last_omega [1] ; + Info [UMFPACK_OMEGA2] = last_omega [2] ; + } + Info [UMFPACK_IR_TAKEN] = step - 1 ; + ASSERT (UMF_report_vector (n, (double *) X, (double *) NULL, UMF_debug, + FALSE, FALSE) == UMFPACK_OK) ; + return (TRUE) ; + } + + /* ---------------------------------------------------------------------- */ + /* save current solution in case we need to reinstate */ + /* ---------------------------------------------------------------------- */ + + for (i = 0 ; i < n ; i++) + { + S [i] = X [i] ; + } + + /* ---------------------------------------------------------------------- */ + /* iterative refinement continues */ + /* ---------------------------------------------------------------------- */ + + ASSERT (UMF_report_vector (n, (double *) X, (double *) NULL, UMF_debug, + FALSE, FALSE) == UMFPACK_OK) ; + return (FALSE) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_solve.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_solve.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,25 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL Int UMF_solve +( + Int sys, + const Int Ap [ ], + const Int Ai [ ], + const double Ax [ ], + double Xx [ ], + const double Bx [ ], +#ifdef COMPLEX + const double Az [ ], + double Xz [ ], + const double Bz [ ], +#endif + NumericType *Numeric, + Int irstep, + double Info [UMFPACK_INFO], + Int Pattern [ ], + double SolveWork [ ] +) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_start_front.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_start_front.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,283 @@ +/* ========================================================================== */ +/* === UMF_start_front ====================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* Allocate the initial frontal matrix working array for a single chain. The + * front does not have to be big enough, since if it's too small it will get + * reallocated. The size computed here is just an estimate. */ + +#include "umf_internal.h" +#include "umf_grow_front.h" + +GLOBAL Int UMF_start_front /* returns TRUE if successful, FALSE otherwise */ +( + Int chain, + NumericType *Numeric, + WorkType *Work, + SymbolicType *Symbolic +) +{ + double maxbytes ; + Int fnrows_max, fncols_max, fnr2, fnc2, fsize, fcurr_size, maxfrsize, + overflow, nb, f, cdeg ; + + nb = Symbolic->nb ; + fnrows_max = Symbolic->Chain_maxrows [chain] ; + fncols_max = Symbolic->Chain_maxcols [chain] ; + + DEBUGm2 (("Start Front for chain "ID". fnrows_max "ID" fncols_max "ID"\n", + chain, fnrows_max, fncols_max)) ; + + Work->fnrows_max = fnrows_max ; + Work->fncols_max = fncols_max ; + Work->any_skip = FALSE ; + + maxbytes = sizeof (Entry) * + (double) (fnrows_max + nb) * (double) (fncols_max + nb) ; + fcurr_size = Work->fcurr_size ; + + if (Symbolic->prefer_diagonal) + { + /* Get a rough upper bound on the degree of the first pivot column in + * this front. Note that Col_degree is not maintained if diagonal + * pivoting is preferred. For most matrices, the first pivot column + * of the first frontal matrix of a new chain has only one tuple in + * it anyway, so this bound is exact in that case. */ + Int col, tpi, e, *E, *Col_tuples, *Col_tlen, *Cols ; + Tuple *tp, *tpend ; + Unit *Memory, *p ; + Element *ep ; + E = Work->E ; + Memory = Numeric->Memory ; + Col_tuples = Numeric->Lip ; + Col_tlen = Numeric->Lilen ; + col = Work->nextcand ; + tpi = Col_tuples [col] ; + tp = (Tuple *) Memory + tpi ; + tpend = tp + Col_tlen [col] ; + cdeg = 0 ; + DEBUGm3 (("\n=============== start front: col "ID" tlen "ID"\n", + col, Col_tlen [col])) ; + for ( ; tp < tpend ; tp++) + { + DEBUG1 (("Tuple ("ID","ID")\n", tp->e, tp->f)) ; + e = tp->e ; + if (!E [e]) continue ; + f = tp->f ; + p = Memory + E [e] ; + ep = (Element *) p ; + p += UNITS (Element, 1) ; + Cols = (Int *) p ; + if (Cols [f] == EMPTY) continue ; + DEBUG1 ((" nrowsleft "ID"\n", ep->nrowsleft)) ; + cdeg += ep->nrowsleft ; + } +#ifndef NDEBUG + DEBUGm3 (("start front cdeg: "ID" col "ID"\n", cdeg, col)) ; + UMF_dump_rowcol (1, Numeric, Work, col, FALSE) ; +#endif + + /* cdeg is now the rough upper bound on the degree of the next pivot + * column. */ + + /* If AMD was called, we know the maximum number of nonzeros in any + * column of L. Use this as an upper bound for cdeg, but add 2 to + * account for a small amount of off-diagonal pivoting. */ + if (Symbolic->amd_dmax > 0) + { + cdeg = MIN (cdeg, Symbolic->amd_dmax) ; + } + + /* Increase it to account for larger columns later on. + * Also ensure that it's larger than zero. */ + cdeg += 2 ; + + /* cdeg cannot be larger than fnrows_max */ + cdeg = MIN (cdeg, fnrows_max) ; + + } + else + { + /* don't do the above cdeg computation */ + cdeg = 0 ; + } + + DEBUGm2 (("fnrows max "ID" fncols_max "ID"\n", fnrows_max, fncols_max)) ; + + /* the current frontal matrix is empty */ + ASSERT (Work->fnrows == 0 && Work->fncols == 0 && Work->fnpiv == 0) ; + + /* maximum row dimension is always odd, to avoid bad cache effects */ + ASSERT (fnrows_max >= 0) ; + ASSERT (fnrows_max % 2 == 1) ; + + /* ---------------------------------------------------------------------- + * allocate working array for current frontal matrix: + * minimum size: 1-by-1 + * maximum size: fnrows_max-by-fncols_max + * desired size: + * + * if Numeric->front_alloc_init >= 0: + * + * for unsymmetric matrices: + * Numeric->front_alloc_init * (fnrows_max-by-fncols_max) + * + * for symmetric matrices (diagonal pivoting preference, actually): + * Numeric->front_alloc_init * (fnrows_max-by-fncols_max), or + * cdeg*cdeg, whichever is smaller. + * + * if Numeric->front_alloc_init < 0: + * allocate a front of size -Numeric->front_alloc_init. + * + * Allocate the whole thing if it's small (less than 2*nb^2). Make sure the + * leading dimension of the frontal matrix is odd. + * + * Also allocate the nb-by-nb LU block, the dr-by-nb L block, and the + * nb-by-dc U block. + * ---------------------------------------------------------------------- */ + + /* get the maximum front size, avoiding integer overflow */ + overflow = INT_OVERFLOW (maxbytes) ; + if (overflow) + { + /* :: int overflow, max front size :: */ + maxfrsize = Int_MAX / sizeof (Entry) ; + } + else + { + maxfrsize = (fnrows_max + nb) * (fncols_max + nb) ; + } + ASSERT (!INT_OVERFLOW ((double) maxfrsize * sizeof (Entry))) ; + + if (Numeric->front_alloc_init < 0) + { + /* allocate a front of -Numeric->front_alloc_init entries */ + fsize = -Numeric->front_alloc_init ; + fsize = MAX (1, fsize) ; + } + else + { + if (INT_OVERFLOW (Numeric->front_alloc_init * maxbytes)) + { + /* :: int overflow, requested front size :: */ + fsize = Int_MAX / sizeof (Entry) ; + } + else + { + fsize = Numeric->front_alloc_init * maxfrsize ; + } + + if (cdeg > 0) + { + /* diagonal pivoting is in use. cdeg was computed above */ + Int fsize2 ; + + /* add the L and U blocks */ + cdeg += nb ; + + if (INT_OVERFLOW (((double) cdeg * (double) cdeg) * sizeof (Entry))) + { + /* :: int overflow, symmetric front size :: */ + fsize2 = Int_MAX / sizeof (Entry) ; + } + else + { + fsize2 = MAX (cdeg * cdeg, fcurr_size) ; + } + fsize = MIN (fsize, fsize2) ; + } + } + + fsize = MAX (fsize, 2*nb*nb) ; + + /* fsize and maxfrsize are now safe from integer overflow. They both + * include the size of the pivot blocks. */ + ASSERT (!INT_OVERFLOW ((double) fsize * sizeof (Entry))) ; + + Work->fnrows_new = 0 ; + Work->fncols_new = 0 ; + + /* desired size is fnr2-by-fnc2 (includes L and U blocks): */ + DEBUGm2 ((" fsize "ID" fcurr_size "ID"\n", fsize, fcurr_size)) ; + DEBUGm2 ((" maxfrsize "ID" fnr_curr "ID" fnc_curr "ID"\n", maxfrsize, + Work->fnr_curr, Work->fnc_curr)) ; + + if (fsize >= maxfrsize && !overflow) + { + /* max working array is small, allocate all of it */ + fnr2 = fnrows_max + nb ; + fnc2 = fncols_max + nb ; + fsize = maxfrsize ; + DEBUGm1 ((" sufficient for ("ID"+"ID")-by-("ID"+"ID")\n", + fnrows_max, nb, fncols_max, nb)) ; + } + else + { + /* allocate a smaller working array */ + if (fnrows_max <= fncols_max) + { + fnr2 = (Int) sqrt ((double) fsize) ; + /* make sure fnr2 is odd */ + fnr2 = MAX (fnr2, 1) ; + if (fnr2 % 2 == 0) fnr2++ ; + fnr2 = MIN (fnr2, fnrows_max + nb) ; + fnc2 = fsize / fnr2 ; + } + else + { + fnc2 = (Int) sqrt ((double) fsize) ; + fnc2 = MIN (fnc2, fncols_max + nb) ; + fnr2 = fsize / fnc2 ; + /* make sure fnr2 is odd */ + fnr2 = MAX (fnr2, 1) ; + if (fnr2 % 2 == 0) + { + fnr2++ ; + fnc2 = fsize / fnr2 ; + } + } + DEBUGm1 ((" smaller "ID"-by-"ID"\n", fnr2, fnc2)) ; + } + fnr2 = MIN (fnr2, fnrows_max + nb) ; + fnc2 = MIN (fnc2, fncols_max + nb) ; + ASSERT (fnr2 % 2 == 1) ; + ASSERT (fnr2 * fnc2 <= fsize) ; + + fnr2 -= nb ; + fnc2 -= nb ; + ASSERT (fnr2 >= 0) ; + ASSERT (fnc2 >= 0) ; + + if (fsize > fcurr_size) + { + DEBUGm1 ((" Grow front \n")) ; + Work->do_grow = TRUE ; + if (!UMF_grow_front (Numeric, fnr2, fnc2, Work, -1)) + { + /* since the minimum front size is 1-by-1, it would be nearly + * impossible to run out of memory here. */ + DEBUGm4 (("out of memory: start front\n")) ; + return (FALSE) ; + } + } + else + { + /* use the existing front */ + DEBUGm1 ((" existing front ok\n")) ; + Work->fnr_curr = fnr2 ; + Work->fnc_curr = fnc2 ; + Work->Flblock = Work->Flublock + nb * nb ; + Work->Fublock = Work->Flblock + nb * fnr2 ; + Work->Fcblock = Work->Fublock + nb * fnc2 ; + } + ASSERT (Work->Flblock == Work->Flublock + Work->nb*Work->nb) ; + ASSERT (Work->Fublock == Work->Flblock + Work->fnr_curr*Work->nb) ; + ASSERT (Work->Fcblock == Work->Fublock + Work->nb*Work->fnc_curr) ; + return (TRUE) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_start_front.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_start_front.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,13 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL Int UMF_start_front +( + Int chain, + NumericType *Numeric, + WorkType *Work, + SymbolicType *Symbolic +) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_store_lu.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_store_lu.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,1056 @@ +/* ========================================================================== */ +/* === UMF_store_lu ========================================================= */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + Store the LU factors. Called by the kernel. + Returns TRUE if successful, FALSE if out of memory. +*/ + +#include "umf_internal.h" +#include "umf_mem_alloc_head_block.h" +#include "umf_get_memory.h" + +/* ========================================================================== */ + +#ifdef DROP +GLOBAL Int UMF_store_lu_drop +#else +GLOBAL Int UMF_store_lu +#endif +( + NumericType *Numeric, + WorkType *Work +) +{ + /* ---------------------------------------------------------------------- */ + /* local variables */ + /* ---------------------------------------------------------------------- */ + + Entry pivot_value ; +#ifdef DROP + double droptol ; +#endif + Entry *D, *Lval, *Uval, *Fl1, *Fl2, *Fu1, *Fu2, + *Flublock, *Flblock, *Fublock ; + Int i, k, fnr_curr, fnrows, fncols, row, col, pivrow, pivcol, *Frows, + *Fcols, *Lpattern, *Upattern, *Lpos, *Upos, llen, ulen, fnc_curr, fnpiv, + uilen, lnz, unz, nb, *Lilen, + *Uilen, *Lip, *Uip, *Li, *Ui, pivcol_position, newLchain, newUchain, + pivrow_position, p, size, lip, uip, lnzi, lnzx, unzx, lnz2i, lnz2x, + unz2i, unz2x, zero_pivot, *Pivrow, *Pivcol, kk, + Lnz [MAXNB] ; + +#ifndef NDEBUG + Int *Col_degree, *Row_degree ; +#endif + +#ifdef DROP + Int all_lnz, all_unz ; + droptol = Numeric->droptol ; +#endif + + /* ---------------------------------------------------------------------- */ + /* get parameters */ + /* ---------------------------------------------------------------------- */ + + fnrows = Work->fnrows ; + fncols = Work->fncols ; + fnpiv = Work->fnpiv ; + + Lpos = Numeric->Lpos ; + Upos = Numeric->Upos ; + Lilen = Numeric->Lilen ; + Uilen = Numeric->Uilen ; + + Lip = Numeric->Lip ; + Uip = Numeric->Uip ; + D = Numeric->D ; + + Flublock = Work->Flublock ; + Flblock = Work->Flblock ; + Fublock = Work->Fublock ; + + fnr_curr = Work->fnr_curr ; + fnc_curr = Work->fnc_curr ; + Frows = Work->Frows ; + Fcols = Work->Fcols ; + +#ifndef NDEBUG + Col_degree = Numeric->Cperm ; /* for NON_PIVOTAL_COL macro */ + Row_degree = Numeric->Rperm ; /* for NON_PIVOTAL_ROW macro */ +#endif + + Lpattern = Work->Lpattern ; + llen = Work->llen ; + Upattern = Work->Upattern ; + ulen = Work->ulen ; + + nb = Work->nb ; + +#ifndef NDEBUG + DEBUG1 (("\nSTORE LU: fnrows "ID + " fncols "ID"\n", fnrows, fncols)) ; + + DEBUG2 (("\nFrontal matrix, including all space:\n" + "fnr_curr "ID" fnc_curr "ID" nb "ID"\n" + "fnrows "ID" fncols "ID" fnpiv "ID"\n", + fnr_curr, fnc_curr, nb, fnrows, fncols, fnpiv)) ; + + DEBUG2 (("\nJust the active part:\n")) ; + DEBUG7 (("C block: ")) ; + UMF_dump_dense (Work->Fcblock, fnr_curr, fnrows, fncols) ; + DEBUG7 (("L block: ")) ; + UMF_dump_dense (Work->Flblock, fnr_curr, fnrows, fnpiv); + DEBUG7 (("U' block: ")) ; + UMF_dump_dense (Work->Fublock, fnc_curr, fncols, fnpiv) ; + DEBUG7 (("LU block: ")) ; + UMF_dump_dense (Work->Flublock, nb, fnpiv, fnpiv) ; + DEBUG7 (("Current frontal matrix: (prior to store LU)\n")) ; + UMF_dump_current_front (Numeric, Work, TRUE) ; +#endif + + Pivrow = Work->Pivrow ; + Pivcol = Work->Pivcol ; + + /* ---------------------------------------------------------------------- */ + /* store the columns of L */ + /* ---------------------------------------------------------------------- */ + + for (kk = 0 ; kk < fnpiv ; kk++) + { + + /* ------------------------------------------------------------------ */ + /* one more pivot row and column is being stored into L and U */ + /* ------------------------------------------------------------------ */ + + k = Work->npiv + kk ; + + /* ------------------------------------------------------------------ */ + /* find the kth pivot row and pivot column */ + /* ------------------------------------------------------------------ */ + + pivrow = Pivrow [kk] ; + pivcol = Pivcol [kk] ; + +#ifndef NDEBUG + ASSERT (pivrow >= 0 && pivrow < Work->n_row) ; + ASSERT (pivcol >= 0 && pivcol < Work->n_col) ; + + DEBUGm4 (( + "\n -------------------------------------------------------------" + "Store LU: step " ID"\n", k)) ; + ASSERT (k < MIN (Work->n_row, Work->n_col)) ; + DEBUG2 (("Store column of L, k = "ID", llen "ID"\n", k, llen)) ; + for (i = 0 ; i < llen ; i++) + { + row = Lpattern [i] ; + ASSERT (row >= 0 && row < Work->n_row) ; + DEBUG2 ((" Lpattern["ID"] "ID" Lpos "ID, i, row, Lpos [row])) ; + if (row == pivrow) DEBUG2 ((" <- pivot row")) ; + DEBUG2 (("\n")) ; + ASSERT (i == Lpos [row]) ; + } +#endif + + /* ------------------------------------------------------------------ */ + /* remove pivot row from L */ + /* ------------------------------------------------------------------ */ + + /* remove pivot row index from current column of L */ + /* if a new Lchain starts, then all entries are removed later */ + DEBUG2 (("Removing pivrow from Lpattern, k = "ID"\n", k)) ; + ASSERT (!NON_PIVOTAL_ROW (pivrow)) ; + pivrow_position = Lpos [pivrow] ; + if (pivrow_position != EMPTY) + { + /* place the last entry in the column in the */ + /* position of the pivot row index */ + ASSERT (pivrow == Lpattern [pivrow_position]) ; + row = Lpattern [--llen] ; + /* ASSERT (NON_PIVOTAL_ROW (row)) ; */ + Lpattern [pivrow_position] = row ; + Lpos [row] = pivrow_position ; + Lpos [pivrow] = EMPTY ; + } + + /* ------------------------------------------------------------------ */ + /* store the pivot value, for the diagonal matrix D */ + /* ------------------------------------------------------------------ */ + + /* kk-th column of LU block */ + Fl1 = Flublock + kk * nb ; + + /* kk-th column of L in the L block */ + Fl2 = Flblock + kk * fnr_curr ; + + /* kk-th pivot in frontal matrix located in Flublock [kk, kk] */ + pivot_value = Fl1 [kk] ; + + D [k] = pivot_value ; + zero_pivot = IS_ZERO (pivot_value) ; + + DEBUG4 (("Pivot D["ID"]=", k)) ; + EDEBUG4 (pivot_value) ; + DEBUG4 (("\n")) ; + + /* ------------------------------------------------------------------ */ + /* count nonzeros in kth column of L */ + /* ------------------------------------------------------------------ */ + + lnz = 0 ; + lnz2i = 0 ; + lnz2x = llen ; + +#ifdef DROP + all_lnz = 0 ; + + for (i = kk + 1 ; i < fnpiv ; i++) + { + Entry x ; + double s ; + x = Fl1 [i] ; + if (IS_ZERO (x)) continue ; + all_lnz++ ; + APPROX_ABS (s, x) ; + if (s <= droptol) continue ; + lnz++ ; + if (Lpos [Pivrow [i]] == EMPTY) lnz2i++ ; + } + + for (i = 0 ; i < fnrows ; i++) + { + Entry x ; + double s ; + x = Fl2 [i] ; + if (IS_ZERO (x)) continue ; + all_lnz++ ; + APPROX_ABS (s, x) ; + if (s <= droptol) continue ; + lnz++ ; + if (Lpos [Frows [i]] == EMPTY) lnz2i++ ; + } + +#else + + for (i = kk + 1 ; i < fnpiv ; i++) + { + if (IS_ZERO (Fl1 [i])) continue ; + lnz++ ; + if (Lpos [Pivrow [i]] == EMPTY) lnz2i++ ; + } + + for (i = 0 ; i < fnrows ; i++) + { + if (IS_ZERO (Fl2 [i])) continue ; + lnz++ ; + if (Lpos [Frows [i]] == EMPTY) lnz2i++ ; + } + +#endif + + lnz2x += lnz2i ; + + /* determine if we start a new Lchain or continue the old one */ + if (llen == 0 || zero_pivot) + { + /* llen == 0 means there is no prior Lchain */ + /* D [k] == 0 means the pivot column is empty */ + newLchain = TRUE ; + } + else + { + newLchain = + /* storage for starting a new Lchain */ + UNITS (Entry, lnz) + UNITS (Int, lnz) + <= + /* storage for continuing a prior Lchain */ + UNITS (Entry, lnz2x) + UNITS (Int, lnz2i) ; + } + + if (newLchain) + { + /* start a new chain for column k of L */ + DEBUG2 (("Start new Lchain, k = "ID"\n", k)) ; + + pivrow_position = EMPTY ; + + /* clear the prior Lpattern */ + for (i = 0 ; i < llen ; i++) + { + row = Lpattern [i] ; + Lpos [row] = EMPTY ; + } + llen = 0 ; + + lnzi = lnz ; + lnzx = lnz ; + } + else + { + /* continue the prior Lchain */ + DEBUG2 (("Continue Lchain, k = "ID"\n", k)) ; + lnzi = lnz2i ; + lnzx = lnz2x ; + } + + /* ------------------------------------------------------------------ */ + /* allocate space for the column of L */ + /* ------------------------------------------------------------------ */ + + size = UNITS (Int, lnzi) + UNITS (Entry, lnzx) ; + +#ifndef NDEBUG + UMF_allocfail = FALSE ; + if (UMF_gprob > 0) + { + double rrr = ((double) (rand ( ))) / (((double) RAND_MAX) + 1) ; + DEBUG4 (("Check random %e %e\n", rrr, UMF_gprob)) ; + UMF_allocfail = rrr < UMF_gprob ; + if (UMF_allocfail) DEBUGm2 (("Random garbage coll. (store LU)\n")); + } +#endif + + p = UMF_mem_alloc_head_block (Numeric, size) ; + if (!p) + { + Int r2, c2 ; + /* Do garbage collection, realloc, and try again. */ + /* Note that there are pivot rows/columns in current front. */ + if (Work->do_grow) + { + /* full compaction of current frontal matrix, since + * UMF_grow_front will be called next anyway. */ + r2 = fnrows ; + c2 = fncols ; + } + else + { + /* partial compaction. */ + r2 = MAX (fnrows, Work->fnrows_new + 1) ; + c2 = MAX (fncols, Work->fncols_new + 1) ; + } + DEBUGm3 (("get_memory from umf_store_lu:\n")) ; + if (!UMF_get_memory (Numeric, Work, size, r2, c2, TRUE)) + { + DEBUGm4 (("out of memory: store LU (1)\n")) ; + return (FALSE) ; /* out of memory */ + } + p = UMF_mem_alloc_head_block (Numeric, size) ; + if (!p) + { + DEBUGm4 (("out of memory: store LU (2)\n")) ; + return (FALSE) ; /* out of memory */ + } + /* garbage collection may have moved the current front */ + fnc_curr = Work->fnc_curr ; + fnr_curr = Work->fnr_curr ; + Flublock = Work->Flublock ; + Flblock = Work->Flblock ; + Fublock = Work->Fublock ; + Fl1 = Flublock + kk * nb ; + Fl2 = Flblock + kk * fnr_curr ; + } + + /* ------------------------------------------------------------------ */ + /* store the column of L */ + /* ------------------------------------------------------------------ */ + + lip = p ; + + Li = (Int *) (Numeric->Memory + p) ; + p += UNITS (Int, lnzi) ; + Lval = (Entry *) (Numeric->Memory + p) ; + p += UNITS (Entry, lnzx) ; + + for (i = 0 ; i < lnzx ; i++) + { + CLEAR (Lval [i]) ; + } + + /* store the numerical entries */ + + if (newLchain) + { + /* flag the first column in the Lchain by negating Lip [k] */ + lip = -lip ; + + ASSERT (llen == 0) ; + +#ifdef DROP + + for (i = kk + 1 ; i < fnpiv ; i++) + { + Entry x ; + double s ; + Int row2, pos ; + x = Fl1 [i] ; + APPROX_ABS (s, x) ; + if (s <= droptol) continue ; + row2 = Pivrow [i] ; + pos = llen++ ; + Lpattern [pos] = row2 ; + Lpos [row2] = pos ; + Li [pos] = row2 ; + Lval [pos] = x ; + } + + for (i = 0 ; i < fnrows ; i++) + { + Entry x ; + double s ; + Int row2, pos ; + x = Fl2 [i] ; + APPROX_ABS (s, x) ; + if (s <= droptol) continue ; + row2 = Frows [i] ; + pos = llen++ ; + Lpattern [pos] = row2 ; + Lpos [row2] = pos ; + Li [pos] = row2 ; + Lval [pos] = x ; + } + +#else + + for (i = kk + 1 ; i < fnpiv ; i++) + { + Entry x ; + Int row2, pos ; + x = Fl1 [i] ; + if (IS_ZERO (x)) continue ; + row2 = Pivrow [i] ; + pos = llen++ ; + Lpattern [pos] = row2 ; + Lpos [row2] = pos ; + Li [pos] = row2 ; + Lval [pos] = x ; + } + + for (i = 0 ; i < fnrows ; i++) + { + Entry x ; + Int row2, pos ; + x = Fl2 [i] ; + if (IS_ZERO (x)) continue ; + row2 = Frows [i] ; + pos = llen++ ; + Lpattern [pos] = row2 ; + Lpos [row2] = pos ; + Li [pos] = row2 ; + Lval [pos] = x ; + } + +#endif + + } + else + { + ASSERT (llen > 0) ; + +#ifdef DROP + + for (i = kk + 1 ; i < fnpiv ; i++) + { + Entry x ; + double s ; + Int row2, pos ; + x = Fl1 [i] ; + APPROX_ABS (s, x) ; + if (s <= droptol) continue ; + row2 = Pivrow [i] ; + pos = Lpos [row2] ; + if (pos == EMPTY) + { + pos = llen++ ; + Lpattern [pos] = row2 ; + Lpos [row2] = pos ; + *Li++ = row2 ; + } + Lval [pos] = x ; + } + + for (i = 0 ; i < fnrows ; i++) + { + Entry x ; + double s ; + Int row2, pos ; + x = Fl2 [i] ; + APPROX_ABS (s, x) ; + if (s <= droptol) continue ; + row2 = Frows [i] ; + pos = Lpos [row2] ; + if (pos == EMPTY) + { + pos = llen++ ; + Lpattern [pos] = row2 ; + Lpos [row2] = pos ; + *Li++ = row2 ; + } + Lval [pos] = x ; + } + +#else + + for (i = kk + 1 ; i < fnpiv ; i++) + { + Entry x ; + Int row2, pos ; + x = Fl1 [i] ; + if (IS_ZERO (x)) continue ; + row2 = Pivrow [i] ; + pos = Lpos [row2] ; + if (pos == EMPTY) + { + pos = llen++ ; + Lpattern [pos] = row2 ; + Lpos [row2] = pos ; + *Li++ = row2 ; + } + Lval [pos] = x ; + } + + for (i = 0 ; i < fnrows ; i++) + { + Entry x ; + Int row2, pos ; + x = Fl2 [i] ; + if (IS_ZERO (x)) continue ; + row2 = Frows [i] ; + pos = Lpos [row2] ; + if (pos == EMPTY) + { + pos = llen++ ; + Lpattern [pos] = row2 ; + Lpos [row2] = pos ; + *Li++ = row2 ; + } + Lval [pos] = x ; + } + +#endif + + } + DEBUG4 (("llen "ID" lnzx "ID"\n", llen, lnzx)) ; + ASSERT (llen == lnzx) ; + ASSERT (lnz <= llen) ; + DEBUG4 (("lnz "ID" \n", lnz)) ; + +#ifdef DROP + + DEBUG4 (("all_lnz "ID" \n", all_lnz)) ; + ASSERT (lnz <= all_lnz) ; + Numeric->lnz += lnz ; + Numeric->all_lnz += all_lnz ; + Lnz [kk] = all_lnz ; + +#else + + Numeric->lnz += lnz ; + Numeric->all_lnz += lnz ; + Lnz [kk] = lnz ; +#endif + + Numeric->nLentries += lnzx ; + Work->llen = llen ; + Numeric->isize += lnzi ; + + /* ------------------------------------------------------------------ */ + /* the pivot column is fully assembled and scaled, and is now the */ + /* k-th column of L */ + /* ------------------------------------------------------------------ */ + + Lpos [pivrow] = pivrow_position ; /* not aliased */ + Lip [pivcol] = lip ; /* aliased with Col_tuples */ + Lilen [pivcol] = lnzi ; /* aliased with Col_tlen */ + + } + + /* ---------------------------------------------------------------------- */ + /* store the rows of U */ + /* ---------------------------------------------------------------------- */ + + for (kk = 0 ; kk < fnpiv ; kk++) + { + + /* ------------------------------------------------------------------ */ + /* one more pivot row and column is being stored into L and U */ + /* ------------------------------------------------------------------ */ + + k = Work->npiv + kk ; + + /* ------------------------------------------------------------------ */ + /* find the kth pivot row and pivot column */ + /* ------------------------------------------------------------------ */ + + pivrow = Pivrow [kk] ; + pivcol = Pivcol [kk] ; + +#ifndef NDEBUG + ASSERT (pivrow >= 0 && pivrow < Work->n_row) ; + ASSERT (pivcol >= 0 && pivcol < Work->n_col) ; + + DEBUG2 (("Store row of U, k = "ID", ulen "ID"\n", k, ulen)) ; + for (i = 0 ; i < ulen ; i++) + { + col = Upattern [i] ; + DEBUG2 ((" Upattern["ID"] "ID, i, col)) ; + if (col == pivcol) DEBUG2 ((" <- pivot col")) ; + DEBUG2 (("\n")) ; + ASSERT (col >= 0 && col < Work->n_col) ; + ASSERT (i == Upos [col]) ; + } +#endif + + /* ------------------------------------------------------------------ */ + /* get the pivot value, for the diagonal matrix D */ + /* ------------------------------------------------------------------ */ + + zero_pivot = IS_ZERO (D [k]) ; + + /* ------------------------------------------------------------------ */ + /* count the nonzeros in the row of U */ + /* ------------------------------------------------------------------ */ + + /* kk-th row of U in the LU block */ + Fu1 = Flublock + kk ; + + /* kk-th row of U in the U block */ + Fu2 = Fublock + kk * fnc_curr ; + + unz = 0 ; + unz2i = 0 ; + unz2x = ulen ; + DEBUG2 (("unz2x is "ID", lnzx "ID"\n", unz2x, lnzx)) ; + + /* if row k does not end a Uchain, pivcol not included in ulen */ + ASSERT (!NON_PIVOTAL_COL (pivcol)) ; + pivcol_position = Upos [pivcol] ; + if (pivcol_position != EMPTY) + { + unz2x-- ; + DEBUG2 (("(exclude pivcol) unz2x is now "ID"\n", unz2x)) ; + } + + ASSERT (unz2x >= 0) ; + +#ifdef DROP + all_unz = 0 ; + + for (i = kk + 1 ; i < fnpiv ; i++) + { + Entry x ; + double s ; + x = Fu1 [i*nb] ; + if (IS_ZERO (x)) continue ; + all_unz++ ; + APPROX_ABS (s, x) ; + if (s <= droptol) continue ; + unz++ ; + if (Upos [Pivcol [i]] == EMPTY) unz2i++ ; + } + + for (i = 0 ; i < fncols ; i++) + { + Entry x ; + double s ; + x = Fu2 [i] ; + if (IS_ZERO (x)) continue ; + all_unz++ ; + APPROX_ABS (s, x) ; + if (s <= droptol) continue ; + unz++ ; + if (Upos [Fcols [i]] == EMPTY) unz2i++ ; + } + +#else + + for (i = kk + 1 ; i < fnpiv ; i++) + { + if (IS_ZERO (Fu1 [i*nb])) continue ; + unz++ ; + if (Upos [Pivcol [i]] == EMPTY) unz2i++ ; + } + + for (i = 0 ; i < fncols ; i++) + { + if (IS_ZERO (Fu2 [i])) continue ; + unz++ ; + if (Upos [Fcols [i]] == EMPTY) unz2i++ ; + } + +#endif + + unz2x += unz2i ; + + ASSERT (IMPLIES (k == 0, ulen == 0)) ; + + /* determine if we start a new Uchain or continue the old one */ + if (ulen == 0 || zero_pivot) + { + /* ulen == 0 means there is no prior Uchain */ + /* D [k] == 0 means the matrix is singular (pivot row might */ + /* not be empty, however, but start a new Uchain to prune zero */ + /* entries for the deg > 0 test in UMF_u*solve) */ + newUchain = TRUE ; + } + else + { + newUchain = + /* approximate storage for starting a new Uchain */ + UNITS (Entry, unz) + UNITS (Int, unz) + <= + /* approximate storage for continuing a prior Uchain */ + UNITS (Entry, unz2x) + UNITS (Int, unz2i) ; + + /* this would be exact, except for the Int to Unit rounding, */ + /* because the Upattern is stored only at the end of the Uchain */ + } + + /* ------------------------------------------------------------------ */ + /* allocate space for the row of U */ + /* ------------------------------------------------------------------ */ + + size = 0 ; + if (newUchain) + { + /* store the pattern of the last row in the prior Uchain */ + size += UNITS (Int, ulen) ; + unzx = unz ; + } + else + { + unzx = unz2x ; + } + size += UNITS (Entry, unzx) ; + +#ifndef NDEBUG + UMF_allocfail = FALSE ; + if (UMF_gprob > 0) + { + double rrr = ((double) (rand ( ))) / (((double) RAND_MAX) + 1) ; + DEBUG4 (("Check random %e %e\n", rrr, UMF_gprob)) ; + UMF_allocfail = rrr < UMF_gprob ; + if (UMF_allocfail) DEBUGm2 (("Random garbage coll. (store LU)\n")); + } +#endif + + p = UMF_mem_alloc_head_block (Numeric, size) ; + if (!p) + { + Int r2, c2 ; + /* Do garbage collection, realloc, and try again. */ + /* Note that there are pivot rows/columns in current front. */ + if (Work->do_grow) + { + /* full compaction of current frontal matrix, since + * UMF_grow_front will be called next anyway. */ + r2 = fnrows ; + c2 = fncols ; + } + else + { + /* partial compaction. */ + r2 = MAX (fnrows, Work->fnrows_new + 1) ; + c2 = MAX (fncols, Work->fncols_new + 1) ; + } + DEBUGm3 (("get_memory from umf_store_lu:\n")) ; + if (!UMF_get_memory (Numeric, Work, size, r2, c2, TRUE)) + { + /* :: get memory, column of L :: */ + DEBUGm4 (("out of memory: store LU (1)\n")) ; + return (FALSE) ; /* out of memory */ + } + p = UMF_mem_alloc_head_block (Numeric, size) ; + if (!p) + { + /* :: out of memory, column of U :: */ + DEBUGm4 (("out of memory: store LU (2)\n")) ; + return (FALSE) ; /* out of memory */ + } + /* garbage collection may have moved the current front */ + fnc_curr = Work->fnc_curr ; + fnr_curr = Work->fnr_curr ; + Flublock = Work->Flublock ; + Flblock = Work->Flblock ; + Fublock = Work->Fublock ; + Fu1 = Flublock + kk ; + Fu2 = Fublock + kk * fnc_curr ; + } + + /* ------------------------------------------------------------------ */ + /* store the row of U */ + /* ------------------------------------------------------------------ */ + + uip = p ; + + if (newUchain) + { + /* starting a new Uchain - flag this by negating Uip [k] */ + uip = -uip ; + DEBUG2 (("Start new Uchain, k = "ID"\n", k)) ; + + pivcol_position = EMPTY ; + + /* end the prior Uchain */ + /* save the current Upattern, and then */ + /* clear it and start a new Upattern */ + DEBUG2 (("Ending prior chain, k-1 = "ID"\n", k-1)) ; + uilen = ulen ; + Ui = (Int *) (Numeric->Memory + p) ; + Numeric->isize += ulen ; + p += UNITS (Int, ulen) ; + for (i = 0 ; i < ulen ; i++) + { + col = Upattern [i] ; + ASSERT (col >= 0 && col < Work->n_col) ; + Upos [col] = EMPTY ; + Ui [i] = col ; + } + + ulen = 0 ; + + } + else + { + /* continue the prior Uchain */ + DEBUG2 (("Continue Uchain, k = "ID"\n", k)) ; + ASSERT (k > 0) ; + + /* remove pivot col index from current row of U */ + /* if a new Uchain starts, then all entries are removed later */ + DEBUG2 (("Removing pivcol from Upattern, k = "ID"\n", k)) ; + + if (pivcol_position != EMPTY) + { + /* place the last entry in the row in the */ + /* position of the pivot col index */ + ASSERT (pivcol == Upattern [pivcol_position]) ; + col = Upattern [--ulen] ; + ASSERT (col >= 0 && col < Work->n_col) ; + Upattern [pivcol_position] = col ; + Upos [col] = pivcol_position ; + Upos [pivcol] = EMPTY ; + } + + /* this row continues the Uchain. Keep track of how much */ + /* to trim from the k-th length to get the length of the */ + /* (k-1)st row of U */ + uilen = unz2i ; + + } + + Uval = (Entry *) (Numeric->Memory + p) ; + /* p += UNITS (Entry, unzx), no need to increment p */ + + for (i = 0 ; i < unzx ; i++) + { + CLEAR (Uval [i]) ; + } + + if (newUchain) + { + ASSERT (ulen == 0) ; + +#ifdef DROP + + for (i = kk + 1 ; i < fnpiv ; i++) + { + Entry x ; + double s ; + Int col2, pos ; + x = Fu1 [i*nb] ; + APPROX_ABS (s, x) ; + if (s <= droptol) continue ; + col2 = Pivcol [i] ; + pos = ulen++ ; + Upattern [pos] = col2 ; + Upos [col2] = pos ; + Uval [pos] = x ; + } + + for (i = 0 ; i < fncols ; i++) + { + Entry x ; + double s ; + Int col2, pos ; + x = Fu2 [i] ; + APPROX_ABS (s, x) ; + if (s <= droptol) continue ; + col2 = Fcols [i] ; + pos = ulen++ ; + Upattern [pos] = col2 ; + Upos [col2] = pos ; + Uval [pos] = x ; + } + +#else + + for (i = kk + 1 ; i < fnpiv ; i++) + { + Entry x ; + Int col2, pos ; + x = Fu1 [i*nb] ; + if (IS_ZERO (x)) continue ; + col2 = Pivcol [i] ; + pos = ulen++ ; + Upattern [pos] = col2 ; + Upos [col2] = pos ; + Uval [pos] = x ; + } + + for (i = 0 ; i < fncols ; i++) + { + Entry x ; + Int col2, pos ; + x = Fu2 [i] ; + if (IS_ZERO (x)) continue ; + col2 = Fcols [i] ; + pos = ulen++ ; + Upattern [pos] = col2 ; + Upos [col2] = pos ; + Uval [pos] = x ; + } + +#endif + + } + else + { + + ASSERT (ulen > 0) ; + + /* store the numerical entries and find new nonzeros */ + +#ifdef DROP + + for (i = kk + 1 ; i < fnpiv ; i++) + { + Entry x ; + double s ; + Int col2, pos ; + x = Fu1 [i*nb] ; + APPROX_ABS (s, x) ; + if (s <= droptol) continue ; + col2 = Pivcol [i] ; + pos = Upos [col2] ; + if (pos == EMPTY) + { + pos = ulen++ ; + Upattern [pos] = col2 ; + Upos [col2] = pos ; + } + Uval [pos] = x ; + } + + for (i = 0 ; i < fncols ; i++) + { + Entry x ; + double s ; + Int col2, pos ; + x = Fu2 [i] ; + APPROX_ABS (s, x) ; + if (s <= droptol) continue ; + col2 = Fcols [i] ; + pos = Upos [col2] ; + if (pos == EMPTY) + { + pos = ulen++ ; + Upattern [pos] = col2 ; + Upos [col2] = pos ; + } + Uval [pos] = x ; + } + +#else + + for (i = kk + 1 ; i < fnpiv ; i++) + { + Entry x ; + Int col2, pos ; + x = Fu1 [i*nb] ; + if (IS_ZERO (x)) continue ; + col2 = Pivcol [i] ; + pos = Upos [col2] ; + if (pos == EMPTY) + { + pos = ulen++ ; + Upattern [pos] = col2 ; + Upos [col2] = pos ; + } + Uval [pos] = x ; + } + + for (i = 0 ; i < fncols ; i++) + { + Entry x ; + Int col2, pos ; + x = Fu2 [i] ; + if (IS_ZERO (x)) continue ; + col2 = Fcols [i] ; + pos = Upos [col2] ; + if (pos == EMPTY) + { + pos = ulen++ ; + Upattern [pos] = col2 ; + Upos [col2] = pos ; + } + Uval [pos] = x ; + } + +#endif + + } + + ASSERT (ulen == unzx) ; + ASSERT (unz <= ulen) ; + DEBUG4 (("unz "ID" \n", unz)) ; + +#ifdef DROP + + DEBUG4 (("all_unz "ID" \n", all_unz)) ; + ASSERT (unz <= all_unz) ; + Numeric->unz += unz ; + Numeric->all_unz += all_unz ; + /* count the "true" flops, based on LU pattern only */ + Numeric->flops += DIV_FLOPS * Lnz [kk] /* scale pivot column */ + + MULTSUB_FLOPS * (Lnz [kk] * all_unz) ; /* outer product */ + +#else + + Numeric->unz += unz ; + Numeric->all_unz += unz ; + /* count the "true" flops, based on LU pattern only */ + Numeric->flops += DIV_FLOPS * Lnz [kk] /* scale pivot column */ + + MULTSUB_FLOPS * (Lnz [kk] * unz) ; /* outer product */ +#endif + + Numeric->nUentries += unzx ; + Work->ulen = ulen ; + DEBUG1 (("Work->ulen = "ID" at end of pivot step, k: "ID"\n", ulen, k)); + + /* ------------------------------------------------------------------ */ + /* the pivot row is the k-th row of U */ + /* ------------------------------------------------------------------ */ + + Upos [pivcol] = pivcol_position ; /* not aliased */ + Uip [pivrow] = uip ; /* aliased with Row_tuples */ + Uilen [pivrow] = uilen ; /* aliased with Row_tlen */ + + } + + /* ---------------------------------------------------------------------- */ + /* no more pivots in frontal working array */ + /* ---------------------------------------------------------------------- */ + + Work->npiv += fnpiv ; + Work->fnpiv = 0 ; + Work->fnzeros = 0 ; + return (TRUE) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_store_lu.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_store_lu.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,17 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL Int UMF_store_lu +( + NumericType *Numeric, + WorkType *Work +) ; + +GLOBAL Int UMF_store_lu_drop +( + NumericType *Numeric, + WorkType *Work +) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_symbolic_usage.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_symbolic_usage.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,45 @@ +/* ========================================================================== */ +/* === UMF_symbolic_usage =================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* Returns the final size of the Symbolic object, in Units */ + +#include "umf_internal.h" + +GLOBAL double UMF_symbolic_usage +( + Int n_row, + Int n_col, + Int nchains, + Int nfr, + Int esize, /* zero if no dense rows. Otherwise, equal to the + * number of non-singleton, non-empty columns */ + Int prefer_diagonal +) +{ + double units ; + + units = + DUNITS (SymbolicType, 1) /* Symbolic structure */ + + 2 * DUNITS (Int, n_col+1) /* Cperm_init, Cdeg */ + + 2 * DUNITS (Int, n_row+1) /* Rperm_init, Rdeg */ + + 3 * DUNITS (Int, nchains+1) /* Chain_ */ + + 4 * DUNITS (Int, nfr+1) ; /* Front_ */ + + /* if dense rows are present */ + units += DUNITS (Int, esize) ; /* Esize */ + + /* for diagonal pivoting */ + if (prefer_diagonal) + { + units += DUNITS (Int, n_col+1) ; /* Diagonal_map */ + } + + return (units) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_symbolic_usage.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_symbolic_usage.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,15 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL double UMF_symbolic_usage +( + Int n_row, + Int n_col, + Int nchains, + Int nfr, + Int esize, + Int prefer_diagonal +) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_transpose.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_transpose.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,400 @@ +/* ========================================================================== */ +/* === UMF_transpose ======================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* Not user-callable. Computes a permuted transpose, R = (A (P,Q(1:nq)))' in + MATLAB notation, where R is in column-form. A is n_row-by-n_col, the + row-form matrix R is n_row-by-nq, where nq <= n_col. A may be singular. + The complex version can do transpose (') or array transpose (.'). + + Uses Gustavson's method (Two Fast Algorithms for Sparse Matrices: + Multiplication and Permuted Transposition, ACM Trans. on Math. Softw., + vol 4, no 3, pp. 250-269). +*/ + +#include "umf_internal.h" +#include "umf_is_permutation.h" + +GLOBAL Int UMF_transpose +( + Int n_row, /* A is n_row-by-n_col */ + Int n_col, + const Int Ap [ ], /* size n_col+1 */ + const Int Ai [ ], /* size nz = Ap [n_col] */ + const double Ax [ ], /* size nz if present */ + + const Int P [ ], /* P [k] = i means original row i is kth row in A(P,Q)*/ + /* P is identity if not present */ + /* size n_row, if present */ + + const Int Q [ ], /* Q [k] = j means original col j is kth col in A(P,Q)*/ + /* Q is identity if not present */ + /* size nq, if present */ + Int nq, /* size of Q, ignored if Q is (Int *) NULL */ + + /* output matrix: Rp, Ri, Rx, and Rz: */ + Int Rp [ ], /* size n_row+1 */ + Int Ri [ ], /* size nz */ + double Rx [ ], /* size nz, if present */ + + Int W [ ], /* size max (n_row,n_col) workspace */ + + Int check /* if true, then check inputs */ +#ifdef COMPLEX + , const double Az [ ] /* size nz */ + , double Rz [ ] /* size nz */ + , Int do_conjugate /* if true, then do conjugate transpose */ + /* otherwise, do array transpose */ +#endif +) +{ + + /* ---------------------------------------------------------------------- */ + /* local variables */ + /* ---------------------------------------------------------------------- */ + + Int i, j, k, p, bp, newj, do_values ; +#ifdef COMPLEX + Int split ; +#endif + + /* ---------------------------------------------------------------------- */ + /* check inputs */ + /* ---------------------------------------------------------------------- */ + +#ifndef NDEBUG + Int nz ; + ASSERT (n_col >= 0) ; + nz = (Ap != (Int *) NULL) ? Ap [n_col] : 0 ; + DEBUG2 (("UMF_transpose: "ID"-by-"ID" nz "ID"\n", n_row, n_col, nz)) ; +#endif + + if (check) + { + /* UMFPACK_symbolic skips this check */ + /* UMFPACK_transpose always does this check */ + if (!Ai || !Ap || !Ri || !Rp || !W) + { + return (UMFPACK_ERROR_argument_missing) ; + } + if (n_row <= 0 || n_col <= 0) /* n_row,n_col must be > 0 */ + { + return (UMFPACK_ERROR_n_nonpositive) ; + } + if (!UMF_is_permutation (P, W, n_row, n_row) || + !UMF_is_permutation (Q, W, nq, nq)) + { + return (UMFPACK_ERROR_invalid_permutation) ; + } + if (!AMD_valid (n_row, n_col, Ap, Ai)) + { + return (UMFPACK_ERROR_invalid_matrix) ; + } + } + +#ifndef NDEBUG + DEBUG2 (("UMF_transpose, input matrix:\n")) ; + UMF_dump_col_matrix (Ax, +#ifdef COMPLEX + Az, +#endif + Ai, Ap, n_row, n_col, nz) ; +#endif + + /* ---------------------------------------------------------------------- */ + /* count the entries in each row of A */ + /* ---------------------------------------------------------------------- */ + + /* use W as workspace for RowCount */ + + for (i = 0 ; i < n_row ; i++) + { + W [i] = 0 ; + Rp [i] = 0 ; + } + + if (Q != (Int *) NULL) + { + for (newj = 0 ; newj < nq ; newj++) + { + j = Q [newj] ; + ASSERT (j >= 0 && j < n_col) ; + for (p = Ap [j] ; p < Ap [j+1] ; p++) + { + i = Ai [p] ; + ASSERT (i >= 0 && i < n_row) ; + W [i]++ ; + } + } + } + else + { + for (j = 0 ; j < n_col ; j++) + { + for (p = Ap [j] ; p < Ap [j+1] ; p++) + { + i = Ai [p] ; + ASSERT (i >= 0 && i < n_row) ; + W [i]++ ; + } + } + } + + /* ---------------------------------------------------------------------- */ + /* compute the row pointers for R = A (P,Q) */ + /* ---------------------------------------------------------------------- */ + + if (P != (Int *) NULL) + { + Rp [0] = 0 ; + for (k = 0 ; k < n_row ; k++) + { + i = P [k] ; + ASSERT (i >= 0 && i < n_row) ; + Rp [k+1] = Rp [k] + W [i] ; + } + for (k = 0 ; k < n_row ; k++) + { + i = P [k] ; + ASSERT (i >= 0 && i < n_row) ; + W [i] = Rp [k] ; + } + } + else + { + Rp [0] = 0 ; + for (i = 0 ; i < n_row ; i++) + { + Rp [i+1] = Rp [i] + W [i] ; + } + for (i = 0 ; i < n_row ; i++) + { + W [i] = Rp [i] ; + } + } + ASSERT (Rp [n_row] <= Ap [n_col]) ; + + /* at this point, W holds the permuted row pointers */ + + /* ---------------------------------------------------------------------- */ + /* construct the row form of B */ + /* ---------------------------------------------------------------------- */ + + do_values = Ax && Rx ; + +#ifdef COMPLEX + split = SPLIT (Az) && SPLIT (Rz) ; + + if (do_conjugate && do_values) + { + if (Q != (Int *) NULL) + { + if (split) + { + /* R = A (P,Q)' */ + for (newj = 0 ; newj < nq ; newj++) + { + j = Q [newj] ; + ASSERT (j >= 0 && j < n_col) ; + for (p = Ap [j] ; p < Ap [j+1] ; p++) + { + bp = W [Ai [p]]++ ; + Ri [bp] = newj ; + Rx [bp] = Ax [p] ; + Rz [bp] = -Az [p] ; + } + } + } + else + { + /* R = A (P,Q)' (merged complex values) */ + for (newj = 0 ; newj < nq ; newj++) + { + j = Q [newj] ; + ASSERT (j >= 0 && j < n_col) ; + for (p = Ap [j] ; p < Ap [j+1] ; p++) + { + bp = W [Ai [p]]++ ; + Ri [bp] = newj ; + Rx [2*bp] = Ax [2*p] ; + Rx [2*bp+1] = -Ax [2*p+1] ; + } + } + } + } + else + { + if (split) + { + /* R = A (P,:)' */ + for (j = 0 ; j < n_col ; j++) + { + for (p = Ap [j] ; p < Ap [j+1] ; p++) + { + bp = W [Ai [p]]++ ; + Ri [bp] = j ; + Rx [bp] = Ax [p] ; + Rz [bp] = -Az [p] ; + } + } + } + else + { + /* R = A (P,:)' (merged complex values) */ + for (j = 0 ; j < n_col ; j++) + { + for (p = Ap [j] ; p < Ap [j+1] ; p++) + { + bp = W [Ai [p]]++ ; + Ri [bp] = j ; + Rx [2*bp] = Ax [2*p] ; + Rx [2*bp+1] = -Ax [2*p+1] ; + } + } + } + } + } + else +#endif + { + if (Q != (Int *) NULL) + { + if (do_values) + { +#ifdef COMPLEX + if (split) +#endif + { + /* R = A (P,Q).' */ + for (newj = 0 ; newj < nq ; newj++) + { + j = Q [newj] ; + ASSERT (j >= 0 && j < n_col) ; + for (p = Ap [j] ; p < Ap [j+1] ; p++) + { + bp = W [Ai [p]]++ ; + Ri [bp] = newj ; + Rx [bp] = Ax [p] ; +#ifdef COMPLEX + Rz [bp] = Az [p] ; +#endif + } + } + } +#ifdef COMPLEX + else + { + /* R = A (P,Q).' (merged complex values) */ + for (newj = 0 ; newj < nq ; newj++) + { + j = Q [newj] ; + ASSERT (j >= 0 && j < n_col) ; + for (p = Ap [j] ; p < Ap [j+1] ; p++) + { + bp = W [Ai [p]]++ ; + Ri [bp] = newj ; + Rx [2*bp] = Ax [2*p] ; + Rx [2*bp+1] = Ax [2*p+1] ; + } + } + } +#endif + } + else + { + /* R = pattern of A (P,Q).' */ + for (newj = 0 ; newj < nq ; newj++) + { + j = Q [newj] ; + ASSERT (j >= 0 && j < n_col) ; + for (p = Ap [j] ; p < Ap [j+1] ; p++) + { + Ri [W [Ai [p]]++] = newj ; + } + } + } + } + else + { + if (do_values) + { +#ifdef COMPLEX + if (split) +#endif + { + /* R = A (P,:).' */ + for (j = 0 ; j < n_col ; j++) + { + for (p = Ap [j] ; p < Ap [j+1] ; p++) + { + bp = W [Ai [p]]++ ; + Ri [bp] = j ; + Rx [bp] = Ax [p] ; +#ifdef COMPLEX + Rz [bp] = Az [p] ; +#endif + } + } + } +#ifdef COMPLEX + else + { + /* R = A (P,:).' (merged complex values) */ + for (j = 0 ; j < n_col ; j++) + { + for (p = Ap [j] ; p < Ap [j+1] ; p++) + { + bp = W [Ai [p]]++ ; + Ri [bp] = j ; + Rx [2*bp] = Ax [2*p] ; + Rx [2*bp+1] = Ax [2*p+1] ; + } + } + } +#endif + } + else + { + /* R = pattern of A (P,:).' */ + for (j = 0 ; j < n_col ; j++) + { + for (p = Ap [j] ; p < Ap [j+1] ; p++) + { + Ri [W [Ai [p]]++] = j ; + } + } + } + } + } + +#ifndef NDEBUG + for (k = 0 ; k < n_row ; k++) + { + if (P != (Int *) NULL) + { + i = P [k] ; + } + else + { + i = k ; + } + DEBUG3 ((ID": W[i] "ID" Rp[k+1] "ID"\n", i, W [i], Rp [k+1])) ; + ASSERT (W [i] == Rp [k+1]) ; + } + DEBUG2 (("UMF_transpose, output matrix:\n")) ; + UMF_dump_col_matrix (Rx, +#ifdef COMPLEX + Rz, +#endif + Ri, Rp, n_col, n_row, Rp [n_row]) ; + ASSERT (AMD_valid (n_col, n_row, Rp, Ri)) ; +#endif + + return (UMFPACK_OK) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_transpose.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_transpose.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,27 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL Int UMF_transpose +( + Int n_row, + Int n_col, + const Int Ap [ ], + const Int Ai [ ], + const double Ax [ ], + const Int P [ ], + const Int Q [ ], + Int nq, + Int Rp [ ], + Int Ri [ ], + double Rx [ ], + Int W [ ], + Int check +#ifdef COMPLEX + , const double Az [ ] + , double Rz [ ] + , Int do_conjugate +#endif +) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_triplet.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_triplet.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,428 @@ +/* ========================================================================== */ +/* === UMF_triplet ========================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + Not user callable. Converts triplet input to column-oriented form. + Duplicate entries may exist (they are summed in the output). The columns + of the column-oriented form are in sorted order. The input is not modified. + Returns 1 if OK, 0 if an error occurred. + + Compiled into four different routines for each version (di, dl, zi, zl), + for a total of 16 different routines. +*/ + +#include "umf_internal.h" + +#ifdef DO_MAP +#ifdef DO_VALUES +GLOBAL Int UMF_triplet_map_x +#else +GLOBAL Int UMF_triplet_map_nox +#endif +#else +#ifdef DO_VALUES +GLOBAL Int UMF_triplet_nomap_x +#else +GLOBAL Int UMF_triplet_nomap_nox +#endif +#endif +( + Int n_row, + Int n_col, + Int nz, + const Int Ti [ ], /* size nz */ + const Int Tj [ ], /* size nz */ + Int Ap [ ], /* size n_col + 1 */ + Int Ai [ ], /* size nz */ + Int Rp [ ], /* size n_row + 1 */ + Int Rj [ ], /* size nz */ + Int W [ ], /* size max (n_row, n_col) */ + Int RowCount [ ] /* size n_row */ +#ifdef DO_VALUES + , const double Tx [ ] /* size nz */ + , double Ax [ ] /* size nz */ + , double Rx [ ] /* size nz */ +#ifdef COMPLEX + , const double Tz [ ] /* size nz */ + , double Az [ ] /* size nz */ + , double Rz [ ] /* size nz */ +#endif +#endif +#ifdef DO_MAP + , Int Map [ ] /* size nz */ + , Int Map2 [ ] /* size nz */ +#endif +) +{ + + /* ---------------------------------------------------------------------- */ + /* local variables */ + /* ---------------------------------------------------------------------- */ + + Int i, j, k, p, cp, p1, p2, pdest, pj ; +#ifdef DO_MAP + Int duplicates ; +#endif +#ifdef DO_VALUES +#ifdef COMPLEX + Int split = SPLIT (Tz) && SPLIT (Az) && SPLIT (Rz) ; +#endif +#endif + + /* ---------------------------------------------------------------------- */ + /* count the entries in each row (also counting duplicates) */ + /* ---------------------------------------------------------------------- */ + + /* use W as workspace for row counts (including duplicates) */ + for (i = 0 ; i < n_row ; i++) + { + W [i] = 0 ; + } + + for (k = 0 ; k < nz ; k++) + { + i = Ti [k] ; + j = Tj [k] ; + if (i < 0 || i >= n_row || j < 0 || j >= n_col) + { + return (UMFPACK_ERROR_invalid_matrix) ; + } + W [i]++ ; +#ifndef NDEBUG + DEBUG1 ((ID " triplet: "ID" "ID" ", k, i, j)) ; +#ifdef DO_VALUES + { + Entry tt ; + ASSIGN (tt, Tx, Tz, k, split) ; + EDEBUG2 (tt) ; + DEBUG1 (("\n")) ; + } +#endif +#endif + } + + /* ---------------------------------------------------------------------- */ + /* compute the row pointers */ + /* ---------------------------------------------------------------------- */ + + Rp [0] = 0 ; + for (i = 0 ; i < n_row ; i++) + { + Rp [i+1] = Rp [i] + W [i] ; + W [i] = Rp [i] ; + } + + /* W is now equal to the row pointers */ + + /* ---------------------------------------------------------------------- */ + /* construct the row form */ + /* ---------------------------------------------------------------------- */ + + for (k = 0 ; k < nz ; k++) + { + p = W [Ti [k]]++ ; +#ifdef DO_MAP + Map [k] = p ; +#endif + Rj [p] = Tj [k] ; +#ifdef DO_VALUES +#ifdef COMPLEX + if (split) + { + Rx [p] = Tx [k] ; + Rz [p] = Tz [k] ; + } + else + { + Rx [2*p ] = Tx [2*k ] ; + Rx [2*p+1] = Tx [2*k+1] ; + } +#else + Rx [p] = Tx [k] ; +#endif +#endif + } + + /* Rp stays the same, but W [i] is advanced to the start of row i+1 */ + +#ifndef NDEBUG + for (i = 0 ; i < n_row ; i++) + { + ASSERT (W [i] == Rp [i+1]) ; + } +#ifdef DO_MAP + for (k = 0 ; k < nz ; k++) + { + /* make sure that kth triplet is mapped correctly */ + p = Map [k] ; + DEBUG1 (("First row map: Map ["ID"] = "ID"\n", k, p)) ; + i = Ti [k] ; + j = Tj [k] ; + ASSERT (j == Rj [p]) ; + ASSERT (Rp [i] <= p && p < Rp [i+1]) ; + } +#endif +#endif + + /* ---------------------------------------------------------------------- */ + /* sum up duplicates */ + /* ---------------------------------------------------------------------- */ + + /* use W [j] to hold position in Ri/Rx/Rz of a_ij, for row i [ */ + + for (j = 0 ; j < n_col ; j++) + { + W [j] = EMPTY ; + } + +#ifdef DO_MAP + duplicates = FALSE ; +#endif + + for (i = 0 ; i < n_row ; i++) + { + p1 = Rp [i] ; + p2 = Rp [i+1] ; + pdest = p1 ; + /* At this point, W [j] < p1 holds true for all columns j, */ + /* because Ri/Rx/Rz is stored in row oriented order. */ +#ifndef NDEBUG + if (UMF_debug >= -2) + { + for (j = 0 ; j < n_col ; j++) + { + ASSERT (W [j] < p1) ; + } + } +#endif + for (p = p1 ; p < p2 ; p++) + { + j = Rj [p] ; + ASSERT (j >= 0 && j < n_col) ; + pj = W [j] ; + if (pj >= p1) + { + /* this column index, j, is already in row i, at position pj */ + ASSERT (pj < p) ; + ASSERT (Rj [pj] == j) ; +#ifdef DO_MAP + Map2 [p] = pj ; + duplicates = TRUE ; +#endif +#ifdef DO_VALUES + /* sum the entry */ +#ifdef COMPLEX + if (split) + { + Rx [pj] += Rx [p] ; + Rz [pj] += Rz [p] ; + } + else + { + Rx[2*pj ] += Rx[2*p ] ; + Rx[2*pj+1] += Rx[2*p+1] ; + } +#else + Rx [pj] += Rx [p] ; +#endif +#endif + } + else + { + /* keep the entry */ + /* also keep track in W[j] of position of a_ij for case above */ + W [j] = pdest ; +#ifdef DO_MAP + Map2 [p] = pdest ; +#endif + /* no need to move the entry if pdest is equal to p */ + if (pdest != p) + { + Rj [pdest] = j ; +#ifdef DO_VALUES +#ifdef COMPLEX + if (split) + { + Rx [pdest] = Rx [p] ; + Rz [pdest] = Rz [p] ; + } + else + { + Rx [2*pdest ] = Rx [2*p ] ; + Rx [2*pdest+1] = Rx [2*p+1] ; + } +#else + Rx [pdest] = Rx [p] ; +#endif +#endif + } + pdest++ ; + } + } + RowCount [i] = pdest - p1 ; + } + + /* done using W for position of a_ij ] */ + + /* ---------------------------------------------------------------------- */ + /* merge Map and Map2 into a single Map */ + /* ---------------------------------------------------------------------- */ + +#ifdef DO_MAP + if (duplicates) + { + for (k = 0 ; k < nz ; k++) + { + Map [k] = Map2 [Map [k]] ; + } + } +#ifndef NDEBUG + else + { + /* no duplicates, so no need to recompute Map */ + for (k = 0 ; k < nz ; k++) + { + ASSERT (Map2 [k] == k) ; + } + } + for (k = 0 ; k < nz ; k++) + { + /* make sure that kth triplet is mapped correctly */ + p = Map [k] ; + DEBUG1 (("Second row map: Map ["ID"] = "ID"\n", k, p)) ; + i = Ti [k] ; + j = Tj [k] ; + ASSERT (j == Rj [p]) ; + ASSERT (Rp [i] <= p && p < Rp [i+1]) ; + } +#endif +#endif + + /* now the kth triplet maps to p = Map [k], and thus to Rj/Rx [p] */ + + /* ---------------------------------------------------------------------- */ + /* count the entries in each column */ + /* ---------------------------------------------------------------------- */ + + /* [ use W as work space for column counts of A */ + for (j = 0 ; j < n_col ; j++) + { + W [j] = 0 ; + } + + for (i = 0 ; i < n_row ; i++) + { + for (p = Rp [i] ; p < Rp [i] + RowCount [i] ; p++) + { + j = Rj [p] ; + ASSERT (j >= 0 && j < n_col) ; + W [j]++ ; + } + } + + /* ---------------------------------------------------------------------- */ + /* create the column pointers */ + /* ---------------------------------------------------------------------- */ + + Ap [0] = 0 ; + for (j = 0 ; j < n_col ; j++) + { + Ap [j+1] = Ap [j] + W [j] ; + } + /* done using W as workspace for column counts of A ] */ + + for (j = 0 ; j < n_col ; j++) + { + W [j] = Ap [j] ; + } + + /* ---------------------------------------------------------------------- */ + /* construct the column form */ + /* ---------------------------------------------------------------------- */ + + for (i = 0 ; i < n_row ; i++) + { + for (p = Rp [i] ; p < Rp [i] + RowCount [i] ; p++) + { + cp = W [Rj [p]]++ ; +#ifdef DO_MAP + Map2 [p] = cp ; +#endif + Ai [cp] = i ; +#ifdef DO_VALUES +#ifdef COMPLEX + if (split) + { + Ax [cp] = Rx [p] ; + Az [cp] = Rz [p] ; + } + else + { + Ax [2*cp ] = Rx [2*p ] ; + Ax [2*cp+1] = Rx [2*p+1] ; + } +#else + Ax [cp] = Rx [p] ; +#endif +#endif + } + } + + /* ---------------------------------------------------------------------- */ + /* merge Map and Map2 into a single Map */ + /* ---------------------------------------------------------------------- */ + +#ifdef DO_MAP + for (k = 0 ; k < nz ; k++) + { + Map [k] = Map2 [Map [k]] ; + } +#endif + + /* now the kth triplet maps to p = Map [k], and thus to Ai/Ax [p] */ + +#ifndef NDEBUG + for (j = 0 ; j < n_col ; j++) + { + ASSERT (W [j] == Ap [j+1]) ; + } + + UMF_dump_col_matrix ( +#ifdef DO_VALUES + Ax, +#ifdef COMPLEX + Az, +#endif +#else + (double *) NULL, +#ifdef COMPLEX + (double *) NULL, +#endif +#endif + Ai, Ap, n_row, n_col, nz) ; + +#ifdef DO_MAP + for (k = 0 ; k < nz ; k++) + { + /* make sure that kth triplet is mapped correctly */ + p = Map [k] ; + DEBUG1 (("Col map: Map ["ID"] = "ID"\t", k, p)) ; + i = Ti [k] ; + j = Tj [k] ; + ASSERT (i == Ai [p]) ; + DEBUG1 ((" i "ID" j "ID" Ap[j] "ID" p "ID" Ap[j+1] "ID"\n", + i, j, Ap [j], p, Ap [j+1])) ; + ASSERT (Ap [j] <= p && p < Ap [j+1]) ; + } +#endif +#endif + + return (UMFPACK_OK) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_triplet.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_triplet.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,85 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL Int UMF_triplet_map_x +( + Int n_row, + Int n_col, + Int nz, + const Int Ti [ ], + const Int Tj [ ], + Int Ap [ ], + Int Ai [ ], + Int Rp [ ], + Int Rj [ ], + Int W [ ], + Int RowCount [ ] + , const double Tx [ ] + , double Ax [ ] + , double Rx [ ] +#ifdef COMPLEX + , const double Tz [ ] + , double Az [ ] + , double Rz [ ] +#endif + , Int Map [ ] + , Int Map2 [ ] +) ; + +GLOBAL Int UMF_triplet_map_nox +( + Int n_row, + Int n_col, + Int nz, + const Int Ti [ ], + const Int Tj [ ], + Int Ap [ ], + Int Ai [ ], + Int Rp [ ], + Int Rj [ ], + Int W [ ], + Int RowCount [ ] + , Int Map [ ] + , Int Map2 [ ] +) ; + +GLOBAL Int UMF_triplet_nomap_x +( + Int n_row, + Int n_col, + Int nz, + const Int Ti [ ], + const Int Tj [ ], + Int Ap [ ], + Int Ai [ ], + Int Rp [ ], + Int Rj [ ], + Int W [ ], + Int RowCount [ ] + , const double Tx [ ] + , double Ax [ ] + , double Rx [ ] +#ifdef COMPLEX + , const double Tz [ ] + , double Az [ ] + , double Rz [ ] +#endif +) ; + +GLOBAL Int UMF_triplet_nomap_nox +( + Int n_row, + Int n_col, + Int nz, + const Int Ti [ ], + const Int Tj [ ], + Int Ap [ ], + Int Ai [ ], + Int Rp [ ], + Int Rj [ ], + Int W [ ], + Int RowCount [ ] +) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_tuple_lengths.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_tuple_lengths.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,135 @@ +/* ========================================================================== */ +/* === UMF_tuple_lengths ==================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* Determine the tuple list lengths, and the amount of memory required for */ +/* them. Return the amount of memory needed to store all the tuples. */ +/* This routine assumes that the tuple lists themselves are either already */ +/* deallocated, or will be shortly (so Row[ ].tlen and Col[ ].tlen are */ +/* overwritten) */ + +#include "umf_internal.h" + +GLOBAL Int UMF_tuple_lengths /* return memory usage */ +( + NumericType *Numeric, + WorkType *Work, + double *p_dusage /* output argument */ +) +{ + /* ---------------------------------------------------------------------- */ + /* local variables */ + /* ---------------------------------------------------------------------- */ + + double dusage ; + Int e, nrows, ncols, nel, i, *Rows, *Cols, row, col, n_row, n_col, *E, + *Row_degree, *Row_tlen, *Col_degree, *Col_tlen, usage, n1 ; + Element *ep ; + Unit *p ; + + /* ---------------------------------------------------------------------- */ + /* get parameters */ + /* ---------------------------------------------------------------------- */ + + E = Work->E ; + Row_degree = Numeric->Rperm ; /* for NON_PIVOTAL_ROW macro only */ + Col_degree = Numeric->Cperm ; /* for NON_PIVOTAL_COL macro only */ + Row_tlen = Numeric->Uilen ; + Col_tlen = Numeric->Lilen ; + n_row = Work->n_row ; + n_col = Work->n_col ; + n1 = Work->n1 ; + nel = Work->nel ; + + DEBUG3 (("TUPLE_LENGTHS: n_row "ID" n_col "ID" nel "ID"\n", + n_row, n_col, nel)) ; + ASSERT (nel < Work->elen) ; + + /* tuple list lengths already initialized to zero */ + + /* ---------------------------------------------------------------------- */ + /* scan each element: count tuple list lengths (include element 0) */ + /* ---------------------------------------------------------------------- */ + + for (e = 1 ; e <= nel ; e++) /* for all elements, in any order */ + { + if (E [e]) + { +#ifndef NDEBUG + UMF_dump_element (Numeric, Work, e, FALSE) ; +#endif + p = Numeric->Memory + E [e] ; + GET_ELEMENT_PATTERN (ep, p, Cols, Rows, ncols) ; + nrows = ep->nrows ; + for (i = 0 ; i < nrows ; i++) + { + row = Rows [i] ; + ASSERT (row == EMPTY || (row >= n1 && row < n_row)) ; + if (row >= n1) + { + ASSERT (NON_PIVOTAL_ROW (row)) ; + Row_tlen [row] ++ ; + } + } + for (i = 0 ; i < ncols ; i++) + { + col = Cols [i] ; + ASSERT (col == EMPTY || (col >= n1 && col < n_col)) ; + if (col >= n1) + { + ASSERT (NON_PIVOTAL_COL (col)) ; + Col_tlen [col] ++ ; + } + } + } + } + + /* note: tuple lengths are now modified, but the tuple lists are not */ + /* updated to reflect that fact. */ + + /* ---------------------------------------------------------------------- */ + /* determine the required memory to hold all the tuple lists */ + /* ---------------------------------------------------------------------- */ + + DEBUG0 (("UMF_build_tuples_usage\n")) ; + + usage = 0 ; + dusage = 0 ; + + ASSERT (Col_tlen && Col_degree) ; + + for (col = n1 ; col < n_col ; col++) + { + if (NON_PIVOTAL_COL (col)) + { + usage += 1 + UNITS (Tuple, TUPLES (Col_tlen [col])) ; + dusage += 1 + DUNITS (Tuple, TUPLES (Col_tlen [col])) ; + DEBUG0 ((" col: "ID" tlen "ID" usage so far: "ID"\n", + col, Col_tlen [col], usage)) ; + } + } + + ASSERT (Row_tlen && Row_degree) ; + + for (row = n1 ; row < n_row ; row++) + { + if (NON_PIVOTAL_ROW (row)) + { + usage += 1 + UNITS (Tuple, TUPLES (Row_tlen [row])) ; + dusage += 1 + DUNITS (Tuple, TUPLES (Row_tlen [row])) ; + DEBUG0 ((" row: "ID" tlen "ID" usage so far: "ID"\n", + row, Row_tlen [row], usage)) ; + } + } + + DEBUG0 (("UMF_build_tuples_usage "ID" %g\n", usage, dusage)) ; + + *p_dusage = dusage ; + return (usage) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_tuple_lengths.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_tuple_lengths.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,12 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL Int UMF_tuple_lengths +( + NumericType *Numeric, + WorkType *Work, + double *dusage +) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_usolve.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_usolve.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,226 @@ +/* ========================================================================== */ +/* === UMF_usolve =========================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* solves Ux = b, where U is the upper triangular factor of a matrix. */ +/* B is overwritten with the solution X. */ +/* Returns the floating point operation count */ + +#include "umf_internal.h" + +GLOBAL double UMF_usolve +( + NumericType *Numeric, + Entry X [ ], /* b on input, solution x on output */ + Int Pattern [ ] /* a work array of size n */ +) +{ + /* ---------------------------------------------------------------------- */ + /* local variables */ + /* ---------------------------------------------------------------------- */ + + Entry xk ; + Entry *xp, *D, *Uval ; + Int k, deg, j, *ip, col, *Upos, *Uilen, pos, + *Uip, n, ulen, up, newUchain, npiv, n1, *Ui ; + + /* ---------------------------------------------------------------------- */ + /* get parameters */ + /* ---------------------------------------------------------------------- */ + + if (Numeric->n_row != Numeric->n_col) return (0.) ; + n = Numeric->n_row ; + npiv = Numeric->npiv ; + Upos = Numeric->Upos ; + Uilen = Numeric->Uilen ; + Uip = Numeric->Uip ; + D = Numeric->D ; + n1 = Numeric->n1 ; + +#ifndef NDEBUG + DEBUG4 (("Usolve start: npiv = "ID" n = "ID"\n", npiv, n)) ; + for (j = 0 ; j < n ; j++) + { + DEBUG4 (("Usolve start "ID": ", j)) ; + EDEBUG4 (X [j]) ; + DEBUG4 (("\n")) ; + } +#endif + + /* ---------------------------------------------------------------------- */ + /* singular case */ + /* ---------------------------------------------------------------------- */ + +#ifndef NO_DIVIDE_BY_ZERO + /* handle the singular part of D, up to just before the last pivot */ + for (k = n-1 ; k >= npiv ; k--) + { + /* This is an *** intentional *** divide-by-zero, to get Inf or Nan, + * as appropriate. It is not a bug. */ + ASSERT (IS_ZERO (D [k])) ; + xk = X [k] ; + /* X [k] = xk / D [k] ; */ + DIV (X [k], xk, D [k]) ; + } +#else + /* Do not divide by zero */ +#endif + + deg = Numeric->ulen ; + if (deg > 0) + { + /* :: make last pivot row of U (singular matrices only) :: */ + for (j = 0 ; j < deg ; j++) + { + DEBUG1 (("Last row of U: j="ID"\n", j)) ; + DEBUG1 (("Last row of U: Upattern[j]="ID"\n", + Numeric->Upattern [j]) ); + Pattern [j] = Numeric->Upattern [j] ; + } + } + + /* ---------------------------------------------------------------------- */ + /* nonsingletons */ + /* ---------------------------------------------------------------------- */ + + for (k = npiv-1 ; k >= n1 ; k--) + { + + /* ------------------------------------------------------------------ */ + /* use row k of U */ + /* ------------------------------------------------------------------ */ + + up = Uip [k] ; + ulen = Uilen [k] ; + newUchain = (up < 0) ; + if (newUchain) + { + up = -up ; + xp = (Entry *) (Numeric->Memory + up + UNITS (Int, ulen)) ; + } + else + { + xp = (Entry *) (Numeric->Memory + up) ; + } + + xk = X [k] ; + for (j = 0 ; j < deg ; j++) + { + DEBUG4 ((" k "ID" col "ID" value", k, Pattern [j])) ; + EDEBUG4 (*xp) ; + DEBUG4 (("\n")) ; + /* xk -= X [Pattern [j]] * (*xp) ; */ + MULT_SUB (xk, X [Pattern [j]], *xp) ; + xp++ ; + } + +#ifndef NO_DIVIDE_BY_ZERO + /* Go ahead and divide by zero if D [k] is zero */ + /* X [k] = xk / D [k] ; */ + DIV (X [k], xk, D [k]) ; +#else + /* Do not divide by zero */ + if (IS_NONZERO (D [k])) + { + /* X [k] = xk / D [k] ; */ + DIV (X [k], xk, D [k]) ; + } +#endif + + /* ------------------------------------------------------------------ */ + /* make row k-1 of U in Pattern [0..deg-1] */ + /* ------------------------------------------------------------------ */ + + if (k == n1) break ; + + if (newUchain) + { + /* next row is a new Uchain */ + deg = ulen ; + ASSERT (IMPLIES (k == 0, deg == 0)) ; + DEBUG4 (("end of chain for row of U "ID" deg "ID"\n", k-1, deg)) ; + ip = (Int *) (Numeric->Memory + up) ; + for (j = 0 ; j < deg ; j++) + { + col = *ip++ ; + DEBUG4 ((" k "ID" col "ID"\n", k-1, col)) ; + ASSERT (k <= col) ; + Pattern [j] = col ; + } + } + else + { + deg -= ulen ; + DEBUG4 (("middle of chain for row of U "ID" deg "ID"\n", k, deg)) ; + ASSERT (deg >= 0) ; + pos = Upos [k] ; + if (pos != EMPTY) + { + /* add the pivot column */ + DEBUG4 (("k "ID" add pivot entry at pos "ID"\n", k, pos)) ; + ASSERT (pos >= 0 && pos <= deg) ; + Pattern [deg++] = Pattern [pos] ; + Pattern [pos] = k ; + } + } + } + + /* ---------------------------------------------------------------------- */ + /* singletons */ + /* ---------------------------------------------------------------------- */ + + for (k = n1 - 1 ; k >= 0 ; k--) + { + deg = Uilen [k] ; + xk = X [k] ; + DEBUG4 (("Singleton k "ID"\n", k)) ; + if (deg > 0) + { + up = Uip [k] ; + Ui = (Int *) (Numeric->Memory + up) ; + up += UNITS (Int, deg) ; + Uval = (Entry *) (Numeric->Memory + up) ; + for (j = 0 ; j < deg ; j++) + { + DEBUG4 ((" k "ID" col "ID" value", k, Ui [j])) ; + EDEBUG4 (Uval [j]) ; + DEBUG4 (("\n")) ; + /* xk -= X [Ui [j]] * Uval [j] ; */ + ASSERT (Ui [j] >= 0 && Ui [j] < n) ; + MULT_SUB (xk, X [Ui [j]], Uval [j]) ; + } + } + +#ifndef NO_DIVIDE_BY_ZERO + /* Go ahead and divide by zero if D [k] is zero */ + /* X [k] = xk / D [k] ; */ + DIV (X [k], xk, D [k]) ; +#else + /* Do not divide by zero */ + if (IS_NONZERO (D [k])) + { + /* X [k] = xk / D [k] ; */ + DIV (X [k], xk, D [k]) ; + } +#endif + + } + +#ifndef NDEBUG + for (j = 0 ; j < n ; j++) + { + DEBUG4 (("Usolve done "ID": ", j)) ; + EDEBUG4 (X [j]) ; + DEBUG4 (("\n")) ; + } + DEBUG4 (("Usolve done.\n")) ; +#endif + + return (DIV_FLOPS * ((double) n) + MULTSUB_FLOPS * ((double) Numeric->unz)); +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_usolve.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_usolve.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,12 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL double UMF_usolve +( + NumericType *Numeric, + Entry X [ ], + Int Pattern [ ] +) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_utsolve.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_utsolve.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,331 @@ +/* ========================================================================== */ +/* === UMF_utsolve ========================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* solves U'x = b or U.'x=b, where U is the upper triangular factor of a */ +/* matrix. B is overwritten with the solution X. */ +/* Returns the floating point operation count */ + +#include "umf_internal.h" + +GLOBAL double +#ifdef CONJUGATE_SOLVE +UMF_uhsolve /* solve U'x=b (complex conjugate transpose) */ +#else +UMF_utsolve /* solve U.'x=b (array transpose) */ +#endif +( + NumericType *Numeric, + Entry X [ ], /* b on input, solution x on output */ + Int Pattern [ ] /* a work array of size n */ +) +{ + /* ---------------------------------------------------------------------- */ + /* local variables */ + /* ---------------------------------------------------------------------- */ + + Entry xk ; + Entry *xp, *D, *Uval ; + Int k, deg, j, *ip, col, *Upos, *Uilen, kstart, kend, up, + *Uip, n, uhead, ulen, pos, npiv, n1, *Ui ; + + /* ---------------------------------------------------------------------- */ + /* get parameters */ + /* ---------------------------------------------------------------------- */ + + if (Numeric->n_row != Numeric->n_col) return (0.) ; + n = Numeric->n_row ; + npiv = Numeric->npiv ; + Upos = Numeric->Upos ; + Uilen = Numeric->Uilen ; + Uip = Numeric->Uip ; + D = Numeric->D ; + kend = 0 ; + n1 = Numeric->n1 ; + +#ifndef NDEBUG + DEBUG4 (("Utsolve start: npiv "ID" n "ID"\n", npiv, n)) ; + for (j = 0 ; j < n ; j++) + { + DEBUG4 (("Utsolve start "ID": ", j)) ; + EDEBUG4 (X [j]) ; + DEBUG4 (("\n")) ; + } +#endif + + /* ---------------------------------------------------------------------- */ + /* singletons */ + /* ---------------------------------------------------------------------- */ + + for (k = 0 ; k < n1 ; k++) + { + DEBUG4 (("Singleton k "ID"\n", k)) ; + +#ifndef NO_DIVIDE_BY_ZERO + /* Go ahead and divide by zero if D [k] is zero. */ +#ifdef CONJUGATE_SOLVE + /* xk = X [k] / conjugate (D [k]) ; */ + DIV_CONJ (xk, X [k], D [k]) ; +#else + /* xk = X [k] / D [k] ; */ + DIV (xk, X [k], D [k]) ; +#endif +#else + /* Do not divide by zero */ + if (IS_NONZERO (D [k])) + { +#ifdef CONJUGATE_SOLVE + /* xk = X [k] / conjugate (D [k]) ; */ + DIV_CONJ (xk, X [k], D [k]) ; +#else + /* xk = X [k] / D [k] ; */ + DIV (xk, X [k], D [k]) ; +#endif + } +#endif + + X [k] = xk ; + deg = Uilen [k] ; + if (deg > 0 && IS_NONZERO (xk)) + { + up = Uip [k] ; + Ui = (Int *) (Numeric->Memory + up) ; + up += UNITS (Int, deg) ; + Uval = (Entry *) (Numeric->Memory + up) ; + for (j = 0 ; j < deg ; j++) + { + DEBUG4 ((" k "ID" col "ID" value", k, Ui [j])) ; + EDEBUG4 (Uval [j]) ; + DEBUG4 (("\n")) ; +#ifdef CONJUGATE_SOLVE + /* X [Ui [j]] -= xk * conjugate (Uval [j]) ; */ + MULT_SUB_CONJ (X [Ui [j]], xk, Uval [j]) ; +#else + /* X [Ui [j]] -= xk * Uval [j] ; */ + MULT_SUB (X [Ui [j]], xk, Uval [j]) ; +#endif + } + } + } + + /* ---------------------------------------------------------------------- */ + /* nonsingletons */ + /* ---------------------------------------------------------------------- */ + + for (kstart = n1 ; kstart < npiv ; kstart = kend + 1) + { + + /* ------------------------------------------------------------------ */ + /* find the end of this Uchain */ + /* ------------------------------------------------------------------ */ + + DEBUG4 (("kstart "ID" kend "ID"\n", kstart, kend)) ; + /* for (kend = kstart ; kend < npiv && Uip [kend+1] > 0 ; kend++) ; */ + kend = kstart ; + while (kend < npiv && Uip [kend+1] > 0) + { + kend++ ; + } + + /* ------------------------------------------------------------------ */ + /* scan the whole Uchain to find the pattern of the first row of U */ + /* ------------------------------------------------------------------ */ + + k = kend+1 ; + DEBUG4 (("\nKend "ID" K "ID"\n", kend, k)) ; + + /* ------------------------------------------------------------------ */ + /* start with last row in Uchain of U in Pattern [0..deg-1] */ + /* ------------------------------------------------------------------ */ + + if (k == npiv) + { + deg = Numeric->ulen ; + if (deg > 0) + { + /* :: make last pivot row of U (singular matrices only) :: */ + for (j = 0 ; j < deg ; j++) + { + Pattern [j] = Numeric->Upattern [j] ; + } + } + } + else + { + ASSERT (k >= 0 && k < npiv) ; + up = -Uip [k] ; + ASSERT (up > 0) ; + deg = Uilen [k] ; + DEBUG4 (("end of chain for row of U "ID" deg "ID"\n", k-1, deg)) ; + ip = (Int *) (Numeric->Memory + up) ; + for (j = 0 ; j < deg ; j++) + { + col = *ip++ ; + DEBUG4 ((" k "ID" col "ID"\n", k-1, col)) ; + ASSERT (k <= col) ; + Pattern [j] = col ; + } + } + + /* empty the stack at the bottom of Pattern */ + uhead = n ; + + for (k = kend ; k > kstart ; k--) + { + /* Pattern [0..deg-1] is the pattern of row k of U */ + + /* -------------------------------------------------------------- */ + /* make row k-1 of U in Pattern [0..deg-1] */ + /* -------------------------------------------------------------- */ + + ASSERT (k >= 0 && k < npiv) ; + ulen = Uilen [k] ; + /* delete, and push on the stack */ + for (j = 0 ; j < ulen ; j++) + { + ASSERT (uhead >= deg) ; + Pattern [--uhead] = Pattern [--deg] ; + } + DEBUG4 (("middle of chain for row of U "ID" deg "ID"\n", k, deg)) ; + ASSERT (deg >= 0) ; + + pos = Upos [k] ; + if (pos != EMPTY) + { + /* add the pivot column */ + DEBUG4 (("k "ID" add pivot entry at position "ID"\n", k, pos)) ; + ASSERT (pos >= 0 && pos <= deg) ; + Pattern [deg++] = Pattern [pos] ; + Pattern [pos] = k ; + } + } + + /* Pattern [0..deg-1] is now the pattern of the first row in Uchain */ + + /* ------------------------------------------------------------------ */ + /* solve using this Uchain, in reverse order */ + /* ------------------------------------------------------------------ */ + + DEBUG4 (("Unwinding Uchain\n")) ; + for (k = kstart ; k <= kend ; k++) + { + + /* -------------------------------------------------------------- */ + /* construct row k */ + /* -------------------------------------------------------------- */ + + ASSERT (k >= 0 && k < npiv) ; + pos = Upos [k] ; + if (pos != EMPTY) + { + /* remove the pivot column */ + DEBUG4 (("k "ID" add pivot entry at position "ID"\n", k, pos)) ; + ASSERT (k > kstart) ; + ASSERT (pos >= 0 && pos < deg) ; + ASSERT (Pattern [pos] == k) ; + Pattern [pos] = Pattern [--deg] ; + } + + up = Uip [k] ; + ulen = Uilen [k] ; + if (k > kstart) + { + /* concatenate the deleted pattern; pop from the stack */ + for (j = 0 ; j < ulen ; j++) + { + ASSERT (deg <= uhead && uhead < n) ; + Pattern [deg++] = Pattern [uhead++] ; + } + DEBUG4 (("middle of chain, row of U "ID" deg "ID"\n", k, deg)) ; + ASSERT (deg >= 0) ; + } + + /* -------------------------------------------------------------- */ + /* use row k of U */ + /* -------------------------------------------------------------- */ + +#ifndef NO_DIVIDE_BY_ZERO + /* Go ahead and divide by zero if D [k] is zero. */ +#ifdef CONJUGATE_SOLVE + /* xk = X [k] / conjugate (D [k]) ; */ + DIV_CONJ (xk, X [k], D [k]) ; +#else + /* xk = X [k] / D [k] ; */ + DIV (xk, X [k], D [k]) ; +#endif +#else + /* Do not divide by zero */ + if (IS_NONZERO (D [k])) + { +#ifdef CONJUGATE_SOLVE + /* xk = X [k] / conjugate (D [k]) ; */ + DIV_CONJ (xk, X [k], D [k]) ; +#else + /* xk = X [k] / D [k] ; */ + DIV (xk, X [k], D [k]) ; +#endif + } +#endif + + X [k] = xk ; + if (IS_NONZERO (xk)) + { + if (k == kstart) + { + up = -up ; + xp = (Entry *) (Numeric->Memory + up + UNITS (Int, ulen)) ; + } + else + { + xp = (Entry *) (Numeric->Memory + up) ; + } + for (j = 0 ; j < deg ; j++) + { + DEBUG4 ((" k "ID" col "ID" value", k, Pattern [j])) ; + EDEBUG4 (*xp) ; + DEBUG4 (("\n")) ; +#ifdef CONJUGATE_SOLVE + /* X [Pattern [j]] -= xk * conjugate (*xp) ; */ + MULT_SUB_CONJ (X [Pattern [j]], xk, *xp) ; +#else + /* X [Pattern [j]] -= xk * (*xp) ; */ + MULT_SUB (X [Pattern [j]], xk, *xp) ; +#endif + xp++ ; + } + } + } + ASSERT (uhead == n) ; + } + +#ifndef NO_DIVIDE_BY_ZERO + for (k = npiv ; k < n ; k++) + { + /* This is an *** intentional *** divide-by-zero, to get Inf or Nan, + * as appropriate. It is not a bug. */ + ASSERT (IS_ZERO (D [k])) ; + /* For conjugate solve, D [k] == conjugate (D [k]), in this case */ + /* xk = X [k] / D [k] ; */ + DIV (xk, X [k], D [k]) ; + X [k] = xk ; + } +#endif + +#ifndef NDEBUG + for (j = 0 ; j < n ; j++) + { + DEBUG4 (("Utsolve done "ID": ", j)) ; + EDEBUG4 (X [j]) ; + DEBUG4 (("\n")) ; + } + DEBUG4 (("Utsolve done.\n")) ; +#endif + + return (DIV_FLOPS * ((double) n) + MULTSUB_FLOPS * ((double) Numeric->unz)); +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_utsolve.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_utsolve.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,20 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL double UMF_utsolve +( + NumericType *Numeric, + Entry X [ ], + Int Pattern [ ] +) ; + + +GLOBAL double UMF_uhsolve +( + NumericType *Numeric, + Entry X [ ], + Int Pattern [ ] +) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_valid_numeric.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_valid_numeric.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,46 @@ +/* ========================================================================== */ +/* === UMF_valid_numeric ==================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* Returns TRUE if the Numeric object is valid, FALSE otherwise. */ +/* Does not check everything. UMFPACK_report_numeric checks more. */ + +#include "umf_internal.h" + +GLOBAL Int UMF_valid_numeric +( + NumericType *Numeric +) +{ + /* This routine does not check the contents of the individual arrays, so */ + /* it can miss some errors. All it checks for is the presence of the */ + /* arrays, and the Numeric "valid" entry. */ + + if (!Numeric) + { + return (FALSE) ; + } + + if (Numeric->valid != NUMERIC_VALID) + { + /* Numeric does not point to a NumericType object */ + return (FALSE) ; + } + + if (Numeric->n_row <= 0 || Numeric->n_col <= 0 || !Numeric->D || + !Numeric->Rperm || !Numeric->Cperm || + !Numeric->Lpos || !Numeric->Upos || + !Numeric->Lilen || !Numeric->Uilen || !Numeric->Lip || !Numeric->Uip || + !Numeric->Memory || (Numeric->ulen > 0 && !Numeric->Upattern)) + { + return (FALSE) ; + } + + return (TRUE) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_valid_numeric.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_valid_numeric.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,10 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL Int UMF_valid_numeric +( + NumericType *Numeric +) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_valid_symbolic.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_valid_symbolic.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,47 @@ +/* ========================================================================== */ +/* === UMF_valid_symbolic =================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +#include "umf_internal.h" + +/* Returns TRUE if the Symbolic object is valid, FALSE otherwise. */ +/* The UMFPACK_report_symbolic routine does a more thorough check. */ + +GLOBAL Int UMF_valid_symbolic +( + SymbolicType *Symbolic +) +{ + /* This routine does not check the contents of the individual arrays, so */ + /* it can miss some errors. All it checks for is the presence of the */ + /* arrays, and the Symbolic "valid" entry. */ + + if (!Symbolic) + { + return (FALSE) ; + } + + if (Symbolic->valid != SYMBOLIC_VALID) + { + /* Symbolic does not point to a SymbolicType object */ + return (FALSE) ; + } + + if (!Symbolic->Cperm_init || !Symbolic->Rperm_init || + !Symbolic->Front_npivcol || !Symbolic->Front_1strow || + !Symbolic->Front_leftmostdesc || + !Symbolic->Front_parent || !Symbolic->Chain_start || + !Symbolic->Chain_maxrows || !Symbolic->Chain_maxcols || + Symbolic->n_row <= 0 || Symbolic->n_col <= 0) + { + return (FALSE) ; + } + + return (TRUE) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_valid_symbolic.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_valid_symbolic.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,10 @@ +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +GLOBAL Int UMF_valid_symbolic +( + SymbolicType *Symbolic +) ; diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umf_version.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umf_version.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,1001 @@ +/* ========================================================================== */ +/* === umf_version.h ======================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + Define routine names, depending on version being compiled. + + DINT: double precision, int's as integers + DLONG: double precision, long's as integers + ZLONG: complex double precision, long's as integers + ZINT: complex double precision, int's as integers +*/ + +/* Set DINT as the default, if nothing is defined */ +#if !defined (DLONG) && !defined (DINT) && !defined (ZLONG) && !defined (ZINT) +#define DINT +#endif + +/* Determine if this is a real or complex version */ +#if defined (ZLONG) || defined (ZINT) +#define COMPLEX +#endif + +/* -------------------------------------------------------------------------- */ +/* integer type (Int is int or long) now defined in amd_internal.h */ +/* -------------------------------------------------------------------------- */ + +#if defined (DLONG) || defined (ZLONG) +#define LONG_INTEGER +#endif + +/* -------------------------------------------------------------------------- */ +/* Numerical relop macros for correctly handling the NaN case */ +/* -------------------------------------------------------------------------- */ + +/* +SCALAR_IS_NAN(x): + True if x is NaN. False otherwise. The commonly-existing isnan(x) + function could be used, but it's not in Kernighan & Ritchie 2nd edition + (ANSI C). It may appear in , but I'm not certain about + portability. The expression x != x is true if and only if x is NaN, + according to the IEEE 754 floating-point standard. + +SCALAR_IS_ZERO(x): + True if x is zero. False if x is nonzero, NaN, or +/- Inf. + This is (x == 0) if the compiler is IEEE 754 compliant. + +SCALAR_IS_NONZERO(x): + True if x is nonzero, NaN, or +/- Inf. False if x zero. + This is (x != 0) if the compiler is IEEE 754 compliant. + +SCALAR_IS_LTZERO(x): + True if x is < zero or -Inf. False if x is >= 0, NaN, or +Inf. + This is (x < 0) if the compiler is IEEE 754 compliant. +*/ + +#if defined (MATHWORKS) + +/* The MathWorks has their own macros in util.h that handle NaN's properly. */ +#define SCALAR_IS_NAN(x) (utIsNaN (x)) +#define SCALAR_IS_ZERO(x) (utEQZero (x)) +#define SCALAR_IS_NONZERO(x) (utNEZero (x)) +#define SCALAR_IS_LTZERO(x) (utLTZero (x)) + +#elif defined (UMF_WINDOWS) + +/* Yes, this is exceedingly ugly. Blame Microsoft, which hopelessly */ +/* violates the IEEE 754 floating-point standard in a bizarre way. */ +/* If you're using an IEEE 754-compliant compiler, then x != x is true */ +/* iff x is NaN. For Microsoft, (x < x) is true iff x is NaN. */ +/* So either way, this macro safely detects a NaN. */ +#define SCALAR_IS_NAN(x) (((x) != (x)) || (((x) < (x)))) +#define SCALAR_IS_ZERO(x) (((x) == 0.) && !SCALAR_IS_NAN(x)) +#define SCALAR_IS_NONZERO(x) (((x) != 0.) || SCALAR_IS_NAN(x)) +#define SCALAR_IS_LTZERO(x) (((x) < 0.) && !SCALAR_IS_NAN(x)) + +#else + +/* These all work properly, according to the IEEE 754 standard ... except on */ +/* a PC with windows. Works fine in Linux on the same PC... */ +#define SCALAR_IS_NAN(x) ((x) != (x)) +#define SCALAR_IS_ZERO(x) ((x) == 0.) +#define SCALAR_IS_NONZERO(x) ((x) != 0.) +#define SCALAR_IS_LTZERO(x) ((x) < 0.) + +#endif + +/* scalar absolute value macro. If x is NaN, the result is NaN: */ +#define SCALAR_ABS(x) ((SCALAR_IS_LTZERO (x)) ? -(x) : (x)) + +/* true if an integer (stored in double x) would overflow (or if x is NaN) */ +#define INT_OVERFLOW(x) ((!((x) * (1.0+1e-8) <= (double) Int_MAX)) \ + || SCALAR_IS_NAN (x)) + +/* print a scalar (avoid printing "-0" for negative zero). */ +#define PRINT_SCALAR(a) \ +{ \ + if (SCALAR_IS_NONZERO (a)) \ + { \ + PRINTF ((" (%g)", (a))) ; \ + } \ + else \ + { \ + PRINTF ((" (0)")) ; \ + } \ +} + +/* -------------------------------------------------------------------------- */ +/* Real floating-point arithmetic */ +/* -------------------------------------------------------------------------- */ + +#ifndef COMPLEX + +#define Entry double + +#define SPLIT(s) (1) +#define REAL_COMPONENT(c) (c) +#define IMAG_COMPONENT(c) (0.) +#define ASSIGN(c,s1,s2,p,split) { (c) = (s1)[p] ; } +#define CLEAR(c) { (c) = 0. ; } +#define CLEAR_AND_INCREMENT(p) { *p++ = 0. ; } +#define IS_NAN(a) SCALAR_IS_NAN (a) +#define IS_ZERO(a) SCALAR_IS_ZERO (a) +#define IS_NONZERO(a) SCALAR_IS_NONZERO (a) +#define SCALE_DIV(c,s) { (c) /= (s) ; } +#define SCALE(c,s) { (c) *= (s) ; } +#define ASSEMBLE(c,a) { (c) += (a) ; } +#define ASSEMBLE_AND_INCREMENT(c,p) { (c) += *p++ ; } +#define DECREMENT(c,a) { (c) -= (a) ; } +#define MULT(c,a,b) { (c) = (a) * (b) ; } +#define MULT_CONJ(c,a,b) { (c) = (a) * (b) ; } +#define MULT_SUB(c,a,b) { (c) -= (a) * (b) ; } +#define MULT_SUB_CONJ(c,a,b) { (c) -= (a) * (b) ; } +#define DIV(c,a,b) { (c) = (a) / (b) ; } +#define RECIPROCAL(c) { (c) = 1.0 / (c) ; } +#define DIV_CONJ(c,a,b) { (c) = (a) / (b) ; } +#define APPROX_ABS(s,a) { (s) = SCALAR_ABS (a) ; } +#define ABS(s,a) { (s) = SCALAR_ABS (a) ; } +#define PRINT_ENTRY(a) PRINT_SCALAR (a) + +/* for flop counts */ +#define MULTSUB_FLOPS 2. /* c -= a*b */ +#define DIV_FLOPS 1. /* c = a/b */ +#define ABS_FLOPS 0. /* c = abs (a) */ +#define ASSEMBLE_FLOPS 1. /* c += a */ +#define DECREMENT_FLOPS 1. /* c -= a */ +#define MULT_FLOPS 1. /* c = a*b */ +#define SCALE_FLOPS 1. /* c = a/s */ + +#else + +/* -------------------------------------------------------------------------- */ +/* Complex floating-point arithmetic */ +/* -------------------------------------------------------------------------- */ + +/* + Note: An alternative to this DoubleComplex type would be to use a + struct { double r ; double i ; }. The problem with that method + (used by the Sun Performance Library, for example) is that ANSI C provides + no guarantee about the layout of a struct. It is possible that the sizeof + the struct above would be greater than 2 * sizeof (double). This would + mean that the complex BLAS could not be used. The method used here avoids + that possibility. ANSI C *does* guarantee that an array of structs has + the same size as n times the size of one struct. + + The ANSI C99 version of the C language includes a "double _Complex" type. + It should be possible in that case to do the following: + + #define Entry double _Complex + + and remove the DoubleComplex struct. The macros, below, could then be + replaced with instrinsic operators. Note that the #define Real and + #define Imag should also be removed (they only appear in this file). + + For the MULT, MULT_SUB, MULT_SUB_CONJ, and MULT_CONJ macros, + the output argument c cannot be the same as any input argument. + +*/ + +typedef struct +{ + double component [2] ; /* real and imaginary parts */ + +} DoubleComplex ; + +#define Entry DoubleComplex +#define Real component [0] +#define Imag component [1] + +/* for flop counts */ +#define MULTSUB_FLOPS 8. /* c -= a*b */ +#define DIV_FLOPS 9. /* c = a/b */ +#define ABS_FLOPS 6. /* c = abs (a), count sqrt as one flop */ +#define ASSEMBLE_FLOPS 2. /* c += a */ +#define DECREMENT_FLOPS 2. /* c -= a */ +#define MULT_FLOPS 6. /* c = a*b */ +#define SCALE_FLOPS 2. /* c = a/s or c = a*s */ + +/* -------------------------------------------------------------------------- */ + +/* real part of c */ +#define REAL_COMPONENT(c) ((c).Real) + +/* -------------------------------------------------------------------------- */ + +/* imag part of c */ +#define IMAG_COMPONENT(c) ((c).Imag) + +/* -------------------------------------------------------------------------- */ + +/* Return TRUE if a complex number is in split form, FALSE if in packed form */ +#define SPLIT(sz) ((sz) != (double *) NULL) + +/* -------------------------------------------------------------------------- */ + +/* c = (s1) + (s2)*i, if s2 is null, then X is in "packed" format (compatible + * with Entry and ANSI C99 double _Complex type). */ +#define ASSIGN(c,s1,s2,p,split) \ +{ \ + if (split) \ + { \ + (c).Real = (s1)[p] ; \ + (c).Imag = (s2)[p] ; \ + } \ + else \ + { \ + (c) = ((Entry *)(s1))[p] ; \ + } \ +} + +/* -------------------------------------------------------------------------- */ + +/* c = 0 */ +#define CLEAR(c) \ +{ \ + (c).Real = 0. ; \ + (c).Imag = 0. ; \ +} + +/* -------------------------------------------------------------------------- */ + +/* *p++ = 0 */ +#define CLEAR_AND_INCREMENT(p) \ +{ \ + p->Real = 0. ; \ + p->Imag = 0. ; \ + p++ ; \ +} + +/* -------------------------------------------------------------------------- */ + +/* True if a == 0 */ +#define IS_ZERO(a) \ + (SCALAR_IS_ZERO ((a).Real) && SCALAR_IS_ZERO ((a).Imag)) + +/* -------------------------------------------------------------------------- */ + +/* True if a is NaN */ +#define IS_NAN(a) \ + (SCALAR_IS_NAN ((a).Real) || SCALAR_IS_NAN ((a).Imag)) + +/* -------------------------------------------------------------------------- */ + +/* True if a != 0 */ +#define IS_NONZERO(a) \ + (SCALAR_IS_NONZERO ((a).Real) || SCALAR_IS_NONZERO ((a).Imag)) + +/* -------------------------------------------------------------------------- */ + +/* c /= s */ +#define SCALE_DIV(c,s) \ +{ \ + (c).Real /= (s) ; \ + (c).Imag /= (s) ; \ +} + +/* -------------------------------------------------------------------------- */ + +/* c *= s */ +#define SCALE(c,s) \ +{ \ + (c).Real *= (s) ; \ + (c).Imag *= (s) ; \ +} + +/* -------------------------------------------------------------------------- */ + +/* c += a */ +#define ASSEMBLE(c,a) \ +{ \ + (c).Real += (a).Real ; \ + (c).Imag += (a).Imag ; \ +} + +/* -------------------------------------------------------------------------- */ + +/* c += *p++ */ +#define ASSEMBLE_AND_INCREMENT(c,p) \ +{ \ + (c).Real += p->Real ; \ + (c).Imag += p->Imag ; \ + p++ ; \ +} + +/* -------------------------------------------------------------------------- */ + +/* c -= a */ +#define DECREMENT(c,a) \ +{ \ + (c).Real -= (a).Real ; \ + (c).Imag -= (a).Imag ; \ +} + +/* -------------------------------------------------------------------------- */ + +/* c = a*b, assert because c cannot be the same as a or b */ +#define MULT(c,a,b) \ +{ \ + ASSERT (&(c) != &(a) && &(c) != &(b)) ; \ + (c).Real = (a).Real * (b).Real - (a).Imag * (b).Imag ; \ + (c).Imag = (a).Imag * (b).Real + (a).Real * (b).Imag ; \ +} + +/* -------------------------------------------------------------------------- */ + +/* c = a*conjugate(b), assert because c cannot be the same as a or b */ +#define MULT_CONJ(c,a,b) \ +{ \ + ASSERT (&(c) != &(a) && &(c) != &(b)) ; \ + (c).Real = (a).Real * (b).Real + (a).Imag * (b).Imag ; \ + (c).Imag = (a).Imag * (b).Real - (a).Real * (b).Imag ; \ +} + +/* -------------------------------------------------------------------------- */ + +/* c -= a*b, assert because c cannot be the same as a or b */ +#define MULT_SUB(c,a,b) \ +{ \ + ASSERT (&(c) != &(a) && &(c) != &(b)) ; \ + (c).Real -= (a).Real * (b).Real - (a).Imag * (b).Imag ; \ + (c).Imag -= (a).Imag * (b).Real + (a).Real * (b).Imag ; \ +} + +/* -------------------------------------------------------------------------- */ + +/* c -= a*conjugate(b), assert because c cannot be the same as a or b */ +#define MULT_SUB_CONJ(c,a,b) \ +{ \ + ASSERT (&(c) != &(a) && &(c) != &(b)) ; \ + (c).Real -= (a).Real * (b).Real + (a).Imag * (b).Imag ; \ + (c).Imag -= (a).Imag * (b).Real - (a).Real * (b).Imag ; \ +} + +/* -------------------------------------------------------------------------- */ + +/* c = a/b, be careful to avoid underflow and overflow */ +#ifdef MATHWORKS +#define DIV(c,a,b) \ +{ \ + (void) utDivideComplex ((a).Real, (a).Imag, (b).Real, (b).Imag, \ + &((c).Real), &((c).Imag)) ; \ +} +#else +/* This uses ACM Algo 116, by R. L. Smith, 1962. */ +/* c can be the same variable as a or b. */ +/* Ignore NaN case for double relop br>=bi. */ +#define DIV(c,a,b) \ +{ \ + double r, den, ar, ai, br, bi ; \ + br = (b).Real ; \ + bi = (b).Imag ; \ + ar = (a).Real ; \ + ai = (a).Imag ; \ + if (SCALAR_ABS (br) >= SCALAR_ABS (bi)) \ + { \ + r = bi / br ; \ + den = br + r * bi ; \ + (c).Real = (ar + ai * r) / den ; \ + (c).Imag = (ai - ar * r) / den ; \ + } \ + else \ + { \ + r = br / bi ; \ + den = r * br + bi ; \ + (c).Real = (ar * r + ai) / den ; \ + (c).Imag = (ai * r - ar) / den ; \ + } \ +} +#endif + +/* -------------------------------------------------------------------------- */ + +/* c = 1/c, be careful to avoid underflow and overflow */ +/* Not used if MATHWORKS is defined. */ +/* This uses ACM Algo 116, by R. L. Smith, 1962. */ +/* Ignore NaN case for double relop cr>=ci. */ +#define RECIPROCAL(c) \ +{ \ + double r, den, cr, ci ; \ + cr = (c).Real ; \ + ci = (c).Imag ; \ + if (SCALAR_ABS (cr) >= SCALAR_ABS (ci)) \ + { \ + r = ci / cr ; \ + den = cr + r * ci ; \ + (c).Real = 1.0 / den ; \ + (c).Imag = - r / den ; \ + } \ + else \ + { \ + r = cr / ci ; \ + den = r * cr + ci ; \ + (c).Real = r / den ; \ + (c).Imag = - 1.0 / den ; \ + } \ +} + + +/* -------------------------------------------------------------------------- */ + +/* c = a/conjugate(b), be careful to avoid underflow and overflow */ +#ifdef MATHWORKS +#define DIV_CONJ(c,a,b) \ +{ \ + (void) utDivideComplex ((a).Real, (a).Imag, (b).Real, (-(b).Imag), \ + &((c).Real), &((c).Imag)) ; \ +} +#else +/* This uses ACM Algo 116, by R. L. Smith, 1962. */ +/* c can be the same variable as a or b. */ +/* Ignore NaN case for double relop br>=bi. */ +#define DIV_CONJ(c,a,b) \ +{ \ + double r, den, ar, ai, br, bi ; \ + br = (b).Real ; \ + bi = (b).Imag ; \ + ar = (a).Real ; \ + ai = (a).Imag ; \ + if (SCALAR_ABS (br) >= SCALAR_ABS (bi)) \ + { \ + r = (-bi) / br ; \ + den = br - r * bi ; \ + (c).Real = (ar + ai * r) / den ; \ + (c).Imag = (ai - ar * r) / den ; \ + } \ + else \ + { \ + r = br / (-bi) ; \ + den = r * br - bi; \ + (c).Real = (ar * r + ai) / den ; \ + (c).Imag = (ai * r - ar) / den ; \ + } \ +} +#endif + +/* -------------------------------------------------------------------------- */ + +/* approximate absolute value, s = |r|+|i| */ +#define APPROX_ABS(s,a) \ +{ \ + (s) = SCALAR_ABS ((a).Real) + SCALAR_ABS ((a).Imag) ; \ +} + +/* -------------------------------------------------------------------------- */ + +/* exact absolute value, s = sqrt (a.real^2 + amag^2) */ +#ifdef MATHWORKS +#define ABS(s,a) \ +{ \ + (s) = utFdlibm_hypot ((a).Real, (a).Imag) ; \ +} +#else +/* Ignore NaN case for the double relops ar>=ai and ar+ai==ar. */ +#define ABS(s,a) \ +{ \ + double r, ar, ai ; \ + ar = SCALAR_ABS ((a).Real) ; \ + ai = SCALAR_ABS ((a).Imag) ; \ + if (ar >= ai) \ + { \ + if (ar + ai == ar) \ + { \ + (s) = ar ; \ + } \ + else \ + { \ + r = ai / ar ; \ + (s) = ar * sqrt (1.0 + r*r) ; \ + } \ + } \ + else \ + { \ + if (ai + ar == ai) \ + { \ + (s) = ai ; \ + } \ + else \ + { \ + r = ar / ai ; \ + (s) = ai * sqrt (1.0 + r*r) ; \ + } \ + } \ +} +#endif + +/* -------------------------------------------------------------------------- */ + +/* print an entry (avoid printing "-0" for negative zero). */ +#define PRINT_ENTRY(a) \ +{ \ + if (SCALAR_IS_NONZERO ((a).Real)) \ + { \ + PRINTF ((" (%g", (a).Real)) ; \ + } \ + else \ + { \ + PRINTF ((" (0")) ; \ + } \ + if (SCALAR_IS_LTZERO ((a).Imag)) \ + { \ + PRINTF ((" - %gi)", -(a).Imag)) ; \ + } \ + else if (SCALAR_IS_ZERO ((a).Imag)) \ + { \ + PRINTF ((" + 0i)")) ; \ + } \ + else \ + { \ + PRINTF ((" + %gi)", (a).Imag)) ; \ + } \ +} + +/* -------------------------------------------------------------------------- */ + +#endif /* #ifndef COMPLEX */ + +/* -------------------------------------------------------------------------- */ +/* Double precision, with int's as integers */ +/* -------------------------------------------------------------------------- */ + +#ifdef DINT + +#define UMF_analyze umf_i_analyze +#define UMF_apply_order umf_i_apply_order +#define UMF_assemble umfdi_assemble +#define UMF_assemble_fixq umfdi_assemble_fixq +#define UMF_blas3_update umfdi_blas3_update +#define UMF_build_tuples umfdi_build_tuples +#define UMF_build_tuples_usage umfdi_build_tuples_usage +#define UMF_colamd umf_i_colamd +#define UMF_colamd_set_defaults umf_i_colamd_set_defaults +#define UMF_create_element umfdi_create_element +#define UMF_extend_front umfdi_extend_front +#define UMF_free umf_i_free +#define UMF_fsize umf_i_fsize +#define UMF_garbage_collection umfdi_garbage_collection +#define UMF_get_memory umfdi_get_memory +#define UMF_grow_front umfdi_grow_front +#define UMF_init_front umfdi_init_front +#define UMF_is_permutation umf_i_is_permutation +#define UMF_kernel umfdi_kernel +#define UMF_kernel_init umfdi_kernel_init +#define UMF_kernel_init_usage umfdi_kernel_init_usage +#define UMF_kernel_wrapup umfdi_kernel_wrapup +#define UMF_local_search umfdi_local_search +#define UMF_lsolve umfdi_lsolve +#define UMF_ltsolve umfdi_ltsolve +#define UMF_lhsolve umfdi_lhsolve +#define UMF_malloc umf_i_malloc +#define UMF_mem_alloc_element umfdi_mem_alloc_element +#define UMF_mem_alloc_head_block umfdi_mem_alloc_head_block +#define UMF_mem_alloc_tail_block umfdi_mem_alloc_tail_block +#define UMF_mem_free_tail_block umfdi_mem_free_tail_block +#define UMF_mem_init_memoryspace umfdi_mem_init_memoryspace +#define UMF_realloc umf_i_realloc +#define UMF_report_perm umf_i_report_perm +#define UMF_report_vector umfdi_report_vector +#define UMF_row_search umfdi_row_search +#define UMF_scale umfdi_scale +#define UMF_scale_column umfdi_scale_column +#define UMF_set_stats umf_i_set_stats +#define UMF_singletons umf_i_singletons +#define UMF_solve umfdi_solve +#define UMF_start_front umfdi_start_front +#define UMF_store_lu umfdi_store_lu +#define UMF_store_lu_drop umfdi_store_lu_drop +#define UMF_symbolic_usage umfdi_symbolic_usage +#define UMF_transpose umfdi_transpose +#define UMF_tuple_lengths umfdi_tuple_lengths +#define UMF_usolve umfdi_usolve +#define UMF_utsolve umfdi_utsolve +#define UMF_uhsolve umfdi_uhsolve +#define UMF_valid_numeric umfdi_valid_numeric +#define UMF_valid_symbolic umfdi_valid_symbolic +#define UMF_triplet_map_x umfdi_triplet_map_x +#define UMF_triplet_map_nox umfdi_triplet_map_nox +#define UMF_triplet_nomap_x umfdi_triplet_nomap_x +#define UMF_triplet_nomap_nox umfdi_triplet_nomap_nox +#define UMF_2by2 umfdi_2by2 + +#define UMFPACK_col_to_triplet umfpack_di_col_to_triplet +#define UMFPACK_defaults umfpack_di_defaults +#define UMFPACK_free_numeric umfpack_di_free_numeric +#define UMFPACK_free_symbolic umfpack_di_free_symbolic +#define UMFPACK_get_lunz umfpack_di_get_lunz +#define UMFPACK_get_numeric umfpack_di_get_numeric +#define UMFPACK_get_symbolic umfpack_di_get_symbolic +#define UMFPACK_get_determinant umfpack_di_get_determinant +#define UMFPACK_numeric umfpack_di_numeric +#define UMFPACK_qsymbolic umfpack_di_qsymbolic +#define UMFPACK_report_control umfpack_di_report_control +#define UMFPACK_report_info umfpack_di_report_info +#define UMFPACK_report_matrix umfpack_di_report_matrix +#define UMFPACK_report_numeric umfpack_di_report_numeric +#define UMFPACK_report_perm umfpack_di_report_perm +#define UMFPACK_report_status umfpack_di_report_status +#define UMFPACK_report_symbolic umfpack_di_report_symbolic +#define UMFPACK_report_triplet umfpack_di_report_triplet +#define UMFPACK_report_vector umfpack_di_report_vector +#define UMFPACK_save_numeric umfpack_di_save_numeric +#define UMFPACK_save_symbolic umfpack_di_save_symbolic +#define UMFPACK_load_numeric umfpack_di_load_numeric +#define UMFPACK_load_symbolic umfpack_di_load_symbolic +#define UMFPACK_scale umfpack_di_scale +#define UMFPACK_solve umfpack_di_solve +#define UMFPACK_symbolic umfpack_di_symbolic +#define UMFPACK_transpose umfpack_di_transpose +#define UMFPACK_triplet_to_col umfpack_di_triplet_to_col +#define UMFPACK_wsolve umfpack_di_wsolve + +/* for debugging only: */ +#define UMF_malloc_count umf_i_malloc_count +#define UMF_debug umfdi_debug +#define UMF_allocfail umfdi_allocfail +#define UMF_gprob umfdi_gprob +#define UMF_dump_dense umfdi_dump_dense +#define UMF_dump_element umfdi_dump_element +#define UMF_dump_rowcol umfdi_dump_rowcol +#define UMF_dump_matrix umfdi_dump_matrix +#define UMF_dump_current_front umfdi_dump_current_front +#define UMF_dump_lu umfdi_dump_lu +#define UMF_dump_memory umfdi_dump_memory +#define UMF_dump_packed_memory umfdi_dump_packed_memory +#define UMF_dump_col_matrix umfdi_dump_col_matrix +#define UMF_dump_chain umfdi_dump_chain +#define UMF_dump_start umfdi_dump_start +#define UMF_dump_rowmerge umfdi_dump_rowmerge +#define UMF_dump_diagonal_map umfdi_dump_diagonal_map + +#endif + +/* -------------------------------------------------------------------------- */ +/* Double precision, with long's as integers */ +/* -------------------------------------------------------------------------- */ + +#ifdef DLONG + +#define UMF_analyze umf_l_analyze +#define UMF_apply_order umf_l_apply_order +#define UMF_assemble umfdl_assemble +#define UMF_assemble_fixq umfdl_assemble_fixq +#define UMF_blas3_update umfdl_blas3_update +#define UMF_build_tuples umfdl_build_tuples +#define UMF_build_tuples_usage umfdl_build_tuples_usage +#define UMF_colamd umf_l_colamd +#define UMF_colamd_set_defaults umf_l_colamd_set_defaults +#define UMF_create_element umfdl_create_element +#define UMF_extend_front umfdl_extend_front +#define UMF_free umf_l_free +#define UMF_fsize umf_l_fsize +#define UMF_garbage_collection umfdl_garbage_collection +#define UMF_get_memory umfdl_get_memory +#define UMF_grow_front umfdl_grow_front +#define UMF_init_front umfdl_init_front +#define UMF_is_permutation umf_l_is_permutation +#define UMF_kernel umfdl_kernel +#define UMF_kernel_init umfdl_kernel_init +#define UMF_kernel_init_usage umfdl_kernel_init_usage +#define UMF_kernel_wrapup umfdl_kernel_wrapup +#define UMF_local_search umfdl_local_search +#define UMF_lsolve umfdl_lsolve +#define UMF_ltsolve umfdl_ltsolve +#define UMF_lhsolve umfdl_lhsolve +#define UMF_malloc umf_l_malloc +#define UMF_mem_alloc_element umfdl_mem_alloc_element +#define UMF_mem_alloc_head_block umfdl_mem_alloc_head_block +#define UMF_mem_alloc_tail_block umfdl_mem_alloc_tail_block +#define UMF_mem_free_tail_block umfdl_mem_free_tail_block +#define UMF_mem_init_memoryspace umfdl_mem_init_memoryspace +#define UMF_realloc umf_l_realloc +#define UMF_report_perm umf_l_report_perm +#define UMF_report_vector umfdl_report_vector +#define UMF_row_search umfdl_row_search +#define UMF_scale umfdl_scale +#define UMF_scale_column umfdl_scale_column +#define UMF_set_stats umf_l_set_stats +#define UMF_singletons umf_l_singletons +#define UMF_solve umfdl_solve +#define UMF_start_front umfdl_start_front +#define UMF_store_lu umfdl_store_lu +#define UMF_store_lu_drop umfdl_store_lu_drop +#define UMF_symbolic_usage umfdl_symbolic_usage +#define UMF_transpose umfdl_transpose +#define UMF_tuple_lengths umfdl_tuple_lengths +#define UMF_usolve umfdl_usolve +#define UMF_utsolve umfdl_utsolve +#define UMF_uhsolve umfdl_uhsolve +#define UMF_valid_numeric umfdl_valid_numeric +#define UMF_valid_symbolic umfdl_valid_symbolic +#define UMF_triplet_map_x umfdl_triplet_map_x +#define UMF_triplet_map_nox umfdl_triplet_map_nox +#define UMF_triplet_nomap_x umfdl_triplet_nomap_x +#define UMF_triplet_nomap_nox umfdl_triplet_nomap_nox +#define UMF_2by2 umfdl_2by2 + +#define UMFPACK_col_to_triplet umfpack_dl_col_to_triplet +#define UMFPACK_defaults umfpack_dl_defaults +#define UMFPACK_free_numeric umfpack_dl_free_numeric +#define UMFPACK_free_symbolic umfpack_dl_free_symbolic +#define UMFPACK_get_lunz umfpack_dl_get_lunz +#define UMFPACK_get_numeric umfpack_dl_get_numeric +#define UMFPACK_get_symbolic umfpack_dl_get_symbolic +#define UMFPACK_get_determinant umfpack_dl_get_determinant +#define UMFPACK_numeric umfpack_dl_numeric +#define UMFPACK_qsymbolic umfpack_dl_qsymbolic +#define UMFPACK_report_control umfpack_dl_report_control +#define UMFPACK_report_info umfpack_dl_report_info +#define UMFPACK_report_matrix umfpack_dl_report_matrix +#define UMFPACK_report_numeric umfpack_dl_report_numeric +#define UMFPACK_report_perm umfpack_dl_report_perm +#define UMFPACK_report_status umfpack_dl_report_status +#define UMFPACK_report_symbolic umfpack_dl_report_symbolic +#define UMFPACK_report_triplet umfpack_dl_report_triplet +#define UMFPACK_report_vector umfpack_dl_report_vector +#define UMFPACK_save_numeric umfpack_dl_save_numeric +#define UMFPACK_save_symbolic umfpack_dl_save_symbolic +#define UMFPACK_load_numeric umfpack_dl_load_numeric +#define UMFPACK_load_symbolic umfpack_dl_load_symbolic +#define UMFPACK_scale umfpack_dl_scale +#define UMFPACK_solve umfpack_dl_solve +#define UMFPACK_symbolic umfpack_dl_symbolic +#define UMFPACK_transpose umfpack_dl_transpose +#define UMFPACK_triplet_to_col umfpack_dl_triplet_to_col +#define UMFPACK_wsolve umfpack_dl_wsolve + +/* for debugging only: */ +#define UMF_malloc_count umf_l_malloc_count +#define UMF_debug umfdl_debug +#define UMF_allocfail umfdl_allocfail +#define UMF_gprob umfdl_gprob +#define UMF_dump_dense umfdl_dump_dense +#define UMF_dump_element umfdl_dump_element +#define UMF_dump_rowcol umfdl_dump_rowcol +#define UMF_dump_matrix umfdl_dump_matrix +#define UMF_dump_current_front umfdl_dump_current_front +#define UMF_dump_lu umfdl_dump_lu +#define UMF_dump_memory umfdl_dump_memory +#define UMF_dump_packed_memory umfdl_dump_packed_memory +#define UMF_dump_col_matrix umfdl_dump_col_matrix +#define UMF_dump_chain umfdl_dump_chain +#define UMF_dump_start umfdl_dump_start +#define UMF_dump_rowmerge umfdl_dump_rowmerge +#define UMF_dump_diagonal_map umfdl_dump_diagonal_map + +#endif + +/* -------------------------------------------------------------------------- */ +/* Complex double precision, with int's as integers */ +/* -------------------------------------------------------------------------- */ + +#ifdef ZINT + +#define UMF_analyze umf_i_analyze +#define UMF_apply_order umf_i_apply_order +#define UMF_assemble umfzi_assemble +#define UMF_assemble_fixq umfzi_assemble_fixq +#define UMF_blas3_update umfzi_blas3_update +#define UMF_build_tuples umfzi_build_tuples +#define UMF_build_tuples_usage umfzi_build_tuples_usage +#define UMF_colamd umf_i_colamd +#define UMF_colamd_set_defaults umf_i_colamd_set_defaults +#define UMF_create_element umfzi_create_element +#define UMF_extend_front umfzi_extend_front +#define UMF_free umf_i_free +#define UMF_fsize umf_i_fsize +#define UMF_garbage_collection umfzi_garbage_collection +#define UMF_get_memory umfzi_get_memory +#define UMF_grow_front umfzi_grow_front +#define UMF_init_front umfzi_init_front +#define UMF_is_permutation umf_i_is_permutation +#define UMF_kernel umfzi_kernel +#define UMF_kernel_init umfzi_kernel_init +#define UMF_kernel_init_usage umfzi_kernel_init_usage +#define UMF_kernel_wrapup umfzi_kernel_wrapup +#define UMF_local_search umfzi_local_search +#define UMF_lsolve umfzi_lsolve +#define UMF_ltsolve umfzi_ltsolve +#define UMF_lhsolve umfzi_lhsolve +#define UMF_malloc umf_i_malloc +#define UMF_mem_alloc_element umfzi_mem_alloc_element +#define UMF_mem_alloc_head_block umfzi_mem_alloc_head_block +#define UMF_mem_alloc_tail_block umfzi_mem_alloc_tail_block +#define UMF_mem_free_tail_block umfzi_mem_free_tail_block +#define UMF_mem_init_memoryspace umfzi_mem_init_memoryspace +#define UMF_realloc umf_i_realloc +#define UMF_report_perm umf_i_report_perm +#define UMF_report_vector umfzi_report_vector +#define UMF_row_search umfzi_row_search +#define UMF_scale umfzi_scale +#define UMF_scale_column umfzi_scale_column +#define UMF_set_stats umfzi_set_stats +#define UMF_singletons umf_i_singletons +#define UMF_solve umfzi_solve +#define UMF_start_front umfzi_start_front +#define UMF_store_lu umfzi_store_lu +#define UMF_store_lu_drop umfzi_store_lu_drop +#define UMF_symbolic_usage umfzi_symbolic_usage +#define UMF_transpose umfzi_transpose +#define UMF_tuple_lengths umfzi_tuple_lengths +#define UMF_usolve umfzi_usolve +#define UMF_utsolve umfzi_utsolve +#define UMF_uhsolve umfzi_uhsolve +#define UMF_valid_numeric umfzi_valid_numeric +#define UMF_valid_symbolic umfzi_valid_symbolic +#define UMF_triplet_map_x umfzi_triplet_map_x +#define UMF_triplet_map_nox umfzi_triplet_map_nox +#define UMF_triplet_nomap_x umfzi_triplet_nomap_x +#define UMF_triplet_nomap_nox umfzi_triplet_nomap_nox +#define UMF_2by2 umfzi_2by2 + +#define UMFPACK_col_to_triplet umfpack_zi_col_to_triplet +#define UMFPACK_defaults umfpack_zi_defaults +#define UMFPACK_free_numeric umfpack_zi_free_numeric +#define UMFPACK_free_symbolic umfpack_zi_free_symbolic +#define UMFPACK_get_lunz umfpack_zi_get_lunz +#define UMFPACK_get_numeric umfpack_zi_get_numeric +#define UMFPACK_get_symbolic umfpack_zi_get_symbolic +#define UMFPACK_get_determinant umfpack_zi_get_determinant +#define UMFPACK_numeric umfpack_zi_numeric +#define UMFPACK_qsymbolic umfpack_zi_qsymbolic +#define UMFPACK_report_control umfpack_zi_report_control +#define UMFPACK_report_info umfpack_zi_report_info +#define UMFPACK_report_matrix umfpack_zi_report_matrix +#define UMFPACK_report_numeric umfpack_zi_report_numeric +#define UMFPACK_report_perm umfpack_zi_report_perm +#define UMFPACK_report_status umfpack_zi_report_status +#define UMFPACK_report_symbolic umfpack_zi_report_symbolic +#define UMFPACK_report_triplet umfpack_zi_report_triplet +#define UMFPACK_report_vector umfpack_zi_report_vector +#define UMFPACK_save_numeric umfpack_zi_save_numeric +#define UMFPACK_save_symbolic umfpack_zi_save_symbolic +#define UMFPACK_load_numeric umfpack_zi_load_numeric +#define UMFPACK_load_symbolic umfpack_zi_load_symbolic +#define UMFPACK_scale umfpack_zi_scale +#define UMFPACK_solve umfpack_zi_solve +#define UMFPACK_symbolic umfpack_zi_symbolic +#define UMFPACK_transpose umfpack_zi_transpose +#define UMFPACK_triplet_to_col umfpack_zi_triplet_to_col +#define UMFPACK_wsolve umfpack_zi_wsolve + +/* for debugging only: */ +#define UMF_malloc_count umf_i_malloc_count +#define UMF_debug umfzi_debug +#define UMF_allocfail umfzi_allocfail +#define UMF_gprob umfzi_gprob +#define UMF_dump_dense umfzi_dump_dense +#define UMF_dump_element umfzi_dump_element +#define UMF_dump_rowcol umfzi_dump_rowcol +#define UMF_dump_matrix umfzi_dump_matrix +#define UMF_dump_current_front umfzi_dump_current_front +#define UMF_dump_lu umfzi_dump_lu +#define UMF_dump_memory umfzi_dump_memory +#define UMF_dump_packed_memory umfzi_dump_packed_memory +#define UMF_dump_col_matrix umfzi_dump_col_matrix +#define UMF_dump_chain umfzi_dump_chain +#define UMF_dump_start umfzi_dump_start +#define UMF_dump_rowmerge umfzi_dump_rowmerge +#define UMF_dump_diagonal_map umfzi_dump_diagonal_map + +#endif + +/* -------------------------------------------------------------------------- */ +/* Complex double precision, with long's as integers */ +/* -------------------------------------------------------------------------- */ + +#ifdef ZLONG + +#define UMF_analyze umf_l_analyze +#define UMF_apply_order umf_l_apply_order +#define UMF_assemble umfzl_assemble +#define UMF_assemble_fixq umfzl_assemble_fixq +#define UMF_blas3_update umfzl_blas3_update +#define UMF_build_tuples umfzl_build_tuples +#define UMF_build_tuples_usage umfzl_build_tuples_usage +#define UMF_colamd umf_l_colamd +#define UMF_colamd_set_defaults umf_l_colamd_set_defaults +#define UMF_create_element umfzl_create_element +#define UMF_extend_front umfzl_extend_front +#define UMF_free umf_l_free +#define UMF_fsize umf_l_fsize +#define UMF_garbage_collection umfzl_garbage_collection +#define UMF_get_memory umfzl_get_memory +#define UMF_grow_front umfzl_grow_front +#define UMF_init_front umfzl_init_front +#define UMF_is_permutation umf_l_is_permutation +#define UMF_kernel umfzl_kernel +#define UMF_kernel_init umfzl_kernel_init +#define UMF_kernel_init_usage umfzl_kernel_init_usage +#define UMF_kernel_wrapup umfzl_kernel_wrapup +#define UMF_local_search umfzl_local_search +#define UMF_lsolve umfzl_lsolve +#define UMF_ltsolve umfzl_ltsolve +#define UMF_lhsolve umfzl_lhsolve +#define UMF_malloc umf_l_malloc +#define UMF_mem_alloc_element umfzl_mem_alloc_element +#define UMF_mem_alloc_head_block umfzl_mem_alloc_head_block +#define UMF_mem_alloc_tail_block umfzl_mem_alloc_tail_block +#define UMF_mem_free_tail_block umfzl_mem_free_tail_block +#define UMF_mem_init_memoryspace umfzl_mem_init_memoryspace +#define UMF_realloc umf_l_realloc +#define UMF_report_perm umf_l_report_perm +#define UMF_report_vector umfzl_report_vector +#define UMF_row_search umfzl_row_search +#define UMF_scale umfzl_scale +#define UMF_scale_column umfzl_scale_column +#define UMF_set_stats umfzl_set_stats +#define UMF_singletons umf_l_singletons +#define UMF_solve umfzl_solve +#define UMF_start_front umfzl_start_front +#define UMF_store_lu umfzl_store_lu +#define UMF_store_lu_drop umfzl_store_lu_drop +#define UMF_symbolic_usage umfzl_symbolic_usage +#define UMF_transpose umfzl_transpose +#define UMF_tuple_lengths umfzl_tuple_lengths +#define UMF_usolve umfzl_usolve +#define UMF_utsolve umfzl_utsolve +#define UMF_uhsolve umfzl_uhsolve +#define UMF_valid_numeric umfzl_valid_numeric +#define UMF_valid_symbolic umfzl_valid_symbolic +#define UMF_triplet_map_x umfzl_triplet_map_x +#define UMF_triplet_map_nox umfzl_triplet_map_nox +#define UMF_triplet_nomap_x umfzl_triplet_nomap_x +#define UMF_triplet_nomap_nox umfzl_triplet_nomap_nox +#define UMF_2by2 umfzl_2by2 + +#define UMFPACK_col_to_triplet umfpack_zl_col_to_triplet +#define UMFPACK_defaults umfpack_zl_defaults +#define UMFPACK_free_numeric umfpack_zl_free_numeric +#define UMFPACK_free_symbolic umfpack_zl_free_symbolic +#define UMFPACK_get_lunz umfpack_zl_get_lunz +#define UMFPACK_get_numeric umfpack_zl_get_numeric +#define UMFPACK_get_symbolic umfpack_zl_get_symbolic +#define UMFPACK_get_determinant umfpack_zl_get_determinant +#define UMFPACK_numeric umfpack_zl_numeric +#define UMFPACK_qsymbolic umfpack_zl_qsymbolic +#define UMFPACK_report_control umfpack_zl_report_control +#define UMFPACK_report_info umfpack_zl_report_info +#define UMFPACK_report_matrix umfpack_zl_report_matrix +#define UMFPACK_report_numeric umfpack_zl_report_numeric +#define UMFPACK_report_perm umfpack_zl_report_perm +#define UMFPACK_report_status umfpack_zl_report_status +#define UMFPACK_report_symbolic umfpack_zl_report_symbolic +#define UMFPACK_report_triplet umfpack_zl_report_triplet +#define UMFPACK_report_vector umfpack_zl_report_vector +#define UMFPACK_save_numeric umfpack_zl_save_numeric +#define UMFPACK_save_symbolic umfpack_zl_save_symbolic +#define UMFPACK_load_numeric umfpack_zl_load_numeric +#define UMFPACK_load_symbolic umfpack_zl_load_symbolic +#define UMFPACK_scale umfpack_zl_scale +#define UMFPACK_solve umfpack_zl_solve +#define UMFPACK_symbolic umfpack_zl_symbolic +#define UMFPACK_transpose umfpack_zl_transpose +#define UMFPACK_triplet_to_col umfpack_zl_triplet_to_col +#define UMFPACK_wsolve umfpack_zl_wsolve + +/* for debugging only: */ +#define UMF_malloc_count umf_l_malloc_count +#define UMF_debug umfzl_debug +#define UMF_allocfail umfzl_allocfail +#define UMF_gprob umfzl_gprob +#define UMF_dump_dense umfzl_dump_dense +#define UMF_dump_element umfzl_dump_element +#define UMF_dump_rowcol umfzl_dump_rowcol +#define UMF_dump_matrix umfzl_dump_matrix +#define UMF_dump_current_front umfzl_dump_current_front +#define UMF_dump_lu umfzl_dump_lu +#define UMF_dump_memory umfzl_dump_memory +#define UMF_dump_packed_memory umfzl_dump_packed_memory +#define UMF_dump_col_matrix umfzl_dump_col_matrix +#define UMF_dump_chain umfzl_dump_chain +#define UMF_dump_start umfzl_dump_start +#define UMF_dump_rowmerge umfzl_dump_rowmerge +#define UMF_dump_diagonal_map umfzl_dump_diagonal_map + +#endif diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umfpack_col_to_triplet.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_col_to_triplet.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,72 @@ +/* ========================================================================== */ +/* === UMFPACK_col_to_triplet =============================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + User callable. Converts a column-oriented input matrix to triplet form by + constructing the column indices Tj from the column pointers Ap. The matrix + may be singular. See umfpack_col_to_triplet.h for details. + +*/ + +#include "umf_internal.h" + +GLOBAL Int UMFPACK_col_to_triplet +( + Int n_col, + const Int Ap [ ], + Int Tj [ ] +) +{ + + /* ---------------------------------------------------------------------- */ + /* local variables */ + /* ---------------------------------------------------------------------- */ + + Int nz, j, p, p1, p2, length ; + + /* ---------------------------------------------------------------------- */ + /* construct the column indices */ + /* ---------------------------------------------------------------------- */ + + if (!Ap || !Tj) + { + return (UMFPACK_ERROR_argument_missing) ; + } + if (n_col <= 0) + { + return (UMFPACK_ERROR_n_nonpositive) ; + } + if (Ap [0] != 0) + { + return (UMFPACK_ERROR_invalid_matrix) ; + } + nz = Ap [n_col] ; + if (nz < 0) + { + return (UMFPACK_ERROR_invalid_matrix) ; + } + + for (j = 0 ; j < n_col ; j++) + { + p1 = Ap [j] ; + p2 = Ap [j+1] ; + length = p2 - p1 ; + if (length < 0 || p2 > nz) + { + return (UMFPACK_ERROR_invalid_matrix) ; + } + for (p = p1 ; p < p2 ; p++) + { + Tj [p] = j ; + } + } + + return (UMFPACK_OK) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umfpack_defaults.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_defaults.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,118 @@ +/* ========================================================================== */ +/* === UMFPACK_defaults ===================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + User-callable. Sets default control parameters. See umfpack_defaults.h + for details. +*/ + +#include "umf_internal.h" + +GLOBAL void UMFPACK_defaults +( + double Control [UMFPACK_CONTROL] +) +{ + Int i ; + + if (!Control) + { + /* silently return if no Control array */ + return ; + } + + for (i = 0 ; i < UMFPACK_CONTROL ; i++) + { + Control [i] = 0 ; + } + + /* ---------------------------------------------------------------------- */ + /* default control settings: can be modified at run-time */ + /* ---------------------------------------------------------------------- */ + + /* used in UMFPACK_report_* routines: */ + Control [UMFPACK_PRL] = UMFPACK_DEFAULT_PRL ; + + /* used in UMFPACK_*symbolic: */ + Control [UMFPACK_DENSE_ROW] = UMFPACK_DEFAULT_DENSE_ROW ; + Control [UMFPACK_DENSE_COL] = UMFPACK_DEFAULT_DENSE_COL ; + Control [UMFPACK_AMD_DENSE] = UMFPACK_DEFAULT_AMD_DENSE ; + Control [UMFPACK_STRATEGY] = UMFPACK_DEFAULT_STRATEGY ; + Control [UMFPACK_2BY2_TOLERANCE] = UMFPACK_DEFAULT_2BY2_TOLERANCE ; + Control [UMFPACK_AGGRESSIVE] = UMFPACK_DEFAULT_AGGRESSIVE ; + + /* used in UMFPACK_numeric: */ + Control [UMFPACK_PIVOT_TOLERANCE] = UMFPACK_DEFAULT_PIVOT_TOLERANCE ; + Control [UMFPACK_SYM_PIVOT_TOLERANCE] = UMFPACK_DEFAULT_SYM_PIVOT_TOLERANCE; + Control [UMFPACK_BLOCK_SIZE] = UMFPACK_DEFAULT_BLOCK_SIZE ; + Control [UMFPACK_ALLOC_INIT] = UMFPACK_DEFAULT_ALLOC_INIT ; + Control [UMFPACK_FRONT_ALLOC_INIT] = UMFPACK_DEFAULT_FRONT_ALLOC_INIT ; + Control [UMFPACK_SCALE] = UMFPACK_DEFAULT_SCALE ; + + /* used in UMFPACK_*solve: */ + Control [UMFPACK_IRSTEP] = UMFPACK_DEFAULT_IRSTEP ; + + /* ---------------------------------------------------------------------- */ + /* compile-time settings: cannot be modified at run-time */ + /* ---------------------------------------------------------------------- */ + +#ifdef USE_NO_BLAS + /* do not use the BLAS - use in-line C code instead */ + Control [UMFPACK_COMPILED_WITH_BLAS] = 0 ; +#else + /* use externally-provided BLAS (dgemm, dger, dgemv, zgemm, zgeru, zgemv) */ + Control [UMFPACK_COMPILED_WITH_BLAS] = 1 ; +#endif + +#ifdef MATLAB_MEX_FILE + /* use mxMalloc, mxFree, mxRealloc, and mexPrintf */ + /* use mxAssert if debugging is enabled */ + Control [UMFPACK_COMPILED_FOR_MATLAB] = 1 ; +#else +#ifdef MATHWORKS + /* use internal utMalloc, utFree, utRealloc, and utPrintf routines. */ + /* use utDivideComplex and utFdlibm_hypot for complex version. */ + /* use utAssert if debugging is enabled. */ + Control [UMFPACK_COMPILED_FOR_MATLAB] = 2 ; +#else + /* use ANSI C malloc, free, realloc, and print */ + /* use ANSI C assert if debugging is enabled */ + Control [UMFPACK_COMPILED_FOR_MATLAB] = 0 ; +#endif +#endif + +#ifdef NO_TIMER + /* no timer used */ + Control [UMFPACK_COMPILED_WITH_GETRUSAGE] = 3 ; +#ifndef NPOSIX + /* uses the POSIX sysconf ( ) and times ( ) routines in UMFPACK_tic, toc */ + Control [UMFPACK_COMPILED_WITH_GETRUSAGE] = 2 ; +#else +#ifdef GETRUSAGE + /* uses the non-standard getrusage to get CPU time (Solaris) */ + Control [UMFPACK_COMPILED_WITH_GETRUSAGE] = 1 ; +#else + /* uses the ANSI standard clock routine to get CPU time */ + /* this may wrap around */ + Control [UMFPACK_COMPILED_WITH_GETRUSAGE] = 0 ; +#endif +#endif +#endif + +#ifndef NDEBUG + /* UMFPACK is compiled in debug mode. */ + /* This is exceedingly slow. */ + DEBUG0 (("UMFPACK is running in debug mode. This is very slow!\n")) ; + Control [UMFPACK_COMPILED_IN_DEBUG_MODE] = 1 ; +#else + /* UMFPACK is compiled in normal (non-debug) mode */ + Control [UMFPACK_COMPILED_IN_DEBUG_MODE] = 0 ; +#endif +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umfpack_free_numeric.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_free_numeric.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,57 @@ +/* ========================================================================== */ +/* === UMFPACK_free_numeric ================================================= */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* User-callable. Free the entire Numeric object (consists of 11 to 13 + * malloc'd objects. See UMFPACK_free_numeric.h for details. + */ + +#include "umf_internal.h" +#include "umf_free.h" + +GLOBAL void UMFPACK_free_numeric +( + void **NumericHandle +) +{ + + NumericType *Numeric ; + if (!NumericHandle) + { + return ; + } + Numeric = *((NumericType **) NumericHandle) ; + if (!Numeric) + { + return ; + } + + /* these 9 objects always exist */ + (void) UMF_free ((void *) Numeric->D) ; + (void) UMF_free ((void *) Numeric->Rperm) ; + (void) UMF_free ((void *) Numeric->Cperm) ; + (void) UMF_free ((void *) Numeric->Lpos) ; + (void) UMF_free ((void *) Numeric->Lilen) ; + (void) UMF_free ((void *) Numeric->Lip) ; + (void) UMF_free ((void *) Numeric->Upos) ; + (void) UMF_free ((void *) Numeric->Uilen) ; + (void) UMF_free ((void *) Numeric->Uip) ; + + /* Rs does not exist if scaling was not performed */ + (void) UMF_free ((void *) Numeric->Rs) ; + + /* Upattern can only exist for singular or rectangular matrices */ + (void) UMF_free ((void *) Numeric->Upattern) ; + + /* these 2 objects always exist */ + (void) UMF_free ((void *) Numeric->Memory) ; + (void) UMF_free ((void *) Numeric) ; + + *NumericHandle = (void *) NULL ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umfpack_free_symbolic.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_free_symbolic.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,56 @@ +/* ========================================================================== */ +/* === UMFPACK_free_symbolic ================================================ */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + User-callable. See umfpack_free_symbolic.h for details. + All 10 objects comprising the Symbolic object are free'd via UMF_free. +*/ + +#include "umf_internal.h" +#include "umf_free.h" + +GLOBAL void UMFPACK_free_symbolic +( + void **SymbolicHandle +) +{ + + SymbolicType *Symbolic ; + if (!SymbolicHandle) + { + return ; + } + Symbolic = *((SymbolicType **) SymbolicHandle) ; + if (!Symbolic) + { + return ; + } + + (void) UMF_free ((void *) Symbolic->Cperm_init) ; + (void) UMF_free ((void *) Symbolic->Rperm_init) ; + (void) UMF_free ((void *) Symbolic->Front_npivcol) ; + (void) UMF_free ((void *) Symbolic->Front_parent) ; + (void) UMF_free ((void *) Symbolic->Front_1strow) ; + (void) UMF_free ((void *) Symbolic->Front_leftmostdesc) ; + (void) UMF_free ((void *) Symbolic->Chain_start) ; + (void) UMF_free ((void *) Symbolic->Chain_maxrows) ; + (void) UMF_free ((void *) Symbolic->Chain_maxcols) ; + (void) UMF_free ((void *) Symbolic->Cdeg) ; + (void) UMF_free ((void *) Symbolic->Rdeg) ; + + /* only when dense rows are present */ + (void) UMF_free ((void *) Symbolic->Esize) ; + + /* only when diagonal pivoting is prefered */ + (void) UMF_free ((void *) Symbolic->Diagonal_map) ; + + (void) UMF_free ((void *) Symbolic) ; + *SymbolicHandle = (void *) NULL ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umfpack_get_determinant.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_get_determinant.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,307 @@ +/* ========================================================================== */ +/* === UMFPACK_get_determinant ============================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + User-callable. From the LU factors, scale factor, and permutation vectors + held in the Numeric object, calculates the determinant of the matrix A. + See umfpack_get_determinant.h for a more detailed description. + + Dynamic memory usage: calls UMF_malloc once, for a total space of + n integers, and then frees all of it via UMF_free when done. + + Contributed by David Bateman, Motorola, Nov. 2004. + Modified for V4.4, Jan. 2005. +*/ + +#include "umf_internal.h" +#include "umf_valid_numeric.h" +#include "umf_malloc.h" +#include "umf_free.h" + +/* ========================================================================== */ +/* === rescale_determinant ================================================== */ +/* ========================================================================== */ + +/* If the mantissa is too big or too small, rescale it and change exponent */ + +PRIVATE Int rescale_determinant +( + Entry *d_mantissa, + double *d_exponent +) +{ + double d_abs ; + + ABS (d_abs, *d_mantissa) ; + + if (SCALAR_IS_ZERO (d_abs)) + { + /* the determinant is zero */ + *d_exponent = 0 ; + return (FALSE) ; + } + + if (SCALAR_IS_NAN (d_abs)) + { + /* the determinant is NaN */ + return (FALSE) ; + } + + while (d_abs < 1.) + { + SCALE (*d_mantissa, 10.0) ; + *d_exponent = *d_exponent - 1.0 ; + ABS (d_abs, *d_mantissa) ; + } + + while (d_abs >= 10.) + { + SCALE (*d_mantissa, 0.1) ; + *d_exponent = *d_exponent + 1.0 ; + ABS (d_abs, *d_mantissa) ; + } + + return (TRUE) ; +} + +/* ========================================================================== */ +/* === UMFPACK_get_determinant ============================================== */ +/* ========================================================================== */ + +GLOBAL Int UMFPACK_get_determinant +( + double *Mx, +#ifdef COMPLEX + double *Mz, +#endif + double *Ex, + void *NumericHandle, + double User_Info [UMFPACK_INFO] +) +{ + /* ---------------------------------------------------------------------- */ + /* local variables */ + /* ---------------------------------------------------------------------- */ + + Entry d_mantissa, d_tmp ; + double d_exponent, Info2 [UMFPACK_INFO], one [2] = {1.0, 0.0}, d_sign ; + Entry *D ; + double *Info, *Rs ; + NumericType *Numeric ; + Int i, n, itmp, npiv, *Wi, *Rperm, *Cperm, do_scale ; + +#ifndef NRECIPROCAL + Int do_recip ; +#endif + + /* ---------------------------------------------------------------------- */ + /* check input parameters */ + /* ---------------------------------------------------------------------- */ + + if (User_Info != (double *) NULL) + { + /* return Info in user's array */ + Info = User_Info ; + } + else + { + /* no Info array passed - use local one instead */ + Info = Info2 ; + for (i = 0 ; i < UMFPACK_INFO ; i++) + { + Info [i] = EMPTY ; + } + } + + Info [UMFPACK_STATUS] = UMFPACK_OK ; + + Numeric = (NumericType *) NumericHandle ; + if (!UMF_valid_numeric (Numeric)) + { + Info [UMFPACK_STATUS] = UMFPACK_ERROR_invalid_Numeric_object ; + return (UMFPACK_ERROR_invalid_Numeric_object) ; + } + + if (Numeric->n_row != Numeric->n_col) + { + /* only square systems can be handled */ + Info [UMFPACK_STATUS] = UMFPACK_ERROR_invalid_system ; + return (UMFPACK_ERROR_invalid_system) ; + } + + if (Mx == (double *) NULL) + { + Info [UMFPACK_STATUS] = UMFPACK_ERROR_argument_missing ; + return (UMFPACK_ERROR_argument_missing) ; + } + + n = Numeric->n_row ; + + /* ---------------------------------------------------------------------- */ + /* allocate workspace */ + /* ---------------------------------------------------------------------- */ + + Wi = (Int *) UMF_malloc (n, sizeof (Int)) ; + + if (!Wi) + { + DEBUGm4 (("out of memory: get determinant\n")) ; + Info [UMFPACK_STATUS] = UMFPACK_ERROR_out_of_memory ; + return (UMFPACK_ERROR_out_of_memory) ; + } + + /* ---------------------------------------------------------------------- */ + /* compute the determinant */ + /* ---------------------------------------------------------------------- */ + + Rs = Numeric->Rs ; /* row scale factors */ + do_scale = (Rs != (double *) NULL) ; + +#ifndef NRECIPROCAL + do_recip = Numeric->do_recip ; +#endif + + d_mantissa = ((Entry *) one) [0] ; + d_exponent = 0.0 ; + D = Numeric->D ; + + /* compute product of diagonal entries of U */ + for (i = 0 ; i < n ; i++) + { + MULT (d_tmp, d_mantissa, D [i]) ; + d_mantissa = d_tmp ; + + if (!rescale_determinant (&d_mantissa, &d_exponent)) + { + /* the determinant is zero or NaN */ + Info [UMFPACK_STATUS] = UMFPACK_WARNING_singular_matrix ; + /* no need to compute the determinant of R */ + do_scale = FALSE ; + break ; + } + } + + /* compute product of diagonal entries of R (or its inverse) */ + if (do_scale) + { + for (i = 0 ; i < n ; i++) + { +#ifndef NRECIPROCAL + if (do_recip) + { + /* compute determinant of R inverse */ + SCALE_DIV (d_mantissa, Rs [i]) ; + } + else +#endif + { + /* compute determinant of R */ + SCALE (d_mantissa, Rs [i]) ; + } + if (!rescale_determinant (&d_mantissa, &d_exponent)) + { + /* the determinant is zero or NaN. This is very unlikey to + * occur here, since the scale factors for a tiny or zero row + * are set to 1. */ + Info [UMFPACK_STATUS] = UMFPACK_WARNING_singular_matrix ; + break ; + } + } + } + + /* ---------------------------------------------------------------------- */ + /* determine if P and Q are odd or even permutations */ + /* ---------------------------------------------------------------------- */ + + npiv = 0 ; + Rperm = Numeric->Rperm ; + + for (i = 0 ; i < n ; i++) + { + Wi [i] = Rperm [i] ; + } + + for (i = 0 ; i < n ; i++) + { + while (Wi [i] != i) + { + itmp = Wi [Wi [i]] ; + Wi [Wi [i]] = Wi [i] ; + Wi [i] = itmp ; + npiv++ ; + } + } + + Cperm = Numeric->Cperm ; + + for (i = 0 ; i < n ; i++) + { + Wi [i] = Cperm [i] ; + } + + for (i = 0 ; i < n ; i++) + { + while (Wi [i] != i) + { + itmp = Wi [Wi [i]] ; + Wi [Wi [i]] = Wi [i] ; + Wi [i] = itmp ; + npiv++ ; + } + } + + /* if npiv is odd, the sign is -1. if it is even, the sign is +1 */ + d_sign = (npiv % 2) ? -1. : 1. ; + + /* ---------------------------------------------------------------------- */ + /* free workspace */ + /* ---------------------------------------------------------------------- */ + + (void) UMF_free ((void *) Wi) ; + + /* ---------------------------------------------------------------------- */ + /* compute the magnitude and exponent of the determinant */ + /* ---------------------------------------------------------------------- */ + + if (Ex == (double *) NULL) + { + /* Ex is not provided, so return the entire determinant in d_mantissa */ + SCALE (d_mantissa, pow (10.0, d_exponent)) ; + } + else + { + Ex [0] = d_exponent ; + } + + Mx [0] = d_sign * REAL_COMPONENT (d_mantissa) ; + +#ifdef COMPLEX + if (SPLIT (Mz)) + { + Mz [0] = d_sign * IMAG_COMPONENT (d_mantissa) ; + } + else + { + Mx [1] = d_sign * IMAG_COMPONENT (d_mantissa) ; + } +#endif + + /* determine if the determinant has (or will) overflow or underflow */ + if (d_exponent + 1.0 > log10 (DBL_MAX)) + { + Info [UMFPACK_STATUS] = UMFPACK_WARNING_determinant_overflow ; + } + else if (d_exponent - 1.0 < log10 (DBL_MIN)) + { + Info [UMFPACK_STATUS] = UMFPACK_WARNING_determinant_underflow ; + } + + return (UMFPACK_OK) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umfpack_get_lunz.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_get_lunz.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,55 @@ +/* ========================================================================== */ +/* === UMFPACK_get_lunz ===================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + User-callable. Determines the number of nonzeros in L and U, and the size + of L and U. +*/ + +#include "umf_internal.h" +#include "umf_valid_numeric.h" + +GLOBAL Int UMFPACK_get_lunz +( + Int *lnz, + Int *unz, + Int *n_row, + Int *n_col, + Int *nz_udiag, + void *NumericHandle +) +{ + NumericType *Numeric ; + + Numeric = (NumericType *) NumericHandle ; + + if (!UMF_valid_numeric (Numeric)) + { + return (UMFPACK_ERROR_invalid_Numeric_object) ; + } + if (!lnz || !unz || !n_row || !n_col || !nz_udiag) + { + return (UMFPACK_ERROR_argument_missing) ; + } + + *n_row = Numeric->n_row ; + *n_col = Numeric->n_col ; + + /* number of nz's in L below diagonal, plus the unit diagonal of L */ + *lnz = Numeric->lnz + MIN (Numeric->n_row, Numeric->n_col) ; + + /* number of nz's in U above diagonal, plus nz's on diagaonal of U */ + *unz = Numeric->unz + Numeric->nnzpiv ; + + /* number of nz's on the diagonal */ + *nz_udiag = Numeric->nnzpiv ; + + return (UMFPACK_OK) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umfpack_get_numeric.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_get_numeric.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,1057 @@ +/* ========================================================================== */ +/* === UMFPACK_get_numeric ================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + User-callable. Gets the LU factors and the permutation vectors held in the + Numeric object. L is returned in sparse row form with sorted rows, U is + returned in sparse column form with sorted columns, and P and Q are + returned as permutation vectors. See umfpack_get_numeric.h for a more + detailed description. + + Returns TRUE if successful, FALSE if the Numeric object is invalid or + if out of memory. + + Dynamic memory usage: calls UMF_malloc twice, for a total space of + 2*n integers, and then frees all of it via UMF_free when done. + +*/ + +#include "umf_internal.h" +#include "umf_valid_numeric.h" +#include "umf_malloc.h" +#include "umf_free.h" + +#ifndef NDEBUG +PRIVATE Int init_count ; +#endif + +PRIVATE void get_L +( + Int Lp [ ], + Int Lj [ ], + double Lx [ ], +#ifdef COMPLEX + double Lz [ ], +#endif + NumericType *Numeric, + Int Pattern [ ], + Int Wi [ ] +) ; + +PRIVATE void get_U +( + Int Up [ ], + Int Ui [ ], + double Ux [ ], +#ifdef COMPLEX + double Uz [ ], +#endif + NumericType *Numeric, + Int Pattern [ ], + Int Wi [ ] +) ; + +/* ========================================================================== */ +/* === UMFPACK_get_numeric ================================================== */ +/* ========================================================================== */ + +GLOBAL Int UMFPACK_get_numeric +( + Int Lp [ ], + Int Lj [ ], + double Lx [ ], +#ifdef COMPLEX + double Lz [ ], +#endif + Int Up [ ], + Int Ui [ ], + double Ux [ ], +#ifdef COMPLEX + double Uz [ ], +#endif + Int P [ ], + Int Q [ ], + double Dx [ ], +#ifdef COMPLEX + double Dz [ ], +#endif + Int *p_do_recip, + double Rs [ ], + void *NumericHandle +) +{ + + /* ---------------------------------------------------------------------- */ + /* local variables */ + /* ---------------------------------------------------------------------- */ + + NumericType *Numeric ; + Int getL, getU, *Rperm, *Cperm, k, nn, n_row, n_col, *Wi, *Pattern, + n_inner ; + double *Rs1 ; + Entry *D ; + +#ifndef NDEBUG + init_count = UMF_malloc_count ; +#endif + + Wi = (Int *) NULL ; + Pattern = (Int *) NULL ; + + /* ---------------------------------------------------------------------- */ + /* check input parameters */ + /* ---------------------------------------------------------------------- */ + + Numeric = (NumericType *) NumericHandle ; + if (!UMF_valid_numeric (Numeric)) + { + return (UMFPACK_ERROR_invalid_Numeric_object) ; + } + + n_row = Numeric->n_row ; + n_col = Numeric->n_col ; + nn = MAX (n_row, n_col) ; + n_inner = MIN (n_row, n_col) ; + + /* ---------------------------------------------------------------------- */ + /* allocate workspace */ + /* ---------------------------------------------------------------------- */ + + getL = Lp && Lj && Lx ; + getU = Up && Ui && Ux ; + + if (getL || getU) + { + Wi = (Int *) UMF_malloc (nn, sizeof (Int)) ; + Pattern = (Int *) UMF_malloc (nn, sizeof (Int)) ; + if (!Wi || !Pattern) + { + (void) UMF_free ((void *) Wi) ; + (void) UMF_free ((void *) Pattern) ; + ASSERT (UMF_malloc_count == init_count) ; + DEBUGm4 (("out of memory: get numeric\n")) ; + return (UMFPACK_ERROR_out_of_memory) ; + } + ASSERT (UMF_malloc_count == init_count + 2) ; + } + + /* ---------------------------------------------------------------------- */ + /* get contents of Numeric */ + /* ---------------------------------------------------------------------- */ + + if (P != (Int *) NULL) + { + Rperm = Numeric->Rperm ; + for (k = 0 ; k < n_row ; k++) + { + P [k] = Rperm [k] ; + } + } + + if (Q != (Int *) NULL) + { + Cperm = Numeric->Cperm ; + for (k = 0 ; k < n_col ; k++) + { + Q [k] = Cperm [k] ; + } + } + + if (getL) + { + get_L (Lp, Lj, Lx, +#ifdef COMPLEX + Lz, +#endif + Numeric, Pattern, Wi) ; + } + + if (getU) + { + get_U (Up, Ui, Ux, +#ifdef COMPLEX + Uz, +#endif + Numeric, Pattern, Wi) ; + } + + if (Dx != (double *) NULL) + { + D = Numeric->D ; +#ifdef COMPLEX + if (SPLIT (Dz)) + { + for (k = 0 ; k < n_inner ; k++) + { + Dx [k] = REAL_COMPONENT (D [k]) ; + Dz [k] = IMAG_COMPONENT (D [k]) ; + } + } + else + { + for (k = 0 ; k < n_inner ; k++) + { + Dx [2*k ] = REAL_COMPONENT (D [k]) ; + Dx [2*k+1] = IMAG_COMPONENT (D [k]) ; + } + } +#else + { + D = Numeric->D ; + for (k = 0 ; k < n_inner ; k++) + { + Dx [k] = D [k] ; + } + } +#endif + } + + /* return the flag stating whether the scale factors are to be multiplied, + * or divided. If do_recip is TRUE, multiply. Otherwise, divided. + * If NRECIPROCAL is defined at compile time, the scale factors are always + * to be used by dividing. + */ + if (p_do_recip != (Int *) NULL) + { +#ifndef NRECIPROCAL + *p_do_recip = Numeric->do_recip ; +#else + *p_do_recip = FALSE ; +#endif + } + + if (Rs != (double *) NULL) + { + Rs1 = Numeric->Rs ; + if (Rs1 == (double *) NULL) + { + /* R is the identity matrix. */ + for (k = 0 ; k < n_row ; k++) + { + Rs [k] = 1.0 ; + } + } + else + { + for (k = 0 ; k < n_row ; k++) + { + Rs [k] = Rs1 [k] ; + } + } + } + + /* ---------------------------------------------------------------------- */ + /* free the workspace */ + /* ---------------------------------------------------------------------- */ + + (void) UMF_free ((void *) Wi) ; + (void) UMF_free ((void *) Pattern) ; + ASSERT (UMF_malloc_count == init_count) ; + + return (UMFPACK_OK) ; +} + + +/* ========================================================================== */ +/* === get_L ================================================================ */ +/* ========================================================================== */ + +/* + The matrix L is stored in the following arrays in the Numeric object: + + Int Lpos [0..npiv] + Int Lip [0..npiv], index into Numeric->Memory + Int Lilen [0..npiv] + Unit *(Numeric->Memory), pointer to memory space holding row indices + and numerical values + + where npiv is the number of pivot entries found. If A is n_row-by-n_col, + then npiv <= MIN (n_row,n_col). + + Let L_k denote the pattern of entries in column k of L (excluding the + diagonal). + + An Lchain is a sequence of columns of L whose nonzero patterns are related. + The start of an Lchain is denoted by a negative value of Lip [k]. + + To obtain L_k: + + (1) If column k starts an Lchain, then L_k is stored in its entirety. + |Lip [k]| is an index into Numeric->Memory for the integer row indices + in L_k. The number of entries in the column is |L_k| = Lilen [k]. + This defines the pattern of the "leading" column of this chain. + Lpos [k] is not used for the first column in the chain. Column zero + is always a leading column. + + (2) If column k does not start an Lchain, then L_k is represented as a + superset of L_k-1. Define Lnew_k such that (L_k-1 - {k} union Lnew_k) + = L_k, where Lnew_k and (L_k-1)-{k} are disjoint. Lnew_k are the + entries in L_k that are not in L_k-1. Lpos [k] holds the position of + pivot row index k in the prior pattern L_k-1 (if it is present), so + that the set subtraction (L_k-1)-{k} can be computed quickly, when + computing the pattern of L_k from L_k-1. The number of new entries in + L_k is stored in Lilen [k] = |Lnew_k|. + + Note that this means we must have the pattern L_k-1 to compute L_k. + + In both cases (1) and (2), we obtain the pattern L_k. + + The numerical values are stored in Numeric->Memory, starting at the index + |Lip [k]| + Lilen [k]. It is stored in the same order as the entries + in L_k, after L_k is obtained from cases (1) or (2), above. + + The advantage of using this "packed" data structure is that it can + dramatically reduce the amount of storage needed for the pattern of L. + The disadvantage is that it can be difficult for the user to access, + and it does not match the sparse matrix data structure used in MATLAB. + Thus, this routine is provided to create a conventional sparse matrix + data structure for L, in sparse-row form. A row-form of L appears to + MATLAB to be a column-oriented from of the transpose of L. If you would + like a column-form of L, then use UMFPACK_transpose (an example of this + is in umfpackmex.c). + +*/ +/* ========================================================================== */ + +PRIVATE void get_L +( + Int Lp [ ], /* of size n_row+1 */ + Int Lj [ ], /* of size lnz, where lnz = Lp [n_row] */ + double Lx [ ], /* of size lnz */ +#ifdef COMPLEX + double Lz [ ], /* of size lnz */ +#endif + NumericType *Numeric, + Int Pattern [ ], /* workspace of size n_row */ + Int Wi [ ] /* workspace of size n_row */ +) +{ + /* ---------------------------------------------------------------------- */ + /* local variables */ + /* ---------------------------------------------------------------------- */ + + Entry value ; + Entry *xp, *Lval ; + Int deg, *ip, j, row, n_row, n_col, n_inner, *Lpos, *Lilen, *Lip, p, llen, + lnz2, lp, newLchain, k, pos, npiv, *Li, n1 ; +#ifdef COMPLEX + Int split = SPLIT (Lz) ; +#endif + + /* ---------------------------------------------------------------------- */ + /* get parameters */ + /* ---------------------------------------------------------------------- */ + + DEBUG4 (("get_L start:\n")) ; + n_row = Numeric->n_row ; + n_col = Numeric->n_col ; + n_inner = MIN (n_row, n_col) ; + npiv = Numeric->npiv ; + n1 = Numeric->n1 ; + Lpos = Numeric->Lpos ; + Lilen = Numeric->Lilen ; + Lip = Numeric->Lip ; + deg = 0 ; + + /* ---------------------------------------------------------------------- */ + /* count the nonzeros in each row of L */ + /* ---------------------------------------------------------------------- */ + +#pragma ivdep + for (row = 0 ; row < n_inner ; row++) + { + /* include the diagonal entry in the row counts */ + Wi [row] = 1 ; + } +#pragma ivdep + for (row = n_inner ; row < n_row ; row++) + { + Wi [row] = 0 ; + } + + /* singletons */ + for (k = 0 ; k < n1 ; k++) + { + DEBUG4 (("Singleton k "ID"\n", k)) ; + deg = Lilen [k] ; + if (deg > 0) + { + lp = Lip [k] ; + Li = (Int *) (Numeric->Memory + lp) ; + lp += UNITS (Int, deg) ; + Lval = (Entry *) (Numeric->Memory + lp) ; + for (j = 0 ; j < deg ; j++) + { + row = Li [j] ; + value = Lval [j] ; + DEBUG4 ((" row "ID" k "ID" value", row, k)) ; + EDEBUG4 (value) ; + DEBUG4 (("\n")) ; + if (IS_NONZERO (value)) + { + Wi [row]++ ; + } + } + } + } + + /* non-singletons */ + for (k = n1 ; k < npiv ; k++) + { + + /* ------------------------------------------------------------------ */ + /* make column of L in Pattern [0..deg-1] */ + /* ------------------------------------------------------------------ */ + + lp = Lip [k] ; + newLchain = (lp < 0) ; + if (newLchain) + { + lp = -lp ; + deg = 0 ; + DEBUG4 (("start of chain for column of L\n")) ; + } + + /* remove pivot row */ + pos = Lpos [k] ; + if (pos != EMPTY) + { + DEBUG4 ((" k "ID" removing row "ID" at position "ID"\n", + k, Pattern [pos], pos)) ; + ASSERT (!newLchain) ; + ASSERT (deg > 0) ; + ASSERT (pos >= 0 && pos < deg) ; + ASSERT (Pattern [pos] == k) ; + Pattern [pos] = Pattern [--deg] ; + } + + /* concatenate the pattern */ + ip = (Int *) (Numeric->Memory + lp) ; + llen = Lilen [k] ; + for (j = 0 ; j < llen ; j++) + { + row = *ip++ ; + DEBUG4 ((" row "ID" k "ID"\n", row, k)) ; + ASSERT (row > k && row < n_row) ; + Pattern [deg++] = row ; + } + + xp = (Entry *) (Numeric->Memory + lp + UNITS (Int, llen)) ; + + for (j = 0 ; j < deg ; j++) + { + DEBUG4 ((" row "ID" k "ID" value", Pattern [j], k)) ; + row = Pattern [j] ; + value = *xp++ ; + EDEBUG4 (value) ; + DEBUG4 (("\n")) ; + if (IS_NONZERO (value)) + { + Wi [row]++ ; + } + } + } + + /* ---------------------------------------------------------------------- */ + /* construct the final row form of L */ + /* ---------------------------------------------------------------------- */ + + /* create the row pointers */ + lnz2 = 0 ; + for (row = 0 ; row < n_row ; row++) + { + Lp [row] = lnz2 ; + lnz2 += Wi [row] ; + Wi [row] = Lp [row] ; + } + Lp [n_row] = lnz2 ; + ASSERT (Numeric->lnz + n_inner == lnz2) ; + + /* add entries from the rows of L (singletons) */ + for (k = 0 ; k < n1 ; k++) + { + DEBUG4 (("Singleton k "ID"\n", k)) ; + deg = Lilen [k] ; + if (deg > 0) + { + lp = Lip [k] ; + Li = (Int *) (Numeric->Memory + lp) ; + lp += UNITS (Int, deg) ; + Lval = (Entry *) (Numeric->Memory + lp) ; + for (j = 0 ; j < deg ; j++) + { + row = Li [j] ; + value = Lval [j] ; + DEBUG4 ((" row "ID" k "ID" value", row, k)) ; + EDEBUG4 (value) ; + DEBUG4 (("\n")) ; + if (IS_NONZERO (value)) + { + p = Wi [row]++ ; + Lj [p] = k ; +#ifdef COMPLEX + if (split) + { + + Lx [p] = REAL_COMPONENT (value) ; + Lz [p] = IMAG_COMPONENT (value) ; + } + else + { + Lx [2*p ] = REAL_COMPONENT (value) ; + Lx [2*p+1] = IMAG_COMPONENT (value) ; + } +#else + Lx [p] = value ; +#endif + } + } + } + } + + /* add entries from the rows of L (non-singletons) */ + for (k = n1 ; k < npiv ; k++) + { + + /* ------------------------------------------------------------------ */ + /* make column of L in Pattern [0..deg-1] */ + /* ------------------------------------------------------------------ */ + + lp = Lip [k] ; + newLchain = (lp < 0) ; + if (newLchain) + { + lp = -lp ; + deg = 0 ; + DEBUG4 (("start of chain for column of L\n")) ; + } + + /* remove pivot row */ + pos = Lpos [k] ; + if (pos != EMPTY) + { + DEBUG4 ((" k "ID" removing row "ID" at position "ID"\n", + k, Pattern [pos], pos)) ; + ASSERT (!newLchain) ; + ASSERT (deg > 0) ; + ASSERT (pos >= 0 && pos < deg) ; + ASSERT (Pattern [pos] == k) ; + Pattern [pos] = Pattern [--deg] ; + } + + /* concatenate the pattern */ + ip = (Int *) (Numeric->Memory + lp) ; + llen = Lilen [k] ; + for (j = 0 ; j < llen ; j++) + { + row = *ip++ ; + DEBUG4 ((" row "ID" k "ID"\n", row, k)) ; + ASSERT (row > k) ; + Pattern [deg++] = row ; + } + + xp = (Entry *) (Numeric->Memory + lp + UNITS (Int, llen)) ; + + for (j = 0 ; j < deg ; j++) + { + DEBUG4 ((" row "ID" k "ID" value", Pattern [j], k)) ; + row = Pattern [j] ; + value = *xp++ ; + EDEBUG4 (value) ; + DEBUG4 (("\n")) ; + if (IS_NONZERO (value)) + { + p = Wi [row]++ ; + Lj [p] = k ; +#ifdef COMPLEX + if (split) + { + Lx [p] = REAL_COMPONENT (value) ; + Lz [p] = IMAG_COMPONENT (value) ; + } + else + { + Lx [2*p ] = REAL_COMPONENT (value) ; + Lx [2*p+1] = IMAG_COMPONENT (value) ; + } +#else + Lx [p] = value ; +#endif + } + } + } + + /* add all of the diagonal entries (L is unit diagonal) */ + for (row = 0 ; row < n_inner ; row++) + { + p = Wi [row]++ ; + Lj [p] = row ; + +#ifdef COMPLEX + if (split) + { + Lx [p] = 1. ; + Lz [p] = 0. ; + } + else + { + Lx [2*p ] = 1. ; + Lx [2*p+1] = 0. ; + } +#else + Lx [p] = 1. ; +#endif + + ASSERT (Wi [row] == Lp [row+1]) ; + } + +#ifndef NDEBUG + DEBUG6 (("L matrix (stored by rows):")) ; + UMF_dump_col_matrix (Lx, +#ifdef COMPLEX + Lz, +#endif + Lj, Lp, n_inner, n_row, Numeric->lnz+n_inner) ; +#endif + + DEBUG4 (("get_L done:\n")) ; +} + + +/* ========================================================================== */ +/* === get_U ================================================================ */ +/* ========================================================================== */ + +/* + The matrix U is stored in the following arrays in the Numeric object: + + Int Upos [0..npiv] + Int Uip [0..npiv], index into Numeric->Memory + Int Uilen [0..npiv] + Unit *(Numeric->Memory), pointer to memory space holding column indices + and numerical values + + where npiv is the number of pivot entries found. If A is n_row-by-n_col, + then npiv <= MIN (n_row,n_col). + + Let U_k denote the pattern of entries in row k of U (excluding the + diagonal). + + A Uchain is a sequence of columns of U whose nonzero patterns are related. + The start of a Uchain is denoted by a negative value of Uip [k]. + + To obtain U_k-1: + + (1) If row k is the start of a Uchain then Uip [k] is negative and |Uip [k]| + is an index into Numeric->Memory for the integer column indices in + U_k-1. The number of entries in the row is |U_k-1| = Uilen [k]. This + defines the pattern of the "trailing" row of this chain that ends at + row k-1. + + + (2) If row k is not the start of a Uchain, then U_k-1 is a subset of U_k. + The indices in U_k are arranged so that last Uilen [k] entries of + U_k are those indices not in U_k-1. Next, the pivot column index k is + added if it appears in row U_k-1 (it never appears in U_k). Upos [k] + holds the position of pivot column index k in the pattern U_k-1 (if it + is present), so that the set union (U_k-1)+{k} can be computed quickly, + when computing the pattern of U_k-1 from U_k. + + Note that this means we must have the pattern U_k to compute L_k-1. + + In both cases (1) and (2), we obtain the pattern U_k. + + The numerical values are stored in Numeric->Memory. If k is the start of a + Uchain, then the offset is |Uip [k]| plus the size of the space needed to + store the pattern U_k-1. Otherwise, Uip [k] is the offset itself of the + numerical values, since in this case no pattern is stored. + The numerical values are stored in the same order as the entries in U_k, + after U_k is obtained from cases (1) or (2), above. + + The advantage of using this "packed" data structure is that it can + dramatically reduce the amount of storage needed for the pattern of U. + The disadvantage is that it can be difficult for the user to access, + and it does not match the sparse matrix data structure used in MATLAB. + Thus, this routine is provided to create a conventional sparse matrix + data structure for U, in sparse-column form. + +*/ +/* ========================================================================== */ + +PRIVATE void get_U +( + Int Up [ ], /* of size n_col+1 */ + Int Ui [ ], /* of size unz, where unz = Up [n_col] */ + double Ux [ ], /* of size unz */ +#ifdef COMPLEX + double Uz [ ], /* of size unz */ +#endif + NumericType *Numeric, + Int Pattern [ ], /* workspace of size n_col */ + Int Wi [ ] /* workspace of size n_col */ +) +{ + /* ---------------------------------------------------------------------- */ + /* local variables */ + /* ---------------------------------------------------------------------- */ + + Entry value ; + Entry *xp, *D, *Uval ; + Int deg, j, *ip, col, *Upos, *Uilen, *Uip, n_col, ulen, *Usi, + unz2, p, k, up, newUchain, pos, npiv, n1 ; +#ifdef COMPLEX + Int split = SPLIT (Uz) ; +#endif +#ifndef NDEBUG + Int nnzpiv = 0 ; +#endif + + /* ---------------------------------------------------------------------- */ + /* get parameters */ + /* ---------------------------------------------------------------------- */ + + DEBUG4 (("get_U start:\n")) ; + n_col = Numeric->n_col ; + n1 = Numeric->n1 ; + npiv = Numeric->npiv ; + Upos = Numeric->Upos ; + Uilen = Numeric->Uilen ; + Uip = Numeric->Uip ; + D = Numeric->D ; + + /* ---------------------------------------------------------------------- */ + /* count the nonzeros in each column of U */ + /* ---------------------------------------------------------------------- */ + + for (col = 0 ; col < npiv ; col++) + { + /* include the diagonal entry in the column counts */ + DEBUG4 (("D ["ID"] = ", col)) ; + EDEBUG4 (D [col]) ; + Wi [col] = IS_NONZERO (D [col]) ; + DEBUG4 ((" is nonzero: "ID"\n", Wi [col])) ; +#ifndef NDEBUG + nnzpiv += IS_NONZERO (D [col]) ; +#endif + } + DEBUG4 (("nnzpiv "ID" "ID"\n", nnzpiv, Numeric->nnzpiv)) ; + ASSERT (nnzpiv == Numeric->nnzpiv) ; + for (col = npiv ; col < n_col ; col++) + { + /* diagonal entries are zero for structurally singular part */ + Wi [col] = 0 ; + } + + deg = Numeric->ulen ; + if (deg > 0) + { + /* make last pivot row of U (singular matrices only) */ + DEBUG0 (("Last pivot row of U: ulen "ID"\n", deg)) ; + for (j = 0 ; j < deg ; j++) + { + Pattern [j] = Numeric->Upattern [j] ; + DEBUG0 ((" column "ID"\n", Pattern [j])) ; + } + } + + /* non-singletons */ + for (k = npiv-1 ; k >= n1 ; k--) + { + + /* ------------------------------------------------------------------ */ + /* use row k of U */ + /* ------------------------------------------------------------------ */ + + up = Uip [k] ; + ulen = Uilen [k] ; + newUchain = (up < 0) ; + if (newUchain) + { + up = -up ; + xp = (Entry *) (Numeric->Memory + up + UNITS (Int, ulen)) ; + } + else + { + xp = (Entry *) (Numeric->Memory + up) ; + } + + for (j = 0 ; j < deg ; j++) + { + DEBUG4 ((" k "ID" col "ID" value\n", k, Pattern [j])) ; + col = Pattern [j] ; + ASSERT (col >= 0 && col < n_col) ; + value = *xp++ ; + EDEBUG4 (value) ; + DEBUG4 (("\n")) ; + if (IS_NONZERO (value)) + { + Wi [col]++ ; + } + } + + /* ------------------------------------------------------------------ */ + /* make row k-1 of U in Pattern [0..deg-1] */ + /* ------------------------------------------------------------------ */ + + if (k == n1) break ; + + if (newUchain) + { + /* next row is a new Uchain */ + deg = ulen ; + DEBUG4 (("end of chain for row of U "ID" deg "ID"\n", k-1, deg)) ; + ip = (Int *) (Numeric->Memory + up) ; + for (j = 0 ; j < deg ; j++) + { + col = *ip++ ; + DEBUG4 ((" k "ID" col "ID"\n", k-1, col)) ; + ASSERT (k <= col) ; + Pattern [j] = col ; + } + } + else + { + deg -= ulen ; + DEBUG4 (("middle of chain for row of U "ID" deg "ID"\n", k-1, deg)); + ASSERT (deg >= 0) ; + pos = Upos [k] ; + if (pos != EMPTY) + { + /* add the pivot column */ + DEBUG4 (("k "ID" add pivot entry at position "ID"\n", k, pos)) ; + ASSERT (pos >= 0 && pos <= deg) ; + Pattern [deg++] = Pattern [pos] ; + Pattern [pos] = k ; + } + } + } + + /* singletons */ + for (k = n1 - 1 ; k >= 0 ; k--) + { + deg = Uilen [k] ; + DEBUG4 (("Singleton k "ID"\n", k)) ; + if (deg > 0) + { + up = Uip [k] ; + Usi = (Int *) (Numeric->Memory + up) ; + up += UNITS (Int, deg) ; + Uval = (Entry *) (Numeric->Memory + up) ; + for (j = 0 ; j < deg ; j++) + { + col = Usi [j] ; + value = Uval [j] ; + DEBUG4 ((" k "ID" col "ID" value", k, col)) ; + EDEBUG4 (value) ; + DEBUG4 (("\n")) ; + if (IS_NONZERO (value)) + { + Wi [col]++ ; + } + } + } + } + + /* ---------------------------------------------------------------------- */ + /* construct the final column form of U */ + /* ---------------------------------------------------------------------- */ + + /* create the column pointers */ + unz2 = 0 ; + for (col = 0 ; col < n_col ; col++) + { + Up [col] = unz2 ; + unz2 += Wi [col] ; + } + Up [n_col] = unz2 ; + DEBUG1 (("Numeric->unz "ID" npiv "ID" nnzpiv "ID" unz2 "ID"\n", + Numeric->unz, npiv, Numeric->nnzpiv, unz2)) ; + ASSERT (Numeric->unz + Numeric->nnzpiv == unz2) ; + + for (col = 0 ; col < n_col ; col++) + { + Wi [col] = Up [col+1] ; + } + + /* add all of the diagonal entries */ + for (col = 0 ; col < npiv ; col++) + { + if (IS_NONZERO (D [col])) + { + p = --(Wi [col]) ; + Ui [p] = col ; +#ifdef COMPLEX + if (split) + { + + Ux [p] = REAL_COMPONENT (D [col]) ; + Uz [p] = IMAG_COMPONENT (D [col]) ; + } + else + { + Ux [2*p ] = REAL_COMPONENT (D [col]) ; + Ux [2*p+1] = IMAG_COMPONENT (D [col]) ; + } +#else + Ux [p] = D [col] ; +#endif + } + } + + /* add all the entries from the rows of U */ + + deg = Numeric->ulen ; + if (deg > 0) + { + /* make last pivot row of U (singular matrices only) */ + for (j = 0 ; j < deg ; j++) + { + Pattern [j] = Numeric->Upattern [j] ; + } + } + + /* non-singletons */ + for (k = npiv-1 ; k >= n1 ; k--) + { + + /* ------------------------------------------------------------------ */ + /* use row k of U */ + /* ------------------------------------------------------------------ */ + + up = Uip [k] ; + ulen = Uilen [k] ; + newUchain = (up < 0) ; + if (newUchain) + { + up = -up ; + xp = (Entry *) (Numeric->Memory + up + UNITS (Int, ulen)) ; + } + else + { + xp = (Entry *) (Numeric->Memory + up) ; + } + + xp += deg ; + for (j = deg-1 ; j >= 0 ; j--) + { + DEBUG4 ((" k "ID" col "ID" value", k, Pattern [j])) ; + col = Pattern [j] ; + ASSERT (col >= 0 && col < n_col) ; + value = *(--xp) ; + EDEBUG4 (value) ; + DEBUG4 (("\n")) ; + if (IS_NONZERO (value)) + { + p = --(Wi [col]) ; + Ui [p] = k ; +#ifdef COMPLEX + if (split) + { + Ux [p] = REAL_COMPONENT (value) ; + Uz [p] = IMAG_COMPONENT (value) ; + } + else + { + Ux [2*p ] = REAL_COMPONENT (value) ; + Ux [2*p+1] = IMAG_COMPONENT (value) ; + } +#else + Ux [p] = value ; +#endif + + } + } + + /* ------------------------------------------------------------------ */ + /* make row k-1 of U in Pattern [0..deg-1] */ + /* ------------------------------------------------------------------ */ + + if (newUchain) + { + /* next row is a new Uchain */ + deg = ulen ; + DEBUG4 (("end of chain for row of U "ID" deg "ID"\n", k-1, deg)) ; + ip = (Int *) (Numeric->Memory + up) ; + for (j = 0 ; j < deg ; j++) + { + col = *ip++ ; + DEBUG4 ((" k "ID" col "ID"\n", k-1, col)) ; + ASSERT (k <= col) ; + Pattern [j] = col ; + } + } + else + { + deg -= ulen ; + DEBUG4 (("middle of chain for row of U "ID" deg "ID"\n", k-1, deg)); + ASSERT (deg >= 0) ; + pos = Upos [k] ; + if (pos != EMPTY) + { + /* add the pivot column */ + DEBUG4 (("k "ID" add pivot entry at position "ID"\n", k, pos)) ; + ASSERT (pos >= 0 && pos <= deg) ; + Pattern [deg++] = Pattern [pos] ; + Pattern [pos] = k ; + } + } + } + + /* singletons */ + for (k = n1 - 1 ; k >= 0 ; k--) + { + deg = Uilen [k] ; + DEBUG4 (("Singleton k "ID"\n", k)) ; + if (deg > 0) + { + up = Uip [k] ; + Usi = (Int *) (Numeric->Memory + up) ; + up += UNITS (Int, deg) ; + Uval = (Entry *) (Numeric->Memory + up) ; + for (j = 0 ; j < deg ; j++) + { + col = Usi [j] ; + value = Uval [j] ; + DEBUG4 ((" k "ID" col "ID" value", k, col)) ; + EDEBUG4 (value) ; + DEBUG4 (("\n")) ; + if (IS_NONZERO (value)) + { + p = --(Wi [col]) ; + Ui [p] = k ; +#ifdef COMPLEX + if (split) + { + Ux [p] = REAL_COMPONENT (value) ; + Uz [p] = IMAG_COMPONENT (value) ; + } + else + { + Ux [2*p ] = REAL_COMPONENT (value) ; + Ux [2*p+1] = IMAG_COMPONENT (value) ; + } +#else + Ux [p] = value ; +#endif + } + } + } + } + +#ifndef NDEBUG + DEBUG6 (("U matrix:")) ; + UMF_dump_col_matrix (Ux, +#ifdef COMPLEX + Uz, +#endif + Ui, Up, Numeric->n_row, n_col, Numeric->unz + Numeric->nnzpiv) ; +#endif + +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umfpack_get_symbolic.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_get_symbolic.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,191 @@ +/* ========================================================================== */ +/* === UMFPACK_get_symbolic ================================================= */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + User-callable. Gets the symbolic information held in the Symbolic object. + See umfpack_get_symbolic.h for a more detailed description. +*/ + +#include "umf_internal.h" +#include "umf_valid_symbolic.h" + +GLOBAL Int UMFPACK_get_symbolic +( + Int *p_n_row, + Int *p_n_col, + Int *p_n1, /* number of singletons */ + Int *p_nz, + Int *p_nfr, + Int *p_nchains, + Int P [ ], + Int Q [ ], + Int Front_npivcol [ ], + Int Front_parent [ ], + Int Front_1strow [ ], + Int Front_leftmostdesc [ ], + Int Chain_start [ ], + Int Chain_maxrows [ ], + Int Chain_maxcols [ ], + void *SymbolicHandle +) +{ + SymbolicType *Symbolic ; + Int k, n_row, n_col, n1, nfr, nchains, *p ; + + /* ---------------------------------------------------------------------- */ + /* check inputs */ + /* ---------------------------------------------------------------------- */ + + Symbolic = (SymbolicType *) SymbolicHandle ; + if (!UMF_valid_symbolic (Symbolic)) + { + return (UMFPACK_ERROR_invalid_Symbolic_object) ; + } + + /* ---------------------------------------------------------------------- */ + /* get contents of Symbolic */ + /* ---------------------------------------------------------------------- */ + + n_row = Symbolic->n_row ; + n_col = Symbolic->n_col ; + n1 = Symbolic->n1 ; + nfr = Symbolic->nfr ; + nchains = Symbolic->nchains ; + + if (p_n_row) + { + *p_n_row = n_row ; + } + + if (p_n_col) + { + *p_n_col = n_col ; + } + + if (p_n1) + { + *p_n1 = n1 ; + } + + if (p_nz) + { + *p_nz = Symbolic->nz ; + } + + if (p_nfr) + { + *p_nfr = nfr ; + } + + if (p_nchains) + { + *p_nchains = nchains ; + } + + if (P != (Int *) NULL) + { + Int *Rperm_init, *Diagonal_map ; + Rperm_init = Symbolic->Rperm_init ; + Diagonal_map = Symbolic->Diagonal_map ; + if (Diagonal_map != (Int *) NULL) + { + ASSERT (n_row == n_col) ; + /* next pivot rows are found in the diagonal map */ + for (k = 0 ; k < n_row ; k++) + { + P [k] = Rperm_init [Diagonal_map [k]] ; + } + } + else + { + /* there is no diagonal map. */ + for (k = 0 ; k < n_row ; k++) + { + P [k] = Rperm_init [k] ; + } + } + } + + if (Q != (Int *) NULL) + { + p = Symbolic->Cperm_init ; + for (k = 0 ; k < n_col ; k++) + { + Q [k] = p [k] ; + } + } + + if (Front_npivcol != (Int *) NULL) + { + p = Symbolic->Front_npivcol ; + for (k = 0 ; k <= nfr ; k++) + { + Front_npivcol [k] = p [k] ; + } + } + + if (Front_parent != (Int *) NULL) + { + p = Symbolic->Front_parent ; + for (k = 0 ; k <= nfr ; k++) + { + Front_parent [k] = p [k] ; + } + } + + if (Front_1strow != (Int *) NULL) + { + p = Symbolic->Front_1strow ; + for (k = 0 ; k <= nfr ; k++) + { + Front_1strow [k] = p [k] ; + } + } + + if (Front_leftmostdesc != (Int *) NULL) + { + p = Symbolic->Front_leftmostdesc ; + for (k = 0 ; k <= nfr ; k++) + { + Front_leftmostdesc [k] = p [k] ; + } + } + + if (Chain_start != (Int *) NULL) + { + p = Symbolic->Chain_start ; + for (k = 0 ; k <= nchains ; k++) + { + Chain_start [k] = p [k] ; + } + } + + if (Chain_maxrows != (Int *) NULL) + { + p = Symbolic->Chain_maxrows ; + for (k = 0 ; k < nchains ; k++) + { + Chain_maxrows [k] = p [k] ; + } + Chain_maxrows [nchains] = 0 ; + } + + if (Chain_maxcols != (Int *) NULL) + { + p = Symbolic->Chain_maxcols ; + for (k = 0 ; k < nchains ; k++) + { + Chain_maxcols [k] = p [k] ; + } + Chain_maxcols [nchains] = 0 ; + } + + return (UMFPACK_OK) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umfpack_load_numeric.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_load_numeric.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,161 @@ +/* ========================================================================== */ +/* === UMFPACK_load_numeric ================================================= */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + User-callable. Loads a Numeric object from a file created by + umfpack_*_save_numeric. +*/ + +#include "umf_internal.h" +#include "umf_valid_numeric.h" +#include "umf_malloc.h" +#include "umf_free.h" + +#define READ(object,type,n) \ +{ \ + object = (type *) UMF_malloc (n, sizeof (type)) ; \ + if (object == (type *) NULL) \ + { \ + UMFPACK_free_numeric ((void **) &Numeric) ; \ + fclose (f) ; \ + return (UMFPACK_ERROR_out_of_memory) ; \ + } \ + if (fread (object, sizeof (type), n, f) != n) \ + { \ + UMFPACK_free_numeric ((void **) &Numeric) ; \ + fclose (f) ; \ + return (UMFPACK_ERROR_file_IO) ; \ + } \ + if (ferror (f)) \ + { \ + UMFPACK_free_numeric ((void **) &Numeric) ; \ + fclose (f) ; \ + return (UMFPACK_ERROR_file_IO) ; \ + } \ +} + +/* ========================================================================== */ +/* === UMFPACK_load_numeric ================================================= */ +/* ========================================================================== */ + +GLOBAL Int UMFPACK_load_numeric +( + void **NumericHandle, + char *user_filename +) +{ + NumericType *Numeric ; + char *filename ; + FILE *f ; + + *NumericHandle = (void *) NULL ; + + /* ---------------------------------------------------------------------- */ + /* get the filename, or use the default name if filename is NULL */ + /* ---------------------------------------------------------------------- */ + + if (user_filename == (char *) NULL) + { + filename = "numeric.umf" ; + } + else + { + filename = user_filename ; + } + f = fopen (filename, "rb") ; + if (!f) + { + return (UMFPACK_ERROR_file_IO) ; + } + + /* ---------------------------------------------------------------------- */ + /* read the Numeric header from the file, in binary */ + /* ---------------------------------------------------------------------- */ + + Numeric = (NumericType *) UMF_malloc (1, sizeof (NumericType)) ; + if (Numeric == (NumericType *) NULL) + { + fclose (f) ; + return (UMFPACK_ERROR_out_of_memory) ; + } + if (fread (Numeric, sizeof (NumericType), 1, f) != 1) + { + (void) UMF_free ((void *) Numeric) ; + fclose (f) ; + return (UMFPACK_ERROR_file_IO) ; + } + if (ferror (f)) + { + (void) UMF_free ((void *) Numeric) ; + fclose (f) ; + return (UMFPACK_ERROR_file_IO) ; + } + + if (Numeric->valid != NUMERIC_VALID || Numeric->n_row <= 0 || + Numeric->n_col <= 0 || Numeric->npiv < 0 || Numeric->ulen < 0 || + Numeric->size <= 0) + { + /* Numeric does not point to a NumericType object */ + (void) UMF_free ((void *) Numeric) ; + fclose (f) ; + return (UMFPACK_ERROR_invalid_Numeric_object) ; + } + + Numeric->D = (Entry *) NULL ; + Numeric->Rperm = (Int *) NULL ; + Numeric->Cperm = (Int *) NULL ; + Numeric->Lpos = (Int *) NULL ; + Numeric->Lilen = (Int *) NULL ; + Numeric->Lip = (Int *) NULL ; + Numeric->Upos = (Int *) NULL ; + Numeric->Uilen = (Int *) NULL ; + Numeric->Uip = (Int *) NULL ; + Numeric->Rs = (double *) NULL ; + Numeric->Memory = (Unit *) NULL ; + Numeric->Upattern = (Int *) NULL ; + + /* umfpack_free_numeric can now be safely called if an error occurs */ + + /* ---------------------------------------------------------------------- */ + /* read the rest of the Numeric object */ + /* ---------------------------------------------------------------------- */ + + READ (Numeric->D, Entry, MIN (Numeric->n_row, Numeric->n_col)+1) ; + READ (Numeric->Rperm, Int, Numeric->n_row+1) ; + READ (Numeric->Cperm, Int, Numeric->n_col+1) ; + READ (Numeric->Lpos, Int, Numeric->npiv+1) ; + READ (Numeric->Lilen, Int, Numeric->npiv+1) ; + READ (Numeric->Lip, Int, Numeric->npiv+1) ; + READ (Numeric->Upos, Int, Numeric->npiv+1) ; + READ (Numeric->Uilen, Int, Numeric->npiv+1) ; + READ (Numeric->Uip, Int, Numeric->npiv+1) ; + if (Numeric->scale != UMFPACK_SCALE_NONE) + { + READ (Numeric->Rs, double, Numeric->n_row) ; + } + if (Numeric->ulen > 0) + { + READ (Numeric->Upattern, Int, Numeric->ulen+1) ; + } + READ (Numeric->Memory, Unit, Numeric->size) ; + + /* close the file */ + fclose (f) ; + + /* make sure the Numeric object is valid */ + if (!UMF_valid_numeric (Numeric)) + { + UMFPACK_free_numeric ((void **) &Numeric) ; + return (UMFPACK_ERROR_invalid_Numeric_object) ; + } + + *NumericHandle = (void *) Numeric ; + return (UMFPACK_OK) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umfpack_load_symbolic.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_load_symbolic.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,165 @@ +/* ========================================================================== */ +/* === UMFPACK_load_symbolic ================================================ */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + User-callable. Loads a Symbolic object from a file created by + umfpack_*_save_symbolic. +*/ + +#include "umf_internal.h" +#include "umf_valid_symbolic.h" +#include "umf_malloc.h" +#include "umf_free.h" + +#define READ(object,type,n) \ +{ \ + object = (type *) UMF_malloc (n, sizeof (type)) ; \ + if (object == (type *) NULL) \ + { \ + UMFPACK_free_symbolic ((void **) &Symbolic) ; \ + fclose (f) ; \ + return (UMFPACK_ERROR_out_of_memory) ; \ + } \ + if (fread (object, sizeof (type), n, f) != n) \ + { \ + UMFPACK_free_symbolic ((void **) &Symbolic) ; \ + fclose (f) ; \ + return (UMFPACK_ERROR_file_IO) ; \ + } \ + if (ferror (f)) \ + { \ + UMFPACK_free_symbolic ((void **) &Symbolic) ; \ + fclose (f) ; \ + return (UMFPACK_ERROR_file_IO) ; \ + } \ +} + +/* ========================================================================== */ +/* === UMFPACK_load_symbolic ================================================ */ +/* ========================================================================== */ + +GLOBAL Int UMFPACK_load_symbolic +( + void **SymbolicHandle, + char *user_filename +) +{ + SymbolicType *Symbolic ; + char *filename ; + FILE *f ; + + *SymbolicHandle = (void *) NULL ; + + /* ---------------------------------------------------------------------- */ + /* get the filename, or use the default name if filename is NULL */ + /* ---------------------------------------------------------------------- */ + + if (user_filename == (char *) NULL) + { + filename = "symbolic.umf" ; + } + else + { + filename = user_filename ; + } + f = fopen (filename, "rb") ; + if (!f) + { + return (UMFPACK_ERROR_file_IO) ; + } + + /* ---------------------------------------------------------------------- */ + /* read the Symbolic header from the file, in binary */ + /* ---------------------------------------------------------------------- */ + + Symbolic = (SymbolicType *) UMF_malloc (1, sizeof (SymbolicType)) ; + if (Symbolic == (SymbolicType *) NULL) + { + fclose (f) ; + return (UMFPACK_ERROR_out_of_memory) ; + } + if (fread (Symbolic, sizeof (SymbolicType), 1, f) != 1) + { + (void) UMF_free ((void *) Symbolic) ; + fclose (f) ; + return (UMFPACK_ERROR_file_IO) ; + } + if (ferror (f)) + { + (void) UMF_free ((void *) Symbolic) ; + fclose (f) ; + return (UMFPACK_ERROR_file_IO) ; + } + + if (Symbolic->valid != SYMBOLIC_VALID || Symbolic->n_row <= 0 || + Symbolic->n_col <= 0 || Symbolic->nfr < 0 || Symbolic->nchains < 0 || + Symbolic->esize < 0) + { + /* Symbolic does not point to a Symbolic object */ + (void) UMF_free ((void *) Symbolic) ; + fclose (f) ; + return (UMFPACK_ERROR_invalid_Symbolic_object) ; + } + + Symbolic->Cperm_init = (Int *) NULL ; + Symbolic->Rperm_init = (Int *) NULL ; + Symbolic->Front_npivcol = (Int *) NULL ; + Symbolic->Front_parent = (Int *) NULL ; + Symbolic->Front_1strow = (Int *) NULL ; + Symbolic->Front_leftmostdesc = (Int *) NULL ; + Symbolic->Chain_start = (Int *) NULL ; + Symbolic->Chain_maxrows = (Int *) NULL ; + Symbolic->Chain_maxcols = (Int *) NULL ; + Symbolic->Cdeg = (Int *) NULL ; + Symbolic->Rdeg = (Int *) NULL ; + Symbolic->Esize = (Int *) NULL ; + Symbolic->Diagonal_map = (Int *) NULL ; + + /* umfpack_free_symbolic can now be safely called if an error occurs */ + + /* ---------------------------------------------------------------------- */ + /* read the rest of the Symbolic object */ + /* ---------------------------------------------------------------------- */ + + READ (Symbolic->Cperm_init, Int, Symbolic->n_col+1) ; + READ (Symbolic->Rperm_init, Int, Symbolic->n_row+1) ; + READ (Symbolic->Front_npivcol, Int, Symbolic->nfr+1) ; + READ (Symbolic->Front_parent, Int, Symbolic->nfr+1) ; + READ (Symbolic->Front_1strow, Int, Symbolic->nfr+1) ; + READ (Symbolic->Front_leftmostdesc, Int, Symbolic->nfr+1) ; + READ (Symbolic->Chain_start, Int, Symbolic->nchains+1) ; + READ (Symbolic->Chain_maxrows, Int, Symbolic->nchains+1) ; + READ (Symbolic->Chain_maxcols, Int, Symbolic->nchains+1) ; + READ (Symbolic->Cdeg, Int, Symbolic->n_col+1) ; + READ (Symbolic->Rdeg, Int, Symbolic->n_row+1) ; + if (Symbolic->esize > 0) + { + /* only when dense rows are present */ + READ (Symbolic->Esize, Int, Symbolic->esize) ; + } + if (Symbolic->prefer_diagonal) + { + /* only when diagonal pivoting is prefered */ + READ (Symbolic->Diagonal_map, Int, Symbolic->n_col+1) ; + } + + /* close the file */ + fclose (f) ; + + /* make sure the Symbolic object is valid */ + if (!UMF_valid_symbolic (Symbolic)) + { + UMFPACK_free_symbolic ((void **) &Symbolic) ; + return (UMFPACK_ERROR_invalid_Symbolic_object) ; + } + + *SymbolicHandle = (void *) Symbolic ; + return (UMFPACK_OK) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umfpack_numeric.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_numeric.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,792 @@ +/* ========================================================================== */ +/* === UMFPACK_numeric ====================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + User-callable. Factorizes A into its LU factors, given a symbolic + pre-analysis computed by UMFPACK_symbolic. See umfpack_numeric.h for a + description. + + Dynamic memory allocation: substantial. See comments (1) through (7), + below. If an error occurs, all allocated space is free'd by UMF_free. + If successful, the Numeric object contains 11 to 13 objects allocated by + UMF_malloc that hold the LU factors of the input matrix. +*/ + +#include "umf_internal.h" +#include "umf_valid_symbolic.h" +#include "umf_set_stats.h" +#include "umf_kernel.h" +#include "umf_malloc.h" +#include "umf_free.h" +#include "umf_realloc.h" + +#ifndef NDEBUG +PRIVATE Int init_count ; +#endif + +PRIVATE Int work_alloc +( + WorkType *Work, + SymbolicType *Symbolic +) ; + +PRIVATE void free_work +( + WorkType *Work +) ; + +PRIVATE Int numeric_alloc +( + NumericType **NumericHandle, + SymbolicType *Symbolic, + double alloc_init, + Int scale +) ; + +PRIVATE void error +( + NumericType **Numeric, + WorkType *Work +) ; + + +/* ========================================================================== */ +/* === UMFPACK_numeric ====================================================== */ +/* ========================================================================== */ + +GLOBAL Int UMFPACK_numeric +( + const Int Ap [ ], + const Int Ai [ ], + const double Ax [ ], +#ifdef COMPLEX + const double Az [ ], +#endif + void *SymbolicHandle, + void **NumericHandle, + const double Control [UMFPACK_CONTROL], + double User_Info [UMFPACK_INFO] +) +{ + + /* ---------------------------------------------------------------------- */ + /* local variables */ + /* ---------------------------------------------------------------------- */ + + double Info2 [UMFPACK_INFO], alloc_init, relpt, relpt2, droptol, + front_alloc_init, stats [2] ; + double *Info ; + WorkType WorkSpace, *Work ; + NumericType *Numeric ; + SymbolicType *Symbolic ; + Int n_row, n_col, n_inner, newsize, i, status, *inew, npiv, ulen, scale ; + Unit *mnew ; + + /* ---------------------------------------------------------------------- */ + /* get the amount of time used by the process so far */ + /* ---------------------------------------------------------------------- */ + + umfpack_tic (stats) ; + + /* ---------------------------------------------------------------------- */ + /* initialize and check inputs */ + /* ---------------------------------------------------------------------- */ + +#ifndef NDEBUG + UMF_dump_start ( ) ; + init_count = UMF_malloc_count ; + DEBUGm4 (("\nUMFPACK numeric: U transpose version\n")) ; +#endif + + /* If front_alloc_init negative then allocate that size of front in + * UMF_start_front. If alloc_init negative, then allocate that initial + * size of Numeric->Memory. */ + + relpt = GET_CONTROL (UMFPACK_PIVOT_TOLERANCE, + UMFPACK_DEFAULT_PIVOT_TOLERANCE) ; + relpt2 = GET_CONTROL (UMFPACK_SYM_PIVOT_TOLERANCE, + UMFPACK_DEFAULT_SYM_PIVOT_TOLERANCE) ; + alloc_init = GET_CONTROL (UMFPACK_ALLOC_INIT, UMFPACK_DEFAULT_ALLOC_INIT) ; + front_alloc_init = GET_CONTROL (UMFPACK_FRONT_ALLOC_INIT, + UMFPACK_DEFAULT_FRONT_ALLOC_INIT) ; + scale = GET_CONTROL (UMFPACK_SCALE, UMFPACK_DEFAULT_SCALE) ; + droptol = GET_CONTROL (UMFPACK_DROPTOL, UMFPACK_DEFAULT_DROPTOL) ; + + relpt = MAX (0.0, MIN (relpt, 1.0)) ; + relpt2 = MAX (0.0, MIN (relpt2, 1.0)) ; + droptol = MAX (0.0, droptol) ; + front_alloc_init = MIN (1.0, front_alloc_init) ; + + if (scale != UMFPACK_SCALE_NONE && scale != UMFPACK_SCALE_MAX) + { + scale = UMFPACK_DEFAULT_SCALE ; + } + + if (User_Info != (double *) NULL) + { + /* return Info in user's array */ + Info = User_Info ; + /* clear the parts of Info that are set by UMFPACK_numeric */ + for (i = UMFPACK_NUMERIC_SIZE ; i <= UMFPACK_MAX_FRONT_NCOLS ; i++) + { + Info [i] = EMPTY ; + } + for (i = UMFPACK_NUMERIC_DEFRAG ; i < UMFPACK_IR_TAKEN ; i++) + { + Info [i] = EMPTY ; + } + } + else + { + /* no Info array passed - use local one instead */ + Info = Info2 ; + for (i = 0 ; i < UMFPACK_INFO ; i++) + { + Info [i] = EMPTY ; + } + } + + Symbolic = (SymbolicType *) SymbolicHandle ; + Numeric = (NumericType *) NULL ; + if (!UMF_valid_symbolic (Symbolic)) + { + Info [UMFPACK_STATUS] = UMFPACK_ERROR_invalid_Symbolic_object ; + return (UMFPACK_ERROR_invalid_Symbolic_object) ; + } + + /* compute alloc_init automatically for AMD ordering */ + if (Symbolic->ordering == UMFPACK_ORDERING_AMD && alloc_init >= 0) + { + alloc_init = (Symbolic->nz + Symbolic->amd_lunz) / Symbolic->lunz_bound; + alloc_init = MIN (1.0, alloc_init) ; + alloc_init *= UMF_REALLOC_INCREASE ; + } + + n_row = Symbolic->n_row ; + n_col = Symbolic->n_col ; + n_inner = MIN (n_row, n_col) ; + + /* check for integer overflow in Numeric->Memory minimum size */ + if (INT_OVERFLOW (Symbolic->dnum_mem_init_usage * sizeof (Unit))) + { + /* :: int overflow, initial Numeric->Memory size :: */ + /* There's no hope to allocate a Numeric object big enough simply to + * hold the initial matrix, so return an out-of-memory condition */ + DEBUGm4 (("out of memory: numeric int overflow\n")) ; + Info [UMFPACK_STATUS] = UMFPACK_ERROR_out_of_memory ; + return (UMFPACK_ERROR_out_of_memory) ; + } + + Info [UMFPACK_STATUS] = UMFPACK_OK ; + Info [UMFPACK_NROW] = n_row ; + Info [UMFPACK_NCOL] = n_col ; + Info [UMFPACK_SIZE_OF_UNIT] = (double) (sizeof (Unit)) ; + + if (!Ap || !Ai || !Ax || !NumericHandle) + { + Info [UMFPACK_STATUS] = UMFPACK_ERROR_argument_missing ; + return (UMFPACK_ERROR_argument_missing) ; + } + + Info [UMFPACK_NZ] = Ap [n_col] ; + *NumericHandle = (void *) NULL ; + + /* ---------------------------------------------------------------------- */ + /* allocate the Work object */ + /* ---------------------------------------------------------------------- */ + + /* (1) calls UMF_malloc 15 or 17 times, to obtain temporary workspace of + * size c+1 Entry's and 2*(n_row+1) + 3*(n_col+1) + (n_col+n_inner+1) + + * (nn+1) + * 3*(c+1) + 2*(r+1) + max(r,c) + (nfr+1) integers plus 2*nn + * more integers if diagonal pivoting is to be done. r is the maximum + * number of rows in any frontal matrix, c is the maximum number of columns + * in any frontal matrix, n_inner is min (n_row,n_col), nn is + * max (n_row,n_col), and nfr is the number of frontal matrices. For a + * square matrix, this is c+1 Entry's and about 8n + 3c + 2r + max(r,c) + + * nfr integers, plus 2n more for diagonal pivoting. + */ + + Work = &WorkSpace ; + Work->n_row = n_row ; + Work->n_col = n_col ; + Work->nfr = Symbolic->nfr ; + Work->nb = Symbolic->nb ; + Work->n1 = Symbolic->n1 ; + + if (!work_alloc (Work, Symbolic)) + { + DEBUGm4 (("out of memory: numeric work\n")) ; + Info [UMFPACK_STATUS] = UMFPACK_ERROR_out_of_memory ; + error (&Numeric, Work) ; + return (UMFPACK_ERROR_out_of_memory) ; + } + ASSERT (UMF_malloc_count == init_count + 16 + 2*Symbolic->prefer_diagonal) ; + + /* ---------------------------------------------------------------------- */ + /* allocate Numeric object */ + /* ---------------------------------------------------------------------- */ + + /* (2) calls UMF_malloc 10 or 11 times, for a total space of + * sizeof (NumericType) bytes, 4*(n_row+1) + 4*(n_row+1) integers, and + * (n_inner+1) Entry's, plus n_row Entry's if row scaling is to be done. + * sizeof (NumericType) is a small constant. Next, it calls UMF_malloc + * once, for the variable-sized part of the Numeric object + * (Numeric->Memory). The size of this object is the larger of + * (Control [UMFPACK_ALLOC_INIT]) * (the approximate upper bound computed + * by UMFPACK_symbolic), and the minimum required to start the numerical + * factorization. * This request is reduced if it fails. + */ + + if (!numeric_alloc (&Numeric, Symbolic, alloc_init, scale)) + { + DEBUGm4 (("out of memory: initial numeric\n")) ; + Info [UMFPACK_STATUS] = UMFPACK_ERROR_out_of_memory ; + error (&Numeric, Work) ; + return (UMFPACK_ERROR_out_of_memory) ; + } + DEBUG0 (("malloc: init_count "ID" UMF_malloc_count "ID"\n", + init_count, UMF_malloc_count)) ; + ASSERT (UMF_malloc_count == init_count + + (16 + 2*Symbolic->prefer_diagonal) + + (11 + (scale != UMFPACK_SCALE_NONE))) ; + + /* set control parameters */ + Numeric->relpt = relpt ; + Numeric->relpt2 = relpt2 ; + Numeric->droptol = droptol ; + Numeric->alloc_init = alloc_init ; + Numeric->front_alloc_init = front_alloc_init ; + Numeric->scale = scale ; + + DEBUG0 (("umf relpt %g %g init %g %g inc %g red %g\n", + relpt, relpt2, alloc_init, front_alloc_init, + UMF_REALLOC_INCREASE, UMF_REALLOC_REDUCTION)) ; + + /* ---------------------------------------------------------------------- */ + /* scale and factorize */ + /* ---------------------------------------------------------------------- */ + + /* (3) During numerical factorization (inside UMF_kernel), the variable-size + * block of memory is increased in size via a call to UMF_realloc if it is + * found to be too small. During factorization, this block holds the + * pattern and values of L and U at the top end, and the elements + * (contibution blocks) and the current frontal matrix (Work->F*) at the + * bottom end. The peak size of the variable-sized object is estimated in + * UMFPACK_*symbolic (Info [UMFPACK_VARIABLE_PEAK_ESTIMATE]), although this + * upper bound can be very loose. The size of the Symbolic object + * (which is currently allocated) is in Info [UMFPACK_SYMBOLIC_SIZE], and + * is between 2*n and 13*n integers. + */ + + DEBUG0 (("Calling umf_kernel\n")) ; + status = UMF_kernel (Ap, Ai, Ax, +#ifdef COMPLEX + Az, +#endif + Numeric, Work, Symbolic) ; + + Info [UMFPACK_STATUS] = status ; + if (status < UMFPACK_OK) + { + /* out of memory, or pattern has changed */ + error (&Numeric, Work) ; + return (status) ; + } + + Info [UMFPACK_FORCED_UPDATES] = Work->nforced ; + Info [UMFPACK_VARIABLE_INIT] = Numeric->init_usage ; + if (Symbolic->prefer_diagonal) + { + Info [UMFPACK_NOFF_DIAG] = Work->noff_diagonal ; + } + + DEBUG0 (("malloc: init_count "ID" UMF_malloc_count "ID"\n", + init_count, UMF_malloc_count)) ; + + npiv = Numeric->npiv ; /* = n_inner for nonsingular matrices */ + ulen = Numeric->ulen ; /* = 0 for square nonsingular matrices */ + + /* ---------------------------------------------------------------------- */ + /* free Work object */ + /* ---------------------------------------------------------------------- */ + + /* (4) After numerical factorization all of the objects allocated in step + * (1) are freed via UMF_free, except that one object of size n_col+1 is + * kept if there are off-diagonal nonzeros in the last pivot row (can only + * occur for singular or rectangular matrices). This is Work->Upattern, + * which is transfered to Numeric->Upattern if ulen > 0. + */ + + DEBUG0 (("malloc: init_count "ID" UMF_malloc_count "ID"\n", + init_count, UMF_malloc_count)) ; + + free_work (Work) ; + + DEBUG0 (("malloc: init_count "ID" UMF_malloc_count "ID"\n", + init_count, UMF_malloc_count)) ; + DEBUG0 (("Numeric->ulen: "ID" scale: "ID"\n", ulen, scale)) ; + ASSERT (UMF_malloc_count == init_count + (ulen > 0) + + (11 + (scale != UMFPACK_SCALE_NONE))) ; + + /* ---------------------------------------------------------------------- */ + /* reduce Lpos, Lilen, Lip, Upos, Uilen and Uip to size npiv+1 */ + /* ---------------------------------------------------------------------- */ + + /* (5) Six components of the Numeric object are reduced in size if the + * matrix is singular or rectangular. The original size is 3*(n_row+1) + + * 3*(n_col+1) integers. The new size is 6*(npiv+1) integers. For + * square non-singular matrices, these two sizes are the same. + */ + + if (npiv < n_row) + { + /* reduce Lpos, Uilen, and Uip from size n_row+1 to size npiv */ + inew = (Int *) UMF_realloc (Numeric->Lpos, npiv+1, sizeof (Int)) ; + if (inew) + { + Numeric->Lpos = inew ; + } + inew = (Int *) UMF_realloc (Numeric->Uilen, npiv+1, sizeof (Int)) ; + if (inew) + { + Numeric->Uilen = inew ; + } + inew = (Int *) UMF_realloc (Numeric->Uip, npiv+1, sizeof (Int)) ; + if (inew) + { + Numeric->Uip = inew ; + } + } + + if (npiv < n_col) + { + /* reduce Upos, Lilen, and Lip from size n_col+1 to size npiv */ + inew = (Int *) UMF_realloc (Numeric->Upos, npiv+1, sizeof (Int)) ; + if (inew) + { + Numeric->Upos = inew ; + } + inew = (Int *) UMF_realloc (Numeric->Lilen, npiv+1, sizeof (Int)) ; + if (inew) + { + Numeric->Lilen = inew ; + } + inew = (Int *) UMF_realloc (Numeric->Lip, npiv+1, sizeof (Int)) ; + if (inew) + { + Numeric->Lip = inew ; + } + } + + /* ---------------------------------------------------------------------- */ + /* reduce Numeric->Upattern from size n_col+1 to size ulen+1 */ + /* ---------------------------------------------------------------------- */ + + /* (6) The size of Numeric->Upattern (formerly Work->Upattern) is reduced + * from size n_col+1 to size ulen + 1. If ulen is zero, the object does + * not exist. */ + + DEBUG4 (("ulen: "ID" Upattern "ID"\n", ulen, (Int) Numeric->Upattern)) ; + ASSERT (IMPLIES (ulen == 0, Numeric->Upattern == (Int *) NULL)) ; + if (ulen > 0 && ulen < n_col) + { + inew = (Int *) UMF_realloc (Numeric->Upattern, ulen+1, sizeof (Int)) ; + if (inew) + { + Numeric->Upattern = inew ; + } + } + + /* ---------------------------------------------------------------------- */ + /* reduce Numeric->Memory to hold just the LU factors at the head */ + /* ---------------------------------------------------------------------- */ + + /* (7) The variable-sized block (Numeric->Memory) is reduced to hold just L + * and U, via a call to UMF_realloc, since the frontal matrices are no + * longer needed. + */ + + newsize = Numeric->ihead ; + if (newsize < Numeric->size) + { + mnew = (Unit *) UMF_realloc (Numeric->Memory, newsize, sizeof (Unit)) ; + if (mnew) + { + /* realloc succeeded (how can it fail since the size is reduced?) */ + Numeric->Memory = mnew ; + Numeric->size = newsize ; + } + } + Numeric->ihead = Numeric->size ; + Numeric->itail = Numeric->ihead ; + Numeric->tail_usage = 0 ; + Numeric->ibig = EMPTY ; + /* UMF_mem_alloc_tail_block can no longer be called (no tail marker) */ + + /* ---------------------------------------------------------------------- */ + /* report the results and return the Numeric object */ + /* ---------------------------------------------------------------------- */ + + UMF_set_stats ( + Info, + Symbolic, + (double) Numeric->max_usage, /* actual peak Numeric->Memory */ + (double) Numeric->size, /* actual final Numeric->Memory */ + Numeric->flops, /* actual "true flops" */ + (double) Numeric->lnz + n_inner, /* actual nz in L */ + (double) Numeric->unz + Numeric->nnzpiv, /* actual nz in U */ + (double) Numeric->maxfrsize, /* actual largest front size */ + (double) ulen, /* actual Numeric->Upattern size */ + (double) npiv, /* actual # pivots found */ + (double) Numeric->maxnrows, /* actual largest #rows in front */ + (double) Numeric->maxncols, /* actual largest #cols in front */ + scale != UMFPACK_SCALE_NONE, + Symbolic->prefer_diagonal, + ACTUAL) ; + + Info [UMFPACK_ALLOC_INIT_USED] = Numeric->alloc_init ; + Info [UMFPACK_NUMERIC_DEFRAG] = Numeric->ngarbage ; + Info [UMFPACK_NUMERIC_REALLOC] = Numeric->nrealloc ; + Info [UMFPACK_NUMERIC_COSTLY_REALLOC] = Numeric->ncostly ; + Info [UMFPACK_COMPRESSED_PATTERN] = Numeric->isize ; + Info [UMFPACK_LU_ENTRIES] = Numeric->nLentries + Numeric->nUentries + + Numeric->npiv ; + Info [UMFPACK_UDIAG_NZ] = Numeric->nnzpiv ; + Info [UMFPACK_RSMIN] = Numeric->rsmin ; + Info [UMFPACK_RSMAX] = Numeric->rsmax ; + Info [UMFPACK_WAS_SCALED] = Numeric->scale ; + + /* nz in L and U with no dropping of small entries */ + Info [UMFPACK_ALL_LNZ] = Numeric->all_lnz + n_inner ; + Info [UMFPACK_ALL_UNZ] = Numeric->all_unz + Numeric->nnzpiv ; + Info [UMFPACK_NZDROPPED] = + (Numeric->all_lnz - Numeric->lnz) + + (Numeric->all_unz - Numeric->unz) ; + + /* estimate of the reciprocal of the condition number. */ + if (SCALAR_IS_ZERO (Numeric->min_udiag) + || SCALAR_IS_ZERO (Numeric->max_udiag) + || SCALAR_IS_NAN (Numeric->min_udiag) + || SCALAR_IS_NAN (Numeric->max_udiag)) + { + /* rcond is zero if there is any zero or NaN on the diagonal */ + Numeric->rcond = 0.0 ; + } + else + { + /* estimate of the recipricol of the condition number. */ + /* This is NaN if diagonal is zero-free, but has one or more NaN's. */ + Numeric->rcond = Numeric->min_udiag / Numeric->max_udiag ; + } + Info [UMFPACK_UMIN] = Numeric->min_udiag ; + Info [UMFPACK_UMAX] = Numeric->max_udiag ; + Info [UMFPACK_RCOND] = Numeric->rcond ; + + if (Numeric->nnzpiv < n_inner + || SCALAR_IS_ZERO (Numeric->rcond) || SCALAR_IS_NAN (Numeric->rcond)) + { + /* there are zeros and/or NaN's on the diagonal of U */ + DEBUG0 (("Warning, matrix is singular in umfpack_numeric\n")) ; + DEBUG0 (("nnzpiv "ID" n_inner "ID" rcond %g\n", Numeric->nnzpiv, + n_inner, Numeric->rcond)) ; + status = UMFPACK_WARNING_singular_matrix ; + Info [UMFPACK_STATUS] = status ; + } + + Numeric->valid = NUMERIC_VALID ; + *NumericHandle = (void *) Numeric ; + + /* Numeric has 11 to 13 objects */ + ASSERT (UMF_malloc_count == init_count + 11 + + + (ulen > 0) /* Numeric->Upattern */ + + (scale != UMFPACK_SCALE_NONE)) ; /* Numeric->Rs */ + + /* ---------------------------------------------------------------------- */ + /* get the time used by UMFPACK_numeric */ + /* ---------------------------------------------------------------------- */ + + umfpack_toc (stats) ; + Info [UMFPACK_NUMERIC_WALLTIME] = stats [0] ; + Info [UMFPACK_NUMERIC_TIME] = stats [1] ; + + /* return UMFPACK_OK or UMFPACK_WARNING_singular_matrix */ + return (status) ; + +} + + +/* ========================================================================== */ +/* === numeric_alloc ======================================================== */ +/* ========================================================================== */ + +/* Allocate the Numeric object */ + +PRIVATE Int numeric_alloc +( + NumericType **NumericHandle, + SymbolicType *Symbolic, + double alloc_init, + Int scale +) +{ + double nsize, bsize ; + Int n_row, n_col, n_inner, min_usage, trying ; + NumericType *Numeric ; + + DEBUG0 (("numeric alloc:\n")) ; + + n_row = Symbolic->n_row ; + n_col = Symbolic->n_col ; + n_inner = MIN (n_row, n_col) ; + *NumericHandle = (NumericType *) NULL ; + + /* 1 allocation: accounted for in UMF_set_stats (num_On_size1), + * free'd in umfpack_free_numeric */ + Numeric = (NumericType *) UMF_malloc (1, sizeof (NumericType)) ; + + if (!Numeric) + { + return (FALSE) ; /* out of memory */ + } + Numeric->valid = 0 ; + *NumericHandle = Numeric ; + + /* 9 allocations: accounted for in UMF_set_stats (num_On_size1), + * free'd in umfpack_free_numeric */ + Numeric->D = (Entry *) UMF_malloc (n_inner+1, sizeof (Entry)) ; + Numeric->Rperm = (Int *) UMF_malloc (n_row+1, sizeof (Int)) ; + Numeric->Cperm = (Int *) UMF_malloc (n_col+1, sizeof (Int)) ; + Numeric->Lpos = (Int *) UMF_malloc (n_row+1, sizeof (Int)) ; + Numeric->Lilen = (Int *) UMF_malloc (n_col+1, sizeof (Int)) ; + Numeric->Lip = (Int *) UMF_malloc (n_col+1, sizeof (Int)) ; + Numeric->Upos = (Int *) UMF_malloc (n_col+1, sizeof (Int)) ; + Numeric->Uilen = (Int *) UMF_malloc (n_row+1, sizeof (Int)) ; + Numeric->Uip = (Int *) UMF_malloc (n_row+1, sizeof (Int)) ; + + /* 1 allocation if scaling: in UMF_set_stats (num_On_size1), + * free'd in umfpack_free_numeric */ + if (scale != UMFPACK_SCALE_NONE) + { + DEBUG0 (("Allocating scale factors\n")) ; + Numeric->Rs = (double *) UMF_malloc (n_row, sizeof (double)) ; + } + else + { + DEBUG0 (("No scale factors allocated (R = I)\n")) ; + Numeric->Rs = (double *) NULL ; + } + + Numeric->Memory = (Unit *) NULL ; + + /* Upattern has already been allocated as part of the Work object. If + * the matrix is singular or rectangular, and there are off-diagonal + * nonzeros in the last pivot row, then Work->Upattern is not free'd. + * Instead it is transfered to Numeric->Upattern. If it exists, + * Numeric->Upattern is free'd in umfpack_free_numeric. */ + Numeric->Upattern = (Int *) NULL ; /* used for singular matrices only */ + + if (!Numeric->D || !Numeric->Rperm || !Numeric->Cperm || !Numeric->Upos || + !Numeric->Lpos || !Numeric->Lilen || !Numeric->Uilen || !Numeric->Lip || + !Numeric->Uip || (scale != UMFPACK_SCALE_NONE && !Numeric->Rs)) + { + return (FALSE) ; /* out of memory */ + } + + /* ---------------------------------------------------------------------- */ + /* allocate initial Numeric->Memory for LU factors and elements */ + /* ---------------------------------------------------------------------- */ + + if (alloc_init < 0) + { + /* -alloc_init is the exact size to initially allocate */ + nsize = -alloc_init ; + } + else + { + /* alloc_init is a ratio of the upper bound memory usage */ + nsize = (alloc_init * Symbolic->num_mem_usage_est) + 1 ; + } + min_usage = Symbolic->num_mem_init_usage ; + + /* Numeric->Memory must be large enough for UMF_kernel_init */ + nsize = MAX (min_usage, nsize) ; + + /* Numeric->Memory cannot be larger in size than Int_MAX / sizeof(Unit) */ + /* For ILP32 mode: 2GB (nsize cannot be bigger than 256 Mwords) */ + bsize = ((double) Int_MAX) / sizeof (Unit) - 1 ; + DEBUG0 (("bsize %g\n", bsize)) ; + nsize = MIN (nsize, bsize) ; + + Numeric->size = (Int) nsize ; + + DEBUG0 (("Num init %g usage_est %g numsize "ID" minusage "ID"\n", + alloc_init, Symbolic->num_mem_usage_est, Numeric->size, min_usage)) ; + + /* allocates 1 object: */ + /* keep trying until successful, or memory request is too small */ + trying = TRUE ; + while (trying) + { + Numeric->Memory = (Unit *) UMF_malloc (Numeric->size, sizeof (Unit)) ; + if (Numeric->Memory) + { + DEBUG0 (("Successful Numeric->size: "ID"\n", Numeric->size)) ; + return (TRUE) ; + } + /* too much, reduce the request (but not below the minimum) */ + /* and try again */ + trying = Numeric->size > min_usage ; + Numeric->size = (Int) + (UMF_REALLOC_REDUCTION * ((double) Numeric->size)) ; + Numeric->size = MAX (min_usage, Numeric->size) ; + } + + return (FALSE) ; /* we failed to allocate Numeric->Memory */ +} + + +/* ========================================================================== */ +/* === work_alloc =========================================================== */ +/* ========================================================================== */ + +/* Allocate the Work object. Return TRUE if successful. */ + +PRIVATE Int work_alloc +( + WorkType *Work, + SymbolicType *Symbolic +) +{ + Int n_row, n_col, nn, maxnrows, maxncols, nfr, ok, maxnrc, n1 ; + + n_row = Work->n_row ; + n_col = Work->n_col ; + nn = MAX (n_row, n_col) ; + nfr = Work->nfr ; + n1 = Symbolic->n1 ; + ASSERT (n1 <= n_row && n1 <= n_col) ; + + maxnrows = Symbolic->maxnrows + Symbolic->nb ; + maxnrows = MIN (n_row, maxnrows) ; + maxncols = Symbolic->maxncols + Symbolic->nb ; + maxncols = MIN (n_col, maxncols) ; + maxnrc = MAX (maxnrows, maxncols) ; + + DEBUG0 (("work alloc: maxnrows+nb "ID" maxncols+nb "ID"\n", + maxnrows, maxncols)) ; + + /* 15 allocations, freed in free_work: */ + /* accounted for in UMF_set_stats (work_usage) */ + Work->Wx = (Entry *) UMF_malloc (maxnrows + 1, sizeof (Entry)) ; + Work->Wy = (Entry *) UMF_malloc (maxnrows + 1, sizeof (Entry)) ; + Work->Frpos = (Int *) UMF_malloc (n_row + 1, sizeof (Int)) ; + Work->Lpattern = (Int *) UMF_malloc (n_row + 1, sizeof (Int)) ; + Work->Fcpos = (Int *) UMF_malloc (n_col + 1, sizeof (Int)) ; + Work->Wp = (Int *) UMF_malloc (nn + 1, sizeof (Int)) ; + Work->Wrp = (Int *) UMF_malloc (MAX (n_col,maxnrows) + 1, sizeof (Int)) ; + Work->Frows = (Int *) UMF_malloc (maxnrows + 1, sizeof (Int)) ; + Work->Wm = (Int *) UMF_malloc (maxnrows + 1, sizeof (Int)) ; + Work->Fcols = (Int *) UMF_malloc (maxncols + 1, sizeof (Int)) ; + Work->Wio = (Int *) UMF_malloc (maxncols + 1, sizeof (Int)) ; + Work->Woi = (Int *) UMF_malloc (maxncols + 1, sizeof (Int)) ; + Work->Woo = (Int *) UMF_malloc (maxnrc + 1, sizeof (Int)); + Work->elen = (n_col - n1) + (n_row - n1) + MIN (n_col-n1, n_row-n1) + 1 ; + Work->E = (Int *) UMF_malloc (Work->elen, sizeof (Int)) ; + Work->Front_new1strow = (Int *) UMF_malloc (nfr + 1, sizeof (Int)) ; + + ok = (Work->Frpos && Work->Fcpos && Work->Lpattern + && Work->Wp && Work->Wrp && Work->Frows && Work->Fcols + && Work->Wio && Work->Woi && Work->Woo && Work->Wm + && Work->E && Work->Front_new1strow && Work->Wx && Work->Wy) ; + + /* 2 allocations: accounted for in UMF_set_stats (work_usage) */ + if (Symbolic->prefer_diagonal) + { + Work->Diagonal_map = (Int *) UMF_malloc (nn, sizeof (Int)) ; + Work->Diagonal_imap = (Int *) UMF_malloc (nn, sizeof (Int)) ; + ok = ok && Work->Diagonal_map && Work->Diagonal_imap ; + } + else + { + /* no diagonal map needed for rectangular matrices */ + Work->Diagonal_map = (Int *) NULL ; + Work->Diagonal_imap = (Int *) NULL ; + } + + /* 1 allocation, may become part of Numeric (if singular or rectangular): */ + Work->Upattern = (Int *) UMF_malloc (n_col + 1, sizeof (Int)) ; + ok = ok && Work->Upattern ; + + /* current frontal matrix does not yet exist */ + Work->Flublock = (Entry *) NULL ; + Work->Flblock = (Entry *) NULL ; + Work->Fublock = (Entry *) NULL ; + Work->Fcblock = (Entry *) NULL ; + + DEBUG0 (("work alloc done.\n")) ; + return (ok) ; +} + + +/* ========================================================================== */ +/* === free_work ============================================================ */ +/* ========================================================================== */ + +PRIVATE void free_work +( + WorkType *Work +) +{ + DEBUG0 (("work free:\n")) ; + if (Work) + { + /* these 16 objects do exist */ + Work->Wx = (Entry *) UMF_free ((void *) Work->Wx) ; + Work->Wy = (Entry *) UMF_free ((void *) Work->Wy) ; + Work->Frpos = (Int *) UMF_free ((void *) Work->Frpos) ; + Work->Fcpos = (Int *) UMF_free ((void *) Work->Fcpos) ; + Work->Lpattern = (Int *) UMF_free ((void *) Work->Lpattern) ; + Work->Upattern = (Int *) UMF_free ((void *) Work->Upattern) ; + Work->Wp = (Int *) UMF_free ((void *) Work->Wp) ; + Work->Wrp = (Int *) UMF_free ((void *) Work->Wrp) ; + Work->Frows = (Int *) UMF_free ((void *) Work->Frows) ; + Work->Fcols = (Int *) UMF_free ((void *) Work->Fcols) ; + Work->Wio = (Int *) UMF_free ((void *) Work->Wio) ; + Work->Woi = (Int *) UMF_free ((void *) Work->Woi) ; + Work->Woo = (Int *) UMF_free ((void *) Work->Woo) ; + Work->Wm = (Int *) UMF_free ((void *) Work->Wm) ; + Work->E = (Int *) UMF_free ((void *) Work->E) ; + Work->Front_new1strow = + (Int *) UMF_free ((void *) Work->Front_new1strow) ; + + /* these objects might not exist */ + Work->Diagonal_map = (Int *) UMF_free ((void *) Work->Diagonal_map) ; + Work->Diagonal_imap = (Int *) UMF_free ((void *) Work->Diagonal_imap) ; + } + DEBUG0 (("work free done.\n")) ; +} + + +/* ========================================================================== */ +/* === error ================================================================ */ +/* ========================================================================== */ + +/* Error return from UMFPACK_numeric. Free all allocated memory. */ + +PRIVATE void error +( + NumericType **Numeric, + WorkType *Work +) +{ + free_work (Work) ; + UMFPACK_free_numeric ((void **) Numeric) ; + ASSERT (UMF_malloc_count == init_count) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umfpack_qsymbolic.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_qsymbolic.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,2415 @@ +/* ========================================================================== */ +/* === UMFPACK_qsymbolic ==================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + User-callable. Performs a symbolic factorization. + See umfpack_qsymbolic.h and umfpack_symbolic.h for details. + + Dynamic memory usage: about (3.4nz + 8n + n) integers and n double's as + workspace (via UMF_malloc, for a square matrix). All of it is free'd via + UMF_free if an error occurs. If successful, the Symbolic object contains + 12 to 14 objects allocated by UMF_malloc, with a total size of no more + than about 13*n integers. +*/ + +#include "umf_internal.h" +#include "umf_symbolic_usage.h" +#include "umf_colamd.h" +#include "umf_set_stats.h" +#include "umf_analyze.h" +#include "umf_transpose.h" +#include "umf_is_permutation.h" +#include "umf_malloc.h" +#include "umf_free.h" +#include "umf_2by2.h" +#include "umf_singletons.h" + +typedef struct /* SWType */ +{ + Int *Front_npivcol ; /* size n_col + 1 */ + Int *Front_nrows ; /* size n_col */ + Int *Front_ncols ; /* size n_col */ + Int *Front_parent ; /* size n_col */ + Int *Front_cols ; /* size n_col */ + Int *InFront ; /* size n_row */ + Int *Ci ; /* size Clen */ + Int *Cperm1 ; /* size n_col */ + Int *Rperm1 ; /* size n_row */ + Int *InvRperm1 ; /* size n_row */ + Int *Si ; /* size nz */ + Int *Sp ; /* size n_col + 1 */ + double *Rs ; /* size n_row */ + Int *Rperm_2by2 ; /* size n_row */ + +} SWType ; + +PRIVATE void free_work +( + SWType *SW +) ; + +PRIVATE void error +( + SymbolicType **Symbolic, + SWType *SW +) ; + +/* worst-case usage for SW object */ +#define SYM_WORK_USAGE(n_col,n_row,Clen) \ + (DUNITS (Int, Clen) + \ + DUNITS (Int, nz) + \ + 4 * DUNITS (Int, n_row) + \ + 4 * DUNITS (Int, n_col) + \ + 2 * DUNITS (Int, n_col + 1) + \ + DUNITS (double, n_row)) + +/* required size of Ci for code that calls UMF_transpose and UMF_analyze below*/ +#define UMF_ANALYZE_CLEN(nz,n_row,n_col,nn) \ + ((n_col) + MAX ((nz),(n_col)) + 3*(nn)+1 + (n_col)) + +/* size of an element (in Units), including tuples */ +#define ELEMENT_SIZE(r,c) \ + (DGET_ELEMENT_SIZE (r, c) + 1 + (r + c) * UNITS (Tuple, 1)) + +#ifndef NDEBUG +PRIVATE Int init_count ; +#endif + +/* ========================================================================== */ +/* === do_amd =============================================================== */ +/* ========================================================================== */ + +PRIVATE void do_amd +( + Int n, + const Int Ap [ ], /* size n+1 */ + const Int Ai [ ], /* size nz = Ap [n] */ + Int Q [ ], /* output permutation, j = Q [k] */ + Int Qinv [ ], /* output inverse permutation, Qinv [j] = k */ + Int Sdeg [ ], /* degree of A+A', from AMD_aat */ + Int Clen, /* size of Ci */ + Int Ci [ ], /* size Ci workspace */ + double amd_Control [ ], /* AMD control parameters */ + double amd_Info [ ], /* AMD info */ + SymbolicType *Symbolic, /* Symbolic object */ + double Info [ ] /* UMFPACK info */ +) +{ + + if (n == 0) + { + Symbolic->amd_dmax = 0 ; + Symbolic->amd_lunz = 0 ; + Info [UMFPACK_SYMMETRIC_LUNZ] = 0 ; + Info [UMFPACK_SYMMETRIC_FLOPS] = 0 ; + Info [UMFPACK_SYMMETRIC_DMAX] = 0 ; + Info [UMFPACK_SYMMETRIC_NDENSE] = 0 ; + } + else + { + AMD_1 (n, Ap, Ai, Q, Qinv, Sdeg, Clen, Ci, amd_Control, amd_Info) ; + + /* return estimates computed from AMD on PA+PA' */ + Symbolic->amd_dmax = amd_Info [AMD_DMAX] ; + Symbolic->amd_lunz = 2 * amd_Info [AMD_LNZ] + n ; + Info [UMFPACK_SYMMETRIC_LUNZ] = Symbolic->amd_lunz ; + Info [UMFPACK_SYMMETRIC_FLOPS] = DIV_FLOPS * amd_Info [AMD_NDIV] + + MULTSUB_FLOPS * amd_Info [AMD_NMULTSUBS_LU] ; + Info [UMFPACK_SYMMETRIC_DMAX] = Symbolic->amd_dmax ; + Info [UMFPACK_SYMMETRIC_NDENSE] = amd_Info [AMD_NDENSE] ; + Info [UMFPACK_SYMBOLIC_DEFRAG] += amd_Info [AMD_NCMPA] ; + } +} + +/* ========================================================================== */ +/* === prune_singletons ===================================================== */ +/* ========================================================================== */ + +/* Create the submatrix after removing the n1 singletons. The matrix has + * row and column indices in the range 0 to n_row-n1 and 0 to n_col-n1, + * respectively. */ + +PRIVATE Int prune_singletons +( + Int n1, + Int n_col, + const Int Ap [ ], + const Int Ai [ ], + const double Ax [ ], +#ifdef COMPLEX + const double Az [ ], +#endif + Int Cperm1 [ ], + Int InvRperm1 [ ], + Int Si [ ], + Int Sp [ ] +#ifndef NDEBUG + , Int Rperm1 [ ] + , Int n_row +#endif +) +{ + Int row, k, pp, p, oldcol, newcol, newrow, nzdiag, do_nzdiag ; +#ifdef COMPLEX + Int split = SPLIT (Az) ; +#endif + + nzdiag = 0 ; + do_nzdiag = (Ax != (double *) NULL) ; + +#ifndef NDEBUG + DEBUGm4 (("Prune : S = A (Cperm1 (n1+1:end), Rperm1 (n1+1:end))\n")) ; + for (k = 0 ; k < n_row ; k++) + { + ASSERT (Rperm1 [k] >= 0 && Rperm1 [k] < n_row) ; + ASSERT (InvRperm1 [Rperm1 [k]] == k) ; + } +#endif + + /* create the submatrix after removing singletons */ + + pp = 0 ; + for (k = n1 ; k < n_col ; k++) + { + oldcol = Cperm1 [k] ; + newcol = k - n1 ; + DEBUG5 (("Prune singletons k "ID" oldcol "ID" newcol "ID": "ID"\n", + k, oldcol, newcol, pp)) ; + Sp [newcol] = pp ; /* load column pointers */ + for (p = Ap [oldcol] ; p < Ap [oldcol+1] ; p++) + { + row = Ai [p] ; + DEBUG5 ((" "ID": row "ID, pp, row)) ; + ASSERT (row >= 0 && row < n_row) ; + newrow = InvRperm1 [row] - n1 ; + ASSERT (newrow < n_row - n1) ; + if (newrow >= 0) + { + DEBUG5 ((" newrow "ID, newrow)) ; + Si [pp++] = newrow ; + if (do_nzdiag) + { + /* count the number of truly nonzero entries on the + * diagonal of S, excluding entries that are present, + * but numerically zero */ + if (newrow == newcol) + { + /* this is the diagonal entry */ +#ifdef COMPLEX + if (split) + { + if (SCALAR_IS_NONZERO (Ax [p]) || + SCALAR_IS_NONZERO (Az [p])) + { + nzdiag++ ; + } + } + else + { + if (SCALAR_IS_NONZERO (Ax [2*p ]) || + SCALAR_IS_NONZERO (Ax [2*p+1])) + { + nzdiag++ ; + } + } +#else + if (SCALAR_IS_NONZERO (Ax [p])) + { + nzdiag++ ; + } +#endif + } + } + } + DEBUG5 (("\n")) ; + } + } + Sp [n_col - n1] = pp ; + + return (nzdiag) ; +} + +/* ========================================================================== */ +/* === combine_ordering ===================================================== */ +/* ========================================================================== */ + +PRIVATE void combine_ordering +( + Int n1, + Int nempty_col, + Int n_col, + Int Cperm_init [ ], /* output permutation */ + Int Cperm1 [ ], /* singleton and empty column ordering */ + Int Qinv [ ] /* Qinv from AMD or COLAMD */ +) +{ + Int k, oldcol, newcol, knew ; + + /* combine the singleton ordering with Qinv */ +#ifndef NDEBUG + for (k = 0 ; k < n_col ; k++) + { + Cperm_init [k] = EMPTY ; + } +#endif + for (k = 0 ; k < n1 ; k++) + { + DEBUG1 ((ID" Initial singleton: "ID"\n", k, Cperm1 [k])) ; + Cperm_init [k] = Cperm1 [k] ; + } + for (k = n1 ; k < n_col - nempty_col ; k++) + { + /* this is a non-singleton column */ + oldcol = Cperm1 [k] ; /* user's name for this column */ + newcol = k - n1 ; /* Qinv's name for this column */ + knew = Qinv [newcol] ; /* Qinv's ordering for this column */ + knew += n1 ; /* shift order, after singletons */ + DEBUG1 ((" k "ID" oldcol "ID" newcol "ID" knew "ID"\n", + k, oldcol, newcol, knew)) ; + ASSERT (knew >= 0 && knew < n_col - nempty_col) ; + ASSERT (Cperm_init [knew] == EMPTY) ; + Cperm_init [knew] = oldcol ; + } + for (k = n_col - nempty_col ; k < n_col ; k++) + { + Cperm_init [k] = Cperm1 [k] ; + } +#ifndef NDEBUG + { + Int *W = (Int *) malloc ((n_col + 1) * sizeof (Int)) ; + ASSERT (UMF_is_permutation (Cperm_init, W, n_col, n_col)) ; + free (W) ; + } +#endif + +} + +/* ========================================================================== */ +/* === UMFPACK_qsymbolic ==================================================== */ +/* ========================================================================== */ + +GLOBAL Int UMFPACK_qsymbolic +( + Int n_row, + Int n_col, + const Int Ap [ ], + const Int Ai [ ], + const double Ax [ ], +#ifdef COMPLEX + const double Az [ ], +#endif + const Int Quser [ ], + void **SymbolicHandle, + const double Control [UMFPACK_CONTROL], + double User_Info [UMFPACK_INFO] +) +{ + + /* ---------------------------------------------------------------------- */ + /* local variables */ + /* ---------------------------------------------------------------------- */ + + double knobs [COLAMD_KNOBS], flops, f, r, c, force_fixQ, + Info2 [UMFPACK_INFO], drow, dcol, dtail_usage, dlf, duf, dmax_usage, + dhead_usage, dlnz, dunz, dmaxfrsize, dClen, dClen_analyze, sym, + amd_Info [AMD_INFO], dClen_amd, dr, dc, cr, cc, cp, + amd_Control [AMD_CONTROL], stats [2], tol ; + double *Info ; + Int i, nz, j, newj, status, f1, f2, maxnrows, maxncols, nfr, col, + nchains, maxrows, maxcols, p, nb, nn, *Chain_start, *Chain_maxrows, + *Chain_maxcols, *Front_npivcol, *Ci, Clen, colamd_stats [COLAMD_STATS], + fpiv, n_inner, child, parent, *Link, row, *Front_parent, + analyze_compactions, k, chain, is_sym, *Si, *Sp, n2, do_UMF_analyze, + fpivcol, fallrows, fallcols, *InFront, *F1, snz, *Front_1strow, f1rows, + kk, *Cperm_init, *Rperm_init, newrow, *InvRperm1, *Front_leftmostdesc, + Clen_analyze, strategy, Clen_amd, fixQ, prefer_diagonal, nzdiag, nzaat, + *Wq, *Sdeg, *Fr_npivcol, nempty, *Fr_nrows, *Fr_ncols, *Fr_parent, + *Fr_cols, nempty_row, nempty_col, user_auto_strategy, fail, max_rdeg, + head_usage, tail_usage, lnz, unz, esize, *Esize, rdeg, *Cdeg, *Rdeg, + *Cperm1, *Rperm1, n1, oldcol, newcol, n1c, n1r, *Rperm_2by2, oldrow, + dense_row_threshold, tlen, aggressive, scale, *Rp, *Ri ; + + SymbolicType *Symbolic ; + SWType SWspace, *SW ; + +#ifndef NDEBUG + UMF_dump_start ( ) ; + init_count = UMF_malloc_count ; + PRINTF (( +"**** Debugging enabled (UMFPACK will be exceedingly slow!) *****************\n" + )) ; +#endif + + /* ---------------------------------------------------------------------- */ + /* get the amount of time used by the process so far */ + /* ---------------------------------------------------------------------- */ + + umfpack_tic (stats) ; + + /* ---------------------------------------------------------------------- */ + /* get control settings and check input parameters */ + /* ---------------------------------------------------------------------- */ + + drow = GET_CONTROL (UMFPACK_DENSE_ROW, UMFPACK_DEFAULT_DENSE_ROW) ; + dcol = GET_CONTROL (UMFPACK_DENSE_COL, UMFPACK_DEFAULT_DENSE_COL) ; + nb = GET_CONTROL (UMFPACK_BLOCK_SIZE, UMFPACK_DEFAULT_BLOCK_SIZE) ; + strategy = GET_CONTROL (UMFPACK_STRATEGY, UMFPACK_DEFAULT_STRATEGY) ; + tol = GET_CONTROL (UMFPACK_2BY2_TOLERANCE, UMFPACK_DEFAULT_2BY2_TOLERANCE) ; + scale = GET_CONTROL (UMFPACK_SCALE, UMFPACK_DEFAULT_SCALE) ; + force_fixQ = GET_CONTROL (UMFPACK_FIXQ, UMFPACK_DEFAULT_FIXQ) ; + AMD_defaults (amd_Control) ; + amd_Control [AMD_DENSE] = + GET_CONTROL (UMFPACK_AMD_DENSE, UMFPACK_DEFAULT_AMD_DENSE) ; + aggressive = + (GET_CONTROL (UMFPACK_AGGRESSIVE, UMFPACK_DEFAULT_AGGRESSIVE) != 0) ; + amd_Control [AMD_AGGRESSIVE] = aggressive ; + + nb = MAX (2, nb) ; + nb = MIN (nb, MAXNB) ; + ASSERT (nb >= 0) ; + if (nb % 2 == 1) nb++ ; /* make sure nb is even */ + DEBUG0 (("UMFPACK_qsymbolic: nb = "ID" aggressive = "ID"\n", nb, + aggressive)) ; + + tol = MAX (0.0, MIN (tol, 1.0)) ; + if (scale != UMFPACK_SCALE_NONE && scale != UMFPACK_SCALE_MAX) + { + scale = UMFPACK_DEFAULT_SCALE ; + } + + if (User_Info != (double *) NULL) + { + /* return Info in user's array */ + Info = User_Info ; + } + else + { + /* no Info array passed - use local one instead */ + Info = Info2 ; + } + /* clear all of Info */ + for (i = 0 ; i < UMFPACK_INFO ; i++) + { + Info [i] = EMPTY ; + } + + nn = MAX (n_row, n_col) ; + n_inner = MIN (n_row, n_col) ; + + Info [UMFPACK_STATUS] = UMFPACK_OK ; + Info [UMFPACK_NROW] = n_row ; + Info [UMFPACK_NCOL] = n_col ; + Info [UMFPACK_SIZE_OF_UNIT] = (double) (sizeof (Unit)) ; + Info [UMFPACK_SIZE_OF_INT] = (double) (sizeof (int)) ; + Info [UMFPACK_SIZE_OF_LONG] = (double) (sizeof (long)) ; + Info [UMFPACK_SIZE_OF_POINTER] = (double) (sizeof (void *)) ; + Info [UMFPACK_SIZE_OF_ENTRY] = (double) (sizeof (Entry)) ; + Info [UMFPACK_SYMBOLIC_DEFRAG] = 0 ; + + if (!Ai || !Ap || !SymbolicHandle) + { + Info [UMFPACK_STATUS] = UMFPACK_ERROR_argument_missing ; + return (UMFPACK_ERROR_argument_missing) ; + } + + *SymbolicHandle = (void *) NULL ; + + if (n_row <= 0 || n_col <= 0) /* n_row, n_col must be > 0 */ + { + Info [UMFPACK_STATUS] = UMFPACK_ERROR_n_nonpositive ; + return (UMFPACK_ERROR_n_nonpositive) ; + } + + nz = Ap [n_col] ; + DEBUG0 (("n_row "ID" n_col "ID" nz "ID"\n", n_row, n_col, nz)) ; + Info [UMFPACK_NZ] = nz ; + if (nz < 0) + { + Info [UMFPACK_STATUS] = UMFPACK_ERROR_invalid_matrix ; + return (UMFPACK_ERROR_invalid_matrix) ; + } + + /* ---------------------------------------------------------------------- */ + /* get the requested strategy */ + /* ---------------------------------------------------------------------- */ + + if (n_row != n_col) + { + /* if the matrix is rectangular, the only available strategy is + * unsymmetric */ + strategy = UMFPACK_STRATEGY_UNSYMMETRIC ; + DEBUGm3 (("Rectangular: forcing unsymmetric strategy\n")) ; + } + + if (strategy < UMFPACK_STRATEGY_AUTO + || strategy > UMFPACK_STRATEGY_SYMMETRIC) + { + /* unrecognized strategy */ + strategy = UMFPACK_STRATEGY_AUTO ; + } + + if (Quser != (Int *) NULL) + { + /* when the user provides Q, only symmetric and unsymmetric strategies + * are available */ + if (strategy == UMFPACK_STRATEGY_2BY2) + { + strategy = UMFPACK_STRATEGY_SYMMETRIC ; + } + if (strategy != UMFPACK_STRATEGY_SYMMETRIC) + { + strategy = UMFPACK_STRATEGY_UNSYMMETRIC ; + } + } + + user_auto_strategy = (strategy == UMFPACK_STRATEGY_AUTO) ; + + /* ---------------------------------------------------------------------- */ + /* determine amount of memory required for UMFPACK_symbolic */ + /* ---------------------------------------------------------------------- */ + + /* The size of Clen required for UMF_colamd is always larger than */ + /* UMF_analyze, but the max is included here in case that changes in */ + /* future versions. */ + + /* This is about 2.2*nz + 9*n_col + 6*n_row, or nz/5 + 13*n_col + 6*n_row, + * whichever is bigger. For square matrices, it works out to + * 2.2nz + 15n, or nz/5 + 19n, whichever is bigger (typically 2.2nz+15n). */ + dClen = UMF_COLAMD_RECOMMENDED ((double) nz, (double) n_row, + (double) n_col) ; + + /* This is defined above, as max (nz,n_col) + 3*nn+1 + 2*n_col, where + * nn = max (n_row,n_col). It is always smaller than the space required + * for colamd or amd. */ + dClen_analyze = UMF_ANALYZE_CLEN ((double) nz, (double) n_row, + (double) n_col, (double) nn) ; + dClen = MAX (dClen, dClen_analyze) ; + + /* The space for AMD can be larger than what's required for colamd: */ + dClen_amd = 2.4 * (double) nz + 8 * (double) n_inner ; + /* additional space for the 2-by-2 strategy */ + dClen_amd += (double) MAX (nn, nz) ; + dClen = MAX (dClen, dClen_amd) ; + + /* worst case total memory usage for UMFPACK_symbolic (revised below) */ + Info [UMFPACK_SYMBOLIC_PEAK_MEMORY] = + SYM_WORK_USAGE (n_col, n_row, dClen) + + UMF_symbolic_usage (n_row, n_col, n_col, n_col, n_col, TRUE) ; + + if (INT_OVERFLOW (dClen * sizeof (Int))) + { + /* :: int overflow, Clen too large :: */ + /* Problem is too large for array indexing (Ci [i]) with an Int i. */ + /* Cannot even analyze the problem to determine upper bounds on */ + /* memory usage. Need to use the long integer version, umfpack_*l_*. */ + DEBUGm4 (("out of memory: symbolic int overflow\n")) ; + Info [UMFPACK_STATUS] = UMFPACK_ERROR_out_of_memory ; + return (UMFPACK_ERROR_out_of_memory) ; + } + + /* repeat the size calculations, in integers */ + Clen = UMF_COLAMD_RECOMMENDED (nz, n_row, n_col) ; + Clen_analyze = UMF_ANALYZE_CLEN (nz, n_row, n_col, nn) ; + Clen = MAX (Clen, Clen_analyze) ; + Clen_amd = 2.4 * nz + 8 * n_inner ; + Clen_amd += MAX (nn, nz) ; /* for Ri, in UMF_2by2 */ + Clen = MAX (Clen, Clen_amd) ; + + /* ---------------------------------------------------------------------- */ + /* allocate the first part of the Symbolic object (header and Cperm_init) */ + /* ---------------------------------------------------------------------- */ + + /* (1) Five calls to UMF_malloc are made, for a total space of + * 2 * (n_row + n_col) + 4 integers + sizeof (SymbolicType). + * sizeof (SymbolicType) is a small constant. This space is part of the + * Symbolic object and is not freed unless an error occurs. If A is square + * then this is about 4*n integers. + */ + + Symbolic = (SymbolicType *) UMF_malloc (1, sizeof (SymbolicType)) ; + + if (!Symbolic) + { + /* If we fail here, Symbolic is NULL and thus it won't be */ + /* dereferenced by UMFPACK_free_symbolic, as called by error ( ). */ + DEBUGm4 (("out of memory: symbolic object\n")) ; + Info [UMFPACK_STATUS] = UMFPACK_ERROR_out_of_memory ; + error (&Symbolic, (SWType *) NULL) ; + return (UMFPACK_ERROR_out_of_memory) ; + } + + /* We now know that Symbolic has been allocated */ + Symbolic->valid = 0 ; + Symbolic->Chain_start = (Int *) NULL ; + Symbolic->Chain_maxrows = (Int *) NULL ; + Symbolic->Chain_maxcols = (Int *) NULL ; + Symbolic->Front_npivcol = (Int *) NULL ; + Symbolic->Front_parent = (Int *) NULL ; + Symbolic->Front_1strow = (Int *) NULL ; + Symbolic->Front_leftmostdesc = (Int *) NULL ; + Symbolic->Esize = (Int *) NULL ; + Symbolic->esize = 0 ; + + Symbolic->Cperm_init = (Int *) UMF_malloc (n_col+1, sizeof (Int)) ; + Symbolic->Rperm_init = (Int *) UMF_malloc (n_row+1, sizeof (Int)) ; + Symbolic->Cdeg = (Int *) UMF_malloc (n_col+1, sizeof (Int)) ; + Symbolic->Rdeg = (Int *) UMF_malloc (n_row+1, sizeof (Int)) ; + Symbolic->Diagonal_map = (Int *) NULL ; + + Cperm_init = Symbolic->Cperm_init ; + Rperm_init = Symbolic->Rperm_init ; + Cdeg = Symbolic->Cdeg ; + Rdeg = Symbolic->Rdeg ; + + if (!Cperm_init || !Rperm_init || !Cdeg || !Rdeg) + { + DEBUGm4 (("out of memory: symbolic perm\n")) ; + Info [UMFPACK_STATUS] = UMFPACK_ERROR_out_of_memory ; + error (&Symbolic, (SWType *) NULL) ; + return (UMFPACK_ERROR_out_of_memory) ; + } + + Symbolic->n_row = n_row ; + Symbolic->n_col = n_col ; + Symbolic->nz = nz ; + Symbolic->nb = nb ; + + /* ---------------------------------------------------------------------- */ + /* check user's input permutation */ + /* ---------------------------------------------------------------------- */ + + if (Quser != (Int *) NULL) + { + /* use Cperm_init as workspace to check input permutation */ + if (!UMF_is_permutation (Quser, Cperm_init, n_col, n_col)) + { + Info [UMFPACK_STATUS] = UMFPACK_ERROR_invalid_permutation ; + error (&Symbolic, (SWType *) NULL) ; + return (UMFPACK_ERROR_invalid_permutation) ; + } + } + + /* ---------------------------------------------------------------------- */ + /* allocate workspace */ + /* ---------------------------------------------------------------------- */ + + /* (2) Eleven calls to UMF_malloc are made, for workspace of size + * Clen + nz + 7*n_col + 2*n_row + 2 integers. Clen is the larger of + * MAX (2*nz, 4*n_col) + 8*n_col + 6*n_row + n_col + nz/5 and + * 2.4*nz + 8 * MIN (n_row, n_col) + MAX (n_row, n_col, nz) + * If A is square and non-singular, then Clen is + * MAX (MAX (2*nz, 4*n) + 7*n + nz/5, 3.4*nz) + 8*n + * If A has at least 4*n nonzeros then Clen is + * MAX (2.2*nz + 7*n, 3.4*nz) + 8*n + * If A has at least (7/1.2)*n nonzeros, (about 5.8*n), then Clen is + * 3.4*nz + 8*n + * This space will be free'd when this routine finishes. + * + * Total space thus far is about 3.4nz + 12n integers. + * For the double precision, 32-bit integer version, the user's matrix + * requires an equivalent space of 3*nz + n integers. So this space is just + * slightly larger than the user's input matrix (including the numerical + * values themselves). + */ + + SW = &SWspace ; /* used for UMFPACK_symbolic only */ + + /* Note that SW->Front_* does not include the dummy placeholder front. */ + /* This space is accounted for by the SYM_WORK_USAGE macro. */ + + /* this is free'd early */ + SW->Si = (Int *) UMF_malloc (nz, sizeof (Int)) ; + SW->Sp = (Int *) UMF_malloc (n_col + 1, sizeof (Int)) ; + SW->InvRperm1 = (Int *) UMF_malloc (n_row, sizeof (Int)) ; + SW->Cperm1 = (Int *) UMF_malloc (n_col, sizeof (Int)) ; + + /* this is free'd late */ + SW->Ci = (Int *) UMF_malloc (Clen, sizeof (Int)) ; + SW->Front_npivcol = (Int *) UMF_malloc (n_col + 1, sizeof (Int)) ; + SW->Front_nrows = (Int *) UMF_malloc (n_col, sizeof (Int)) ; + SW->Front_ncols = (Int *) UMF_malloc (n_col, sizeof (Int)) ; + SW->Front_parent = (Int *) UMF_malloc (n_col, sizeof (Int)) ; + SW->Front_cols = (Int *) UMF_malloc (n_col, sizeof (Int)) ; + SW->Rperm1 = (Int *) UMF_malloc (n_row, sizeof (Int)) ; + SW->InFront = (Int *) UMF_malloc (n_row, sizeof (Int)) ; + + /* this is allocated later, and free'd after Cperm1 but before Ci */ + SW->Rperm_2by2 = (Int *) NULL ; /* will be nn Int's */ + + /* this is allocated last, and free'd first */ + SW->Rs = (double *) NULL ; /* will be n_row double's */ + + Ci = SW->Ci ; + Fr_npivcol = SW->Front_npivcol ; + Fr_nrows = SW->Front_nrows ; + Fr_ncols = SW->Front_ncols ; + Fr_parent = SW->Front_parent ; + Fr_cols = SW->Front_cols ; + Cperm1 = SW->Cperm1 ; + Rperm1 = SW->Rperm1 ; + Si = SW->Si ; + Sp = SW->Sp ; + InvRperm1 = SW->InvRperm1 ; + Rperm_2by2 = (Int *) NULL ; + InFront = SW->InFront ; + + if (!Ci || !Fr_npivcol || !Fr_nrows || !Fr_ncols || !Fr_parent || !Fr_cols + || !Cperm1 || !Rperm1 || !Si || !Sp || !InvRperm1 || !InFront) + { + DEBUGm4 (("out of memory: symbolic work\n")) ; + Info [UMFPACK_STATUS] = UMFPACK_ERROR_out_of_memory ; + error (&Symbolic, SW) ; + return (UMFPACK_ERROR_out_of_memory) ; + } + + DEBUG0 (("Symbolic UMF_malloc_count - init_count = "ID"\n", + UMF_malloc_count - init_count)) ; + ASSERT (UMF_malloc_count == init_count + 17) ; + + /* ---------------------------------------------------------------------- */ + /* find the row and column singletons */ + /* ---------------------------------------------------------------------- */ + + /* [ use first nz + n_row + MAX (n_row, n_col) entries in Ci as workspace, + * and use Rperm_init as workspace */ + ASSERT (Clen >= nz + n_row + MAX (n_row, n_col)) ; + + status = UMF_singletons (n_row, n_col, Ap, Ai, Quser, strategy, + Cdeg, Cperm1, Rdeg, + Rperm1, InvRperm1, &n1, &n1c, &n1r, &nempty_col, &nempty_row, &is_sym, + &max_rdeg, /* workspace: */ Rperm_init, Ci, Ci + nz, Ci + nz + n_row) ; + + /* ] done using Rperm_init and Ci as workspace */ + + /* InvRperm1 is now the inverse of Rperm1 */ + + if (status != UMFPACK_OK) + { + DEBUGm4 (("matrix invalid: UMF_singletons\n")) ; + Info [UMFPACK_STATUS] = status ; + error (&Symbolic, SW) ; + return (status) ; + } + Info [UMFPACK_NEMPTY_COL] = nempty_col ; + Info [UMFPACK_NEMPTY_ROW] = nempty_row ; + Info [UMFPACK_NDENSE_COL] = 0 ; /* # dense rows/cols recomputed below */ + Info [UMFPACK_NDENSE_ROW] = 0 ; + Info [UMFPACK_COL_SINGLETONS] = n1c ; + Info [UMFPACK_ROW_SINGLETONS] = n1r ; + Info [UMFPACK_S_SYMMETRIC] = is_sym ; + + nempty = MIN (nempty_col, nempty_row) ; + Symbolic->nempty_row = nempty_row ; + Symbolic->nempty_col = nempty_col ; + + /* UMF_singletons has verified that the user's input matrix is valid */ + ASSERT (AMD_valid (n_row, n_col, Ap, Ai)) ; + + Symbolic->n1 = n1 ; + Symbolic->nempty = nempty ; + ASSERT (n1 <= n_inner) ; + n2 = nn - n1 - nempty ; + + dense_row_threshold = + UMFPACK_DENSE_DEGREE_THRESHOLD (drow, n_col - n1 - nempty_col) ; + Symbolic->dense_row_threshold = dense_row_threshold ; + + if (!is_sym) + { + /* either the pruned submatrix rectangular, or it is square and + * Rperm [n1 .. n-nempty-1] is not the same as Cperm [n1 .. n-nempty-1]. + * Switch to the unsymmetric strategy, ignoring user-requested + * strategy. */ + strategy = UMFPACK_STRATEGY_UNSYMMETRIC ; + DEBUGm4 (("Strategy: Unsymmetric singletons\n")) ; + } + + /* ---------------------------------------------------------------------- */ + /* determine symmetry, nzdiag, and degrees of S+S' */ + /* ---------------------------------------------------------------------- */ + + /* S is the matrix obtained after removing singletons + * = A (Cperm1 [n1..n_col-nempty_col-1], Rperm1 [n1..n_row-nempty_row-1]) + */ + + Wq = Rperm_init ; /* use Rperm_init as workspace for Wq [ */ + Sdeg = Cperm_init ; /* use Cperm_init as workspace for Sdeg [ */ + sym = EMPTY ; + nzaat = EMPTY ; + nzdiag = EMPTY ; + for (i = 0 ; i < AMD_INFO ; i++) + { + amd_Info [i] = EMPTY ; + } + + if (strategy != UMFPACK_STRATEGY_UNSYMMETRIC) + { + /* This also determines the degree of each node in S+S' (Sdeg), which + * is needed by the 2-by-2 strategy, the symmetry of S, and the number + * of nonzeros on the diagonal of S. */ + ASSERT (n_row == n_col) ; + ASSERT (nempty_row == nempty_col) ; + + /* get the count of nonzeros on the diagonal of S, excluding explicitly + * zero entries. nzdiag = amd_Info [AMD_NZDIAG] counts the zero entries + * in S. */ + + nzdiag = prune_singletons (n1, nn, Ap, Ai, Ax, +#ifdef COMPLEX + Az, +#endif + Cperm1, InvRperm1, Si, Sp +#ifndef NDEBUG + , Rperm1, nn +#endif + ) ; + + /* use Ci as workspace to sort S into R, if needed [ */ + if (Quser != (Int *) NULL) + { + /* need to sort the columns of S first */ + Rp = Ci ; + Ri = Ci + (n_row) + 1 ; + (void) UMF_transpose (n2, n2, Sp, Si, (double *) NULL, + (Int *) NULL, (Int *) NULL, 0, + Rp, Ri, (double *) NULL, Wq, FALSE +#ifdef COMPLEX + , (double *) NULL, (double *) NULL, FALSE +#endif + ) ; + } + else + { + /* S already has sorted columns */ + Rp = Sp ; + Ri = Si ; + } + ASSERT (AMD_valid (n2, n2, Rp, Ri)) ; + + nzaat = AMD_aat (n2, Rp, Ri, Sdeg, Wq, amd_Info) ; + sym = amd_Info [AMD_SYMMETRY] ; + Info [UMFPACK_N2] = n2 ; + /* nzdiag = amd_Info [AMD_NZDIAG] counts the zero entries of S too */ + + /* done using Ci as workspace to sort S into R ] */ + +#ifndef NDEBUG + for (k = 0 ; k < n2 ; k++) + { + ASSERT (Sdeg [k] >= 0 && Sdeg [k] < n2) ; + } + ASSERT (Sp [n2] - n2 <= nzaat && nzaat <= 2 * Sp [n2]) ; + DEBUG0 (("Explicit zeros: "ID" %g\n", nzdiag, amd_Info [AMD_NZDIAG])) ; +#endif + + } + + /* get statistics from amd_aat, if computed */ + Symbolic->sym = sym ; + Symbolic->nzaat = nzaat ; + Symbolic->nzdiag = nzdiag ; + Symbolic->amd_dmax = EMPTY ; + + Info [UMFPACK_PATTERN_SYMMETRY] = sym ; + Info [UMFPACK_NZ_A_PLUS_AT] = nzaat ; + Info [UMFPACK_NZDIAG] = nzdiag ; + + /* ---------------------------------------------------------------------- */ + /* determine the initial strategy based on symmetry and nnz (diag (S)) */ + /* ---------------------------------------------------------------------- */ + + if (strategy == UMFPACK_STRATEGY_AUTO) + { + if (sym < 0.10) + { + /* highly unsymmetric: use the unsymmetric strategy */ + strategy = UMFPACK_STRATEGY_UNSYMMETRIC ; + DEBUGm4 (("Strategy: select unsymmetric\n")) ; + } + else if (sym >= 0.7 && nzdiag == n2) + { + /* mostly symmetric, zero-free diagonal: use symmetric strategy */ + strategy = UMFPACK_STRATEGY_SYMMETRIC ; + DEBUGm4 (("Strategy: select symmetric\n")) ; + } + else + { + /* Evaluate the symmetric 2-by-2 strategy, and select it, or + * the unsymmetric strategy if the 2-by-2 strategy doesn't look + * promising. */ + strategy = UMFPACK_STRATEGY_2BY2 ; + DEBUGm4 (("Strategy: try 2-by-2\n")) ; + } + } + + /* ---------------------------------------------------------------------- */ + /* try the 2-by-2 strategy */ + /* ---------------------------------------------------------------------- */ + + /* (3) If the 2-by-2 strategy is attempted, additional workspace of size + * nn integers and nn double's is allocated, where nn = n_row = n_col. + * The real workspace is immediately free'd. The integer workspace of + * size nn remains until the end of umfpack_qsymbolic. */ + + /* If the resulting matrix S (Rperm_2by2, :) is too unsymmetric, then the + * unsymmetric strategy will be used instead. */ + + if (strategy == UMFPACK_STRATEGY_2BY2) + { + double sym2 ; + Int *Blen, *W, nz_papat, nzd2, nweak, unmatched, Clen3 ; + + /* ------------------------------------------------------------------ */ + /* get workspace for UMF_2by2 */ + /* ------------------------------------------------------------------ */ + + ASSERT (n_row == n_col && nn == n_row) ; + +#ifndef NDEBUG + for (k = 0 ; k < n2 ; k++) + { + ASSERT (Sdeg [k] >= 0 && Sdeg [k] < n2) ; + } +#endif + + /* allocate Rperm_2by2 */ + SW->Rperm_2by2 = (Int *) UMF_malloc (nn, sizeof (Int)) ; + Rperm_2by2 = SW->Rperm_2by2 ; + if (Rperm_2by2 == (Int *) NULL) + { + DEBUGm4 (("out of memory: Rperm_2by2\n")) ; + Info [UMFPACK_STATUS] = UMFPACK_ERROR_out_of_memory ; + error (&Symbolic, SW) ; + return (UMFPACK_ERROR_out_of_memory) ; + } + + /* allocate Ri from the tail end of Ci [ */ + Clen3 = Clen - (MAX (nn, nz) + 1) ; + Ri = Ci + Clen3 ; + ASSERT (Clen3 >= nz) ; /* space required for UMF_2by2 */ + + /* use Fr_* as workspace for Rp, Blen, and W [ */ + Rp = Fr_npivcol ; + Blen = Fr_ncols ; + W = Fr_cols ; + + if (scale != UMFPACK_SCALE_NONE) + { + SW->Rs = (double *) UMF_malloc (nn, sizeof (double)) ; + if (SW->Rs == (double *) NULL) + { + DEBUGm4 (("out of memory: scale factors for 2-by-2\n")) ; + Info [UMFPACK_STATUS] = UMFPACK_ERROR_out_of_memory ; + error (&Symbolic, SW) ; + return (UMFPACK_ERROR_out_of_memory) ; + } + } + + /* ------------------------------------------------------------------ */ + /* find the 2-by-2 row permutation */ + /* ------------------------------------------------------------------ */ + + /* find a row permutation Rperm_2by2 such that S (Rperm_2by2, :) + * has a healthy diagonal */ + + UMF_2by2 (nn, Ap, Ai, Ax, +#ifdef COMPLEX + Az, +#endif + tol, scale, Cperm1, +#ifndef NDEBUG + Rperm1, +#endif + InvRperm1, n1, nempty, Sdeg, Rperm_2by2, &nweak, &unmatched, + Ri, Rp, SW->Rs, Blen, W, Ci, Wq) ; + DEBUGm3 (("2by2: nweak "ID" unmatched "ID"\n", nweak, unmatched)) ; + Info [UMFPACK_2BY2_NWEAK] = nweak ; + Info [UMFPACK_2BY2_UNMATCHED] = unmatched ; + + SW->Rs = (double *) UMF_free ((void *) SW->Rs) ; + + /* R = S (Rperm_2by2,:)' */ + (void) UMF_transpose (n2, n2, Sp, Si, (double *) NULL, Rperm_2by2, + (Int *) NULL, 0, Rp, Ri, (double *) NULL, W, FALSE +#ifdef COMPLEX + , (double *) NULL, (double *) NULL, FALSE +#endif + ) ; + ASSERT (AMD_valid (n2, n2, Rp, Ri)) ; + + /* contents of Si and Sp no longer needed, but the space is + * still needed */ + + /* ------------------------------------------------------------------ */ + /* find symmetry of S (Rperm_2by2, :)', and prepare to order with AMD */ + /* ------------------------------------------------------------------ */ + + for (i = 0 ; i < AMD_INFO ; i++) + { + amd_Info [i] = EMPTY ; + } + nz_papat = AMD_aat (n2, Rp, Ri, Sdeg, Wq, amd_Info) ; + sym2 = amd_Info [AMD_SYMMETRY] ; + nzd2 = amd_Info [AMD_NZDIAG] ; + + Info [UMFPACK_2BY2_PATTERN_SYMMETRY] = sym2 ; + Info [UMFPACK_2BY2_NZ_PA_PLUS_PAT] = nz_papat ; + Info [UMFPACK_2BY2_NZDIAG] = nzd2 ; + + DEBUG0 (("2by2: sym2 %g nzd2 "ID" n2 "ID"\n", sym2, nzd2, n2)) ; + + /* ------------------------------------------------------------------ */ + /* evaluate the 2-by-2 results */ + /* ------------------------------------------------------------------ */ + + if (user_auto_strategy) + { + if ((sym2 > 1.1 * sym) && (nzd2 > 0.9 * n2)) + { + /* 2-by-2 made it much more symmetric */ + DEBUGm4 (("eval Strategy 2by2: much more symmetric: 2by2\n")) ; + strategy = UMFPACK_STRATEGY_2BY2 ; + } + else if (sym2 < 0.7 * sym) + { + /* 2-by-2 made it much more unsymmetric */ + DEBUGm4 (("eval Strategy 2by2: much more UNsymmetric:unsym\n")); + strategy = UMFPACK_STRATEGY_UNSYMMETRIC ; + } + else if (sym2 < 0.25) + { + DEBUGm4 (("eval Strategy 2by2: is UNsymmetric: unsym\n")); + strategy = UMFPACK_STRATEGY_UNSYMMETRIC ; + } + else if (sym2 >= 0.51) + { + DEBUGm4 (("eval Strategy 2by2: sym2 >= 0.51: 2by2\n")) ; + strategy = UMFPACK_STRATEGY_2BY2 ; + } + else if (sym2 >= 0.999 * sym) + { + /* 2-by-2 improved symmetry, or made it only slightly worse */ + DEBUGm4 (("eval Strategy 2by2: sym2 >= 0.999 sym: 2by2\n")) ; + strategy = UMFPACK_STRATEGY_2BY2 ; + } + else + { + /* can't decide what to do, so pick the unsymmetric strategy */ + DEBUGm4 (("eval Strategy 2by2: punt: unsym\n")); + strategy = UMFPACK_STRATEGY_UNSYMMETRIC ; + } + } + + /* ------------------------------------------------------------------ */ + /* if the 2-by-2 strategy is selected: */ + /* ------------------------------------------------------------------ */ + + if (strategy == UMFPACK_STRATEGY_2BY2) + { + if (Quser == (Int *) NULL) + { + /* 2-by-2 strategy is successful */ + /* compute amd (S) */ + Int *Qinv = Fr_npivcol ; + ASSERT (Clen3 >= (nz_papat + nz_papat/5 + nn) + 7*nn) ; + do_amd (n2, Rp, Ri, Wq, Qinv, Sdeg, Clen3, Ci, + amd_Control, amd_Info, Symbolic, Info) ; + /* combine the singleton ordering and the AMD ordering */ + combine_ordering (n1, nempty, nn, Cperm_init, Cperm1, Qinv) ; + } + /* fix Rperm_2by2 to reflect A, not S */ + for (k = 0 ; k < n1 ; k++) + { + oldcol = Cperm1 [k] ; + i = k ; + oldrow = Rperm1 [k] ; + W [oldcol] = oldrow ; + } + for (k = n1 ; k < nn - nempty ; k++) + { + oldcol = Cperm1 [k] ; + i = Rperm_2by2 [k - n1] + n1 ; + oldrow = Rperm1 [i] ; + W [oldcol] = oldrow ; + } + for (k = nn - nempty ; k < nn ; k++) + { + oldcol = Cperm1 [k] ; + i = k ; + oldrow = Rperm1 [k] ; + W [oldcol] = oldrow ; + } + for (k = 0 ; k < nn ; k++) + { + Rperm_2by2 [k] = W [k] ; + } + + /* Now, the "diagonal" entry in oldcol (where oldcol is the user's + * name for a column, is the entry in row oldrow (where oldrow is + * the user's name for a row, and oldrow = Rperm_2by2 [oldcol] */ + } + + /* Fr_* no longer needed for Rp, Blen, W ] */ + } + + /* ---------------------------------------------------------------------- */ + /* finalize the strategy, including fixQ and prefer_diagonal */ + /* ---------------------------------------------------------------------- */ + + if (strategy == UMFPACK_STRATEGY_SYMMETRIC) + { + /* use given Quser or AMD (A+A'), fix Q during factorization, + * prefer diagonal */ + DEBUG0 (("\nStrategy: symmetric\n")) ; + ASSERT (n_row == n_col) ; + Symbolic->ordering = UMFPACK_ORDERING_AMD ; + fixQ = TRUE ; + prefer_diagonal = TRUE ; + } + else if (strategy == UMFPACK_STRATEGY_2BY2) + { + /* use Q = given Quser or Q = AMD (PA+PA'), fix Q during factorization, + * prefer diagonal, and factorize PAQ, where P is found by UMF_2by2. */ + DEBUG0 (("\nStrategy: symmetric 2-by-2\n")) ; + ASSERT (n_row == n_col) ; + Symbolic->ordering = UMFPACK_ORDERING_AMD ; + fixQ = TRUE ; + prefer_diagonal = TRUE ; + } + else + { + /* use given Quser or COLAMD (A), refine Q during factorization, + * no diagonal preference */ + ASSERT (strategy == UMFPACK_STRATEGY_UNSYMMETRIC) ; + DEBUG0 (("\nStrategy: unsymmetric\n")) ; + Symbolic->ordering = UMFPACK_ORDERING_COLAMD ; + fixQ = FALSE ; + prefer_diagonal = FALSE ; + } + + if (Quser != (Int *) NULL) + { + Symbolic->ordering = UMFPACK_ORDERING_GIVEN ; + } + + if (force_fixQ > 0) + { + fixQ = TRUE ; + DEBUG0 (("Force fixQ true\n")) ; + } + else if (force_fixQ < 0) + { + fixQ = FALSE ; + DEBUG0 (("Force fixQ false\n")) ; + } + + DEBUG0 (("Strategy: ordering: "ID"\n", Symbolic->ordering)) ; + DEBUG0 (("Strategy: fixQ: "ID"\n", fixQ)) ; + DEBUG0 (("Strategy: prefer diag "ID"\n", prefer_diagonal)) ; + + /* get statistics from amd_aat, if computed */ + Symbolic->strategy = strategy ; + Symbolic->fixQ = fixQ ; + Symbolic->prefer_diagonal = prefer_diagonal ; + + Info [UMFPACK_STRATEGY_USED] = strategy ; + Info [UMFPACK_ORDERING_USED] = Symbolic->ordering ; + Info [UMFPACK_QFIXED] = fixQ ; + Info [UMFPACK_DIAG_PREFERRED] = prefer_diagonal ; + + /* ---------------------------------------------------------------------- */ + /* get the AMD ordering for the symmetric strategy */ + /* ---------------------------------------------------------------------- */ + + if (strategy == UMFPACK_STRATEGY_SYMMETRIC && Quser == (Int *) NULL) + { + /* symmetric strategy for a matrix with mostly symmetric pattern */ + Int *Qinv = Fr_npivcol ; + ASSERT (n_row == n_col && nn == n_row) ; + ASSERT (Clen >= (nzaat + nzaat/5 + nn) + 7*nn) ; + do_amd (n2, Sp, Si, Wq, Qinv, Sdeg, Clen, Ci, + amd_Control, amd_Info, Symbolic, Info) ; + /* combine the singleton ordering and the AMD ordering */ + combine_ordering (n1, nempty, nn, Cperm_init, Cperm1, Qinv) ; + } + /* Sdeg no longer needed ] */ + /* done using Rperm_init as workspace for Wq ] */ + + /* Contents of Si and Sp no longer needed, but the space is still needed */ + + /* ---------------------------------------------------------------------- */ + /* use the user's input column ordering (already in Cperm1) */ + /* ---------------------------------------------------------------------- */ + + if (Quser != (Int *) NULL) + { + for (k = 0 ; k < n_col ; k++) + { + Cperm_init [k] = Cperm1 [k] ; + } + } + + /* ---------------------------------------------------------------------- */ + /* use COLAMD to order the matrix */ + /* ---------------------------------------------------------------------- */ + + if (strategy == UMFPACK_STRATEGY_UNSYMMETRIC && Quser == (Int *) NULL) + { + + /* ------------------------------------------------------------------ */ + /* copy the matrix into colamd workspace (colamd destroys its input) */ + /* ------------------------------------------------------------------ */ + + /* C = A (Cperm1 (n1+1:end), Rperm1 (n1+1:end)), where Ci is used as + * the row indices and Cperm_init (on input) is used as the column + * pointers. */ + + (void) prune_singletons (n1, n_col, Ap, Ai, + (double *) NULL, +#ifdef COMPLEX + (double *) NULL, +#endif + Cperm1, InvRperm1, Ci, Cperm_init +#ifndef NDEBUG + , Rperm1, n_row +#endif + ) ; + + /* ------------------------------------------------------------------ */ + /* set UMF_colamd defaults */ + /* ------------------------------------------------------------------ */ + + UMF_colamd_set_defaults (knobs) ; + knobs [COLAMD_DENSE_ROW] = drow ; + knobs [COLAMD_DENSE_COL] = dcol ; + knobs [COLAMD_AGGRESSIVE] = aggressive ; + + /* ------------------------------------------------------------------ */ + /* check input matrix and find the initial column pre-ordering */ + /* ------------------------------------------------------------------ */ + + /* NOTE: umf_colamd is not given any original empty rows or columns. + * Those have already been removed via prune_singletons, above. The + * umf_colamd routine has been modified to assume that all rows and + * columns have at least one entry in them. It will break if it is + * given empty rows or columns (an assertion is triggered when running + * in debug mode. */ + + (void) UMF_colamd ( + n_row - n1 - nempty_row, + n_col - n1 - nempty_col, + Clen, Ci, Cperm_init, knobs, colamd_stats, + Fr_npivcol, Fr_nrows, Fr_ncols, Fr_parent, Fr_cols, &nfr, + InFront) ; + ASSERT (colamd_stats [COLAMD_EMPTY_ROW] == 0) ; + ASSERT (colamd_stats [COLAMD_EMPTY_COL] == 0) ; + + /* # of dense rows will be recomputed below */ + Info [UMFPACK_NDENSE_ROW] = colamd_stats [COLAMD_DENSE_ROW] ; + Info [UMFPACK_NDENSE_COL] = colamd_stats [COLAMD_DENSE_COL] ; + Info [UMFPACK_SYMBOLIC_DEFRAG] = colamd_stats [COLAMD_DEFRAG_COUNT] ; + + /* re-analyze if any "dense" rows or cols ignored by UMF_colamd */ + do_UMF_analyze = + colamd_stats [COLAMD_DENSE_ROW] > 0 || + colamd_stats [COLAMD_DENSE_COL] > 0 ; + + /* Combine the singleton and colamd ordering into Cperm_init */ + /* Note that colamd returns its inverse permutation in Ci */ + combine_ordering (n1, nempty_col, n_col, Cperm_init, Cperm1, Ci) ; + + /* contents of Ci no longer needed */ + +#ifndef NDEBUG + for (col = 0 ; col < n_col ; col++) + { + DEBUG1 (("Cperm_init ["ID"] = "ID"\n", col, Cperm_init[col])); + } + /* make sure colamd returned a valid permutation */ + ASSERT (Cperm_init != (Int *) NULL) ; + ASSERT (UMF_is_permutation (Cperm_init, Ci, n_col, n_col)) ; +#endif + + } + else + { + + /* ------------------------------------------------------------------ */ + /* do not call colamd - use input Quser or AMD instead */ + /* ------------------------------------------------------------------ */ + + /* The ordering (Quser or Qamd) is already in Cperm_init */ + do_UMF_analyze = TRUE ; + + } + + Cperm_init [n_col] = EMPTY ; /* unused in Cperm_init */ + + /* ---------------------------------------------------------------------- */ + /* AMD ordering, if it exists, has been copied into Cperm_init */ + /* ---------------------------------------------------------------------- */ + +#ifndef NDEBUG + DEBUG3 (("Cperm_init column permutation:\n")) ; + ASSERT (UMF_is_permutation (Cperm_init, Ci, n_col, n_col)) ; + for (k = 0 ; k < n_col ; k++) + { + DEBUG3 ((ID"\n", Cperm_init [k])) ; + } + /* ensure that empty columns have been placed last in A (:,Cperm_init) */ + for (newj = 0 ; newj < n_col ; newj++) + { + /* empty columns will be last in A (:, Cperm_init (1:n_col)) */ + j = Cperm_init [newj] ; + ASSERT (IMPLIES (newj >= n_col-nempty_col, Cdeg [j] == 0)) ; + ASSERT (IMPLIES (newj < n_col-nempty_col, Cdeg [j] > 0)) ; + } +#endif + + /* ---------------------------------------------------------------------- */ + /* symbolic factorization (unless colamd has already done it) */ + /* ---------------------------------------------------------------------- */ + + if (do_UMF_analyze) + { + + Int *W, *Bp, *Bi, *Cperm2, ok, *P, Clen2, bsize, Clen0 ; + + /* ------------------------------------------------------------------ */ + /* construct column pre-ordered, pruned submatrix */ + /* ------------------------------------------------------------------ */ + + /* S = column form submatrix after removing singletons and applying + * initial column ordering (includes singleton ordering) */ + (void) prune_singletons (n1, n_col, Ap, Ai, + (double *) NULL, +#ifdef COMPLEX + (double *) NULL, +#endif + Cperm_init, InvRperm1, Si, Sp +#ifndef NDEBUG + , Rperm1, n_row +#endif + ) ; + + /* ------------------------------------------------------------------ */ + /* Ci [0 .. Clen-1] holds the following work arrays: + + first Clen0 entries empty space, where Clen0 = + Clen - (nn+1 + 2*nn + n_col) + and Clen0 >= nz + n_col + next nn+1 entries Bp [0..nn] + next nn entries Link [0..nn-1] + next nn entries W [0..nn-1] + last n_col entries Cperm2 [0..n_col-1] + + We have Clen >= n_col + MAX (nz,n_col) + 3*nn+1 + n_col, + So Clen0 >= 2*n_col as required for AMD_postorder + and Clen0 >= n_col + nz as required + */ + + Clen0 = Clen - (nn+1 + 2*nn + n_col) ; + Bp = Ci + Clen0 ; + Link = Bp + (nn+1) ; + W = Link + nn ; + Cperm2 = W + nn ; + ASSERT (Cperm2 + n_col == Ci + Clen) ; + ASSERT (Clen0 >= nz + n_col) ; + ASSERT (Clen0 >= 2*n_col) ; + + /* ------------------------------------------------------------------ */ + /* P = order that rows will be used in UMF_analyze */ + /* ------------------------------------------------------------------ */ + + /* use W to mark rows, and use Link for row permutation P [ [ */ + for (row = 0 ; row < n_row - n1 ; row++) + { + W [row] = FALSE ; + } + P = Link ; + + k = 0 ; + + for (col = 0 ; col < n_col - n1 ; col++) + { + /* empty columns are last in S */ + for (p = Sp [col] ; p < Sp [col+1] ; p++) + { + row = Si [p] ; + if (!W [row]) + { + /* this row has just been seen for the first time */ + W [row] = TRUE ; + P [k++] = row ; + } + } + } + + /* If the matrix has truly empty rows, then P will not be */ + /* complete, and visa versa. The matrix is structurally singular. */ + nempty_row = n_row - n1 - k ; + if (k < n_row - n1) + { + /* complete P by putting empty rows last in their natural order, */ + /* rather than declaring an error (the matrix is singular) */ + for (row = 0 ; row < n_row - n1 ; row++) + { + if (!W [row]) + { + /* W [row] = TRUE ; (not required) */ + P [k++] = row ; + } + } + } + + /* contents of W no longer needed ] */ + +#ifndef NDEBUG + DEBUG3 (("Induced row permutation:\n")) ; + ASSERT (k == n_row - n1) ; + ASSERT (UMF_is_permutation (P, W, n_row - n1, n_row - n1)) ; + for (k = 0 ; k < n_row - n1 ; k++) + { + DEBUG3 ((ID"\n", P [k])) ; + } +#endif + + /* ------------------------------------------------------------------ */ + /* B = row-form of the pattern of S (excluding empty columns) */ + /* ------------------------------------------------------------------ */ + + /* Ci [0 .. Clen-1] holds the following work arrays: + + first Clen2 entries empty space, must be at least >= n_col + next max (nz,1) Bi [0..max (nz,1)-1] + next nn+1 entries Bp [0..nn] + next nn entries Link [0..nn-1] + next nn entries W [0..nn-1] + last n_col entries Cperm2 [0..n_col-1] + + This memory usage is accounted for by the UMF_ANALYZE_CLEN + macro. + */ + + Clen2 = Clen0 ; + snz = Sp [n_col - n1] ; + bsize = MAX (snz, 1) ; + Clen2 -= bsize ; + Bi = Ci + Clen2 ; + ASSERT (Clen2 >= n_col) ; + + (void) UMF_transpose (n_row - n1, n_col - n1 - nempty_col, + Sp, Si, (double *) NULL, + P, (Int *) NULL, 0, Bp, Bi, (double *) NULL, W, FALSE +#ifdef COMPLEX + , (double *) NULL, (double *) NULL, FALSE +#endif + ) ; + + /* contents of Si and Sp no longer needed */ + + /* contents of P (same as Link) and W not needed */ + /* still need Link and W as work arrays, though ] */ + + ASSERT (Bp [0] == 0) ; + ASSERT (Bp [n_row - n1] == snz) ; + + /* increment Bp to point into Ci, not Bi */ + for (i = 0 ; i <= n_row - n1 ; i++) + { + Bp [i] += Clen2 ; + } + ASSERT (Bp [0] == Clen0 - bsize) ; + ASSERT (Bp [n_row - n1] <= Clen0) ; + + /* Ci [0 .. Clen-1] holds the following work arrays: + + first Clen0 entries Ci [0 .. Clen0-1], where the col indices + of B are at the tail end of this part, + and Bp [0] = Clen2 >= n_col. Note + that Clen0 = Clen2 + max (snz,1). + next nn+1 entries Bp [0..nn] + next nn entries Link [0..nn-1] + next nn entries W [0..nn-1] + last n_col entries Cperm2 [0..n_col-1] + */ + + /* ------------------------------------------------------------------ */ + /* analyze */ + /* ------------------------------------------------------------------ */ + + /* only analyze the non-empty, non-singleton part of the matrix */ + ok = UMF_analyze ( + n_row - n1 - nempty_row, + n_col - n1 - nempty_col, + Ci, Bp, Cperm2, fixQ, W, Link, + Fr_ncols, Fr_nrows, Fr_npivcol, + Fr_parent, &nfr, &analyze_compactions) ; + if (!ok) + { + /* :: internal error in umf_analyze :: */ + Info [UMFPACK_STATUS] = UMFPACK_ERROR_internal_error ; + error (&Symbolic, SW) ; + return (UMFPACK_ERROR_internal_error) ; + } + Info [UMFPACK_SYMBOLIC_DEFRAG] += analyze_compactions ; + + /* ------------------------------------------------------------------ */ + /* combine the input permutation and UMF_analyze's permutation */ + /* ------------------------------------------------------------------ */ + + if (!fixQ) + { + /* Cperm2 is the column etree post-ordering */ + ASSERT (UMF_is_permutation (Cperm2, W, + n_col-n1-nempty_col, n_col-n1-nempty_col)) ; + + /* Note that the empty columns remain at the end of Cperm_init */ + for (k = 0 ; k < n_col - n1 - nempty_col ; k++) + { + W [k] = Cperm_init [n1 + Cperm2 [k]] ; + } + + for (k = 0 ; k < n_col - n1 - nempty_col ; k++) + { + Cperm_init [n1 + k] = W [k] ; + } + } + + ASSERT (UMF_is_permutation (Cperm_init, W, n_col, n_col)) ; + + } + + /* ---------------------------------------------------------------------- */ + /* free some of the workspace */ + /* ---------------------------------------------------------------------- */ + + /* (4) The real workspace, Rs, of size n_row doubles has already been + * free'd. An additional workspace of size nz + n_col+1 + n_col integers + * is now free'd as well. */ + + SW->Si = (Int *) UMF_free ((void *) SW->Si) ; + SW->Sp = (Int *) UMF_free ((void *) SW->Sp) ; + SW->Cperm1 = (Int *) UMF_free ((void *) SW->Cperm1) ; + ASSERT (SW->Rs == (double *) NULL) ; + + /* ---------------------------------------------------------------------- */ + /* determine the size of the Symbolic object */ + /* ---------------------------------------------------------------------- */ + + /* ---------------------------------------------------------------------- */ + /* determine the size of the Symbolic object */ + /* ---------------------------------------------------------------------- */ + + nchains = 0 ; + for (i = 0 ; i < nfr ; i++) + { + if (Fr_parent [i] != i+1) + { + nchains++ ; + } + } + + Symbolic->nchains = nchains ; + Symbolic->nfr = nfr ; + Symbolic->esize + = (max_rdeg > dense_row_threshold) ? (n_col - n1 - nempty_col) : 0 ; + + /* true size of Symbolic object */ + Info [UMFPACK_SYMBOLIC_SIZE] = UMF_symbolic_usage (n_row, n_col, nchains, + nfr, Symbolic->esize, prefer_diagonal) ; + + /* actual peak memory usage for UMFPACK_symbolic (actual nfr, nchains) */ + Info [UMFPACK_SYMBOLIC_PEAK_MEMORY] = + SYM_WORK_USAGE (n_col, n_row, Clen) + Info [UMFPACK_SYMBOLIC_SIZE] ; + Symbolic->peak_sym_usage = Info [UMFPACK_SYMBOLIC_PEAK_MEMORY] ; + + DEBUG0 (("Number of fronts: "ID"\n", nfr)) ; + + /* ---------------------------------------------------------------------- */ + /* allocate the second part of the Symbolic object (Front_*, Chain_*) */ + /* ---------------------------------------------------------------------- */ + + /* (5) UMF_malloc is called 7 or 8 times, for a total space of + * (4*(nfr+1) + 3*(nchains+1) + esize) integers, where nfr is the total + * number of frontal matrices and nchains is the total number of frontal + * matrix chains, and where nchains <= nfr <= n_col. esize is zero if there + * are no dense rows, or n_col-n1-nempty_col otherwise (n1 is the number of + * singletons and nempty_col is the number of empty columns). This space is + * part of the Symbolic object and is not free'd unless an error occurs. + * This is between 7 and about 8n integers when A is square. + */ + + /* Note that Symbolic->Front_* does include the dummy placeholder front */ + Symbolic->Front_npivcol = (Int *) UMF_malloc (nfr+1, sizeof (Int)) ; + Symbolic->Front_parent = (Int *) UMF_malloc (nfr+1, sizeof (Int)) ; + Symbolic->Front_1strow = (Int *) UMF_malloc (nfr+1, sizeof (Int)) ; + Symbolic->Front_leftmostdesc = (Int *) UMF_malloc (nfr+1, sizeof (Int)) ; + Symbolic->Chain_start = (Int *) UMF_malloc (nchains+1, sizeof (Int)) ; + Symbolic->Chain_maxrows = (Int *) UMF_malloc (nchains+1, sizeof (Int)) ; + Symbolic->Chain_maxcols = (Int *) UMF_malloc (nchains+1, sizeof (Int)) ; + + fail = (!Symbolic->Front_npivcol || !Symbolic->Front_parent || + !Symbolic->Front_1strow || !Symbolic->Front_leftmostdesc || + !Symbolic->Chain_start || !Symbolic->Chain_maxrows || + !Symbolic->Chain_maxcols) ; + + if (Symbolic->esize > 0) + { + Symbolic->Esize = (Int *) UMF_malloc (Symbolic->esize, sizeof (Int)) ; + fail = fail || !Symbolic->Esize ; + } + + if (fail) + { + DEBUGm4 (("out of memory: rest of symbolic object\n")) ; + Info [UMFPACK_STATUS] = UMFPACK_ERROR_out_of_memory ; + error (&Symbolic, SW) ; + return (UMFPACK_ERROR_out_of_memory) ; + } + DEBUG0 (("Symbolic UMF_malloc_count - init_count = "ID"\n", + UMF_malloc_count - init_count)) ; + ASSERT (UMF_malloc_count == init_count + 21 + + (SW->Rperm_2by2 != (Int *) NULL) + + (Symbolic->Esize != (Int *) NULL)) ; + + Front_npivcol = Symbolic->Front_npivcol ; + Front_parent = Symbolic->Front_parent ; + Front_1strow = Symbolic->Front_1strow ; + Front_leftmostdesc = Symbolic->Front_leftmostdesc ; + + Chain_start = Symbolic->Chain_start ; + Chain_maxrows = Symbolic->Chain_maxrows ; + Chain_maxcols = Symbolic->Chain_maxcols ; + + Esize = Symbolic->Esize ; + + /* ---------------------------------------------------------------------- */ + /* assign rows to fronts */ + /* ---------------------------------------------------------------------- */ + + /* find InFront, unless colamd has already computed it */ + if (do_UMF_analyze) + { + + DEBUGm4 ((">>>>>>>>>Computing Front_1strow from scratch\n")) ; + /* empty rows go to dummy front nfr */ + for (row = 0 ; row < n_row ; row++) + { + InFront [row] = nfr ; + } + /* assign the singleton pivot rows to the "empty" front */ + for (k = 0 ; k < n1 ; k++) + { + row = Rperm1 [k] ; + InFront [row] = EMPTY ; + } + DEBUG1 (("Front (EMPTY), singleton nrows "ID" ncols "ID"\n", k, k)) ; + newj = n1 ; + for (i = 0 ; i < nfr ; i++) + { + fpivcol = Fr_npivcol [i] ; + f1rows = 0 ; + /* for all pivot columns in front i */ + for (kk = 0 ; kk < fpivcol ; kk++, newj++) + { + j = Cperm_init [newj] ; + ASSERT (IMPLIES (newj >= n_col-nempty_col, + Ap [j+1] - Ap [j] == 0)); + for (p = Ap [j] ; p < Ap [j+1] ; p++) + { + row = Ai [p] ; + if (InFront [row] == nfr) + { + /* this row belongs to front i */ + DEBUG1 ((" Row "ID" in Front "ID"\n", row, i)) ; + InFront [row] = i ; + f1rows++ ; + } + } + } + Front_1strow [i] = f1rows ; + DEBUG1 ((" Front "ID" has 1strows: "ID" pivcols "ID"\n", + i, f1rows, fpivcol)) ; + } + + } + else + { + + /* COLAMD has already computed InFront, but it is not yet + * InFront [row] = front i, where row is an original row. It is + * InFront [k-n1] = i for k in the range n1 to n_row-nempty_row, + * and where row = Rperm1 [k]. Need to permute InFront. Also compute + * # of original rows assembled into each front. + * [ use Ci as workspace */ + DEBUGm4 ((">>>>>>>>>Computing Front_1strow from colamd's InFront\n")) ; + for (i = 0 ; i <= nfr ; i++) + { + Front_1strow [i] = 0 ; + } + /* assign the singleton pivot rows to "empty" front */ + for (k = 0 ; k < n1 ; k++) + { + row = Rperm1 [k] ; + Ci [row] = EMPTY ; + } + /* assign the non-empty rows to the front that assembled them */ + for ( ; k < n_row - nempty_row ; k++) + { + row = Rperm1 [k] ; + i = InFront [k - n1] ; + ASSERT (i >= EMPTY && i < nfr) ; + if (i != EMPTY) + { + Front_1strow [i]++ ; + } + /* use Ci as permuted version of InFront */ + Ci [row] = i ; + } + /* empty rows go to the "dummy" front */ + for ( ; k < n_row ; k++) + { + row = Rperm1 [k] ; + Ci [row] = nfr ; + } + /* permute InFront so that InFront [row] = i if the original row is + * in front i */ + for (row = 0 ; row < n_row ; row++) + { + InFront [row] = Ci [row] ; + } + /* ] no longer need Ci as workspace */ + } + +#ifndef NDEBUG + for (row = 0 ; row < n_row ; row++) + { + if (InFront [row] == nfr) + { + DEBUG1 ((" Row "ID" in Dummy Front "ID"\n", row, nfr)) ; + } + else if (InFront [row] == EMPTY) + { + DEBUG1 ((" singleton Row "ID"\n", row)) ; + } + else + { + DEBUG1 ((" Row "ID" in Front "ID"\n", row, nfr)) ; + } + } + for (i = 0 ; i <= nfr ; i++) + { + DEBUG1 (("Front "ID" has 1strows: "ID" pivcols "ID"\n", + i, f1rows, fpivcol)) ; + } +#endif + + /* ---------------------------------------------------------------------- */ + /* copy front information into Symbolic object */ + /* ---------------------------------------------------------------------- */ + + k = n1 ; + for (i = 0 ; i < nfr ; i++) + { + fpivcol = Fr_npivcol [i] ; + DEBUG1 (("Front "ID" k "ID" npivcol "ID" nrows "ID" ncols "ID"\n", + i, k, fpivcol, Fr_nrows [i], Fr_ncols [i])) ; + k += fpivcol ; + /* copy Front info into Symbolic object from SW */ + Front_npivcol [i] = fpivcol ; + Front_parent [i] = Fr_parent [i] ; + } + + /* assign empty columns to dummy placehold front nfr */ + DEBUG1 (("Dummy Cols in Front "ID" : "ID"\n", nfr, n_col-k)) ; + Front_npivcol [nfr] = n_col - k ; + Front_parent [nfr] = EMPTY ; + + /* ---------------------------------------------------------------------- */ + /* find initial row permutation */ + /* ---------------------------------------------------------------------- */ + + /* order the singleton pivot rows */ + for (k = 0 ; k < n1 ; k++) + { + Rperm_init [k] = Rperm1 [k] ; + } + + /* determine the first row in each front (in the new row ordering) */ + for (i = 0 ; i < nfr ; i++) + { + f1rows = Front_1strow [i] ; + DEBUG1 (("Front "ID" : npivcol "ID" parent "ID, + i, Front_npivcol [i], Front_parent [i])) ; + DEBUG1 ((" 1st rows in Front "ID" : "ID"\n", i, f1rows)) ; + Front_1strow [i] = k ; + k += f1rows ; + } + + /* assign empty rows to dummy placehold front nfr */ + DEBUG1 (("Rows in Front "ID" (dummy): "ID"\n", nfr, n_row-k)) ; + Front_1strow [nfr] = k ; + DEBUG1 (("nfr "ID" 1strow[nfr] "ID" nrow "ID"\n", nfr, k, n_row)) ; + + /* Use Ci as temporary workspace for F1 */ + F1 = Ci ; /* [ of size nfr+1 */ + ASSERT (Clen >= 2*n_row + nfr+1) ; + + for (i = 0 ; i <= nfr ; i++) + { + F1 [i] = Front_1strow [i] ; + } + + for (row = 0 ; row < n_row ; row++) + { + i = InFront [row] ; + if (i != EMPTY) + { + newrow = F1 [i]++ ; + ASSERT (newrow >= n1) ; + Rperm_init [newrow] = row ; + } + } + Rperm_init [n_row] = EMPTY ; /* unused */ + +#ifndef NDEBUG + for (k = 0 ; k < n_row ; k++) + { + DEBUG2 (("Rperm_init ["ID"] = "ID"\n", k, Rperm_init [k])) ; + } +#endif + + /* ] done using F1 */ + + /* ---------------------------------------------------------------------- */ + /* find the diagonal map */ + /* ---------------------------------------------------------------------- */ + + /* Rperm_init [newrow] = row gives the row permutation that is implied + * by the column permutation, where "row" is a row index of the original + * matrix A. It is not dependent on the Rperm_2by2 permutation, which + * only redefines the "diagonal". Both are used to construct the + * Diagonal_map. Diagonal_map only needs to be defined for + * k = n1 to nn - nempty, but go ahead and define it for all of + * k = 0 to nn */ + + if (prefer_diagonal) + { + Int *Diagonal_map ; + ASSERT (n_row == n_col && nn == n_row) ; + ASSERT (nempty_row == nempty_col && nempty == nempty_row) ; + + /* allocate the Diagonal_map */ + Symbolic->Diagonal_map = (Int *) UMF_malloc (n_col+1, sizeof (Int)) ; + Diagonal_map = Symbolic->Diagonal_map ; + if (Diagonal_map == (Int *) NULL) + { + /* :: out of memory (diagonal map) :: */ + DEBUGm4 (("out of memory: Diagonal map\n")) ; + Info [UMFPACK_STATUS] = UMFPACK_ERROR_out_of_memory ; + error (&Symbolic, SW) ; + return (UMFPACK_ERROR_out_of_memory) ; + } + + /* use Ci as workspace to compute the inverse of Rperm_init [ */ + for (newrow = 0 ; newrow < nn ; newrow++) + { + oldrow = Rperm_init [newrow] ; + ASSERT (oldrow >= 0 && oldrow < nn) ; + Ci [oldrow] = newrow ; + } + if (strategy == UMFPACK_STRATEGY_2BY2) + { + ASSERT (Rperm_2by2 != (Int *) NULL) ; + for (newcol = 0 ; newcol < nn ; newcol++) + { + oldcol = Cperm_init [newcol] ; + /* 2-by-2 pivoting done in S */ + oldrow = Rperm_2by2 [oldcol] ; + newrow = Ci [oldrow] ; + Diagonal_map [newcol] = newrow ; + } + } + else + { + for (newcol = 0 ; newcol < nn ; newcol++) + { + oldcol = Cperm_init [newcol] ; + /* no 2-by-2 pivoting in S */ + oldrow = oldcol ; + newrow = Ci [oldrow] ; + Diagonal_map [newcol] = newrow ; + } + } + +#ifndef NDEBUG + DEBUG1 (("\nDiagonal map:\n")) ; + for (newcol = 0 ; newcol < nn ; newcol++) + { + oldcol = Cperm_init [newcol] ; + DEBUG3 (("oldcol "ID" newcol "ID":\n", oldcol, newcol)) ; + for (p = Ap [oldcol] ; p < Ap [oldcol+1] ; p++) + { + Entry aij ; + oldrow = Ai [p] ; + newrow = Ci [oldrow] ; + if (Ax != (double *) NULL) + { + ASSIGN (aij, Ax, Az, p, SPLIT (Az)) ; + } + if (oldrow == oldcol) + { + DEBUG2 ((" old diagonal : oldcol "ID" oldrow "ID" ", + oldcol, oldrow)) ; + EDEBUG2 (aij) ; + DEBUG2 (("\n")) ; + } + if (newrow == Diagonal_map [newcol]) + { + DEBUG2 ((" MAP diagonal : newcol "ID" MAProw "ID" ", + newcol, Diagonal_map [newrow])) ; + EDEBUG2 (aij) ; + DEBUG2 (("\n")) ; + } + } + } +#endif + /* done using Ci as workspace ] */ + + } + + /* ---------------------------------------------------------------------- */ + /* find the leftmost descendant of each front */ + /* ---------------------------------------------------------------------- */ + + for (i = 0 ; i <= nfr ; i++) + { + Front_leftmostdesc [i] = EMPTY ; + } + + for (i = 0 ; i < nfr ; i++) + { + /* start at i and walk up the tree */ + DEBUG2 (("Walk up front tree from "ID"\n", i)) ; + j = i ; + while (j != EMPTY && Front_leftmostdesc [j] == EMPTY) + { + DEBUG3 ((" Leftmost desc of "ID" is "ID"\n", j, i)) ; + Front_leftmostdesc [j] = i ; + j = Front_parent [j] ; + DEBUG3 ((" go to j = "ID"\n", j)) ; + } + } + + /* ---------------------------------------------------------------------- */ + /* find the frontal matrix chains and max frontal matrix sizes */ + /* ---------------------------------------------------------------------- */ + + maxnrows = 1 ; /* max # rows in any front */ + maxncols = 1 ; /* max # cols in any front */ + dmaxfrsize = 1 ; /* max frontal matrix size */ + + /* start the first chain */ + nchains = 0 ; /* number of chains */ + Chain_start [0] = 0 ; /* front 0 starts a new chain */ + maxrows = 1 ; /* max # rows for any front in current chain */ + maxcols = 1 ; /* max # cols for any front in current chain */ + DEBUG1 (("Constructing chains:\n")) ; + + for (i = 0 ; i < nfr ; i++) + { + /* get frontal matrix info */ + fpivcol = Front_npivcol [i] ; /* # candidate pivot columns */ + fallrows = Fr_nrows [i] ; /* all rows (not just Schur comp) */ + fallcols = Fr_ncols [i] ; /* all cols (not just Schur comp) */ + parent = Front_parent [i] ; /* parent in column etree */ + fpiv = MIN (fpivcol, fallrows) ; /* # pivot rows and cols */ + maxrows = MAX (maxrows, fallrows) ; + maxcols = MAX (maxcols, fallcols) ; + + DEBUG1 (("Front: "ID", pivcol "ID", "ID"-by-"ID" parent "ID + ", npiv "ID" Chain: maxrows "ID" maxcols "ID"\n", i, fpivcol, + fallrows, fallcols, parent, fpiv, maxrows, maxcols)) ; + + if (parent != i+1) + { + /* this is the end of a chain */ + double s ; + DEBUG1 (("\nEnd of chain "ID"\n", nchains)) ; + + /* make sure maxrows is an odd number */ + ASSERT (maxrows >= 0) ; + if (maxrows % 2 == 0) maxrows++ ; + + DEBUG1 (("Chain maxrows "ID" maxcols "ID"\n", maxrows, maxcols)) ; + + Chain_maxrows [nchains] = maxrows ; + Chain_maxcols [nchains] = maxcols ; + + /* keep track of the maximum front size for all chains */ + + /* for Info only: */ + s = (double) maxrows * (double) maxcols ; + dmaxfrsize = MAX (dmaxfrsize, s) ; + + /* for the subsequent numerical factorization */ + maxnrows = MAX (maxnrows, maxrows) ; + maxncols = MAX (maxncols, maxcols) ; + + DEBUG1 (("Chain dmaxfrsize %g\n\n", dmaxfrsize)) ; + + /* start the next chain */ + nchains++ ; + Chain_start [nchains] = i+1 ; + maxrows = 1 ; + maxcols = 1 ; + } + } + + /* for Info only: */ + dmaxfrsize = ceil (dmaxfrsize) ; + DEBUGm1 (("dmaxfrsize %30.20g Int_MAX "ID"\n", dmaxfrsize, Int_MAX)) ; + ASSERT (Symbolic->nchains == nchains) ; + + /* For allocating objects in umfpack_numeric (does not include all possible + * pivots, particularly pivots from prior fronts in the chain. Need to add + * nb to these to get the # of columns in the L block, for example. This + * is the largest row dimension and largest column dimension of any frontal + * matrix. maxnrows is always odd. */ + Symbolic->maxnrows = maxnrows ; + Symbolic->maxncols = maxncols ; + DEBUGm3 (("maxnrows "ID" maxncols "ID"\n", maxnrows, maxncols)) ; + + /* ---------------------------------------------------------------------- */ + /* find the initial element sizes */ + /* ---------------------------------------------------------------------- */ + + if (max_rdeg > dense_row_threshold) + { + /* there are one or more dense rows in the input matrix */ + /* count the number of dense rows in each column */ + /* use Ci as workspace for inverse of Rperm_init [ */ + ASSERT (Esize != (Int *) NULL) ; + for (newrow = 0 ; newrow < n_row ; newrow++) + { + oldrow = Rperm_init [newrow] ; + ASSERT (oldrow >= 0 && oldrow < nn) ; + Ci [oldrow] = newrow ; + } + for (col = n1 ; col < n_col - nempty_col ; col++) + { + oldcol = Cperm_init [col] ; + esize = Cdeg [oldcol] ; + ASSERT (esize > 0) ; + for (p = Ap [oldcol] ; p < Ap [oldcol+1] ; p++) + { + oldrow = Ai [p] ; + newrow = Ci [oldrow] ; + if (newrow >= n1 && Rdeg [oldrow] > dense_row_threshold) + { + esize-- ; + } + } + ASSERT (esize >= 0) ; + Esize [col - n1] = esize ; + } + /* done using Ci as workspace ] */ + } + + /* If there are no dense rows, then Esize [col-n1] is identical to + * Cdeg [col], once Cdeg is permuted below */ + + /* ---------------------------------------------------------------------- */ + /* permute Cdeg and Rdeg according to initial column and row permutation */ + /* ---------------------------------------------------------------------- */ + + /* use Ci as workspace [ */ + for (k = 0 ; k < n_col ; k++) + { + Ci [k] = Cdeg [Cperm_init [k]] ; + } + for (k = 0 ; k < n_col ; k++) + { + Cdeg [k] = Ci [k] ; + } + for (k = 0 ; k < n_row ; k++) + { + Ci [k] = Rdeg [Rperm_init [k]] ; + } + for (k = 0 ; k < n_row ; k++) + { + Rdeg [k] = Ci [k] ; + } + /* done using Ci as workspace ] */ + + /* ---------------------------------------------------------------------- */ + /* simulate UMF_kernel_init */ + /* ---------------------------------------------------------------------- */ + + /* count elements and tuples at tail, LU factors of singletons, and + * head and tail markers */ + + dlnz = n_inner ; /* upper limit of nz in L (incl diag) */ + dunz = dlnz ; /* upper limit of nz in U (incl diag) */ + + /* head marker */ + head_usage = 1 ; + dhead_usage = 1 ; + + /* tail markers: */ + tail_usage = 2 ; + dtail_usage = 2 ; + + /* allocate the Rpi and Rpx workspace for UMF_kernel_init (incl. headers) */ + tail_usage += UNITS (Int *, n_row+1) + UNITS (Entry *, n_row+1) + 2 ; + dtail_usage += DUNITS (Int *, n_row+1) + DUNITS (Entry *, n_row+1) + 2 ; + DEBUG1 (("Symbolic usage after Rpi/Rpx allocation: head "ID" tail "ID"\n", + head_usage, tail_usage)) ; + + /* LU factors for singletons, at the head of memory */ + for (k = 0 ; k < n1 ; k++) + { + lnz = Cdeg [k] - 1 ; + unz = Rdeg [k] - 1 ; + dlnz += lnz ; + dunz += unz ; + DEBUG1 (("singleton k "ID" pivrow "ID" pivcol "ID" lnz "ID" unz "ID"\n", + k, Rperm_init [k], Cperm_init [k], lnz, unz)) ; + head_usage += UNITS (Int, lnz) + UNITS (Entry, lnz) + + UNITS (Int, unz) + UNITS (Entry, unz) ; + dhead_usage += DUNITS (Int, lnz) + DUNITS (Entry, lnz) + + DUNITS (Int, unz) + DUNITS (Entry, unz) ; + } + DEBUG1 (("Symbolic init head usage: "ID" for LU singletons\n",head_usage)) ; + + /* column elements: */ + for (k = n1 ; k < n_col - nempty_col; k++) + { + esize = Esize ? Esize [k-n1] : Cdeg [k] ; + DEBUG2 ((" esize: "ID"\n", esize)) ; + ASSERT (esize >= 0) ; + if (esize > 0) + { + tail_usage += GET_ELEMENT_SIZE (esize, 1) + 1 ; + dtail_usage += DGET_ELEMENT_SIZE (esize, 1) + 1 ; + } + } + + /* dense row elements */ + if (Esize) + { + Int nrow_elements = 0 ; + for (k = n1 ; k < n_row - nempty_row ; k++) + { + rdeg = Rdeg [k] ; + if (rdeg > dense_row_threshold) + { + tail_usage += GET_ELEMENT_SIZE (1, rdeg) + 1 ; + dtail_usage += GET_ELEMENT_SIZE (1, rdeg) + 1 ; + nrow_elements++ ; + } + } + Info [UMFPACK_NDENSE_ROW] = nrow_elements ; + } + + DEBUG1 (("Symbolic usage: "ID" = head "ID" + tail "ID" after els\n", + head_usage + tail_usage, head_usage, tail_usage)) ; + + /* compute the tuple lengths */ + if (Esize) + { + /* row tuples */ + for (row = n1 ; row < n_row ; row++) + { + rdeg = Rdeg [row] ; + tlen = (rdeg > dense_row_threshold) ? 1 : rdeg ; + tail_usage += 1 + UNITS (Tuple, TUPLES (tlen)) ; + dtail_usage += 1 + DUNITS (Tuple, TUPLES (tlen)) ; + } + /* column tuples */ + for (col = n1 ; col < n_col - nempty_col ; col++) + { + /* tlen is 1 plus the number of dense rows in this column */ + esize = Esize [col - n1] ; + tlen = (esize > 0) + (Cdeg [col] - esize) ; + tail_usage += 1 + UNITS (Tuple, TUPLES (tlen)) ; + dtail_usage += 1 + DUNITS (Tuple, TUPLES (tlen)) ; + } + for ( ; col < n_col ; col++) + { + tail_usage += 1 + UNITS (Tuple, TUPLES (0)) ; + dtail_usage += 1 + DUNITS (Tuple, TUPLES (0)) ; + } + } + else + { + /* row tuples */ + for (row = n1 ; row < n_row ; row++) + { + tlen = Rdeg [row] ; + tail_usage += 1 + UNITS (Tuple, TUPLES (tlen)) ; + dtail_usage += 1 + DUNITS (Tuple, TUPLES (tlen)) ; + } + /* column tuples */ + for (col = n1 ; col < n_col ; col++) + { + tail_usage += 1 + UNITS (Tuple, TUPLES (1)) ; + dtail_usage += 1 + DUNITS (Tuple, TUPLES (1)) ; + } + } + + Symbolic->num_mem_init_usage = head_usage + tail_usage ; + DEBUG1 (("Symbolic usage: "ID" = head "ID" + tail "ID" final\n", + Symbolic->num_mem_init_usage, head_usage, tail_usage)) ; + + ASSERT (UMF_is_permutation (Rperm_init, Ci, n_row, n_row)) ; + + /* initial head and tail usage in Numeric->Memory */ + dmax_usage = dhead_usage + dtail_usage ; + dmax_usage = MAX (Symbolic->num_mem_init_usage, ceil (dmax_usage)) ; + Info [UMFPACK_VARIABLE_INIT_ESTIMATE] = dmax_usage ; + + /* In case Symbolic->num_mem_init_usage overflows, keep as a double, too */ + Symbolic->dnum_mem_init_usage = dmax_usage ; + + /* free the Rpi and Rpx workspace */ + tail_usage -= UNITS (Int *, n_row+1) + UNITS (Entry *, n_row+1) ; + dtail_usage -= DUNITS (Int *, n_row+1) + DUNITS (Entry *, n_row+1) ; + + /* ---------------------------------------------------------------------- */ + /* simulate UMF_kernel, assuming unsymmetric pivoting */ + /* ---------------------------------------------------------------------- */ + + /* Use Ci as temporary workspace for link lists [ */ + Link = Ci ; + for (i = 0 ; i < nfr ; i++) + { + Link [i] = EMPTY ; + } + + flops = 0 ; /* flop count upper bound */ + + for (chain = 0 ; chain < nchains ; chain++) + { + double fsize ; + f1 = Chain_start [chain] ; + f2 = Chain_start [chain+1] - 1 ; + + /* allocate frontal matrix working array (C, L, and U) */ + dr = Chain_maxrows [chain] ; + dc = Chain_maxcols [chain] ; + fsize = + nb*nb /* LU is nb-by-nb */ + + dr*nb /* L is dr-by-nb */ + + nb*dc /* U is nb-by-dc, stored by rows */ + + dr*dc ; /* C is dr by dc */ + dtail_usage += DUNITS (Entry, fsize) ; + dmax_usage = MAX (dmax_usage, dhead_usage + dtail_usage) ; + + for (i = f1 ; i <= f2 ; i++) + { + + /* get frontal matrix info */ + fpivcol = Front_npivcol [i] ; /* # candidate pivot columns */ + fallrows = Fr_nrows [i] ; /* all rows (not just Schur comp*/ + fallcols = Fr_ncols [i] ; /* all cols (not just Schur comp*/ + parent = Front_parent [i] ; /* parent in column etree */ + fpiv = MIN (fpivcol, fallrows) ; /* # pivot rows and cols */ + f = (double) fpiv ; + r = fallrows - fpiv ; /* # rows in Schur comp. */ + c = fallcols - fpiv ; /* # cols in Schur comp. */ + + /* assemble all children of front i in column etree */ + for (child = Link [i] ; child != EMPTY ; child = Link [child]) + { + ASSERT (child >= 0 && child < i) ; + ASSERT (Front_parent [child] == i) ; + /* free the child element and remove it from tuple lists */ + cp = MIN (Front_npivcol [child], Fr_nrows [child]) ; + cr = Fr_nrows [child] - cp ; + cc = Fr_ncols [child] - cp ; + ASSERT (cp >= 0 && cr >= 0 && cc >= 0) ; + dtail_usage -= ELEMENT_SIZE (cr, cc) ; + + } + + /* The flop count computed here is "canonical". */ + + /* factorize the frontal matrix */ + flops += DIV_FLOPS * (f*r + (f-1)*f/2) /* scale pivot columns */ + /* f outer products: */ + + MULTSUB_FLOPS * (f*r*c + (r+c)*(f-1)*f/2 + (f-1)*f*(2*f-1)/6); + + /* count nonzeros and memory usage in double precision */ + dlf = (f*f-f)/2 + f*r ; /* nz in L below diagonal */ + duf = (f*f-f)/2 + f*c ; /* nz in U above diagonal */ + dlnz += dlf ; + dunz += duf ; + + /* store f columns of L and f rows of U */ + dhead_usage += + DUNITS (Entry, dlf + duf) /* numerical values (excl diag) */ + + DUNITS (Int, r + c + f) ; /* indices (compressed) */ + + if (parent != EMPTY) + { + /* create new element and place in tuple lists */ + dtail_usage += ELEMENT_SIZE (r, c) ; + + /* place in link list of parent */ + Link [i] = Link [parent] ; + Link [parent] = i ; + } + + /* keep track of peak Numeric->Memory usage */ + dmax_usage = MAX (dmax_usage, dhead_usage + dtail_usage) ; + + } + + /* free the current frontal matrix */ + dtail_usage -= DUNITS (Entry, fsize) ; + } + + dhead_usage = ceil (dhead_usage) ; + dmax_usage = ceil (dmax_usage) ; + Symbolic->num_mem_size_est = dhead_usage ; + Symbolic->num_mem_usage_est = dmax_usage ; + Symbolic->lunz_bound = dlnz + dunz - n_inner ; + + /* ] done using Ci as workspace for Link array */ + + /* ---------------------------------------------------------------------- */ + /* estimate total memory usage in UMFPACK_numeric */ + /* ---------------------------------------------------------------------- */ + + UMF_set_stats ( + Info, + Symbolic, + dmax_usage, /* estimated peak size of Numeric->Memory */ + dhead_usage, /* estimated final size of Numeric->Memory */ + flops, /* estimated "true flops" */ + dlnz, /* estimated nz in L */ + dunz, /* estimated nz in U */ + dmaxfrsize, /* estimated largest front size */ + (double) n_col, /* worst case Numeric->Upattern size */ + (double) n_inner, /* max possible pivots to be found */ + (double) maxnrows, /* estimated largest #rows in front */ + (double) maxncols, /* estimated largest #cols in front */ + TRUE, /* assume scaling is to be performed */ + prefer_diagonal, + ESTIMATE) ; + + /* ---------------------------------------------------------------------- */ + +#ifndef NDEBUG + for (i = 0 ; i < nchains ; i++) + { + DEBUG2 (("Chain "ID" start "ID" end "ID" maxrows "ID" maxcols "ID"\n", + i, Chain_start [i], Chain_start [i+1] - 1, + Chain_maxrows [i], Chain_maxcols [i])) ; + UMF_dump_chain (Chain_start [i], Fr_parent, Fr_npivcol, Fr_nrows, + Fr_ncols, nfr) ; + } + fpivcol = 0 ; + for (i = 0 ; i < nfr ; i++) + { + fpivcol = MAX (fpivcol, Front_npivcol [i]) ; + } + DEBUG0 (("Max pivot cols in any front: "ID"\n", fpivcol)) ; + DEBUG1 (("Largest front: maxnrows "ID" maxncols "ID" dmaxfrsize %g\n", + maxnrows, maxncols, dmaxfrsize)) ; +#endif + + /* ---------------------------------------------------------------------- */ + /* UMFPACK_symbolic was successful, return the object handle */ + /* ---------------------------------------------------------------------- */ + + Symbolic->valid = SYMBOLIC_VALID ; + *SymbolicHandle = (void *) Symbolic ; + + /* ---------------------------------------------------------------------- */ + /* free workspace */ + /* ---------------------------------------------------------------------- */ + + /* (6) The last of the workspace is free'd. The final Symbolic object + * consists of 12 to 14 allocated objects. Its final total size is lies + * roughly between 4*n and 13*n for a square matrix, which is all that is + * left of the memory allocated by this routine. If an error occurs, the + * entire Symbolic object is free'd when this routine returns (the error + * return routine, below). + */ + + free_work (SW) ; + + DEBUG0 (("(3)Symbolic UMF_malloc_count - init_count = "ID"\n", + UMF_malloc_count - init_count)) ; + ASSERT (UMF_malloc_count == init_count + 12 + + (Symbolic->Esize != (Int *) NULL) + + (Symbolic->Diagonal_map != (Int *) NULL)) ; + + /* ---------------------------------------------------------------------- */ + /* get the time used by UMFPACK_*symbolic */ + /* ---------------------------------------------------------------------- */ + + umfpack_toc (stats) ; + Info [UMFPACK_SYMBOLIC_WALLTIME] = stats [0] ; + Info [UMFPACK_SYMBOLIC_TIME] = stats [1] ; + + return (UMFPACK_OK) ; +} + + +/* ========================================================================== */ +/* === free_work ============================================================ */ +/* ========================================================================== */ + +PRIVATE void free_work +( + SWType *SW +) +{ + if (SW) + { + SW->Rperm_2by2 = (Int *) UMF_free ((void *) SW->Rperm_2by2) ; + SW->InvRperm1 = (Int *) UMF_free ((void *) SW->InvRperm1) ; + SW->Rs = (double *) UMF_free ((void *) SW->Rs) ; + SW->Si = (Int *) UMF_free ((void *) SW->Si) ; + SW->Sp = (Int *) UMF_free ((void *) SW->Sp) ; + SW->Ci = (Int *) UMF_free ((void *) SW->Ci) ; + SW->Front_npivcol = (Int *) UMF_free ((void *) SW->Front_npivcol); + SW->Front_nrows = (Int *) UMF_free ((void *) SW->Front_nrows) ; + SW->Front_ncols = (Int *) UMF_free ((void *) SW->Front_ncols) ; + SW->Front_parent = (Int *) UMF_free ((void *) SW->Front_parent) ; + SW->Front_cols = (Int *) UMF_free ((void *) SW->Front_cols) ; + SW->Cperm1 = (Int *) UMF_free ((void *) SW->Cperm1) ; + SW->Rperm1 = (Int *) UMF_free ((void *) SW->Rperm1) ; + SW->InFront = (Int *) UMF_free ((void *) SW->InFront) ; + } +} + + +/* ========================================================================== */ +/* === error ================================================================ */ +/* ========================================================================== */ + +/* Error return from UMFPACK_symbolic. Free all allocated memory. */ + +PRIVATE void error +( + SymbolicType **Symbolic, + SWType *SW +) +{ + + free_work (SW) ; + UMFPACK_free_symbolic ((void **) Symbolic) ; + ASSERT (UMF_malloc_count == init_count) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umfpack_report_control.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_report_control.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,386 @@ +/* ========================================================================== */ +/* === UMFPACK_report_control =============================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + User-callable. Prints the control settings. See umfpack_report_control.h + for details. +*/ + +#include "umf_internal.h" + +GLOBAL void UMFPACK_report_control +( + const double Control [UMFPACK_CONTROL] +) +{ + double drow, dcol, relpt, relpt2, alloc_init, front_alloc_init, amd_alpha, + tol, force_fixQ, droptol, aggr ; + Int prl, nb, irstep, strategy, scale, s ; + + prl = GET_CONTROL (UMFPACK_PRL, UMFPACK_DEFAULT_PRL) ; + + if (prl < 2) + { + /* default is to print nothing */ + return ; + } + + PRINTF (("\n%s, Control:\n\n", UMFPACK_VERSION)) ; + + /* ---------------------------------------------------------------------- */ + /* run-time options */ + /* ---------------------------------------------------------------------- */ + + /* This is a "run-time" option because all four umfpack_* versions */ + /* compiled into the UMFPACK library. */ + +#ifdef DINT + PRINTF ((" Matrix entry defined as: double\n")) ; + PRINTF ((" Int (generic integer) defined as: int\n")) ; +#endif +#ifdef DLONG + PRINTF ((" Matrix entry defined as: double\n")) ; + PRINTF ((" Int (generic integer) defined as: long\n")) ; +#endif +#ifdef ZINT + PRINTF ((" Matrix entry defined as: double complex\n")) ; + PRINTF ((" Int (generic integer) defined as: int\n")) ; +#endif +#ifdef ZLONG + PRINTF ((" Matrix entry defined as: double complex\n")) ; + PRINTF ((" Int (generic integer) defined as: long\n")) ; +#endif + + /* ---------------------------------------------------------------------- */ + /* printing level */ + /* ---------------------------------------------------------------------- */ + + PRINTF (("\n "ID": print level: "ID"\n", + (Int) INDEX (UMFPACK_PRL), prl)) ; + + /* ---------------------------------------------------------------------- */ + /* dense row/col parameters */ + /* ---------------------------------------------------------------------- */ + + drow = GET_CONTROL (UMFPACK_DENSE_ROW, UMFPACK_DEFAULT_DENSE_ROW) ; + dcol = GET_CONTROL (UMFPACK_DENSE_COL, UMFPACK_DEFAULT_DENSE_COL) ; + + PRINTF ((" "ID": dense row parameter: %g\n", + (Int) INDEX (UMFPACK_DENSE_ROW), drow)) ; + PRINTF ((" \"dense\" rows have > max (16, (%g)*16*sqrt(n_col)" + " entries)\n", drow)) ; + PRINTF ((" "ID": dense column parameter: %g\n", + (Int) INDEX (UMFPACK_DENSE_COL), dcol)) ; + PRINTF ((" \"dense\" columns have > max (16, (%g)*16*sqrt(n_row)" + " entries)\n", dcol)) ; + + /* ---------------------------------------------------------------------- */ + /* pivot tolerance */ + /* ---------------------------------------------------------------------- */ + + relpt = GET_CONTROL (UMFPACK_PIVOT_TOLERANCE, + UMFPACK_DEFAULT_PIVOT_TOLERANCE) ; + relpt = MAX (0.0, MIN (relpt, 1.0)) ; + PRINTF ((" "ID": pivot tolerance: %g\n", + (Int) INDEX (UMFPACK_PIVOT_TOLERANCE), relpt)) ; + + /* ---------------------------------------------------------------------- */ + /* block size */ + /* ---------------------------------------------------------------------- */ + + nb = GET_CONTROL (UMFPACK_BLOCK_SIZE, UMFPACK_DEFAULT_BLOCK_SIZE) ; + nb = MAX (1, nb) ; + PRINTF ((" "ID": block size for dense matrix kernels: "ID"\n", + (Int) INDEX (UMFPACK_BLOCK_SIZE), nb)) ; + + /* ---------------------------------------------------------------------- */ + /* strategy */ + /* ---------------------------------------------------------------------- */ + + strategy = GET_CONTROL (UMFPACK_STRATEGY, UMFPACK_DEFAULT_STRATEGY) ; + if (strategy < UMFPACK_STRATEGY_AUTO + || strategy > UMFPACK_STRATEGY_SYMMETRIC) + { + strategy = UMFPACK_STRATEGY_AUTO ; + } + + PRINTF ((" "ID": strategy: "ID, + (Int) INDEX (UMFPACK_STRATEGY), strategy)) ; + + if (strategy == UMFPACK_STRATEGY_SYMMETRIC) + { + PRINTF ((" (symmetric)\n" + " Q = AMD (A+A'), Q not refined during numerical\n" + " factorization, and diagonal pivoting (P=Q') attempted.\n")) ; + } + else if (strategy == UMFPACK_STRATEGY_UNSYMMETRIC) + { + PRINTF ((" (unsymmetric)\n" + " Q = COLAMD (A), Q refined during numerical\n" + " factorization, and no attempt at diagonal pivoting.\n")) ; + } + else if (strategy == UMFPACK_STRATEGY_2BY2) + { + PRINTF ((" (symmetric, with 2-by-2 block pivoting)\n" + " P2 = row permutation that tries to place large entries on\n" + " the diagonal. Q = AMD (P2*A+(P2*A)'), Q not refined during\n" + " numerical factorization, attempt to select pivots from the\n" + " diagonal of P2*A.\n")) ; + } + else /* auto strategy */ + { + strategy = UMFPACK_STRATEGY_AUTO ; + PRINTF ((" (auto)\n")) ; + } + + /* ---------------------------------------------------------------------- */ + /* initial allocation parameter */ + /* ---------------------------------------------------------------------- */ + + alloc_init = GET_CONTROL (UMFPACK_ALLOC_INIT, UMFPACK_DEFAULT_ALLOC_INIT) ; + if (alloc_init >= 0) + { + PRINTF ((" "ID": initial allocation ratio: %g\n", + (Int) INDEX (UMFPACK_ALLOC_INIT), alloc_init)) ; + } + else + { + s = -alloc_init ; + s = MAX (1, s) ; + PRINTF ((" "ID": initial allocation (in Units): "ID"\n", + (Int) INDEX (UMFPACK_ALLOC_INIT), s)) ; + } + + /* ---------------------------------------------------------------------- */ + /* maximum iterative refinement steps */ + /* ---------------------------------------------------------------------- */ + + irstep = GET_CONTROL (UMFPACK_IRSTEP, UMFPACK_DEFAULT_IRSTEP) ; + irstep = MAX (0, irstep) ; + PRINTF ((" "ID": max iterative refinement steps: "ID"\n", + (Int) INDEX (UMFPACK_IRSTEP), irstep)) ; + + /* ---------------------------------------------------------------------- */ + /* 2-by-2 pivot tolerance */ + /* ---------------------------------------------------------------------- */ + + tol = GET_CONTROL (UMFPACK_2BY2_TOLERANCE, UMFPACK_DEFAULT_2BY2_TOLERANCE) ; + tol = MAX (0.0, MIN (tol, 1.0)) ; + PRINTF ((" "ID": 2-by-2 pivot tolerance: %g\n", + (Int) INDEX (UMFPACK_2BY2_TOLERANCE), tol)) ; + + /* ---------------------------------------------------------------------- */ + /* force fixQ */ + /* ---------------------------------------------------------------------- */ + + force_fixQ = GET_CONTROL (UMFPACK_FIXQ, UMFPACK_DEFAULT_FIXQ) ; + PRINTF ((" "ID": Q fixed during numerical factorization: %g ", + (Int) INDEX (UMFPACK_FIXQ), force_fixQ)) ; + if (force_fixQ > 0) + { + PRINTF (("(yes)\n")) ; + } + else if (force_fixQ < 0) + { + PRINTF (("(no)\n")) ; + } + else + { + PRINTF (("(auto)\n")) ; + } + + /* ---------------------------------------------------------------------- */ + /* AMD parameters */ + /* ---------------------------------------------------------------------- */ + + amd_alpha = GET_CONTROL (UMFPACK_AMD_DENSE, UMFPACK_DEFAULT_AMD_DENSE) ; + PRINTF ((" "ID": AMD dense row/col parameter: %g\n", + (Int) INDEX (UMFPACK_AMD_DENSE), amd_alpha)) ; + if (amd_alpha < 0) + { + PRINTF ((" no \"dense\" rows/columns\n")) ; + } + else + { + PRINTF ((" \"dense\" rows/columns have > max (16, (%g)*sqrt(n))" + " entries\n", amd_alpha)) ; + } + PRINTF ((" Only used if the AMD ordering is used.\n")) ; + + /* ---------------------------------------------------------------------- */ + /* pivot tolerance for symmetric pivoting */ + /* ---------------------------------------------------------------------- */ + + relpt2 = GET_CONTROL (UMFPACK_SYM_PIVOT_TOLERANCE, + UMFPACK_DEFAULT_SYM_PIVOT_TOLERANCE) ; + relpt2 = MAX (0.0, MIN (relpt2, 1.0)) ; + PRINTF ((" "ID": diagonal pivot tolerance: %g\n" + " Only used if diagonal pivoting is attempted.\n", + (Int) INDEX (UMFPACK_SYM_PIVOT_TOLERANCE), relpt2)) ; + + /* ---------------------------------------------------------------------- */ + /* scaling */ + /* ---------------------------------------------------------------------- */ + + scale = GET_CONTROL (UMFPACK_SCALE, UMFPACK_DEFAULT_SCALE) ; + if (scale != UMFPACK_SCALE_NONE && scale != UMFPACK_SCALE_MAX) + { + scale = UMFPACK_DEFAULT_SCALE ; + } + PRINTF ((" "ID": scaling: "ID, (Int) INDEX (UMFPACK_SCALE), scale)) ; + if (scale == UMFPACK_SCALE_NONE) + { + PRINTF ((" (no)")) ; + } + else if (scale == UMFPACK_SCALE_SUM) + { + PRINTF ((" (divide each row by sum of abs. values in each row)")) ; + } + else if (scale == UMFPACK_SCALE_MAX) + { + PRINTF ((" (divide each row by max. abs. value in each row)")) ; + } + PRINTF (("\n")) ; + + /* ---------------------------------------------------------------------- */ + /* frontal matrix allocation parameter */ + /* ---------------------------------------------------------------------- */ + + front_alloc_init = GET_CONTROL (UMFPACK_FRONT_ALLOC_INIT, + UMFPACK_DEFAULT_FRONT_ALLOC_INIT) ; + front_alloc_init = MIN (1.0, front_alloc_init) ; + if (front_alloc_init >= 0) + { + PRINTF ((" "ID": frontal matrix allocation ratio: %g\n", + (Int) INDEX (UMFPACK_FRONT_ALLOC_INIT), front_alloc_init)) ; + } + else + { + s = -front_alloc_init ; + s = MAX (1, s) ; + PRINTF ((" "ID": initial frontal matrix size (# of Entry's): "ID"\n", + (Int) INDEX (UMFPACK_FRONT_ALLOC_INIT), s)) ; + } + + /* ---------------------------------------------------------------------- */ + /* drop tolerance */ + /* ---------------------------------------------------------------------- */ + + droptol = GET_CONTROL (UMFPACK_DROPTOL, UMFPACK_DEFAULT_DROPTOL) ; + PRINTF ((" "ID": drop tolerance: %g\n", + (Int) INDEX (UMFPACK_DROPTOL), droptol)) ; + + /* ---------------------------------------------------------------------- */ + /* aggressive absorption */ + /* ---------------------------------------------------------------------- */ + + aggr = GET_CONTROL (UMFPACK_AGGRESSIVE, UMFPACK_DEFAULT_AGGRESSIVE) ; + PRINTF ((" "ID": AMD and COLAMD aggressive absorption: %g", + (Int) INDEX (UMFPACK_AGGRESSIVE), aggr)) ; + if (aggr != 0.0) + { + PRINTF ((" (yes)\n")) ; + } + else + { + PRINTF ((" (no)\n")) ; + } + + /* ---------------------------------------------------------------------- */ + /* compile-time options */ + /* ---------------------------------------------------------------------- */ + + PRINTF (( + "\n The following options can only be changed at compile-time:\n")) ; + + PRINTF ((" "ID": BLAS library used: ", + (Int) INDEX (UMFPACK_COMPILED_WITH_BLAS))) ; + +#if defined (USE_NO_BLAS) + PRINTF (("none. UMFPACK will be slow.\n")) ; +#elif defined (USE_C_BLAS) + PRINTF (("C-BLAS.\n")) ; +#elif defined (USE_MATLAB_BLAS) + PRINTF (("built-in MATLAB BLAS (ATLAS).\n")) ; +#elif defined (USE_SUNPERF_BLAS) + PRINTF (("Sun Performance Library BLAS.\n")) ; +#elif defined (USE_SCSL_BLAS) + PRINTF (("SGI SCSL BLAS.\n")) ; +#elif defined (USE_FORTRAN_BLAS) + PRINTF (("Fortran BLAS.\n")) ; +#endif + +#ifdef MATLAB_MEX_FILE +#ifdef NUTIL + PRINTF ((" "ID": compiled for MATLAB" + " (uses mxMalloc, mxFree, mxRealloc, and mexPrintf)\n", + (Int) INDEX (UMFPACK_COMPILED_FOR_MATLAB))) ; +#else + PRINTF ((" "ID": compiled for MATLAB" + " (uses utMalloc, utFree, utRealloc, and mexPrintf)\n", + (Int) INDEX (UMFPACK_COMPILED_FOR_MATLAB))) ; +#endif +#else +#ifdef MATHWORKS + PRINTF ((" "ID": compiled for MATLAB, using internal utility routines\n" + " (uses utMalloc, utFree, utRealloc, and utPrintf)\n", + (Int) INDEX (UMFPACK_COMPILED_FOR_MATLAB))) ; + PRINTF ((" (complex version uses utDivideComplex, utFdlibm_hypot)\n")) ; +#else + PRINTF ((" "ID": compiled for ANSI C" + " (uses malloc, free, realloc, and printf)\n", + (Int) INDEX (UMFPACK_COMPILED_FOR_MATLAB))) ; +#endif +#endif + +#ifdef NO_TIMER + PRINTF ((" "ID": no CPU timer \n", + (Int) INDEX (UMFPACK_COMPILED_WITH_GETRUSAGE))) ; +#else +#ifndef NPOSIX + PRINTF ((" "ID": CPU timer is POSIX times ( ) routine.\n", + (Int) INDEX (UMFPACK_COMPILED_WITH_GETRUSAGE))) ; +#else +#ifdef GETRUSAGE + PRINTF ((" "ID": CPU timer is getrusage.\n", + (Int) INDEX (UMFPACK_COMPILED_WITH_GETRUSAGE))) ; +#else + PRINTF ((" "ID": CPU timer is ANSI C clock (may wrap around).\n", + (Int) INDEX (UMFPACK_COMPILED_WITH_GETRUSAGE))) ; +#endif +#endif +#endif + +#ifndef NDEBUG + PRINTF (( +"**** Debugging enabled (UMFPACK will be exceedingly slow!) *****************\n" +" "ID": compiled with debugging enabled. ", + (Int) INDEX (UMFPACK_COMPILED_IN_DEBUG_MODE))) ; +#ifdef MATLAB_MEX_FILE + PRINTF (("Uses mxAssert.\n")) ; +#else +#ifdef MATHWORKS + PRINTF (("Uses utAssert.\n")) ; +#else + PRINTF (("Uses ANSI C assert.\n")) ; +#endif +#endif +#else + PRINTF ((" "ID": compiled for normal operation (debugging disabled)\n", + (Int) INDEX (UMFPACK_COMPILED_IN_DEBUG_MODE))) ; +#endif + + PRINTF ((" computer/operating system: %s\n", UMFPACK_ARCHITECTURE)) ; + PRINTF ((" size of int: %g long: %g Int: %g pointer: %g" + " double: %g Entry: %g (in bytes)\n\n", (double) sizeof (int), + (double) sizeof (long), (double) sizeof (Int), + (double) sizeof (void *), (double) sizeof (double), + (double) sizeof (Entry))) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umfpack_report_info.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_report_info.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,615 @@ +/* ========================================================================== */ +/* === UMFPACK_report_info ================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + User-callable. Prints the Info array. See umfpack_report_info.h for + details. +*/ + +#include "umf_internal.h" + +#define PRINT_INFO(format,x) \ +{ \ + if (SCALAR_IS_NAN (x) || (!SCALAR_IS_LTZERO (x))) \ + { \ + PRINTF ((format, x)) ; \ + } \ +} + +/* RATIO macro uses a double relop, but ignore NaN case: */ +#define RATIO(a,b,c) (((b) == 0) ? (c) : (((double) a)/((double) b))) + +/* ========================================================================== */ +/* === print_ratio ========================================================== */ +/* ========================================================================== */ + +PRIVATE void print_ratio +( + char *what, + char *format, + double estimate, + double actual +) +{ + if (estimate < 0 && actual < 0) /* double relop, but ignore Nan case */ + { + return ; + } + PRINTF ((" %-27s", what)) ; + if (estimate >= 0) /* double relop, but ignore Nan case */ + { + PRINTF ((format, estimate)) ; + } + else + { + PRINTF ((" -")) ; + } + if (actual >= 0) /* double relop, but ignore Nan case */ + { + PRINTF ((format, actual)) ; + } + else + { + PRINTF ((" -")) ; + } + if (estimate >= 0 && actual >= 0) /* double relop, but ignore Nan case */ + { + PRINTF ((" %5.0f%%\n", 100 * RATIO (actual, estimate, 1))) ; + } + else + { + PRINTF ((" -\n")) ; + } +} + +/* ========================================================================== */ +/* === UMFPACK_report_info ================================================== */ +/* ========================================================================== */ + +GLOBAL void UMFPACK_report_info +( + const double Control [UMFPACK_CONTROL], + const double Info [UMFPACK_INFO] +) +{ + + double lnz_est, unz_est, lunz_est, lnz, unz, lunz, tsym, tnum, fnum, tsolve, + fsolve, ttot, ftot, twsym, twnum, twsolve, twtot, n2 ; + Int n_row, n_col, n_inner, prl, is_sym ; + + /* ---------------------------------------------------------------------- */ + /* get control settings and status to determine what to print */ + /* ---------------------------------------------------------------------- */ + + prl = GET_CONTROL (UMFPACK_PRL, UMFPACK_DEFAULT_PRL) ; + + if (!Info || prl < 2) + { + /* no output generated if Info is (double *) NULL */ + /* or if prl is less than 2 */ + return ; + } + + /* ---------------------------------------------------------------------- */ + /* print umfpack version */ + /* ---------------------------------------------------------------------- */ + + PRINTF (("\n%s, Info:\n", UMFPACK_VERSION)) ; + +#ifndef NDEBUG + PRINTF (( +"**** Debugging enabled (UMFPACK will be exceedingly slow!) *****************\n" + )) ; +#endif + + /* ---------------------------------------------------------------------- */ + /* print run-time options */ + /* ---------------------------------------------------------------------- */ + +#ifdef DINT + PRINTF ((" matrix entry defined as: double\n")) ; + PRINTF ((" Int (generic integer) defined as: int\n")) ; +#endif +#ifdef DLONG + PRINTF ((" matrix entry defined as: double\n")) ; + PRINTF ((" Int (generic integer) defined as: long\n")) ; +#endif +#ifdef ZINT + PRINTF ((" matrix entry defined as: double complex\n")) ; + PRINTF ((" Int (generic integer) defined as: int\n")) ; +#endif +#ifdef ZLONG + PRINTF ((" matrix entry defined as: double complex\n")) ; + PRINTF ((" Int (generic integer) defined as: long\n")) ; +#endif + + /* ---------------------------------------------------------------------- */ + /* print compile-time options */ + /* ---------------------------------------------------------------------- */ + + PRINTF ((" BLAS library used: ")) ; + +#if defined (USE_NO_BLAS) + PRINTF (("none. UMFPACK will be slow.\n")) ; +#elif defined (USE_C_BLAS) + PRINTF (("C-BLAS.\n")) ; +#elif defined (USE_MATLAB_BLAS) + PRINTF (("built-in MATLAB BLAS.\n")) ; +#elif defined (USE_SUNPERF_BLAS) + PRINTF (("Sun Performance Library BLAS.\n")) ; +#elif defined (USE_SCSL_BLAS) + PRINTF (("SGI SCSL BLAS.\n")) ; +#elif defined (USE_FORTRAN_BLAS) + PRINTF (("Fortran BLAS.\n")) ; +#endif + + PRINTF ((" MATLAB: ")) ; +#ifdef MATLAB_MEX_FILE + PRINTF (("yes.\n")) ; +#else +#ifdef MATHWORKS + PRINTF (("yes (using internal ut* routines).\n")) ; +#else + PRINTF (("no.\n")) ; +#endif +#endif + + PRINTF ((" CPU timer: ")) ; +#ifdef NO_TIMER + PRINTF (("none.\n")) ; +#else +#ifndef NPOSIX + PRINTF (("POSIX times ( ) routine.\n")) ; +#else +#ifdef GETRUSAGE + PRINTF (("getrusage ( ) routine.\n")) ; +#else + PRINTF (("ANSI clock ( ) routine.\n")) ; +#endif +#endif +#endif + + /* ---------------------------------------------------------------------- */ + /* print n and nz */ + /* ---------------------------------------------------------------------- */ + + n_row = (Int) Info [UMFPACK_NROW] ; + n_col = (Int) Info [UMFPACK_NCOL] ; + n_inner = MIN (n_row, n_col) ; + + PRINT_INFO (" number of rows in matrix A: "ID"\n", n_row) ; + PRINT_INFO (" number of columns in matrix A: "ID"\n", n_col) ; + PRINT_INFO (" entries in matrix A: "ID"\n", + (Int) Info [UMFPACK_NZ]) ; + PRINT_INFO (" memory usage reported in: "ID"-byte Units\n", + (Int) Info [UMFPACK_SIZE_OF_UNIT]) ; + + PRINT_INFO (" size of int: "ID" bytes\n", + (Int) Info [UMFPACK_SIZE_OF_INT]) ; + PRINT_INFO (" size of long: "ID" bytes\n", + (Int) Info [UMFPACK_SIZE_OF_LONG]) ; + PRINT_INFO (" size of pointer: "ID" bytes\n", + (Int) Info [UMFPACK_SIZE_OF_POINTER]) ; + PRINT_INFO (" size of numerical entry: "ID" bytes\n", + (Int) Info [UMFPACK_SIZE_OF_ENTRY]) ; + + /* ---------------------------------------------------------------------- */ + /* symbolic parameters */ + /* ---------------------------------------------------------------------- */ + + if (Info [UMFPACK_STRATEGY_USED] == UMFPACK_STRATEGY_SYMMETRIC) + { + PRINTF (("\n strategy used: symmetric\n")) ; + } + else if (Info [UMFPACK_STRATEGY_USED] == UMFPACK_STRATEGY_UNSYMMETRIC) + { + PRINTF (("\n strategy used: unsymmetric\n")) ; + } + else if (Info [UMFPACK_STRATEGY_USED] == UMFPACK_STRATEGY_2BY2) + { + PRINTF (("\n strategy used: symmetric 2-by-2\n")); + } + + if (Info [UMFPACK_ORDERING_USED] == UMFPACK_ORDERING_AMD) + { + PRINTF ((" ordering used: amd on A+A'\n")) ; + } + else if (Info [UMFPACK_ORDERING_USED] == UMFPACK_ORDERING_COLAMD) + { + PRINTF ((" ordering used: colamd on A\n")) ; + } + else if (Info [UMFPACK_ORDERING_USED] == UMFPACK_ORDERING_GIVEN) + { + PRINTF ((" ordering used: provided by user\n")) ; + } + + if (Info [UMFPACK_QFIXED] == 1) + { + PRINTF ((" modify Q during factorization: no\n")) ; + } + else if (Info [UMFPACK_QFIXED] == 0) + { + PRINTF ((" modify Q during factorization: yes\n")) ; + } + + if (Info [UMFPACK_DIAG_PREFERRED] == 0) + { + PRINTF ((" prefer diagonal pivoting: no\n")) ; + } + else if (Info [UMFPACK_DIAG_PREFERRED] == 1) + { + PRINTF ((" prefer diagonal pivoting: yes\n")) ; + } + + /* ---------------------------------------------------------------------- */ + /* singleton statistics */ + /* ---------------------------------------------------------------------- */ + + PRINT_INFO (" pivots with zero Markowitz cost: %0.f\n", + Info [UMFPACK_COL_SINGLETONS] + Info [UMFPACK_ROW_SINGLETONS]) ; + PRINT_INFO (" submatrix S after removing zero-cost pivots:\n" + " number of \"dense\" rows: %.0f\n", + Info [UMFPACK_NDENSE_ROW]) ; + PRINT_INFO (" number of \"dense\" columns: %.0f\n", + Info [UMFPACK_NDENSE_COL]) ; + PRINT_INFO (" number of empty rows: %.0f\n", + Info [UMFPACK_NEMPTY_ROW]) ; + PRINT_INFO (" number of empty columns %.0f\n", + Info [UMFPACK_NEMPTY_COL]) ; + is_sym = Info [UMFPACK_S_SYMMETRIC] ; + if (is_sym > 0) + { + PRINTF ((" submatrix S square and diagonal preserved\n")) ; + } + else if (is_sym == 0) + { + PRINTF ((" submatrix S not square or diagonal not preserved\n")); + } + + /* ---------------------------------------------------------------------- */ + /* statistics from amd_aat */ + /* ---------------------------------------------------------------------- */ + + n2 = Info [UMFPACK_N2] ; + if (n2 >= 0) + { + PRINTF ((" pattern of square submatrix S:\n")) ; + } + PRINT_INFO (" number rows and columns %.0f\n", + n2) ; + PRINT_INFO (" symmetry of nonzero pattern: %.6f\n", + Info [UMFPACK_PATTERN_SYMMETRY]) ; + PRINT_INFO (" nz in S+S' (excl. diagonal): %.0f\n", + Info [UMFPACK_NZ_A_PLUS_AT]) ; + PRINT_INFO (" nz on diagonal of matrix S: %.0f\n", + Info [UMFPACK_NZDIAG]) ; + if (Info [UMFPACK_NZDIAG] >= 0 && n2 > 0) + { + PRINTF ((" fraction of nz on diagonal: %.6f\n", + Info [UMFPACK_NZDIAG] / n2)) ; + } + + /* ---------------------------------------------------------------------- */ + /* statistics from 2-by-2 permutation */ + /* ---------------------------------------------------------------------- */ + + PRINT_INFO (" 2-by-2 pivoting to place large entries on diagonal:\n" + " # of small diagonal entries of S: %.0f\n", + Info [UMFPACK_2BY2_NWEAK]) ; + PRINT_INFO (" # unmatched: %.0f\n", + Info [UMFPACK_2BY2_UNMATCHED]) ; + PRINT_INFO (" symmetry of P2*S: %.6f\n", + Info [UMFPACK_2BY2_PATTERN_SYMMETRY]) ; + PRINT_INFO (" nz in P2*S+(P2*S)' (excl. diag.): %.0f\n", + Info [UMFPACK_2BY2_NZ_PA_PLUS_PAT]) ; + PRINT_INFO (" nz on diagonal of P2*S: %.0f\n", + Info [UMFPACK_2BY2_NZDIAG]) ; + if (Info [UMFPACK_2BY2_NZDIAG] >= 0 && n2 > 0) + { + PRINTF ((" fraction of nz on diag of P2*S: %.6f\n", + Info [UMFPACK_2BY2_NZDIAG] / n2)) ; + } + + /* ---------------------------------------------------------------------- */ + /* statistics from AMD */ + /* ---------------------------------------------------------------------- */ + + if (Info [UMFPACK_ORDERING_USED] == UMFPACK_ORDERING_AMD) + { + double dmax = Info [UMFPACK_SYMMETRIC_DMAX] ; + PRINTF ((" AMD statistics, for strict diagonal pivoting:\n")) ; + PRINT_INFO (" est. flops for LU factorization: %.5e\n", + Info [UMFPACK_SYMMETRIC_FLOPS]) ; + PRINT_INFO (" est. nz in L+U (incl. diagonal): %.0f\n", + Info [UMFPACK_SYMMETRIC_LUNZ]) ; + PRINT_INFO (" est. largest front (# entries): %.0f\n", + dmax*dmax) ; + PRINT_INFO (" est. max nz in any column of L: %.0f\n", + dmax) ; + PRINT_INFO ( + " number of \"dense\" rows/columns in S+S': %.0f\n", + Info [UMFPACK_SYMMETRIC_NDENSE]) ; + } + + /* ---------------------------------------------------------------------- */ + /* symbolic factorization */ + /* ---------------------------------------------------------------------- */ + + tsym = Info [UMFPACK_SYMBOLIC_TIME] ; + twsym = Info [UMFPACK_SYMBOLIC_WALLTIME] ; + + PRINT_INFO (" symbolic factorization defragmentations: %.0f\n", + Info [UMFPACK_SYMBOLIC_DEFRAG]) ; + PRINT_INFO (" symbolic memory usage (Units): %.0f\n", + Info [UMFPACK_SYMBOLIC_PEAK_MEMORY]) ; + PRINT_INFO (" symbolic memory usage (MBytes): %.1f\n", + MBYTES (Info [UMFPACK_SYMBOLIC_PEAK_MEMORY])) ; + PRINT_INFO (" Symbolic size (Units): %.0f\n", + Info [UMFPACK_SYMBOLIC_SIZE]) ; + PRINT_INFO (" Symbolic size (MBytes): %.0f\n", + MBYTES (Info [UMFPACK_SYMBOLIC_SIZE])) ; + PRINT_INFO (" symbolic factorization CPU time (sec): %.2f\n", + tsym) ; + PRINT_INFO (" symbolic factorization wallclock time(sec): %.2f\n", + twsym) ; + + /* ---------------------------------------------------------------------- */ + /* scaling, from numerical factorization */ + /* ---------------------------------------------------------------------- */ + + if (Info [UMFPACK_WAS_SCALED] == UMFPACK_SCALE_NONE) + { + PRINTF (("\n matrix scaled: no\n")) ; + } + else if (Info [UMFPACK_WAS_SCALED] == UMFPACK_SCALE_SUM) + { + PRINTF (("\n matrix scaled: yes ")) ; + PRINTF (("(divided each row by sum of abs values in each row)\n")) ; + PRINTF ((" minimum sum (abs (rows of A)): %.5e\n", + Info [UMFPACK_RSMIN])) ; + PRINTF ((" maximum sum (abs (rows of A)): %.5e\n", + Info [UMFPACK_RSMAX])) ; + } + else if (Info [UMFPACK_WAS_SCALED] == UMFPACK_SCALE_MAX) + { + PRINTF (("\n matrix scaled: yes ")) ; + PRINTF (("(divided each row by max abs value in each row)\n")) ; + PRINTF ((" minimum max (abs (rows of A)): %.5e\n", + Info [UMFPACK_RSMIN])) ; + PRINTF ((" maximum max (abs (rows of A)): %.5e\n", + Info [UMFPACK_RSMAX])) ; + } + + /* ---------------------------------------------------------------------- */ + /* estimate/actual in symbolic/numeric factorization */ + /* ---------------------------------------------------------------------- */ + + /* double relop, but ignore NaN case: */ + if (Info [UMFPACK_SYMBOLIC_DEFRAG] >= 0 /* UMFPACK_*symbolic called */ + || Info [UMFPACK_NUMERIC_DEFRAG] >= 0) /* UMFPACK_numeric called */ + { + PRINTF (("\n symbolic/numeric factorization: upper bound")) ; + PRINTF ((" actual %%\n")) ; + PRINTF ((" variable-sized part of Numeric object:\n")) ; + } + print_ratio (" initial size (Units)", " %20.0f", + Info [UMFPACK_VARIABLE_INIT_ESTIMATE], Info [UMFPACK_VARIABLE_INIT]) ; + print_ratio (" peak size (Units)", " %20.0f", + Info [UMFPACK_VARIABLE_PEAK_ESTIMATE], Info [UMFPACK_VARIABLE_PEAK]) ; + print_ratio (" final size (Units)", " %20.0f", + Info [UMFPACK_VARIABLE_FINAL_ESTIMATE], Info [UMFPACK_VARIABLE_FINAL]) ; + print_ratio ("Numeric final size (Units)", " %20.0f", + Info [UMFPACK_NUMERIC_SIZE_ESTIMATE], Info [UMFPACK_NUMERIC_SIZE]) ; + print_ratio ("Numeric final size (MBytes)", " %20.1f", + MBYTES (Info [UMFPACK_NUMERIC_SIZE_ESTIMATE]), + MBYTES (Info [UMFPACK_NUMERIC_SIZE])) ; + print_ratio ("peak memory usage (Units)", " %20.0f", + Info [UMFPACK_PEAK_MEMORY_ESTIMATE], Info [UMFPACK_PEAK_MEMORY]) ; + print_ratio ("peak memory usage (MBytes)", " %20.1f", + MBYTES (Info [UMFPACK_PEAK_MEMORY_ESTIMATE]), + MBYTES (Info [UMFPACK_PEAK_MEMORY])) ; + print_ratio ("numeric factorization flops", " %20.5e", + Info [UMFPACK_FLOPS_ESTIMATE], Info [UMFPACK_FLOPS]) ; + + lnz_est = Info [UMFPACK_LNZ_ESTIMATE] ; + unz_est = Info [UMFPACK_UNZ_ESTIMATE] ; + if (lnz_est >= 0 && unz_est >= 0) /* double relop, but ignore NaN case */ + { + lunz_est = lnz_est + unz_est - n_inner ; + } + else + { + lunz_est = EMPTY ; + } + lnz = Info [UMFPACK_LNZ] ; + unz = Info [UMFPACK_UNZ] ; + if (lnz >= 0 && unz >= 0) /* double relop, but ignore NaN case */ + { + lunz = lnz + unz - n_inner ; + } + else + { + lunz = EMPTY ; + } + print_ratio ("nz in L (incl diagonal)", " %20.0f", lnz_est, lnz) ; + print_ratio ("nz in U (incl diagonal)", " %20.0f", unz_est, unz) ; + print_ratio ("nz in L+U (incl diagonal)", " %20.0f", lunz_est, lunz) ; + + print_ratio ("largest front (# entries)", " %20.0f", + Info [UMFPACK_MAX_FRONT_SIZE_ESTIMATE], Info [UMFPACK_MAX_FRONT_SIZE]) ; + print_ratio ("largest # rows in front", " %20.0f", + Info [UMFPACK_MAX_FRONT_NROWS_ESTIMATE], + Info [UMFPACK_MAX_FRONT_NROWS]) ; + print_ratio ("largest # columns in front", " %20.0f", + Info [UMFPACK_MAX_FRONT_NCOLS_ESTIMATE], + Info [UMFPACK_MAX_FRONT_NCOLS]) ; + + /* ---------------------------------------------------------------------- */ + /* numeric factorization */ + /* ---------------------------------------------------------------------- */ + + tnum = Info [UMFPACK_NUMERIC_TIME] ; + twnum = Info [UMFPACK_NUMERIC_WALLTIME] ; + fnum = Info [UMFPACK_FLOPS] ; + + PRINT_INFO ("\n initial allocation ratio used: %0.3g\n", + Info [UMFPACK_ALLOC_INIT_USED]) ; + PRINT_INFO (" # of forced updates due to frontal growth: %.0f\n", + Info [UMFPACK_FORCED_UPDATES]) ; + PRINT_INFO (" number of off-diagonal pivots: %.0f\n", + Info [UMFPACK_NOFF_DIAG]) ; + PRINT_INFO (" nz in L (incl diagonal), if none dropped %.0f\n", + Info [UMFPACK_ALL_LNZ]) ; + PRINT_INFO (" nz in U (incl diagonal), if none dropped %.0f\n", + Info [UMFPACK_ALL_UNZ]) ; + PRINT_INFO (" number of small entries dropped %.0f\n", + Info [UMFPACK_NZDROPPED]) ; + PRINT_INFO (" nonzeros on diagonal of U: %.0f\n", + Info [UMFPACK_UDIAG_NZ]) ; + PRINT_INFO (" min abs. value on diagonal of U: %.2e\n", + Info [UMFPACK_UMIN]) ; + PRINT_INFO (" max abs. value on diagonal of U: %.2e\n", + Info [UMFPACK_UMAX]) ; + PRINT_INFO (" estimate of reciprocal of condition number: %.2e\n", + Info [UMFPACK_RCOND]) ; + PRINT_INFO (" indices in compressed pattern: %.0f\n", + Info [UMFPACK_COMPRESSED_PATTERN]) ; + PRINT_INFO (" numerical values stored in Numeric object: %.0f\n", + Info [UMFPACK_LU_ENTRIES]) ; + PRINT_INFO (" numeric factorization defragmentations: %.0f\n", + Info [UMFPACK_NUMERIC_DEFRAG]) ; + PRINT_INFO (" numeric factorization reallocations: %.0f\n", + Info [UMFPACK_NUMERIC_REALLOC]) ; + PRINT_INFO (" costly numeric factorization reallocations: %.0f\n", + Info [UMFPACK_NUMERIC_COSTLY_REALLOC]) ; + PRINT_INFO (" numeric factorization CPU time (sec): %.2f\n", + tnum) ; + PRINT_INFO (" numeric factorization wallclock time (sec): %.2f\n", + twnum) ; + + if (tnum > 0 && fnum > 0) + { + PRINT_INFO ( + " numeric factorization mflops (CPU time): %.2f\n", + 1e-6 * fnum / tnum) ; + } + if (twnum > 0 && fnum > 0) + { + PRINT_INFO ( + " numeric factorization mflops (wallclock): %.2f\n", + 1e-6 * fnum / twnum) ; + } + + ttot = EMPTY ; + ftot = fnum ; + if (tsym >= 0 && tnum >= 0) + { + ttot = tsym + tnum ; + PRINT_INFO (" symbolic + numeric CPU time (sec): %.2f\n", + ttot) ; + if (ftot > 0 && ttot > 0) + { + PRINT_INFO ( + " symbolic + numeric mflops (CPU time): %.2f\n", + 1e-6 * ftot / ttot) ; + } + } + + twtot = EMPTY ; + if (twsym >= 0 && twnum >= 0) + { + twtot = twsym + twnum ; + PRINT_INFO (" symbolic + numeric wall clock time (sec): %.2f\n", + twtot) ; + if (ftot > 0 && twtot > 0) + { + PRINT_INFO ( + " symbolic + numeric mflops (wall clock): %.2f\n", + 1e-6 * ftot / twtot) ; + } + } + + /* ---------------------------------------------------------------------- */ + /* solve */ + /* ---------------------------------------------------------------------- */ + + tsolve = Info [UMFPACK_SOLVE_TIME] ; + twsolve = Info [UMFPACK_SOLVE_WALLTIME] ; + fsolve = Info [UMFPACK_SOLVE_FLOPS] ; + + PRINT_INFO ("\n solve flops: %.5e\n", + fsolve) ; + PRINT_INFO (" iterative refinement steps taken: %.0f\n", + Info [UMFPACK_IR_TAKEN]) ; + PRINT_INFO (" iterative refinement steps attempted: %.0f\n", + Info [UMFPACK_IR_ATTEMPTED]) ; + PRINT_INFO (" sparse backward error omega1: %.2e\n", + Info [UMFPACK_OMEGA1]) ; + PRINT_INFO (" sparse backward error omega2: %.2e\n", + Info [UMFPACK_OMEGA2]) ; + PRINT_INFO (" solve CPU time (sec): %.2f\n", + tsolve) ; + PRINT_INFO (" solve wall clock time (sec): %.2f\n", + twsolve) ; + if (fsolve > 0 && tsolve > 0) + { + PRINT_INFO ( + " solve mflops (CPU time): %.2f\n", + 1e-6 * fsolve / tsolve) ; + } + if (fsolve > 0 && twsolve > 0) + { + PRINT_INFO ( + " solve mflops (wall clock time): %.2f\n", + 1e-6 * fsolve / twsolve) ; + } + + if (ftot >= 0 && fsolve >= 0) + { + ftot += fsolve ; + PRINT_INFO ( + "\n total symbolic + numeric + solve flops: %.5e\n", ftot) ; + } + + if (tsolve >= 0) + { + if (ttot >= 0 && ftot >= 0) + { + ttot += tsolve ; + PRINT_INFO ( + " total symbolic + numeric + solve CPU time: %.2f\n", + ttot) ; + if (ftot > 0 && ttot > 0) + { + PRINT_INFO ( + " total symbolic + numeric + solve mflops (CPU): %.2f\n", + 1e-6 * ftot / ttot) ; + } + } + } + + if (twsolve >= 0) + { + if (twtot >= 0 && ftot >= 0) + { + twtot += tsolve ; + PRINT_INFO ( + " total symbolic+numeric+solve wall clock time: %.2f\n", + twtot) ; + if (ftot > 0 && twtot > 0) + { + PRINT_INFO ( + " total symbolic+numeric+solve mflops(wallclock) %.2f\n", + 1e-6 * ftot / twtot) ; + } + } + } + PRINTF (("\n")) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umfpack_report_matrix.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_report_matrix.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,201 @@ +/* ========================================================================== */ +/* === UMFPACK_report_matrix ================================================ */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + User-callable. Prints a column or row-oriented matrix. See + umfpack_report_matrix.h for details. +*/ + +#include "umf_internal.h" + +GLOBAL Int UMFPACK_report_matrix +( + Int n_row, + Int n_col, + const Int Ap [ ], + const Int Ai [ ], + const double Ax [ ], +#ifdef COMPLEX + const double Az [ ], +#endif + Int col_form, /* 1: column form, 0: row form */ + const double Control [UMFPACK_CONTROL] +) +{ + Entry a ; + Int prl, i, k, length, ilast, p, nz, prl1, p1, p2, n, n_i, do_values ; + char *vector, *index ; +#ifdef COMPLEX + Int split = SPLIT (Az) ; +#endif + + /* ---------------------------------------------------------------------- */ + /* determine the form, and check if inputs exist */ + /* ---------------------------------------------------------------------- */ + + prl = GET_CONTROL (UMFPACK_PRL, UMFPACK_DEFAULT_PRL) ; + + if (prl <= 2) + { + return (UMFPACK_OK) ; + } + + if (col_form) + { + vector = "column" ; /* column vectors */ + index = "row" ; /* with row indices */ + n = n_col ; + n_i = n_row ; + } + else + { + vector = "row" ; /* row vectors */ + index = "column" ; /* with column indices */ + n = n_row ; + n_i = n_col ; + } + + PRINTF (("%s-form matrix, n_row "ID" n_col "ID", ", vector, n_row, n_col)) ; + + if (n_row <= 0 || n_col <= 0) + { + PRINTF (("ERROR: n_row <= 0 or n_col <= 0\n\n")) ; + return (UMFPACK_ERROR_n_nonpositive) ; + } + + if (!Ap) + { + PRINTF (("ERROR: Ap missing\n\n")) ; + return (UMFPACK_ERROR_argument_missing) ; + } + + nz = Ap [n] ; + PRINTF (("nz = "ID". ", nz)) ; + if (nz < 0) + { + PRINTF (("ERROR: number of entries < 0\n\n")) ; + return (UMFPACK_ERROR_invalid_matrix) ; + } + + if (Ap [0] != 0) + { + PRINTF (("ERROR: Ap ["ID"] = "ID" must be "ID"\n\n", + (Int) INDEX (0), INDEX (Ap [0]), (Int) INDEX (0))) ; + return (UMFPACK_ERROR_invalid_matrix) ; + } + + if (!Ai) + { + PRINTF (("ERROR: Ai missing\n\n")) ; + return (UMFPACK_ERROR_argument_missing) ; + } + + do_values = Ax != (double *) NULL ; + + PRINTF4 (("\n")) ; + + /* ---------------------------------------------------------------------- */ + /* check the row/column pointers, Ap */ + /* ---------------------------------------------------------------------- */ + + for (k = 0 ; k < n ; k++) + { + if (Ap [k] < 0) + { + PRINTF (("ERROR: Ap ["ID"] < 0\n\n", INDEX (k))) ; + return (UMFPACK_ERROR_invalid_matrix) ; + } + if (Ap [k] > nz) + { + PRINTF (("ERROR: Ap ["ID"] > size of Ai\n\n", INDEX (k))) ; + return (UMFPACK_ERROR_invalid_matrix) ; + } + } + + for (k = 0 ; k < n ; k++) + { + length = Ap [k+1] - Ap [k] ; + if (length < 0) + { + PRINTF (("ERROR: # entries in %s "ID" is < 0\n\n", + vector, INDEX (k))) ; + return (UMFPACK_ERROR_invalid_matrix) ; + } + } + + /* ---------------------------------------------------------------------- */ + /* print each vector */ + /* ---------------------------------------------------------------------- */ + + prl1 = prl ; + + for (k = 0 ; k < n ; k++) + { + /* if prl is 4, print the first 10 entries of the first 10 vectors */ + if (k < 10) + { + prl = prl1 ; + } + /* get the vector pointers */ + p1 = Ap [k] ; + p2 = Ap [k+1] ; + length = p2 - p1 ; + PRINTF4 (("\n %s "ID": start: "ID" end: "ID" entries: "ID"\n", + vector, INDEX (k), p1, p2-1, length)) ; + ilast = EMPTY ; + for (p = p1 ; p < p2 ; p++) + { + i = Ai [p] ; + PRINTF4 (("\t%s "ID" ", index, INDEX (i))) ; + if (do_values && prl >= 4) + { + PRINTF ((":")) ; + ASSIGN (a, Ax, Az, p, split) ; + PRINT_ENTRY (a) ; + } + if (i < 0 || i >= n_i) + { + PRINTF ((" ERROR: %s index "ID" out of range in %s "ID"\n\n", + index, INDEX (i), vector, INDEX (k))) ; + return (UMFPACK_ERROR_invalid_matrix) ; + } + if (i <= ilast) + { + PRINTF ((" ERROR: %s index "ID" out of order (or duplicate) in " + "%s "ID"\n\n", index, INDEX (i), vector, INDEX (k))) ; + return (UMFPACK_ERROR_invalid_matrix) ; + } + PRINTF4 (("\n")) ; + /* truncate printout, but continue to check matrix */ + if (prl == 4 && (p - p1) == 9 && length > 10) + { + PRINTF4 (("\t...\n")) ; + prl-- ; + } + ilast = i ; + } + /* truncate printout, but continue to check matrix */ + if (prl == 4 && k == 9 && n > 10) + { + PRINTF4 (("\n ...\n")) ; + prl-- ; + } + } + prl = prl1 ; + + /* ---------------------------------------------------------------------- */ + /* return the status of the matrix */ + /* ---------------------------------------------------------------------- */ + + PRINTF4 ((" %s-form matrix ", vector)) ; + PRINTF (("OK\n\n")) ; + + return (UMFPACK_OK) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umfpack_report_numeric.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_report_numeric.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,663 @@ +/* ========================================================================== */ +/* === UMFPACK_report_numeric =============================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + User-callable. Prints the Numeric object. + See umfpack_report_numeric.h for details. + + Dynamic memory usage: Allocates a size n*sizeof(Int) workspace via a single + call to UMF_malloc and then frees all of it via UMF_free on return. The + workspace is not allocated if an early error return occurs before the + workspace is needed. +*/ + +#include "umf_internal.h" +#include "umf_valid_numeric.h" +#include "umf_report_perm.h" +#include "umf_report_vector.h" +#include "umf_malloc.h" +#include "umf_free.h" + + +PRIVATE Int report_L +( + NumericType *Numeric, + Int Pattern [ ], + Int prl +) ; + + +PRIVATE Int report_U +( + NumericType *Numeric, + Int Pattern [ ], + Int prl +) ; + +/* ========================================================================== */ +/* === UMFPACK_report_numeric =============================================== */ +/* ========================================================================== */ + +GLOBAL Int UMFPACK_report_numeric +( + void *NumericHandle, + const double Control [UMFPACK_CONTROL] +) +{ + Int prl, *W, nn, n_row, n_col, n_inner, num_fixed_size, numeric_size, + npiv ; + NumericType *Numeric ; + + prl = GET_CONTROL (UMFPACK_PRL, UMFPACK_DEFAULT_PRL) ; + + if (prl <= 2) + { + return (UMFPACK_OK) ; + } + + PRINTF (("Numeric object: ")) ; + + Numeric = (NumericType *) NumericHandle ; + if (!UMF_valid_numeric (Numeric)) + { + PRINTF (("ERROR: LU factors invalid\n\n")) ; + return (UMFPACK_ERROR_invalid_Numeric_object) ; + } + + n_row = Numeric->n_row ; + n_col = Numeric->n_col ; + nn = MAX (n_row, n_col) ; + n_inner = MIN (n_row, n_col) ; + npiv = Numeric->npiv ; + + DEBUG1 (("n_row "ID" n_col "ID" nn "ID" n_inner "ID" npiv "ID"\n", + n_row, n_col, nn, n_inner, npiv)) ; + + /* size of Numeric object, except Numeric->Memory and Numeric->Upattern */ + /* see also UMF_set_stats */ + num_fixed_size = + UNITS (NumericType, 1) /* Numeric structure */ + + UNITS (Entry, n_inner+1) /* D */ + + UNITS (Int, n_row+1) /* Rperm */ + + UNITS (Int, n_col+1) /* Cperm */ + + 6 * UNITS (Int, npiv+1) /* Lpos, Uilen, Uip, Upos, Lilen, Lip */ + + ((Numeric->scale != UMFPACK_SCALE_NONE) ? + UNITS (Entry, n_row) : 0) ; /* Rs */ + + DEBUG1 (("num fixed size: "ID"\n", num_fixed_size)) ; + DEBUG1 (("Numeric->size "ID"\n", Numeric->size)) ; + DEBUG1 (("ulen units "ID"\n", UNITS (Int, Numeric->ulen))) ; + + /* size of Numeric->Memory is Numeric->size */ + /* size of Numeric->Upattern is Numeric->ulen */ + numeric_size = num_fixed_size + Numeric->size + + UNITS (Int, Numeric->ulen) ; + + DEBUG1 (("numeric total size "ID"\n", numeric_size)) ; + + if (prl >= 4) + { + PRINTF (("\n n_row: "ID" n_col: "ID"\n", n_row, n_col)) ; + + PRINTF ((" relative pivot tolerance used: %g\n", + Numeric->relpt)) ; + PRINTF ((" relative symmetric pivot tolerance used: %g\n", + Numeric->relpt2)) ; + + PRINTF ((" matrix scaled: ")) ; + if (Numeric->scale == UMFPACK_SCALE_NONE) + { + PRINTF (("no")) ; + } + else if (Numeric->scale == UMFPACK_SCALE_SUM) + { + PRINTF (("yes (divided each row by sum abs value in each row)\n")) ; + PRINTF ((" minimum sum (abs (rows of A)): %.5e\n", + Numeric->rsmin)) ; + PRINTF ((" maximum sum (abs (rows of A)): %.5e", + Numeric->rsmax)) ; + } + else if (Numeric->scale == UMFPACK_SCALE_MAX) + { + PRINTF (("yes (divided each row by max abs value in each row)\n")) ; + PRINTF ((" minimum max (abs (rows of A)): %.5e\n", + Numeric->rsmin)) ; + PRINTF ((" maximum max (abs (rows of A)): %.5e", + Numeric->rsmax)) ; + } + PRINTF (("\n")) ; + + PRINTF ((" initial allocation parameter used: %g\n", + Numeric->alloc_init)) ; + PRINTF ((" frontal matrix allocation parameter used: %g\n", + Numeric->front_alloc_init)) ; + PRINTF ((" final total size of Numeric object (Units): "ID"\n", + numeric_size)) ; + PRINTF ((" final total size of Numeric object (MBytes): %.1f\n", + MBYTES (numeric_size))) ; + PRINTF ((" peak size of variable-size part (Units): "ID"\n", + Numeric->max_usage)) ; + PRINTF ((" peak size of variable-size part (MBytes): %.1f\n", + MBYTES (Numeric->max_usage))) ; + PRINTF ((" largest actual frontal matrix size: "ID"\n", + Numeric->maxfrsize)) ; + PRINTF ((" memory defragmentations: "ID"\n", + Numeric->ngarbage)) ; + PRINTF ((" memory reallocations: "ID"\n", + Numeric->nrealloc)) ; + PRINTF ((" costly memory reallocations: "ID"\n", + Numeric->ncostly)) ; + PRINTF ((" entries in compressed pattern (L and U): "ID"\n", + Numeric->isize)) ; + PRINTF ((" number of nonzeros in L (excl diag): "ID"\n", + Numeric->lnz)) ; + PRINTF ((" number of entries stored in L (excl diag): "ID"\n", + Numeric->nLentries)) ; + PRINTF ((" number of nonzeros in U (excl diag): "ID"\n", + Numeric->unz)) ; + PRINTF ((" number of entries stored in U (excl diag): "ID"\n", + Numeric->nUentries)) ; + PRINTF ((" factorization floating-point operations: %g\n", + Numeric->flops)) ; + PRINTF ((" number of nonzeros on diagonal of U: "ID"\n", + Numeric->nnzpiv)) ; + PRINTF ((" min abs. value on diagonal of U: %.5e\n", + Numeric->min_udiag)) ; + PRINTF ((" max abs. value on diagonal of U: %.5e\n", + Numeric->max_udiag)) ; + PRINTF ((" reciprocal condition number estimate: %.2e\n", + Numeric->rcond)) ; + } + + W = (Int *) UMF_malloc (nn, sizeof (Int)) ; + if (!W) + { + PRINTF ((" ERROR: out of memory to check Numeric object\n\n")) ; + return (UMFPACK_ERROR_out_of_memory) ; + } + + if (Numeric->Rs) + { +#ifndef NRECIPROCAL + if (Numeric->do_recip) + { + PRINTF4 (("\nScale factors applied via multiplication\n")) ; + } + else +#endif + { + PRINTF4 (("\nScale factors applied via division\n")) ; + } + PRINTF4 (("Scale factors, Rs: ")) ; + (void) UMF_report_vector (n_row, Numeric->Rs, (double *) NULL, + prl, FALSE, TRUE) ; + } + else + { + PRINTF4 (("Scale factors, Rs: (not present)\n")) ; + } + + PRINTF4 (("\nP: row ")) ; + if (UMF_report_perm (n_row, Numeric->Rperm, W, prl, 0) != UMFPACK_OK) + { + (void) UMF_free ((void *) W) ; + return (UMFPACK_ERROR_invalid_Numeric_object) ; + } + + PRINTF4 (("\nQ: column ")) ; + if (UMF_report_perm (n_col, Numeric->Cperm, W, prl, 0) != UMFPACK_OK) + { + (void) UMF_free ((void *) W) ; + return (UMFPACK_ERROR_invalid_Numeric_object) ; + } + + if (!report_L (Numeric, W, prl)) + { + (void) UMF_free ((void *) W) ; + PRINTF ((" ERROR: L factor invalid\n\n")) ; + return (UMFPACK_ERROR_invalid_Numeric_object) ; + } + + if (!report_U (Numeric, W, prl)) + { + (void) UMF_free ((void *) W) ; + PRINTF ((" ERROR: U factor invalid\n\n")) ; + return (UMFPACK_ERROR_invalid_Numeric_object) ; + } + + /* The diagonal of U is in "merged" (Entry) form, not "split" form. */ + PRINTF4 (("\ndiagonal of U: ")) ; + (void) UMF_report_vector (n_inner, (double *) Numeric->D, (double *) NULL, + prl, FALSE, FALSE) ; + + (void) UMF_free ((void *) W) ; + + PRINTF4 ((" Numeric object: ")) ; + PRINTF (("OK\n\n")) ; + return (UMFPACK_OK) ; +} + + +/* ========================================================================== */ +/* === report_L ============================================================= */ +/* ========================================================================== */ + +PRIVATE Int report_L +( + NumericType *Numeric, + Int Pattern [ ], + Int prl +) +{ + Int k, deg, *ip, j, row, n_row, *Lpos, *Lilen, valid, k1, + *Lip, newLchain, llen, prl1, pos, lp, p, npiv, n1, *Li ; + Entry *xp, *Lval ; + + /* ---------------------------------------------------------------------- */ + + ASSERT (prl >= 3) ; + + n_row = Numeric->n_row ; + npiv = Numeric->npiv ; + n1 = Numeric->n1 ; + Lpos = Numeric->Lpos ; + Lilen = Numeric->Lilen ; + Lip = Numeric->Lip ; + prl1 = prl ; + deg = 0 ; + + PRINTF4 (( + "\nL in Numeric object, in column-oriented compressed-pattern form:\n" + " Diagonal entries are all equal to 1.0 (not stored)\n")) ; + + ASSERT (Pattern != (Int *) NULL) ; + + /* ---------------------------------------------------------------------- */ + /* print L */ + /* ---------------------------------------------------------------------- */ + + k1 = 12 ; + + /* ---------------------------------------------------------------------- */ + /* print the singleton columns of L */ + /* ---------------------------------------------------------------------- */ + + for (k = 0 ; k < n1 ; k++) + { + if (k1 > 0) + { + prl = prl1 ; + } + lp = Lip [k] ; + deg = Lilen [k] ; + Li = (Int *) (Numeric->Memory + lp) ; + lp += UNITS (Int, deg) ; + Lval = (Entry *) (Numeric->Memory + lp) ; + if (k1-- > 0) + { + prl = prl1 ; + } + else if (prl == 4) + { + PRINTF ((" ...\n")) ; + prl-- ; + } + PRINTF4 (("\n column "ID":", INDEX (k))) ; + PRINTF4 ((" length "ID".\n", deg)) ; + for (j = 0 ; j < deg ; j++) + { + row = Li [j] ; + PRINTF4 (("\trow "ID" : ", INDEX (row))) ; + if (prl >= 4) PRINT_ENTRY (Lval [j]) ; + if (row <= k || row >= n_row) + { + return (FALSE) ; + } + PRINTF4 (("\n")) ; + /* truncate printout, but continue to check L */ + if (prl == 4 && j == 9 && deg > 10) + { + PRINTF (("\t...\n")) ; + prl-- ; + } + } + } + + /* ---------------------------------------------------------------------- */ + /* print the regular columns of L */ + /* ---------------------------------------------------------------------- */ + + for (k = n1 ; k < npiv ; k++) + { + /* if prl is 4, print the first 10 entries of the first 10 columns */ + if (k1 > 0) + { + prl = prl1 ; + } + + lp = Lip [k] ; + newLchain = (lp < 0) ; + if (newLchain) + { + lp = -lp ; + deg = 0 ; + } + + if (k1-- > 0) + { + prl = prl1 ; + } + else if (prl == 4) + { + PRINTF ((" ...\n")) ; + prl-- ; + } + + PRINTF4 (("\n column "ID":", INDEX (k))) ; + + /* ------------------------------------------------------------------ */ + /* make column of L in Pattern [0..deg-1] */ + /* ------------------------------------------------------------------ */ + + /* remove pivot row */ + pos = Lpos [k] ; + if (pos != EMPTY) + { + PRINTF4 ((" remove row "ID" at position "ID".", + INDEX (Pattern [pos]), INDEX (pos))) ; + valid = (!newLchain) && (deg > 0) && (pos < deg) && (pos >= 0) + && (Pattern [pos] == k) ; + if (!valid) + { + return (FALSE) ; + } + Pattern [pos] = Pattern [--deg] ; + } + + /* concatenate the pattern */ + llen = Lilen [k] ; + if (llen < 0) + { + return (FALSE) ; + } + p = lp + UNITS (Int, llen) ; + xp = (Entry *) (Numeric->Memory + p) ; + if ((llen > 0 || deg > 0) + && (p + (Int) UNITS (Entry, deg) > Numeric->size)) + { + return (FALSE) ; + } + if (llen > 0) + { + PRINTF4 ((" add "ID" entries.", llen)) ; + ip = (Int *) (Numeric->Memory + lp) ; + for (j = 0 ; j < llen ; j++) + { + Pattern [deg++] = *ip++ ; + } + } + + /* ------------------------------------------------------------------ */ + /* print column k of L */ + /* ------------------------------------------------------------------ */ + + PRINTF4 ((" length "ID".", deg)) ; + if (newLchain) + { + PRINTF4 ((" Start of Lchain.")) ; + } + PRINTF4 (("\n")) ; + + for (j = 0 ; j < deg ; j++) + { + row = Pattern [j] ; + PRINTF4 (("\trow "ID" : ", INDEX (row))) ; + if (prl >= 4) PRINT_ENTRY (*xp) ; + if (row <= k || row >= n_row) + { + return (FALSE) ; + } + PRINTF4 (("\n")) ; + xp++ ; + /* truncate printout, but continue to check L */ + if (prl == 4 && j == 9 && deg > 10) + { + PRINTF (("\t...\n")) ; + prl-- ; + } + } + } + + PRINTF4 (("\n")) ; + return (TRUE) ; +} + + +/* ========================================================================== */ +/* === report_U ============================================================= */ +/* ========================================================================== */ + +PRIVATE Int report_U +( + NumericType *Numeric, + Int Pattern [ ], + Int prl +) +{ + /* ---------------------------------------------------------------------- */ + + Int k, deg, j, *ip, col, *Upos, *Uilen, k1, prl1, pos, + *Uip, n_col, ulen, p, newUchain, up, npiv, n1, *Ui ; + Entry *xp, *Uval ; + + /* ---------------------------------------------------------------------- */ + + ASSERT (prl >= 3) ; + + n_col = Numeric->n_col ; + npiv = Numeric->npiv ; + n1 = Numeric->n1 ; + Upos = Numeric->Upos ; + Uilen = Numeric->Uilen ; + Uip = Numeric->Uip ; + prl1 = prl ; + + PRINTF4 (( + "\nU in Numeric object, in row-oriented compressed-pattern form:\n" + " Diagonal is stored separately.\n")) ; + + ASSERT (Pattern != (Int *) NULL) ; + + k1 = 12 ; + + /* ---------------------------------------------------------------------- */ + /* print the sparse part of U */ + /* ---------------------------------------------------------------------- */ + + deg = Numeric->ulen ; + if (deg > 0) + { + /* make last pivot row of U (singular matrices only) */ + for (j = 0 ; j < deg ; j++) + { + Pattern [j] = Numeric->Upattern [j] ; + } + } + + PRINTF4 (("\n row "ID": length "ID". End of Uchain.\n", INDEX (npiv-1), + deg)) ; + + for (k = npiv-1 ; k >= n1 ; k--) + { + + /* ------------------------------------------------------------------ */ + /* print row k of U */ + /* ------------------------------------------------------------------ */ + + /* if prl is 3, print the first 10 entries of the first 10 columns */ + if (k1 > 0) + { + prl = prl1 ; + } + + up = Uip [k] ; + ulen = Uilen [k] ; + if (ulen < 0) + { + return (FALSE) ; + } + newUchain = (up < 0) ; + if (newUchain) + { + up = -up ; + p = up + UNITS (Int, ulen) ; + } + else + { + p = up ; + } + xp = (Entry *) (Numeric->Memory + p) ; + if (deg > 0 && (p + (Int) UNITS (Entry, deg) > Numeric->size)) + { + return (FALSE) ; + } + for (j = 0 ; j < deg ; j++) + { + col = Pattern [j] ; + PRINTF4 (("\tcol "ID" :", INDEX (col))) ; + if (prl >= 4) PRINT_ENTRY (*xp) ; + if (col <= k || col >= n_col) + { + return (FALSE) ; + } + PRINTF4 (("\n")) ; + xp++ ; + /* truncate printout, but continue to check U */ + if (prl == 4 && j == 9 && deg > 10) + { + PRINTF (("\t...\n")) ; + prl-- ; + } + } + + /* ------------------------------------------------------------------ */ + /* make row k-1 of U in Pattern [0..deg-1] */ + /* ------------------------------------------------------------------ */ + + if (k1-- > 0) + { + prl = prl1 ; + } + else if (prl == 4) + { + PRINTF ((" ...\n")) ; + prl-- ; + } + + if (k > 0) + { + PRINTF4 (("\n row "ID": ", INDEX (k-1))) ; + } + + if (newUchain) + { + /* next row is a new Uchain */ + if (k > 0) + { + deg = ulen ; + PRINTF4 (("length "ID". End of Uchain.\n", deg)) ; + if (up + (Int) UNITS (Int, ulen) > Numeric->size) + { + return (FALSE) ; + } + ip = (Int *) (Numeric->Memory + up) ; + for (j = 0 ; j < deg ; j++) + { + Pattern [j] = *ip++ ; + } + } + } + else + { + if (ulen > 0) + { + PRINTF4 (("remove "ID" entries. ", ulen)) ; + } + deg -= ulen ; + if (deg < 0) + { + return (FALSE) ; + } + pos = Upos [k] ; + if (pos != EMPTY) + { + /* add the pivot column */ + PRINTF4 (("add column "ID" at position "ID". ", + INDEX (k), INDEX (pos))) ; + if (pos < 0 || pos > deg) + { + return (FALSE) ; + } + Pattern [deg++] = Pattern [pos] ; + Pattern [pos] = k ; + } + PRINTF4 (("length "ID".\n", deg)) ; + } + } + + /* ---------------------------------------------------------------------- */ + /* print the singleton rows of U */ + /* ---------------------------------------------------------------------- */ + + for (k = n1 - 1 ; k >= 0 ; k--) + { + if (k1 > 0) + { + prl = prl1 ; + } + up = Uip [k] ; + deg = Uilen [k] ; + Ui = (Int *) (Numeric->Memory + up) ; + up += UNITS (Int, deg) ; + Uval = (Entry *) (Numeric->Memory + up) ; + if (k1-- > 0) + { + prl = prl1 ; + } + else if (prl == 4) + { + PRINTF ((" ...\n")) ; + prl-- ; + } + PRINTF4 (("\n row "ID":", INDEX (k))) ; + PRINTF4 ((" length "ID".\n", deg)) ; + for (j = 0 ; j < deg ; j++) + { + col = Ui [j] ; + PRINTF4 (("\tcol "ID" : ", INDEX (col))) ; + if (prl >= 4) PRINT_ENTRY (Uval [j]) ; + if (col <= k || col >= n_col) + { + return (FALSE) ; + } + PRINTF4 (("\n")) ; + /* truncate printout, but continue to check U */ + if (prl == 4 && j == 9 && deg > 10) + { + PRINTF (("\t...\n")) ; + prl-- ; + } + } + } + + prl = prl1 ; + PRINTF4 (("\n")) ; + return (TRUE) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umfpack_report_perm.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_report_perm.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,44 @@ +/* ========================================================================== */ +/* === UMFPACK_report_perm ================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + User-callable. Prints a permutation vector. See umfpack_report_perm.h + for details. + + Dynamic memory usage: Allocates a size max(np,1)*sizeof(Int) workspace via + a single call to UMF_malloc and then frees all of it via UMF_free on return. +*/ + +#include "umf_internal.h" +#include "umf_report_perm.h" +#include "umf_malloc.h" +#include "umf_free.h" + +GLOBAL Int UMFPACK_report_perm +( + Int np, + const Int Perm [ ], + const double Control [UMFPACK_CONTROL] +) +{ + Int prl, *W, status ; + + prl = GET_CONTROL (UMFPACK_PRL, UMFPACK_DEFAULT_PRL) ; + + if (prl <= 2) + { + return (UMFPACK_OK) ; + } + + W = (Int *) UMF_malloc (MAX (np,1), sizeof (Int)) ; + status = UMF_report_perm (np, Perm, W, prl, 1) ; + (void) UMF_free ((void *) W) ; + return (status) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umfpack_report_status.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_report_status.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,118 @@ +/* ========================================================================== */ +/* === UMFPACK_report_status ================================================ */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + User-callable. Prints the return value from other UMFPACK_* routines. + See umfpack_report_status.h for details. +*/ + +#include "umf_internal.h" + +GLOBAL void UMFPACK_report_status +( + const double Control [UMFPACK_CONTROL], + Int status +) +{ + Int prl ; + + /* ---------------------------------------------------------------------- */ + /* get control settings and status to determine what to print */ + /* ---------------------------------------------------------------------- */ + + prl = GET_CONTROL (UMFPACK_PRL, UMFPACK_DEFAULT_PRL) ; + + if (prl < 1) + { + /* no output generated if prl is less than 1 */ + return ; + } + + if (status == UMFPACK_OK && prl <= 1) + { + /* no output generated if prl is 1 or less and no error occurred. */ + /* note that the default printing level is 1. */ + return ; + } + + /* ---------------------------------------------------------------------- */ + /* print umfpack license, copyright, version, and status condition */ + /* ---------------------------------------------------------------------- */ + + PRINTF (("\n")) ; + PRINTF4 (("%s\n", UMFPACK_COPYRIGHT)) ; + PRINTF6 (("%s", UMFPACK_LICENSE_PART1)) ; + PRINTF6 (("%s", UMFPACK_LICENSE_PART2)) ; + PRINTF6 (("%s", UMFPACK_LICENSE_PART3)) ; + PRINTF (("%s: ", UMFPACK_VERSION)) ; + + switch (status) + { + case UMFPACK_OK: + PRINTF (("OK\n")) ; + break ; + + case UMFPACK_WARNING_singular_matrix: + PRINTF (("WARNING: matrix is singular\n")) ; + break ; + + case UMFPACK_ERROR_out_of_memory: + PRINTF (("ERROR: out of memory\n")) ; + break ; + + case UMFPACK_ERROR_invalid_Numeric_object: + PRINTF (("ERROR: Numeric object is invalid\n")) ; + break ; + + case UMFPACK_ERROR_invalid_Symbolic_object: + PRINTF (("ERROR: Symbolic object is invalid\n")) ; + break ; + + case UMFPACK_ERROR_argument_missing: + PRINTF (("ERROR: required argument(s) missing\n")) ; + break ; + + case UMFPACK_ERROR_n_nonpositive: + PRINTF (("ERROR: dimension (n_row or n_col) must be > 0\n")) ; + break ; + + case UMFPACK_ERROR_invalid_matrix: + PRINTF (("ERROR: input matrix is invalid\n")) ; + break ; + + case UMFPACK_ERROR_invalid_system: + PRINTF (("ERROR: system argument invalid\n")) ; + break ; + + case UMFPACK_ERROR_invalid_permutation: + PRINTF (("ERROR: invalid permutation\n")) ; + break ; + + case UMFPACK_ERROR_different_pattern: + PRINTF (("ERROR: pattern of matrix (Ap and/or Ai) has changed\n")) ; + break ; + + case UMFPACK_ERROR_internal_error: + PRINTF (("INTERNAL ERROR!\n" + "Input arguments might be corrupted or aliased, or an internal\n" + "error has occurred. Check your input arguments with the\n" + "umfpack_*_report_* routines before calling the umfpack_*\n" + "computational routines. Recompile UMFPACK with debugging\n" + "enabled, and look for failed assertions. If all else fails\n" + "please report this error to Tim Davis (davis@cise.ufl.edu).\n" + )) ; + break ; + + default: + PRINTF (("ERROR: Unrecognized error code: "ID"\n", status)) ; + + } + PRINTF (("\n")) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umfpack_report_symbolic.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_report_symbolic.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,228 @@ +/* ========================================================================== */ +/* === UMFPACK_report_symbolic ============================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + User-callable. Prints the Symbolic object. See umfpack_report_symbolic.h + for details. Does not print new Cdeg, Rdeg, Esize, and the Diagonal_map. + + Dynamic memory usage: Allocates a size MAX (n_row,n_col)*sizeof(Int) + workspace via a single call to UMF_malloc and then frees all of it via + UMF_free on return. The workspace is not allocated if an early error + return occurs before the workspace is needed. +*/ + +#include "umf_internal.h" +#include "umf_valid_symbolic.h" +#include "umf_report_perm.h" +#include "umf_malloc.h" +#include "umf_free.h" + +GLOBAL Int UMFPACK_report_symbolic +( + void *SymbolicHandle, + const double Control [UMFPACK_CONTROL] +) +{ + Int n_row, n_col, nz, nchains, nfr, maxnrows, maxncols, prl, + k, chain, frontid, frontid1, frontid2, kk, *Chain_start, *W, + *Chain_maxrows, *Chain_maxcols, *Front_npivcol, *Front_1strow, + *Front_leftmostdesc, *Front_parent, done, status1, status2 ; + SymbolicType *Symbolic ; + + prl = GET_CONTROL (UMFPACK_PRL, UMFPACK_DEFAULT_PRL) ; + + if (prl <= 2) + { + return (UMFPACK_OK) ; + } + + PRINTF (("Symbolic object: ")) ; + + Symbolic = (SymbolicType *) SymbolicHandle ; + if (!UMF_valid_symbolic (Symbolic)) + { + PRINTF (("ERROR: invalid\n")) ; + return (UMFPACK_ERROR_invalid_Symbolic_object) ; + } + + n_row = Symbolic->n_row ; + n_col = Symbolic->n_col ; + + nz = Symbolic->nz ; + + nchains = Symbolic->nchains ; + nfr = Symbolic->nfr ; + maxnrows = Symbolic->maxnrows ; + maxncols = Symbolic->maxncols ; + + Chain_start = Symbolic->Chain_start ; + Chain_maxrows = Symbolic->Chain_maxrows ; + Chain_maxcols = Symbolic->Chain_maxcols ; + Front_npivcol = Symbolic->Front_npivcol ; + Front_1strow = Symbolic->Front_1strow ; + Front_leftmostdesc = Symbolic->Front_leftmostdesc ; + Front_parent = Symbolic->Front_parent ; + + if (prl >= 4) + { + + PRINTF (("\n matrix to be factorized:\n")) ; + PRINTF (("\tn_row: "ID" n_col: "ID"\n", n_row, n_col)) ; + PRINTF (("\tnumber of entries: "ID"\n", nz)) ; + PRINTF ((" block size used for dense matrix kernels: "ID"\n", + Symbolic->nb)) ; + + PRINTF ((" strategy used: ")) ; + /* strategy cannot be auto */ + if (Symbolic->strategy == UMFPACK_STRATEGY_SYMMETRIC) + { + PRINTF (("symmetric")) ; + } + else if (Symbolic->strategy == UMFPACK_STRATEGY_UNSYMMETRIC) + { + PRINTF (("unsymmetric")) ; + } + else if (Symbolic->strategy == UMFPACK_STRATEGY_2BY2) + { + PRINTF (("symmetric 2-by-2")) ; + } + PRINTF (("\n")) ; + + PRINTF ((" ordering used: ")) ; + if (Symbolic->ordering == UMFPACK_ORDERING_COLAMD) + { + PRINTF (("colamd on A\n")) ; + } + else if (Symbolic->ordering == UMFPACK_ORDERING_AMD) + { + PRINTF (("amd on A+A'\n")) ; + } + else if (Symbolic->ordering == UMFPACK_ORDERING_GIVEN) + { + PRINTF (("provided by user")) ; + } + PRINTF (("\n")) ; + + PRINTF ((" performn column etree postorder: ")) ; + if (Symbolic->fixQ) + { + PRINTF (("no\n")) ; + } + else + { + PRINTF (("yes\n")) ; + } + + PRINTF ((" prefer diagonal pivoting (attempt P=Q): ")) ; + if (Symbolic->prefer_diagonal) + { + PRINTF (("yes\n")) ; + } + else + { + PRINTF (("no\n")) ; + } + + PRINTF ((" variable-size part of Numeric object:\n")) ; + PRINTF (("\tminimum initial size (Units): %.20g (MBytes): %.1f\n", + Symbolic->dnum_mem_init_usage, + MBYTES (Symbolic->dnum_mem_init_usage))) ; + PRINTF (("\testimated peak size (Units): %.20g (MBytes): %.1f\n", + Symbolic->num_mem_usage_est, + MBYTES (Symbolic->num_mem_usage_est))) ; + PRINTF (("\testimated final size (Units): %.20g (MBytes): %.1f\n", + Symbolic->num_mem_size_est, + MBYTES (Symbolic->num_mem_size_est))) ; + PRINTF ((" symbolic factorization memory usage (Units):" + " %.20g (MBytes): %.1f\n", + Symbolic->peak_sym_usage, + MBYTES (Symbolic->peak_sym_usage))) ; + PRINTF ((" frontal matrices / supercolumns:\n")) ; + PRINTF (("\tnumber of frontal chains: "ID"\n", nchains)) ; + PRINTF (("\tnumber of frontal matrices: "ID"\n", nfr)) ; + PRINTF (("\tlargest frontal matrix row dimension: "ID"\n", maxnrows)) ; + PRINTF (("\tlargest frontal matrix column dimension: "ID"\n",maxncols)); + } + + k = 0 ; + done = FALSE ; + + for (chain = 0 ; chain < nchains ; chain++) + { + frontid1 = Chain_start [chain] ; + frontid2 = Chain_start [chain+1] - 1 ; + PRINTF4 (("\n Frontal chain: "ID". Frontal matrices "ID" to "ID"\n", + INDEX (chain), INDEX (frontid1), INDEX (frontid2))) ; + PRINTF4 (("\tLargest frontal matrix in Frontal chain: "ID"-by-"ID"\n", + Chain_maxrows [chain], Chain_maxcols [chain])) ; + for (frontid = frontid1 ; frontid <= frontid2 ; frontid++) + { + kk = Front_npivcol [frontid] ; + PRINTF4 (("\tFront: "ID" pivot cols: "ID" (pivot columns "ID" to " + ID")\n", INDEX (frontid), kk, INDEX (k), INDEX (k+kk-1))) ; + PRINTF4 (("\t pivot row candidates: "ID" to "ID"\n", + INDEX (Front_1strow [Front_leftmostdesc [frontid]]), + INDEX (Front_1strow [frontid+1]-1))) ; + PRINTF4 (("\t leftmost descendant: "ID"\n", + INDEX (Front_leftmostdesc [frontid]))) ; + PRINTF4 (("\t 1st new candidate row : "ID"\n", + INDEX (Front_1strow [frontid]))) ; + PRINTF4 (("\t parent:")) ; + if (Front_parent [frontid] == EMPTY) + { + PRINTF4 ((" (none)\n")) ; + } + else + { + PRINTF4 ((" "ID"\n", INDEX (Front_parent [frontid]))) ; + } + done = (frontid == 20 && frontid < nfr-1 && prl == 4) ; + if (done) + { + PRINTF4 (("\t...\n")) ; + break ; + } + k += kk ; + } + if (Front_npivcol [nfr] != 0) + { + PRINTF4 (("\tFront: "ID" placeholder for "ID" empty columns\n", + INDEX (nfr), Front_npivcol [nfr])) ; + } + if (done) + { + break ; + } + } + + W = (Int *) UMF_malloc (MAX (n_row, n_col), sizeof (Int)) ; + if (!W) + { + PRINTF (("ERROR: out of memory to check Symbolic object\n\n")) ; + return (UMFPACK_ERROR_out_of_memory) ; + } + + PRINTF4 (("\nInitial column permutation, Q1: ")) ; + status1 = UMF_report_perm (n_col, Symbolic->Cperm_init, W, prl, 0) ; + + PRINTF4 (("\nInitial row permutation, P1: ")) ; + status2 = UMF_report_perm (n_row, Symbolic->Rperm_init, W, prl, 0) ; + + (void) UMF_free ((void *) W) ; + + if (status1 != UMFPACK_OK || status2 != UMFPACK_OK) + { + return (UMFPACK_ERROR_invalid_Symbolic_object) ; + } + + PRINTF4 ((" Symbolic object: ")) ; + PRINTF (("OK\n\n")) ; + return (UMFPACK_OK) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umfpack_report_triplet.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_report_triplet.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,99 @@ +/* ========================================================================== */ +/* === UMFPACK_report_triplet =============================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + User-callable. Prints a matrix in triplet form. See + umfpack_report_triplet.h for details. +*/ + +#include "umf_internal.h" + +GLOBAL Int UMFPACK_report_triplet +( + Int n_row, + Int n_col, + Int nz, + const Int Ti [ ], + const Int Tj [ ], + const double Tx [ ], +#ifdef COMPLEX + const double Tz [ ], +#endif + const double Control [UMFPACK_CONTROL] +) +{ + Entry t ; + Int prl, prl1, k, i, j, do_values ; +#ifdef COMPLEX + Int split = SPLIT (Tz) ; +#endif + + prl = GET_CONTROL (UMFPACK_PRL, UMFPACK_DEFAULT_PRL) ; + + if (prl <= 2) + { + return (UMFPACK_OK) ; + } + + PRINTF (("triplet-form matrix, n_row = "ID", n_col = "ID" nz = "ID". ", + n_row, n_col, nz)) ; + + if (!Ti || !Tj) + { + PRINTF (("ERROR: indices not present\n\n")) ; + return (UMFPACK_ERROR_argument_missing) ; + } + + if (n_row <= 0 || n_col <= 0) + { + PRINTF (("ERROR: n_row or n_col is <= 0\n\n")) ; + return (UMFPACK_ERROR_n_nonpositive) ; + } + + if (nz < 0) + { + PRINTF (("ERROR: nz is < 0\n\n")) ; + return (UMFPACK_ERROR_invalid_matrix) ; + } + + PRINTF4 (("\n")) ; + + do_values = Tx != (double *) NULL ; + + prl1 = prl ; + for (k = 0 ; k < nz ; k++) + { + i = Ti [k] ; + j = Tj [k] ; + PRINTF4 ((" "ID" : "ID" "ID" ", INDEX (k), INDEX (i), INDEX (j))) ; + if (do_values && prl >= 4) + { + ASSIGN (t, Tx, Tz, k, split) ; + PRINT_ENTRY (t) ; + } + PRINTF4 (("\n")) ; + if (i < 0 || i >= n_row || j < 0 || j >= n_col) + { + /* invalid triplet */ + PRINTF (("ERROR: invalid triplet\n\n")) ; + return (UMFPACK_ERROR_invalid_matrix) ; + } + if (prl == 4 && k == 9 && nz > 10) + { + PRINTF ((" ...\n")) ; + prl-- ; + } + } + prl = prl1 ; + + PRINTF4 ((" triplet-form matrix ")) ; + PRINTF (("OK\n\n")) ; + return (UMFPACK_OK) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umfpack_report_vector.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_report_vector.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,43 @@ +/* ========================================================================== */ +/* === UMFPACK_report_vector ================================================ */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + User-callable. Prints a real or complex vector. + See umfpack_report_vector.h for details. +*/ + +#include "umf_internal.h" +#include "umf_report_vector.h" + +GLOBAL Int UMFPACK_report_vector +( + Int n, + const double Xx [ ], +#ifdef COMPLEX + const double Xz [ ], +#endif + const double Control [UMFPACK_CONTROL] +) +{ + Int prl ; + +#ifndef COMPLEX + double *Xz = (double *) NULL ; +#endif + + prl = GET_CONTROL (UMFPACK_PRL, UMFPACK_DEFAULT_PRL) ; + + if (prl <= 2) + { + return (UMFPACK_OK) ; + } + + return (UMF_report_vector (n, Xx, Xz, prl, TRUE, FALSE)) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umfpack_save_numeric.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_save_numeric.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,92 @@ +/* ========================================================================== */ +/* === UMFPACK_save_numeric ================================================= */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + User-callable. Saves a Numeric object to a file. It can later be read back + in via a call to umfpack_*_load_numeric. +*/ + +#include "umf_internal.h" +#include "umf_valid_numeric.h" + +#define WRITE(object,type,n) \ +{ \ + ASSERT (object != (type *) NULL) ; \ + if (fwrite (object, sizeof (type), n, f) != n) \ + { \ + fclose (f) ; \ + return (UMFPACK_ERROR_file_IO) ; \ + } \ +} + +/* ========================================================================== */ +/* === UMFPACK_save_numeric ================================================= */ +/* ========================================================================== */ + +GLOBAL Int UMFPACK_save_numeric +( + void *NumericHandle, + char *user_filename +) +{ + NumericType *Numeric ; + char *filename ; + FILE *f ; + + /* get the Numeric object */ + Numeric = (NumericType *) NumericHandle ; + + /* make sure the Numeric object is valid */ + if (!UMF_valid_numeric (Numeric)) + { + return (UMFPACK_ERROR_invalid_Numeric_object) ; + } + + /* get the filename, or use the default name if filename is NULL */ + if (user_filename == (char *) NULL) + { + filename = "numeric.umf" ; + } + else + { + filename = user_filename ; + } + f = fopen (filename, "wb") ; + if (!f) + { + return (UMFPACK_ERROR_file_IO) ; + } + + /* write the Numeric object to the file, in binary */ + WRITE (Numeric, NumericType, 1) ; + WRITE (Numeric->D, Entry, MIN (Numeric->n_row, Numeric->n_col)+1) ; + WRITE (Numeric->Rperm, Int, Numeric->n_row+1) ; + WRITE (Numeric->Cperm, Int, Numeric->n_col+1) ; + WRITE (Numeric->Lpos, Int, Numeric->npiv+1) ; + WRITE (Numeric->Lilen, Int, Numeric->npiv+1) ; + WRITE (Numeric->Lip, Int, Numeric->npiv+1) ; + WRITE (Numeric->Upos, Int, Numeric->npiv+1) ; + WRITE (Numeric->Uilen, Int, Numeric->npiv+1) ; + WRITE (Numeric->Uip, Int, Numeric->npiv+1) ; + if (Numeric->scale != UMFPACK_SCALE_NONE) + { + WRITE (Numeric->Rs, double, Numeric->n_row) ; + } + if (Numeric->ulen > 0) + { + WRITE (Numeric->Upattern, Int, Numeric->ulen+1) ; + } + WRITE (Numeric->Memory, Unit, Numeric->size) ; + + /* close the file */ + fclose (f) ; + + return (UMFPACK_OK) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umfpack_save_symbolic.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_save_symbolic.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,95 @@ +/* ========================================================================== */ +/* === UMFPACK_save_symbolic ================================================ */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + User-callable. Saves a Symbolic object to a file. It can later be read + back in via a call to umfpack_*_load_symbolic. +*/ + +#include "umf_internal.h" +#include "umf_valid_symbolic.h" + +#define WRITE(object,type,n) \ +{ \ + ASSERT (object != (type *) NULL) ; \ + if (fwrite (object, sizeof (type), n, f) != n) \ + { \ + fclose (f) ; \ + return (UMFPACK_ERROR_file_IO) ; \ + } \ +} + +/* ========================================================================== */ +/* === UMFPACK_save_symbolic ================================================ */ +/* ========================================================================== */ + +GLOBAL Int UMFPACK_save_symbolic +( + void *SymbolicHandle, + char *user_filename +) +{ + SymbolicType *Symbolic ; + char *filename ; + FILE *f ; + + /* get the Symbolic object */ + Symbolic = (SymbolicType *) SymbolicHandle ; + + /* make sure the Symbolic object is valid */ + if (!UMF_valid_symbolic (Symbolic)) + { + return (UMFPACK_ERROR_invalid_Symbolic_object) ; + } + + /* get the filename, or use the default name if filename is NULL */ + if (user_filename == (char *) NULL) + { + filename = "symbolic.umf" ; + } + else + { + filename = user_filename ; + } + f = fopen (filename, "wb") ; + if (!f) + { + return (UMFPACK_ERROR_file_IO) ; + } + + /* write the Symbolic object to the file, in binary */ + WRITE (Symbolic, SymbolicType, 1) ; + WRITE (Symbolic->Cperm_init, Int, Symbolic->n_col+1) ; + WRITE (Symbolic->Rperm_init, Int, Symbolic->n_row+1) ; + WRITE (Symbolic->Front_npivcol, Int, Symbolic->nfr+1) ; + WRITE (Symbolic->Front_parent, Int, Symbolic->nfr+1) ; + WRITE (Symbolic->Front_1strow, Int, Symbolic->nfr+1) ; + WRITE (Symbolic->Front_leftmostdesc, Int, Symbolic->nfr+1) ; + WRITE (Symbolic->Chain_start, Int, Symbolic->nchains+1) ; + WRITE (Symbolic->Chain_maxrows, Int, Symbolic->nchains+1) ; + WRITE (Symbolic->Chain_maxcols, Int, Symbolic->nchains+1) ; + WRITE (Symbolic->Cdeg, Int, Symbolic->n_col+1) ; + WRITE (Symbolic->Rdeg, Int, Symbolic->n_row+1) ; + if (Symbolic->esize > 0) + { + /* only when dense rows are present */ + WRITE (Symbolic->Esize, Int, Symbolic->esize) ; + } + if (Symbolic->prefer_diagonal) + { + /* only when diagonal pivoting is prefered */ + WRITE (Symbolic->Diagonal_map, Int, Symbolic->n_col+1) ; + } + + /* close the file */ + fclose (f) ; + + return (UMFPACK_OK) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umfpack_scale.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_scale.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,158 @@ +/* ========================================================================== */ +/* === UMFPACK_scale ======================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + User-callable. Applies the scale factors computed during numerical + factorization to a vector. See umfpack_scale.h for more details. + + The LU factorization is L*U = P*R*A*Q, where P and Q are permutation + matrices, and R is diagonal. This routine computes X = R * B using the + matrix R stored in the Numeric object. + + Returns FALSE if any argument is invalid, TRUE otherwise. + + If R not present in the Numeric object, then R = I and no floating-point + work is done. B is simply copied into X. +*/ + +#include "umf_internal.h" +#include "umf_valid_numeric.h" + +GLOBAL Int UMFPACK_scale +( + double Xx [ ], +#ifdef COMPLEX + double Xz [ ], +#endif + const double Bx [ ], +#ifdef COMPLEX + const double Bz [ ], +#endif + void *NumericHandle +) +{ + /* ---------------------------------------------------------------------- */ + /* local variables */ + /* ---------------------------------------------------------------------- */ + + NumericType *Numeric ; + Int n, i ; + double *Rs ; +#ifdef COMPLEX + Int split = SPLIT (Xz) && SPLIT (Bz) ; +#endif + + Numeric = (NumericType *) NumericHandle ; + if (!UMF_valid_numeric (Numeric)) + { + return (UMFPACK_ERROR_invalid_Numeric_object) ; + } + + n = Numeric->n_row ; + Rs = Numeric->Rs ; + + if (!Xx || !Bx) + { + return (UMFPACK_ERROR_argument_missing) ; + } + + /* ---------------------------------------------------------------------- */ + /* X = R*B or R\B */ + /* ---------------------------------------------------------------------- */ + + if (Rs != (double *) NULL) + { +#ifndef NRECIPROCAL + if (Numeric->do_recip) + { + /* multiply by the scale factors */ +#ifdef COMPLEX + if (split) + { + for (i = 0 ; i < n ; i++) + { + Xx [i] = Bx [i] * Rs [i] ; + Xz [i] = Bz [i] * Rs [i] ; + } + } + else + { + for (i = 0 ; i < n ; i++) + { + Xx [2*i ] = Bx [2*i ] * Rs [i] ; + Xx [2*i+1] = Bx [2*i+1] * Rs [i] ; + } + } +#else + for (i = 0 ; i < n ; i++) + { + Xx [i] = Bx [i] * Rs [i] ; + } +#endif + } + else +#endif + { + /* divide by the scale factors */ +#ifdef COMPLEX + if (split) + { + for (i = 0 ; i < n ; i++) + { + Xx [i] = Bx [i] / Rs [i] ; + Xz [i] = Bz [i] / Rs [i] ; + } + } + else + { + for (i = 0 ; i < n ; i++) + { + Xx [2*i ] = Bx [2*i ] / Rs [i] ; + Xx [2*i+1] = Bx [2*i+1] / Rs [i] ; + } + } +#else + for (i = 0 ; i < n ; i++) + { + Xx [i] = Bx [i] / Rs [i] ; + } +#endif + } + } + else + { + /* no scale factors, just copy B into X */ +#ifdef COMPLEX + if (split) + { + for (i = 0 ; i < n ; i++) + { + Xx [i] = Bx [i] ; + Xz [i] = Bz [i] ; + } + } + else + { + for (i = 0 ; i < n ; i++) + { + Xx [2*i ] = Bx [2*i ] ; + Xx [2*i+1] = Bx [2*i+1] ; + } + } +#else + for (i = 0 ; i < n ; i++) + { + Xx [i] = Bx [i] ; + } +#endif + } + + return (UMFPACK_OK) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umfpack_solve.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_solve.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,245 @@ +/* ========================================================================== */ +/* === UMFPACK_solve ======================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + User-callable. Solves a linear system using the numerical factorization + computed by UMFPACK_numeric. See umfpack_solve.h for more details. + + For umfpack_*_solve: + Dynamic memory usage: UMFPACK_solve calls UMF_malloc twice, for + workspace of size c*n*sizeof(double) + n*sizeof(Int), where c is + defined below. On return, all of this workspace is free'd via UMF_free. + + For umfpack_*_wsolve: + No dynamic memory usage. Input arrays are used for workspace instead. + Pattern is a workspace of size n Integers. The double array W must be + at least of size c*n, where c is defined below. + + If iterative refinement is requested, and Ax=b, A'x=b or A.'x=b is being + solved, and the matrix A is not singular, then c is 5 for the real version + and 10 for the complex version. Otherwise, c is 1 for the real version and + 4 for the complex version. +*/ + +#include "umf_internal.h" +#include "umf_valid_numeric.h" +#include "umf_solve.h" + +#ifndef WSOLVE +#include "umf_malloc.h" +#include "umf_free.h" +#ifndef NDEBUG +PRIVATE Int init_count ; +#endif +#endif + +GLOBAL Int +#ifdef WSOLVE +UMFPACK_wsolve +#else +UMFPACK_solve +#endif +( + Int sys, + const Int Ap [ ], + const Int Ai [ ], + const double Ax [ ], +#ifdef COMPLEX + const double Az [ ], +#endif + double Xx [ ], +#ifdef COMPLEX + double Xz [ ], +#endif + const double Bx [ ], +#ifdef COMPLEX + const double Bz [ ], +#endif + void *NumericHandle, + const double Control [UMFPACK_CONTROL], + double User_Info [UMFPACK_INFO] +#ifdef WSOLVE + , Int Pattern [ ], + double W [ ] +#endif +) +{ + /* ---------------------------------------------------------------------- */ + /* local variables */ + /* ---------------------------------------------------------------------- */ + + double Info2 [UMFPACK_INFO], stats [2] ; + double *Info ; + NumericType *Numeric ; + Int n, i, irstep, status ; +#ifndef WSOLVE + Int *Pattern, wsize ; + double *W ; +#endif + + /* ---------------------------------------------------------------------- */ + /* get the amount of time used by the process so far */ + /* ---------------------------------------------------------------------- */ + + umfpack_tic (stats) ; + +#ifndef WSOLVE +#ifndef NDEBUG + init_count = UMF_malloc_count ; +#endif +#endif + + /* ---------------------------------------------------------------------- */ + /* get parameters */ + /* ---------------------------------------------------------------------- */ + + irstep = GET_CONTROL (UMFPACK_IRSTEP, UMFPACK_DEFAULT_IRSTEP) ; + + if (User_Info != (double *) NULL) + { + /* return Info in user's array */ + Info = User_Info ; + /* clear the parts of Info that are set by UMFPACK_solve */ + for (i = UMFPACK_IR_TAKEN ; i <= UMFPACK_SOLVE_TIME ; i++) + { + Info [i] = EMPTY ; + } + } + else + { + /* no Info array passed - use local one instead */ + Info = Info2 ; + for (i = 0 ; i < UMFPACK_INFO ; i++) + { + Info [i] = EMPTY ; + } + } + + Info [UMFPACK_STATUS] = UMFPACK_OK ; + Info [UMFPACK_SOLVE_FLOPS] = 0 ; + + Numeric = (NumericType *) NumericHandle ; + if (!UMF_valid_numeric (Numeric)) + { + Info [UMFPACK_STATUS] = UMFPACK_ERROR_invalid_Numeric_object ; + return (UMFPACK_ERROR_invalid_Numeric_object) ; + } + + Info [UMFPACK_NROW] = Numeric->n_row ; + Info [UMFPACK_NCOL] = Numeric->n_col ; + + if (Numeric->n_row != Numeric->n_col) + { + /* only square systems can be handled */ + Info [UMFPACK_STATUS] = UMFPACK_ERROR_invalid_system ; + return (UMFPACK_ERROR_invalid_system) ; + } + n = Numeric->n_row ; + if (Numeric->nnzpiv < n + || SCALAR_IS_ZERO (Numeric->rcond) || SCALAR_IS_NAN (Numeric->rcond)) + { + /* turn off iterative refinement if A is singular */ + /* or if U has NaN's on the diagonal. */ + irstep = 0 ; + } + + if (!Xx || !Bx) + { + Info [UMFPACK_STATUS] = UMFPACK_ERROR_argument_missing ; + return (UMFPACK_ERROR_argument_missing) ; + } + + if (sys >= UMFPACK_Pt_L) + { + /* no iterative refinement except for nonsingular Ax=b, A'x=b, A.'x=b */ + irstep = 0 ; + } + + /* ---------------------------------------------------------------------- */ + /* allocate or check the workspace */ + /* ---------------------------------------------------------------------- */ + +#ifdef WSOLVE + + if (!W || !Pattern) + { + Info [UMFPACK_STATUS] = UMFPACK_ERROR_argument_missing ; + return (UMFPACK_ERROR_argument_missing) ; + } + +#else + +#ifdef COMPLEX + if (irstep > 0) + { + wsize = 10*n ; /* W, X, Z, S, Y, B2 */ + } + else + { + wsize = 4*n ; /* W, X */ + } +#else + if (irstep > 0) + { + wsize = 5*n ; /* W, Z, S, Y, B2 */ + } + else + { + wsize = n ; /* W */ + } +#endif + + Pattern = (Int *) UMF_malloc (n, sizeof (Int)) ; + W = (double *) UMF_malloc (wsize, sizeof (double)) ; + if (!W || !Pattern) + { + DEBUGm4 (("out of memory: solve work\n")) ; + Info [UMFPACK_STATUS] = UMFPACK_ERROR_out_of_memory ; + (void) UMF_free ((void *) W) ; + (void) UMF_free ((void *) Pattern) ; + return (UMFPACK_ERROR_out_of_memory) ; + } + +#endif /* WSOLVE */ + + /* ---------------------------------------------------------------------- */ + /* solve the system */ + /* ---------------------------------------------------------------------- */ + + status = UMF_solve (sys, Ap, Ai, Ax, Xx, Bx, +#ifdef COMPLEX + Az, Xz, Bz, +#endif + Numeric, irstep, Info, Pattern, W) ; + + /* ---------------------------------------------------------------------- */ + /* free the workspace (if allocated) */ + /* ---------------------------------------------------------------------- */ + +#ifndef WSOLVE + (void) UMF_free ((void *) W) ; + (void) UMF_free ((void *) Pattern) ; + ASSERT (UMF_malloc_count == init_count) ; +#endif + + /* ---------------------------------------------------------------------- */ + /* get the time used by UMFPACK_*solve */ + /* ---------------------------------------------------------------------- */ + + Info [UMFPACK_STATUS] = status ; + if (status >= 0) + { + umfpack_toc (stats) ; + Info [UMFPACK_SOLVE_WALLTIME] = stats [0] ; + Info [UMFPACK_SOLVE_TIME] = stats [1] ; + } + + return (status) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umfpack_symbolic.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_symbolic.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,39 @@ +/* ========================================================================== */ +/* === UMFPACK_symbolic ===================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + User-callable. Performs a symbolic factorization. + See umfpack_symbolic.h for details. +*/ + +#include "umf_internal.h" + +GLOBAL Int UMFPACK_symbolic +( + Int n_row, + Int n_col, + const Int Ap [ ], + const Int Ai [ ], + const double Ax [ ], +#ifdef COMPLEX + const double Az [ ], +#endif + void **SymbolicHandle, + const double Control [UMFPACK_CONTROL], + double Info [UMFPACK_INFO] +) +{ + Int *Qinit = (Int *) NULL ; + return (UMFPACK_qsymbolic (n_row, n_col, Ap, Ai, Ax, +#ifdef COMPLEX + Az, +#endif + Qinit, SymbolicHandle, Control, Info)) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umfpack_tictoc.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_tictoc.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,106 @@ +/* ========================================================================== */ +/* === umfpack_tictoc ======================================================= */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + User-callable. Returns the time in seconds used by the process, and + the current wall clock time. BE CAREFUL: if you compare the run time of + UMFPACK with other sparse matrix packages, be sure to use the same timer. + See umfpack_tictoc.h for details. + + These routines conform to the POSIX standard. See umf_config.h for + more details. +*/ + +#include "umf_internal.h" + +#ifdef NO_TIMER + +/* -------------------------------------------------------------------------- */ +/* no timer used if -DNO_TIMER is defined at compile time */ +/* -------------------------------------------------------------------------- */ + +void umfpack_tic (double stats [2]) +{ + stats [0] = 0 ; + stats [1] = 0 ; +} + +void umfpack_toc (double stats [2]) +{ + stats [0] = 0 ; + stats [1] = 0 ; +} + +#else + +/* -------------------------------------------------------------------------- */ +/* timer routines, using either times() or clock() */ +/* -------------------------------------------------------------------------- */ + +#define TINY_TIME 1e-4 + +#ifndef NPOSIX + +#include +#include + +void umfpack_tic (double stats [2]) +{ + /* Return the current time */ + /* stats [0]: current wallclock time, in seconds */ + /* stats [1]: user + system time for the process, in seconds */ + + double ticks ; + struct tms t ; + + ticks = (double) sysconf (_SC_CLK_TCK) ; + stats [0] = (double) times (&t) / ticks ; + stats [1] = (double) (t.tms_utime + t.tms_stime) / ticks ; + + /* if time is tiny, just return zero */ + if (stats [0] < TINY_TIME) stats [0] = 0 ; + if (stats [1] < TINY_TIME) stats [1] = 0 ; +} + +#else + +/* Generic ANSI C: use the ANSI clock function. No wallclock time. */ + +#include + +void umfpack_tic (double stats [2]) +{ + stats [0] = 0 ; + stats [1] = ((double) (clock ( ))) / ((double) (CLOCKS_PER_SEC)) ; + if (stats [1] < TINY_TIME) stats [1] = 0 ; +} + +#endif + +/* -------------------------------------------------------------------------- */ + +void umfpack_toc (double stats [2]) +{ + /* Return the current time since the last call to umfpack_tic. */ + /* On input, stats holds the values returned by umfpack_tic. */ + /* On ouput, stats holds the time since the last umfpack_tic. */ + + double done [2] ; + umfpack_tic (done) ; + + stats [0] = done [0] - stats [0] ; + stats [1] = done [1] - stats [1] ; + + if (stats [0] < 0) stats [0] = 0 ; + if (stats [1] < 0) stats [1] = 0 ; + +} + +#endif diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umfpack_timer.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_timer.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,83 @@ +/* ========================================================================== */ +/* === umfpack_timer ======================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + User-callable. Returns the time in seconds used by the process. BE + CAREFUL: if you compare the run time of UMFPACK with other sparse matrix + packages, be sure to use the same timer. See umfpack_timer.h for details. + See umfpack_tictoc.h, which is the timer used internally by UMFPACK. +*/ + +#ifdef NO_TIMER + +/* -------------------------------------------------------------------------- */ +/* no timer used if -DNO_TIMER is defined at compile time */ +/* -------------------------------------------------------------------------- */ + +double umfpack_timer ( void ) +{ + return (0) ; +} + +#else + +#ifdef GETRUSAGE + +/* -------------------------------------------------------------------------- */ +/* use getrusage for accurate process times (and no overflow) */ +/* -------------------------------------------------------------------------- */ + +/* + This works under Solaris, SGI Irix, Linux, IBM RS 6000 (AIX), and Compaq + Alpha. It might work on other Unix systems, too. Includes both the "user + time" and the "system time". The system time is the time spent by the + operating system on behalf of the process, and thus should be charged to + the process. +*/ + +#include +#include + +double umfpack_timer ( void ) +{ + struct rusage ru ; + double user_time, sys_time ; + + (void) getrusage (RUSAGE_SELF, &ru) ; + + user_time = + ru.ru_utime.tv_sec /* user time (seconds) */ + + 1e-6 * ru.ru_utime.tv_usec ; /* user time (microseconds) */ + + sys_time = + ru.ru_stime.tv_sec /* system time (seconds) */ + + 1e-6 * ru.ru_stime.tv_usec ; /* system time (microseconds) */ + + return (user_time + sys_time) ; +} + +#else + +/* -------------------------------------------------------------------------- */ +/* Generic ANSI C: use the ANSI clock function */ +/* -------------------------------------------------------------------------- */ + +/* This is portable, but may overflow. On Sun Solaris, when compiling in */ +/* 32-bit mode, the overflow occurs in only 2147 seconds (about 36 minutes). */ + +#include + +double umfpack_timer ( void ) +{ + return (((double) (clock ( ))) / ((double) (CLOCKS_PER_SEC))) ; +} + +#endif +#endif diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umfpack_transpose.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_transpose.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,108 @@ +/* ========================================================================== */ +/* === UMFPACK_transpose ==================================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + User callable. Computes a permuted transpose, R = (A (P,Q))' in MATLAB + notation. See umfpack_transpose.h for details. A and R can be rectangular. + The matrix A may be singular. + The complex version can do transpose (') or array transpose (.'). + + Dynamic memory usage: A single call to UMF_malloc is made, for a workspace + of size max (n_row,n_col,1) * sizeof(Int). This is then free'd on return, + via UMF_free. +*/ + +#include "umf_internal.h" +#include "umf_transpose.h" +#include "umf_malloc.h" +#include "umf_free.h" + +#ifndef NDEBUG +PRIVATE Int init_count ; +#endif + +/* ========================================================================== */ + +GLOBAL Int UMFPACK_transpose +( + Int n_row, + Int n_col, + const Int Ap [ ], /* size n_col+1 */ + const Int Ai [ ], /* size nz = Ap [n_col] */ + const double Ax [ ], /* size nz, if present */ +#ifdef COMPLEX + const double Az [ ], /* size nz, if present */ +#endif + + const Int P [ ], /* P [k] = i means original row i is kth row in A(P,Q)*/ + /* P is identity if not present */ + /* size n_row, if present */ + + const Int Q [ ], /* Q [k] = j means original col j is kth col in A(P,Q)*/ + /* Q is identity if not present */ + /* size n_col, if present */ + + Int Rp [ ], /* size n_row+1 */ + Int Ri [ ], /* size nz */ + double Rx [ ] /* size nz, if present */ +#ifdef COMPLEX + , double Rz [ ] /* size nz, if present */ + , Int do_conjugate /* if true, then to conjugate transpose */ + /* otherwise, do array transpose */ +#endif +) +{ + + /* ---------------------------------------------------------------------- */ + /* local variables */ + /* ---------------------------------------------------------------------- */ + + Int status, *W, nn ; + +#ifndef NDEBUG + init_count = UMF_malloc_count ; + UMF_dump_start ( ) ; +#endif + + /* ---------------------------------------------------------------------- */ + /* allocate workspace */ + /* ---------------------------------------------------------------------- */ + + nn = MAX (n_row, n_col) ; + nn = MAX (nn, 1) ; + W = (Int *) UMF_malloc (nn, sizeof (Int)) ; + if (!W) + { + DEBUGm4 (("out of memory: transpose work\n")) ; + ASSERT (UMF_malloc_count == init_count) ; + return (UMFPACK_ERROR_out_of_memory) ; + } + ASSERT (UMF_malloc_count == init_count + 1) ; + + /* ---------------------------------------------------------------------- */ + /* C = (A (P,Q))' or (A (P,Q)).' */ + /* ---------------------------------------------------------------------- */ + + status = UMF_transpose (n_row, n_col, Ap, Ai, Ax, P, Q, n_col, Rp, Ri, Rx, + W, TRUE +#ifdef COMPLEX + , Az, Rz, do_conjugate +#endif + ) ; + + /* ---------------------------------------------------------------------- */ + /* free the workspace */ + /* ---------------------------------------------------------------------- */ + + (void) UMF_free ((void *) W) ; + ASSERT (UMF_malloc_count == init_count) ; + + return (status) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/UMFPACK/UMFPACK/Source/umfpack_triplet_to_col.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_triplet_to_col.c Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,225 @@ +/* ========================================================================== */ +/* === UMFPACK_triplet_to_col =============================================== */ +/* ========================================================================== */ + +/* -------------------------------------------------------------------------- */ +/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis. CISE Dept, */ +/* Univ. of Florida. All Rights Reserved. See ../Doc/License for License. */ +/* web: http://www.cise.ufl.edu/research/sparse/umfpack */ +/* -------------------------------------------------------------------------- */ + +/* + User callable. Converts triplet input to column-oriented form. Duplicate + entries may exist (they are summed in the output). The columns of the + column-oriented form are in sorted order. The input is not modified. + Returns 1 if OK, 0 if an error occurred. See umfpack_triplet_to_col.h for + details. + + If Map is present (a non-NULL pointer to an Int array of size nz), then on + output it holds the position of the triplets in the column-form matrix. + That is, suppose p = Map [k], and the k-th triplet is i=Ti[k], j=Tj[k], and + aij=Tx[k]. Then i=Ai[p], and aij will have been summed into Ax[p]. Also, + Ap[j] <= p < Ap[j+1]. The Map array is not computed if it is (Int *) NULL. + + Dynamic memory usage: + + If numerical values are present, then one (two for complex version) + workspace of size (nz+1)*sizeof(double) is allocated via UMF_malloc. + Next, 4 calls to UMF_malloc are made to obtain workspace of size + ((nz+1) + (n_row+1) + n_row + MAX (n_row,n_col)) * sizeof(Int). All of + this workspace (4 to 6 objects) are free'd via UMF_free on return. + + For the complex version, additional space is allocated. + + An extra array of size nz*sizeof(Int) is allocated if Map is present. +*/ + +#include "umf_internal.h" +#include "umf_malloc.h" +#include "umf_free.h" +#include "umf_triplet.h" + +#ifndef NDEBUG +PRIVATE Int init_count ; +#endif + +/* ========================================================================== */ + +GLOBAL Int UMFPACK_triplet_to_col +( + Int n_row, + Int n_col, + Int nz, + const Int Ti [ ], /* size nz */ + const Int Tj [ ], /* size nz */ + const double Tx [ ], /* size nz */ +#ifdef COMPLEX + const double Tz [ ], /* size nz */ +#endif + Int Ap [ ], /* size n_col + 1 */ + Int Ai [ ], /* size nz */ + double Ax [ ] /* size nz */ +#ifdef COMPLEX + , double Az [ ] /* size nz */ +#endif + , Int Map [ ] /* size nz */ +) +{ + + /* ---------------------------------------------------------------------- */ + /* local variables */ + /* ---------------------------------------------------------------------- */ + + Int *RowCount, *Rp, *Rj, *W, nn, do_values, do_map, *Map2, status ; + double *Rx ; +#ifdef COMPLEX + double *Rz ; + Int split ; +#endif + +#ifndef NDEBUG + UMF_dump_start ( ) ; + init_count = UMF_malloc_count ; +#endif + + /* ---------------------------------------------------------------------- */ + /* check inputs */ + /* ---------------------------------------------------------------------- */ + + if (!Ai || !Ap || !Ti || !Tj) + { + return (UMFPACK_ERROR_argument_missing) ; + } + + if (n_row <= 0 || n_col <= 0) /* must be > 0 */ + { + return (UMFPACK_ERROR_n_nonpositive) ; + } + + if (nz < 0) /* nz must be >= 0 (singular matrices are OK) */ + { + return (UMFPACK_ERROR_invalid_matrix) ; + } + + nn = MAX (n_row, n_col) ; + + /* ---------------------------------------------------------------------- */ + /* allocate workspace */ + /* ---------------------------------------------------------------------- */ + + Rx = (double *) NULL ; + + do_values = Ax && Tx ; + + if (do_values) + { +#ifdef COMPLEX + Rx = (double *) UMF_malloc (2*nz+2, sizeof (double)) ; + split = SPLIT (Tz) && SPLIT (Az) ; + if (split) + { + Rz = Rx + nz ; + } + else + { + Rz = (double *) NULL ; + } +#else + Rx = (double *) UMF_malloc (nz+1, sizeof (double)) ; +#endif + if (!Rx) + { + DEBUGm4 (("out of memory: triplet work \n")) ; + ASSERT (UMF_malloc_count == init_count) ; + return (UMFPACK_ERROR_out_of_memory) ; + } + } + + do_map = (Map != (Int *) NULL) ; + Map2 = (Int *) NULL ; + if (do_map) + { + DEBUG0 (("Do map:\n")) ; + Map2 = (Int *) UMF_malloc (nz+1, sizeof (Int)) ; + if (!Map2) + { + DEBUGm4 (("out of memory: triplet map\n")) ; + (void) UMF_free ((void *) Rx) ; + ASSERT (UMF_malloc_count == init_count) ; + return (UMFPACK_ERROR_out_of_memory) ; + } + } + + Rj = (Int *) UMF_malloc (nz+1, sizeof (Int)) ; + Rp = (Int *) UMF_malloc (n_row+1, sizeof (Int)) ; + RowCount = (Int *) UMF_malloc (n_row, sizeof (Int)) ; + W = (Int *) UMF_malloc (nn, sizeof (Int)) ; + if (!Rj || !Rp || !RowCount || !W) + { + DEBUGm4 (("out of memory: triplet work (int)\n")) ; + (void) UMF_free ((void *) Rx) ; + (void) UMF_free ((void *) Map2) ; + (void) UMF_free ((void *) Rp) ; + (void) UMF_free ((void *) Rj) ; + (void) UMF_free ((void *) RowCount) ; + (void) UMF_free ((void *) W) ; + ASSERT (UMF_malloc_count == init_count) ; + return (UMFPACK_ERROR_out_of_memory) ; + } + + ASSERT (UMF_malloc_count == init_count + 4 + + (Rx != (double *) NULL) + do_map) ; + + /* ---------------------------------------------------------------------- */ + /* convert from triplet to column form */ + /* ---------------------------------------------------------------------- */ + + if (do_map) + { + if (do_values) + { + status = UMF_triplet_map_x (n_row, n_col, nz, Ti, Tj, Ap, Ai, Rp, + Rj, W, RowCount, Tx, Ax, Rx +#ifdef COMPLEX + , Tz, Az, Rz +#endif + , Map, Map2) ; + } + else + { + status = UMF_triplet_map_nox (n_row, n_col, nz, Ti, Tj, Ap, Ai, Rp, + Rj, W, RowCount, Map, Map2) ; + } + } + else + { + if (do_values) + { + status = UMF_triplet_nomap_x (n_row, n_col, nz, Ti, Tj, Ap, Ai, Rp, + Rj, W, RowCount , Tx, Ax, Rx +#ifdef COMPLEX + , Tz, Az, Rz +#endif + ) ; + } + else + { + status = UMF_triplet_nomap_nox (n_row, n_col, nz, Ti, Tj, Ap, Ai, + Rp, Rj, W, RowCount) ; + } + } + + /* ---------------------------------------------------------------------- */ + /* free the workspace */ + /* ---------------------------------------------------------------------- */ + + (void) UMF_free ((void *) Rx) ; + (void) UMF_free ((void *) Map2) ; + (void) UMF_free ((void *) Rp) ; + (void) UMF_free ((void *) Rj) ; + (void) UMF_free ((void *) RowCount) ; + (void) UMF_free ((void *) W) ; + ASSERT (UMF_malloc_count == init_count) ; + + return (status) ; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/boolSparse.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/boolSparse.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,268 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include "config.h" +#include "quit.h" +#include "lo-ieee.h" +#include "lo-mappers.h" + +#include "boolSparse.h" + +// SparseBoolMatrix class. + +bool +SparseBoolMatrix::operator == (const SparseBoolMatrix& a) const +{ + int nr = rows (); + int nc = cols (); + int nz = nnz (); + int nr_a = a.rows (); + int nc_a = a.cols (); + int nz_a = a.nnz (); + + if (nr != nr_a || nc != nc_a || nz != nz_a) + return false; + + for (int i = 0; i < nc + 1; i++) + if (cidx(i) != a.cidx(i)) + return false; + + for (int i = 0; i < nz; i++) + if (data(i) != a.data(i) || ridx(i) != a.ridx(i)) + return false; + + return true; +} + +bool +SparseBoolMatrix::operator != (const SparseBoolMatrix& a) const +{ + return !(*this == a); +} + +SparseBoolMatrix& +SparseBoolMatrix::insert (const SparseBoolMatrix& a, int r, int c) +{ + Sparse::insert (a, r, c); + return *this; +} + +SparseBoolMatrix +SparseBoolMatrix::concat (const SparseBoolMatrix& rb, const Array& ra_idx) +{ + // Don't use numel to avoid all possiblity of an overflow + if (rb.rows () > 0 && rb.cols () > 0) + insert (rb, ra_idx(0), ra_idx(1)); + return *this; +} + +// unary operations + +SparseBoolMatrix +SparseBoolMatrix::operator ! (void) const +{ + int nr = rows (); + int nc = cols (); + int nz1 = nnz (); + int nz2 = nr*nc - nz1; + + SparseBoolMatrix r (nr, nc, nz2); + + int ii = 0; + int jj = 0; + for (int i = 0; i < nc; i++) + { + for (int j = 0; j < nr; j++) + { + if (jj < cidx(i+1) && ridx(jj) == j) + jj++; + else + { + r.data(ii) = true; + r.ridx(ii++) = j; + } + } + r.cidx (i) = ii; + } + + return r; +} + +// other operations + +// XXX FIXME XXX Do these really belong here? Maybe they should be +// in a base class? + +SparseBoolMatrix +SparseBoolMatrix::all (int dim) const +{ + SPARSE_ALL_OP (dim); +} + +SparseBoolMatrix +SparseBoolMatrix::any (int dim) const +{ + SPARSE_ANY_OP (dim); +} + +boolMatrix +SparseBoolMatrix::matrix_value (void) const +{ + int nr = rows (); + int nc = cols (); + + boolMatrix retval (nr, nc, false); + for (int j = 0; j < nc; j++) + for (int i = cidx(j); i < cidx(j+1); i++) + retval.elem (ridx(i), j) = data (i); + + return retval; +} + +std::ostream& +operator << (std::ostream& os, const SparseBoolMatrix& a) +{ + int nc = a.cols (); + + // add one to the printed indices to go from + // zero-based to one-based arrays + for (int j = 0; j < nc; j++) + { + OCTAVE_QUIT; + for (int i = a.cidx(j); i < a.cidx(j+1); i++) + os << a.ridx(i) + 1 << " " << j + 1 << " " << a.data(i) << "\n"; + } + + return os; +} + +std::istream& +operator >> (std::istream& is, SparseBoolMatrix& a) +{ + int nr = a.rows (); + int nc = a.cols (); + int nz = a.nnz (); + + if (nr < 1 || nc < 1) + is.clear (std::ios::badbit); + else + { + int itmp, jtmp, jold = 0; + bool tmp; + int ii = 0; + + a.cidx (0) = 0; + for (int i = 0; i < nz; i++) + { + is >> itmp; + itmp--; + is >> jtmp; + jtmp--; + is >> tmp; + if (is) + { + if (jold != jtmp) + { + for (int j = jold; j < jtmp; j++) + a.cidx(j+1) = ii; + + jold = jtmp; + } + a.data (ii) = tmp; + a.ridx (ii++) = itmp; + } + else + goto done; + } + + for (int j = jold; j < nc; j++) + a.cidx(j+1) = ii; + } + + done: + + return is; +} + +SparseBoolMatrix +SparseBoolMatrix::squeeze (void) const +{ + return Sparse::squeeze (); +} + +SparseBoolMatrix +SparseBoolMatrix::index (idx_vector& i, int resize_ok) const +{ + return Sparse::index (i, resize_ok); +} + +SparseBoolMatrix +SparseBoolMatrix::index (idx_vector& i, idx_vector& j, int resize_ok) const +{ + return Sparse::index (i, j, resize_ok); +} + +SparseBoolMatrix +SparseBoolMatrix::index (Array& ra_idx, int resize_ok) const +{ + return Sparse::index (ra_idx, resize_ok); +} + +SparseBoolMatrix +SparseBoolMatrix::reshape (const dim_vector& new_dims) const +{ + return Sparse::reshape (new_dims); +} + +SparseBoolMatrix +SparseBoolMatrix::permute (const Array& vec, bool inv) const +{ + return Sparse::permute (vec, inv); +} + +SparseBoolMatrix +SparseBoolMatrix::ipermute (const Array& vec) const +{ + return Sparse::ipermute (vec); +} + +SPARSE_SMS_EQNE_OPS (SparseBoolMatrix, false, , bool, false, ) +SPARSE_SMS_BOOL_OPS (SparseBoolMatrix, bool, false) + +SPARSE_SSM_EQNE_OPS (bool, false, , SparseBoolMatrix, false, ) +SPARSE_SSM_BOOL_OPS (bool, SparseBoolMatrix, false) + +SPARSE_SMSM_EQNE_OPS (SparseBoolMatrix, false, , SparseBoolMatrix, false, ) +SPARSE_SMSM_BOOL_OPS (SparseBoolMatrix, SparseBoolMatrix, false) + + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/boolSparse.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/boolSparse.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,129 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#if !defined (octave_boolSparse_h) +#define octave_boolSparse_h 1 + +#include "Sparse.h" +#include "MSparse-defs.h" +#include "Sparse-op-defs.h" + +class +SparseBoolMatrix : public Sparse +{ +public: + + SparseBoolMatrix (void) : Sparse () { } + + SparseBoolMatrix (int r, int c) : Sparse (r, c) { } + + explicit SparseBoolMatrix (int r, int c, bool val) + : Sparse (r, c, val) { } + + SparseBoolMatrix (const Sparse& a) : Sparse (a) { } + + SparseBoolMatrix (const SparseBoolMatrix& a) : Sparse (a) { } + + SparseBoolMatrix (const SparseBoolMatrix& a, const dim_vector& dv) + : Sparse (a, dv) { } + + explicit SparseBoolMatrix (const boolMatrix& a) : Sparse (a) { } + + explicit SparseBoolMatrix (const boolNDArray& a) : Sparse (a) { } + + explicit SparseBoolMatrix (const Array a, const Array& r, + const Array& c, int nr = -1, + int nc = -1, bool sum_terms = true) + : Sparse (a, r, c, nr, nc, sum_terms) { } + + explicit SparseBoolMatrix (const Array a, const Array& r, + const Array& c, int nr = -1, + int nc = -1, bool sum_terms = true) + : Sparse (a, r, c, nr, nc, sum_terms) { } + + SparseBoolMatrix (int r, int c, int num_nz) : Sparse (r, c, num_nz) { } + + SparseBoolMatrix& operator = (const SparseBoolMatrix& a) + { + Sparse::operator = (a); + return *this; + } + + bool operator == (const SparseBoolMatrix& a) const; + bool operator != (const SparseBoolMatrix& a) const; + + SparseBoolMatrix transpose (void) const + { return Sparse::transpose (); } + + // destructive insert/delete/reorder operations + + SparseBoolMatrix& insert (const SparseBoolMatrix& a, int r, int c); + + SparseBoolMatrix concat (const SparseBoolMatrix& rb, + const Array& ra_idx); + + boolMatrix matrix_value (void) const; + + SparseBoolMatrix squeeze (void) const; + + SparseBoolMatrix index (idx_vector& i, int resize_ok) const; + + SparseBoolMatrix index (idx_vector& i, idx_vector& j, int resize_ok) const; + + SparseBoolMatrix index (Array& ra_idx, int resize_ok) const; + + SparseBoolMatrix reshape (const dim_vector& new_dims) const; + + SparseBoolMatrix permute (const Array& vec, bool inv = false) const; + + SparseBoolMatrix ipermute (const Array& vec) const; + + // unary operations + + SparseBoolMatrix operator ! (void) const; + + // other operations + + SparseBoolMatrix all (int dim = -1) const; + SparseBoolMatrix any (int dim = -1) const; + + // i/o + + friend std::ostream& operator << (std::ostream& os, const SparseBoolMatrix& a); + friend std::istream& operator >> (std::istream& is, SparseBoolMatrix& a); +}; + +SPARSE_SMS_EQNE_OP_DECLS (SparseBoolMatrix, bool) +SPARSE_SMS_BOOL_OP_DECLS (SparseBoolMatrix, bool) + +SPARSE_SSM_EQNE_OP_DECLS (bool, SparseBoolMatrix) +SPARSE_SSM_BOOL_OP_DECLS (bool, SparseBoolMatrix) + +SPARSE_SMSM_EQNE_OP_DECLS (SparseBoolMatrix, SparseBoolMatrix) +SPARSE_SMSM_BOOL_OP_DECLS (SparseBoolMatrix, SparseBoolMatrix) + +#endif + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/dNDArray.cc --- a/liboctave/dNDArray.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/liboctave/dNDArray.cc Fri Feb 25 19:55:28 2005 +0000 @@ -26,6 +26,7 @@ #endif #include + #include #include "Array-util.h" diff -r 9f3299378193 -r 57077d0ddc8e liboctave/dSparse.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/dSparse.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,6713 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include +#include + +#include "quit.h" +#include "lo-ieee.h" +#include "lo-mappers.h" +#include "f77-fcn.h" +#include "dRowVector.h" + +#include "CSparse.h" +#include "boolSparse.h" +#include "dSparse.h" +#include "oct-spparms.h" +#include "SparsedbleLU.h" +#include "SparseType.h" + +// External UMFPACK functions in C +extern "C" { +#include "umfpack.h" +} + +// Fortran functions we call. +extern "C" +{ + F77_RET_T + F77_FUNC (dgbtrf, DGBTRF) (const int&, const int&, const int&, + const int&, double*, const int&, int*, int&); + + F77_RET_T + F77_FUNC (dgbtrs, DGBTRS) (F77_CONST_CHAR_ARG_DECL, const int&, + const int&, const int&, const int&, + const double*, const int&, + const int*, double*, const int&, int& + F77_CHAR_ARG_LEN_DECL); + + F77_RET_T + F77_FUNC (dgbcon, DGBCON) (F77_CONST_CHAR_ARG_DECL, const int&, + const int&, const int&, double*, + const int&, const int*, const double&, + double&, double*, int*, int& + F77_CHAR_ARG_LEN_DECL); + + F77_RET_T + F77_FUNC (dpbtrf, DPBTRF) (F77_CONST_CHAR_ARG_DECL, const int&, + const int&, double*, const int&, int& + F77_CHAR_ARG_LEN_DECL); + + F77_RET_T + F77_FUNC (dpbtrs, DPBTRS) (F77_CONST_CHAR_ARG_DECL, const int&, + const int&, const int&, double*, const int&, + double*, const int&, int& + F77_CHAR_ARG_LEN_DECL); + + F77_RET_T + F77_FUNC (dpbcon, DPBCON) (F77_CONST_CHAR_ARG_DECL, const int&, + const int&, double*, const int&, + const double&, double&, double*, int*, int& + F77_CHAR_ARG_LEN_DECL); + F77_RET_T + F77_FUNC (dptsv, DPTSV) (const int&, const int&, double*, double*, + double*, const int&, int&); + + F77_RET_T + F77_FUNC (dgtsv, DGTSV) (const int&, const int&, double*, double*, + double*, double*, const int&, int&); + + F77_RET_T + F77_FUNC (dgttrf, DGTTRF) (const int&, double*, double*, double*, double*, + int*, int&); + + F77_RET_T + F77_FUNC (dgttrs, DGTTRS) (F77_CONST_CHAR_ARG_DECL, const int&, + const int&, const double*, const double*, + const double*, const double*, const int*, + double *, const int&, int& + F77_CHAR_ARG_LEN_DECL); + + F77_RET_T + F77_FUNC (zptsv, ZPTSV) (const int&, const int&, Complex*, Complex*, + Complex*, const int&, int&); + + F77_RET_T + F77_FUNC (zgtsv, ZGTSV) (const int&, const int&, Complex*, Complex*, + Complex*, Complex*, const int&, int&); + +} + +SparseMatrix::SparseMatrix (const SparseBoolMatrix &a) + : MSparse (a.rows (), a.cols (), a.nnz ()) +{ + int nc = cols (); + int nz = nnz (); + + for (int i = 0; i < nc + 1; i++) + cidx (i) = a.cidx (i); + + for (int i = 0; i < nz; i++) + { + data (i) = a.data (i); + ridx (i) = a.ridx (i); + } +} + +bool +SparseMatrix::operator == (const SparseMatrix& a) const +{ + int nr = rows (); + int nc = cols (); + int nz = nnz (); + int nr_a = a.rows (); + int nc_a = a.cols (); + int nz_a = a.nnz (); + + if (nr != nr_a || nc != nc_a || nz != nz_a) + return false; + + for (int i = 0; i < nc + 1; i++) + if (cidx(i) != a.cidx(i)) + return false; + + for (int i = 0; i < nz; i++) + if (data(i) != a.data(i) || ridx(i) != a.ridx(i)) + return false; + + return true; +} + +bool +SparseMatrix::operator != (const SparseMatrix& a) const +{ + return !(*this == a); +} + +bool +SparseMatrix::is_symmetric (void) const +{ + if (is_square () && rows () > 0) + { + for (int i = 0; i < rows (); i++) + for (int j = i+1; j < cols (); j++) + if (elem (i, j) != elem (j, i)) + return false; + + return true; + } + + return false; +} + +SparseMatrix& +SparseMatrix::insert (const SparseMatrix& a, int r, int c) +{ + MSparse::insert (a, r, c); + return *this; +} + +SparseMatrix +SparseMatrix::max (int dim) const +{ + Array2 dummy_idx; + return max (dummy_idx, dim); +} + +SparseMatrix +SparseMatrix::max (Array2& idx_arg, int dim) const +{ + SparseMatrix result; + dim_vector dv = dims (); + + if (dv.numel () == 0 || dim > dv.length () || dim < 0) + return result; + + int nr = dv(0); + int nc = dv(1); + + if (dim == 0) + { + idx_arg.resize (1, nc); + int nel = 0; + for (int j = 0; j < nc; j++) + { + double tmp_max = octave_NaN; + int idx_j = 0; + for (int i = cidx(j); i < cidx(j+1); i++) + { + if (ridx(i) != idx_j) + break; + else + idx_j++; + } + + if (idx_j != nr) + tmp_max = 0.; + + for (int i = cidx(j); i < cidx(j+1); i++) + { + double tmp = data (i); + + if (octave_is_NaN_or_NA (tmp)) + continue; + else if (octave_is_NaN_or_NA (tmp_max) || tmp > tmp_max) + { + idx_j = ridx (i); + tmp_max = tmp; + } + + } + + idx_arg.elem (j) = octave_is_NaN_or_NA (tmp_max) ? 0 : idx_j; + if (tmp_max != 0.) + nel++; + } + + result = SparseMatrix (1, nc, nel); + + int ii = 0; + result.xcidx (0) = 0; + for (int j = 0; j < nc; j++) + { + double tmp = elem (idx_arg(j), j); + if (tmp != 0.) + { + result.xdata (ii) = tmp; + result.xridx (ii++) = 0; + } + result.xcidx (j+1) = ii; + + } + } + else + { + idx_arg.resize (nr, 1, 0); + + for (int i = cidx(0); i < cidx(1); i++) + idx_arg.elem(ridx(i)) = -1; + + for (int j = 0; j < nc; j++) + for (int i = 0; i < nr; i++) + { + if (idx_arg.elem(i) != -1) + continue; + bool found = false; + for (int k = cidx(j); k < cidx(j+1); k++) + if (ridx(k) == i) + { + found = true; + break; + } + + if (!found) + idx_arg.elem(i) = j; + + } + + for (int j = 0; j < nc; j++) + { + for (int i = cidx(j); i < cidx(j+1); i++) + { + int ir = ridx (i); + int ix = idx_arg.elem (ir); + double tmp = data (i); + + if (octave_is_NaN_or_NA (tmp)) + continue; + else if (ix == -1 || tmp > elem (ir, ix)) + idx_arg.elem (ir) = j; + } + } + + int nel = 0; + for (int j = 0; j < nr; j++) + if (idx_arg.elem(j) == -1 || elem (j, idx_arg.elem (j)) != 0.) + nel++; + + result = SparseMatrix (nr, 1, nel); + + int ii = 0; + result.xcidx (0) = 0; + result.xcidx (1) = nel; + for (int j = 0; j < nr; j++) + { + if (idx_arg(j) == -1) + { + idx_arg(j) = 0; + result.xdata (ii) = octave_NaN; + result.xridx (ii++) = j; + } + else + { + double tmp = elem (j, idx_arg(j)); + if (tmp != 0.) + { + result.xdata (ii) = tmp; + result.xridx (ii++) = j; + } + } + } + } + + return result; +} + +SparseMatrix +SparseMatrix::min (int dim) const +{ + Array2 dummy_idx; + return min (dummy_idx, dim); +} + +SparseMatrix +SparseMatrix::min (Array2& idx_arg, int dim) const +{ + SparseMatrix result; + dim_vector dv = dims (); + + if (dv.numel () == 0 || dim > dv.length () || dim < 0) + return result; + + int nr = dv(0); + int nc = dv(1); + + if (dim == 0) + { + idx_arg.resize (1, nc); + int nel = 0; + for (int j = 0; j < nc; j++) + { + double tmp_min = octave_NaN; + int idx_j = 0; + for (int i = cidx(j); i < cidx(j+1); i++) + { + if (ridx(i) != idx_j) + break; + else + idx_j++; + } + + if (idx_j != nr) + tmp_min = 0.; + + for (int i = cidx(j); i < cidx(j+1); i++) + { + double tmp = data (i); + + if (octave_is_NaN_or_NA (tmp)) + continue; + else if (octave_is_NaN_or_NA (tmp_min) || tmp < tmp_min) + { + idx_j = ridx (i); + tmp_min = tmp; + } + + } + + idx_arg.elem (j) = octave_is_NaN_or_NA (tmp_min) ? 0 : idx_j; + if (tmp_min != 0.) + nel++; + } + + result = SparseMatrix (1, nc, nel); + + int ii = 0; + result.xcidx (0) = 0; + for (int j = 0; j < nc; j++) + { + double tmp = elem (idx_arg(j), j); + if (tmp != 0.) + { + result.xdata (ii) = tmp; + result.xridx (ii++) = 0; + } + result.xcidx (j+1) = ii; + + } + } + else + { + idx_arg.resize (nr, 1, 0); + + for (int i = cidx(0); i < cidx(1); i++) + idx_arg.elem(ridx(i)) = -1; + + for (int j = 0; j < nc; j++) + for (int i = 0; i < nr; i++) + { + if (idx_arg.elem(i) != -1) + continue; + bool found = false; + for (int k = cidx(j); k < cidx(j+1); k++) + if (ridx(k) == i) + { + found = true; + break; + } + + if (!found) + idx_arg.elem(i) = j; + + } + + for (int j = 0; j < nc; j++) + { + for (int i = cidx(j); i < cidx(j+1); i++) + { + int ir = ridx (i); + int ix = idx_arg.elem (ir); + double tmp = data (i); + + if (octave_is_NaN_or_NA (tmp)) + continue; + else if (ix == -1 || tmp < elem (ir, ix)) + idx_arg.elem (ir) = j; + } + } + + int nel = 0; + for (int j = 0; j < nr; j++) + if (idx_arg.elem(j) == -1 || elem (j, idx_arg.elem (j)) != 0.) + nel++; + + result = SparseMatrix (nr, 1, nel); + + int ii = 0; + result.xcidx (0) = 0; + result.xcidx (1) = nel; + for (int j = 0; j < nr; j++) + { + if (idx_arg(j) == -1) + { + idx_arg(j) = 0; + result.xdata (ii) = octave_NaN; + result.xridx (ii++) = j; + } + else + { + double tmp = elem (j, idx_arg(j)); + if (tmp != 0.) + { + result.xdata (ii) = tmp; + result.xridx (ii++) = j; + } + } + } + } + + return result; +} + +SparseMatrix +SparseMatrix::concat (const SparseMatrix& rb, const Array& ra_idx) +{ + // Don't use numel to avoid all possiblity of an overflow + if (rb.rows () > 0 && rb.cols () > 0) + insert (rb, ra_idx(0), ra_idx(1)); + return *this; +} + +SparseComplexMatrix +SparseMatrix::concat (const SparseComplexMatrix& rb, const Array& ra_idx) +{ + SparseComplexMatrix retval (*this); + if (rb.rows () > 0 && rb.cols () > 0) + retval.insert (rb, ra_idx(0), ra_idx(1)); + return retval; +} + +SparseMatrix +real (const SparseComplexMatrix& a) +{ + int nr = a.rows (); + int nc = a.cols (); + int nz = a.nnz (); + SparseMatrix r (nr, nc, nz); + + for (int i = 0; i < nc +1; i++) + r.cidx(i) = a.cidx(i); + + for (int i = 0; i < nz; i++) + { + r.data(i) = real (a.data(i)); + r.ridx(i) = a.ridx(i); + } + + return r; +} + +SparseMatrix +imag (const SparseComplexMatrix& a) +{ + int nr = a.rows (); + int nc = a.cols (); + int nz = a.nnz (); + SparseMatrix r (nr, nc, nz); + + for (int i = 0; i < nc +1; i++) + r.cidx(i) = a.cidx(i); + + for (int i = 0; i < nz; i++) + { + r.data(i) = imag (a.data(i)); + r.ridx(i) = a.ridx(i); + } + + return r; +} + +SparseMatrix +atan2 (const double& x, const SparseMatrix& y) +{ + int nr = y.rows (); + int nc = y.cols (); + + if (x == 0.) + return SparseMatrix (nr, nc); + else + { + // Its going to be basically full, so this is probably the + // best way to handle it. + Matrix tmp (nr, nc, atan2 (x, 0.)); + + for (int j = 0; j < nc; j++) + for (int i = y.cidx (j); i < y.cidx (j+1); i++) + tmp.elem (y.ridx(i), j) = atan2 (x, y.data(i)); + + return SparseMatrix (tmp); + } +} + +SparseMatrix +atan2 (const SparseMatrix& x, const double& y) +{ + int nr = x.rows (); + int nc = x.cols (); + int nz = x.nnz (); + + SparseMatrix retval (nr, nc, nz); + + int ii = 0; + retval.xcidx(0) = 0; + for (int i = 0; i < nc; i++) + { + for (int j = x.cidx(i); j < x.cidx(i+1); j++) + { + double tmp = atan2 (x.data(j), y); + if (tmp != 0.) + { + retval.xdata (ii) = tmp; + retval.xridx (ii++) = x.ridx (j); + } + } + retval.xcidx (i+1) = ii; + } + + if (ii != nz) + { + SparseMatrix retval2 (nr, nc, ii); + for (int i = 0; i < nc+1; i++) + retval2.xcidx (i) = retval.cidx (i); + for (int i = 0; i < ii; i++) + { + retval2.xdata (i) = retval.data (i); + retval2.xridx (i) = retval.ridx (i); + } + return retval2; + } + else + return retval; +} + +SparseMatrix +atan2 (const SparseMatrix& x, const SparseMatrix& y) +{ + SparseMatrix r; + + if ((x.rows() == y.rows()) && (x.cols() == y.cols())) + { + int x_nr = x.rows (); + int x_nc = x.cols (); + + int y_nr = y.rows (); + int y_nc = y.cols (); + + if (x_nr != y_nr || x_nc != y_nc) + gripe_nonconformant ("atan2", x_nr, x_nc, y_nr, y_nc); + else + { + r = SparseMatrix (x_nr, x_nc, (x.nnz () + y.nnz ())); + + int jx = 0; + r.cidx (0) = 0; + for (int i = 0 ; i < x_nc ; i++) + { + int ja = x.cidx(i); + int ja_max = x.cidx(i+1); + bool ja_lt_max= ja < ja_max; + + int jb = y.cidx(i); + int jb_max = y.cidx(i+1); + bool jb_lt_max = jb < jb_max; + + while (ja_lt_max || jb_lt_max ) + { + OCTAVE_QUIT; + if ((! jb_lt_max) || + (ja_lt_max && (x.ridx(ja) < y.ridx(jb)))) + { + r.ridx(jx) = x.ridx(ja); + r.data(jx) = atan2 (x.data(ja), 0.); + jx++; + ja++; + ja_lt_max= ja < ja_max; + } + else if (( !ja_lt_max ) || + (jb_lt_max && (y.ridx(jb) < x.ridx(ja)) ) ) + { + jb++; + jb_lt_max= jb < jb_max; + } + else + { + double tmp = atan2 (x.data(ja), y.data(jb)); + if (tmp != 0.) + { + r.data(jx) = tmp; + r.ridx(jx) = x.ridx(ja); + jx++; + } + ja++; + ja_lt_max= ja < ja_max; + jb++; + jb_lt_max= jb < jb_max; + } + } + r.cidx(i+1) = jx; + } + + r.maybe_compress (); + } + } + else + (*current_liboctave_error_handler) ("matrix size mismatch"); + + return r; +} + +SparseMatrix +SparseMatrix::inverse (void) const +{ + int info; + double rcond; + return inverse (info, rcond, 0, 0); +} + +SparseMatrix +SparseMatrix::inverse (int& info) const +{ + double rcond; + return inverse (info, rcond, 0, 0); +} + +SparseMatrix +SparseMatrix::inverse (int& info, double& rcond, int force, int calc_cond) const +{ + info = -1; + (*current_liboctave_error_handler) + ("SparseMatrix::inverse not implemented yet"); + return SparseMatrix (); +} + +DET +SparseMatrix::determinant (void) const +{ + int info; + double rcond; + return determinant (info, rcond, 0); +} + +DET +SparseMatrix::determinant (int& info) const +{ + double rcond; + return determinant (info, rcond, 0); +} + +DET +SparseMatrix::determinant (int& err, double& rcond, int) const +{ + DET retval; + + int nr = rows (); + int nc = cols (); + + if (nr == 0 || nc == 0 || nr != nc) + { + double d[2]; + d[0] = 1.0; + d[1] = 0.0; + retval = DET (d); + } + else + { + err = 0; + + // Setup the control parameters + Matrix Control (UMFPACK_CONTROL, 1); + double *control = Control.fortran_vec (); + umfpack_di_defaults (control); + + double tmp = Voctave_sparse_controls.get_key ("spumoni"); + if (!xisnan (tmp)) + Control (UMFPACK_PRL) = tmp; + + tmp = Voctave_sparse_controls.get_key ("piv_tol"); + if (!xisnan (tmp)) + { + Control (UMFPACK_SYM_PIVOT_TOLERANCE) = tmp; + Control (UMFPACK_PIVOT_TOLERANCE) = tmp; + } + + // Set whether we are allowed to modify Q or not + tmp = Voctave_sparse_controls.get_key ("autoamd"); + if (!xisnan (tmp)) + Control (UMFPACK_FIXQ) = tmp; + + // Turn-off UMFPACK scaling for LU + Control (UMFPACK_SCALE) = UMFPACK_SCALE_NONE; + + umfpack_di_report_control (control); + + const int *Ap = cidx (); + const int *Ai = ridx (); + const double *Ax = data (); + + umfpack_di_report_matrix (nr, nc, Ap, Ai, Ax, 1, control); + + void *Symbolic; + Matrix Info (1, UMFPACK_INFO); + double *info = Info.fortran_vec (); + int status = umfpack_di_qsymbolic (nr, nc, Ap, Ai, Ax, NULL, + &Symbolic, control, info); + + if (status < 0) + { + (*current_liboctave_error_handler) + ("SparseMatrix::determinant symbolic factorization failed"); + + umfpack_di_report_status (control, status); + umfpack_di_report_info (control, info); + + umfpack_di_free_symbolic (&Symbolic) ; + } + else + { + umfpack_di_report_symbolic (Symbolic, control); + + void *Numeric; + status = umfpack_di_numeric (Ap, Ai, Ax, Symbolic, &Numeric, + control, info) ; + umfpack_di_free_symbolic (&Symbolic) ; + + rcond = Info (UMFPACK_RCOND); + + if (status < 0) + { + (*current_liboctave_error_handler) + ("SparseMatrix::determinant numeric factorization failed"); + + umfpack_di_report_status (control, status); + umfpack_di_report_info (control, info); + + umfpack_di_free_numeric (&Numeric); + } + else + { + umfpack_di_report_numeric (Numeric, control); + + double d[2]; + + status = umfpack_di_get_determinant (&d[0], &d[1], Numeric, + info); + + if (status < 0) + { + (*current_liboctave_error_handler) + ("SparseMatrix::determinant error calculating determinant"); + + umfpack_di_report_status (control, status); + umfpack_di_report_info (control, info); + + umfpack_di_free_numeric (&Numeric); + } + else + retval = DET (d); + } + } + } + + return retval; +} + +Matrix +SparseMatrix::dsolve (SparseType &mattype, const Matrix& b, int& err, + double& rcond, solve_singularity_handler) const +{ + Matrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + int typ = mattype.type (); + mattype.info (); + + if (typ == SparseType::Diagonal || + typ == SparseType::Permuted_Diagonal) + { + retval.resize (b.rows (), b.cols()); + if (typ == SparseType::Diagonal) + for (int j = 0; j < b.cols(); j++) + for (int i = 0; i < nr; i++) + retval(i,j) = b(i,j) / data (i); + else + for (int j = 0; j < b.cols(); j++) + for (int i = 0; i < nr; i++) + retval(i,j) = b(ridx(i),j) / data (i); + + double dmax = 0., dmin = octave_Inf; + for (int i = 0; i < nr; i++) + { + double tmp = fabs(data(i)); + if (tmp > dmax) + dmax = tmp; + if (tmp < dmin) + dmin = tmp; + } + rcond = dmin / dmax; + } + else + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +SparseMatrix +SparseMatrix::dsolve (SparseType &mattype, const SparseMatrix& b, int& err, + double& rcond, solve_singularity_handler) const +{ + SparseMatrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + int typ = mattype.type (); + mattype.info (); + + if (typ == SparseType::Diagonal || + typ == SparseType::Permuted_Diagonal) + { + int b_nr = b.rows (); + int b_nc = b.cols (); + int b_nz = b.nnz (); + retval = SparseMatrix (b_nr, b_nc, b_nz); + + retval.xcidx(0) = 0; + int ii = 0; + if (typ == SparseType::Diagonal) + for (int j = 0; j < b.cols(); j++) + { + for (int i = b.cidx(j); i < b.cidx(j+1); i++) + { + retval.xridx (ii) = b.ridx(i); + retval.xdata (ii++) = b.data(i) / data (b.ridx (i)); + } + retval.xcidx(j+1) = ii; + } + else + for (int j = 0; j < b.cols(); j++) + { + for (int i = 0; i < nr; i++) + { + bool found = false; + int k; + for (k = b.cidx(j); k < b.cidx(j+1); k++) + if (ridx(i) == b.ridx(k)) + { + found = true; + break; + } + if (found) + { + retval.xridx (ii) = i; + retval.xdata (ii++) = b.data(k) / data (i); + } + } + retval.xcidx(j+1) = ii; + } + + double dmax = 0., dmin = octave_Inf; + for (int i = 0; i < nr; i++) + { + double tmp = fabs(data(i)); + if (tmp > dmax) + dmax = tmp; + if (tmp < dmin) + dmin = tmp; + } + rcond = dmin / dmax; + } + else + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +ComplexMatrix +SparseMatrix::dsolve (SparseType &mattype, const ComplexMatrix& b, int& err, + double& rcond, solve_singularity_handler) const +{ + ComplexMatrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + int typ = mattype.type (); + mattype.info (); + + if (typ == SparseType::Diagonal || + typ == SparseType::Permuted_Diagonal) + { + retval.resize (b.rows (), b.cols()); + if (typ == SparseType::Diagonal) + for (int j = 0; j < b.cols(); j++) + for (int i = 0; i < nr; i++) + retval(i,j) = b(i,j) / data (i); + else + for (int j = 0; j < b.cols(); j++) + for (int i = 0; i < nr; i++) + retval(i,j) = b(ridx(i),j) / data (i); + + double dmax = 0., dmin = octave_Inf; + for (int i = 0; i < nr; i++) + { + double tmp = fabs(data(i)); + if (tmp > dmax) + dmax = tmp; + if (tmp < dmin) + dmin = tmp; + } + rcond = dmin / dmax; + } + else + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +SparseComplexMatrix +SparseMatrix::dsolve (SparseType &mattype, const SparseComplexMatrix& b, + int& err, double& rcond, + solve_singularity_handler) const +{ + SparseComplexMatrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + int typ = mattype.type (); + mattype.info (); + + if (typ == SparseType::Diagonal || + typ == SparseType::Permuted_Diagonal) + { + int b_nr = b.rows (); + int b_nc = b.cols (); + int b_nz = b.nnz (); + retval = SparseComplexMatrix (b_nr, b_nc, b_nz); + + retval.xcidx(0) = 0; + int ii = 0; + if (typ == SparseType::Diagonal) + for (int j = 0; j < b.cols(); j++) + { + for (int i = b.cidx(j); i < b.cidx(j+1); i++) + { + retval.xridx (ii) = b.ridx(i); + retval.xdata (ii++) = b.data(i) / data (b.ridx (i)); + } + retval.xcidx(j+1) = ii; + } + else + for (int j = 0; j < b.cols(); j++) + { + for (int i = 0; i < nr; i++) + { + bool found = false; + int k; + for (k = b.cidx(j); k < b.cidx(j+1); k++) + if (ridx(i) == b.ridx(k)) + { + found = true; + break; + } + if (found) + { + retval.xridx (ii) = i; + retval.xdata (ii++) = b.data(k) / data (i); + } + } + retval.xcidx(j+1) = ii; + } + + double dmax = 0., dmin = octave_Inf; + for (int i = 0; i < nr; i++) + { + double tmp = fabs(data(i)); + if (tmp > dmax) + dmax = tmp; + if (tmp < dmin) + dmin = tmp; + } + rcond = dmin / dmax; + } + else + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +Matrix +SparseMatrix::utsolve (SparseType &mattype, const Matrix& b, int& err, + double& rcond, + solve_singularity_handler sing_handler) const +{ + Matrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + int typ = mattype.type (); + mattype.info (); + + if (typ == SparseType::Permuted_Upper || + typ == SparseType::Upper) + { + double anorm = 0.; + double ainvnorm = 0.; + int b_cols = b.cols (); + rcond = 0.; + + // Calculate the 1-norm of matrix for rcond calculation + for (int j = 0; j < nr; j++) + { + double atmp = 0.; + for (int i = cidx(j); i < cidx(j+1); i++) + atmp += fabs(data(i)); + if (atmp > anorm) + anorm = atmp; + } + + if (typ == SparseType::Permuted_Upper) + { + retval.resize (b.rows (), b.cols ()); + OCTAVE_LOCAL_BUFFER (double, work, nr); + int *p_perm = mattype.triangular_row_perm (); + int *q_perm = mattype.triangular_col_perm (); + + (*current_liboctave_warning_handler) + ("SparseMatrix::solve XXX FIXME XXX permuted triangular code not tested"); + + for (int j = 0; j < b_cols; j++) + { + for (int i = 0; i < nr; i++) + work[i] = b(i,j); + + for (int k = nr-1; k >= 0; k--) + { + int iidx = q_perm[k]; + if (work[iidx] != 0.) + { + if (ridx(cidx(iidx+1)-1) != iidx) + { + err = -2; + goto triangular_error; + } + + double tmp = work[iidx] / data(cidx(iidx+1)-1); + work[iidx] = tmp; + for (int i = cidx(iidx); i < cidx(iidx+1)-1; i++) + { + int idx2 = q_perm[ridx(i)]; + work[idx2] = + work[idx2] - tmp * data(i); + } + } + } + + for (int i = 0; i < nr; i++) + retval (i, j) = work[p_perm[i]]; + } + + // Calculation of 1-norm of inv(*this) + for (int i = 0; i < nr; i++) + work[i] = 0.; + + for (int j = 0; j < nr; j++) + { + work[q_perm[j]] = 1.; + + for (int k = j; k >= 0; k--) + { + int iidx = q_perm[k]; + + if (work[iidx] != 0.) + { + double tmp = work[iidx] / data(cidx(iidx+1)-1); + work[iidx] = tmp; + for (int i = cidx(iidx); i < cidx(iidx+1)-1; i++) + { + int idx2 = q_perm[ridx(i)]; + work[idx2] = work[idx2] - tmp * data(i); + } + } + } + double atmp = 0; + for (int i = 0; i < j+1; i++) + { + atmp += fabs(work[i]); + work[i] = 0.; + } + if (atmp > ainvnorm) + ainvnorm = atmp; + } + } + else + { + retval = b; + double *x_vec = retval.fortran_vec (); + + for (int j = 0; j < b_cols; j++) + { + int offset = j * nr; + for (int k = nr-1; k >= 0; k--) + { + if (x_vec[k+offset] != 0.) + { + if (ridx(cidx(k+1)-1) != k) + { + err = -2; + goto triangular_error; + } + + double tmp = x_vec[k+offset] / + data(cidx(k+1)-1); + x_vec[k+offset] = tmp; + for (int i = cidx(k); i < cidx(k+1)-1; i++) + { + int iidx = ridx(i); + x_vec[iidx+offset] = + x_vec[iidx+offset] - tmp * data(i); + } + } + } + } + + // Calculation of 1-norm of inv(*this) + OCTAVE_LOCAL_BUFFER (double, work, nr); + for (int i = 0; i < nr; i++) + work[i] = 0.; + + for (int j = 0; j < nr; j++) + { + work[j] = 1.; + + for (int k = j; k >= 0; k--) + { + if (work[k] != 0.) + { + double tmp = work[k] / data(cidx(k+1)-1); + work[k] = tmp; + for (int i = cidx(k); i < cidx(k+1)-1; i++) + { + int iidx = ridx(i); + work[iidx] = work[iidx] - tmp * data(i); + } + } + } + double atmp = 0; + for (int i = 0; i < j+1; i++) + { + atmp += fabs(work[i]); + work[i] = 0.; + } + if (atmp > ainvnorm) + ainvnorm = atmp; + } + } + + rcond = 1. / ainvnorm / anorm; + + triangular_error: + if (err != 0) + { + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("SparseMatrix::solve matrix singular to machine precision, rcond = %g", + rcond); + } + + volatile double rcond_plus_one = rcond + 1.0; + + if (rcond_plus_one == 1.0 || xisnan (rcond)) + { + err = -2; + + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("matrix singular to machine precision, rcond = %g", + rcond); + } + } + else + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +SparseMatrix +SparseMatrix::utsolve (SparseType &mattype, const SparseMatrix& b, int& err, + double& rcond, solve_singularity_handler sing_handler) const +{ + SparseMatrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + int typ = mattype.type (); + mattype.info (); + + if (typ == SparseType::Permuted_Upper || + typ == SparseType::Upper) + { + double anorm = 0.; + double ainvnorm = 0.; + rcond = 0.; + + // Calculate the 1-norm of matrix for rcond calculation + for (int j = 0; j < nr; j++) + { + double atmp = 0.; + for (int i = cidx(j); i < cidx(j+1); i++) + atmp += fabs(data(i)); + if (atmp > anorm) + anorm = atmp; + } + + int b_nr = b.rows (); + int b_nc = b.cols (); + int b_nz = b.nnz (); + retval = SparseMatrix (b_nr, b_nc, b_nz); + retval.xcidx(0) = 0; + int ii = 0; + int x_nz = b_nz; + + if (typ == SparseType::Permuted_Upper) + { + OCTAVE_LOCAL_BUFFER (double, work, nr); + int *p_perm = mattype.triangular_row_perm (); + int *q_perm = mattype.triangular_col_perm (); + + (*current_liboctave_warning_handler) + ("SparseMatrix::solve XXX FIXME XXX permuted triangular code not tested"); + + for (int j = 0; j < b_nc; j++) + { + for (int i = 0; i < nr; i++) + work[i] = 0.; + for (int i = b.cidx(j); i < b.cidx(j+1); i++) + work[b.ridx(i)] = b.data(i); + + for (int k = nr-1; k >= 0; k--) + { + int iidx = q_perm[k]; + if (work[iidx] != 0.) + { + if (ridx(cidx(iidx+1)-1) != iidx) + { + err = -2; + goto triangular_error; + } + + double tmp = work[iidx] / data(cidx(iidx+1)-1); + work[iidx] = tmp; + for (int i = cidx(iidx); i < cidx(iidx+1)-1; i++) + { + int idx2 = q_perm[ridx(i)]; + work[idx2] = + work[idx2] - tmp * data(i); + } + } + } + + // Count non-zeros in work vector and adjust space in + // retval if needed + int new_nnz = 0; + for (int i = 0; i < nr; i++) + if (work[i] != 0.) + new_nnz++; + + if (ii + new_nnz > x_nz) + { + // Resize the sparse matrix + int sz = new_nnz * (b_nc - j) + x_nz; + retval.change_capacity (sz); + x_nz = sz; + } + + for (int i = 0; i < nr; i++) + if (work[p_perm[i]] != 0.) + { + retval.xridx(ii) = i; + retval.xdata(ii++) = work[p_perm[i]]; + } + retval.xcidx(j+1) = ii; + } + + retval.maybe_compress (); + + // Calculation of 1-norm of inv(*this) + for (int i = 0; i < nr; i++) + work[i] = 0.; + + for (int j = 0; j < nr; j++) + { + work[q_perm[j]] = 1.; + + for (int k = j; k >= 0; k--) + { + int iidx = q_perm[k]; + + if (work[iidx] != 0.) + { + double tmp = work[iidx] / data(cidx(iidx+1)-1); + work[iidx] = tmp; + for (int i = cidx(iidx); i < cidx(iidx+1)-1; i++) + { + int idx2 = q_perm[ridx(i)]; + work[idx2] = work[idx2] - tmp * data(i); + } + } + } + double atmp = 0; + for (int i = 0; i < j+1; i++) + { + atmp += fabs(work[i]); + work[i] = 0.; + } + if (atmp > ainvnorm) + ainvnorm = atmp; + } + } + else + { + OCTAVE_LOCAL_BUFFER (double, work, nr); + + for (int j = 0; j < b_nc; j++) + { + for (int i = 0; i < nr; i++) + work[i] = 0.; + for (int i = b.cidx(j); i < b.cidx(j+1); i++) + work[b.ridx(i)] = b.data(i); + + for (int k = nr-1; k >= 0; k--) + { + if (work[k] != 0.) + { + if (ridx(cidx(k+1)-1) != k) + { + err = -2; + goto triangular_error; + } + + double tmp = work[k] / data(cidx(k+1)-1); + work[k] = tmp; + for (int i = cidx(k); i < cidx(k+1)-1; i++) + { + int iidx = ridx(i); + work[iidx] = work[iidx] - tmp * data(i); + } + } + } + + // Count non-zeros in work vector and adjust space in + // retval if needed + int new_nnz = 0; + for (int i = 0; i < nr; i++) + if (work[i] != 0.) + new_nnz++; + + if (ii + new_nnz > x_nz) + { + // Resize the sparse matrix + int sz = new_nnz * (b_nc - j) + x_nz; + retval.change_capacity (sz); + x_nz = sz; + } + + for (int i = 0; i < nr; i++) + if (work[i] != 0.) + { + retval.xridx(ii) = i; + retval.xdata(ii++) = work[i]; + } + retval.xcidx(j+1) = ii; + } + + retval.maybe_compress (); + + // Calculation of 1-norm of inv(*this) + for (int i = 0; i < nr; i++) + work[i] = 0.; + + for (int j = 0; j < nr; j++) + { + work[j] = 1.; + + for (int k = j; k >= 0; k--) + { + if (work[k] != 0.) + { + double tmp = work[k] / data(cidx(k+1)-1); + work[k] = tmp; + for (int i = cidx(k); i < cidx(k+1)-1; i++) + { + int iidx = ridx(i); + work[iidx] = work[iidx] - tmp * data(i); + } + } + } + double atmp = 0; + for (int i = 0; i < j+1; i++) + { + atmp += fabs(work[i]); + work[i] = 0.; + } + if (atmp > ainvnorm) + ainvnorm = atmp; + } + } + + rcond = 1. / ainvnorm / anorm; + + triangular_error: + if (err != 0) + { + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("SparseMatrix::solve matrix singular to machine precision, rcond = %g", + rcond); + } + + volatile double rcond_plus_one = rcond + 1.0; + + if (rcond_plus_one == 1.0 || xisnan (rcond)) + { + err = -2; + + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("matrix singular to machine precision, rcond = %g", + rcond); + } + } + else + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + return retval; +} + +ComplexMatrix +SparseMatrix::utsolve (SparseType &mattype, const ComplexMatrix& b, int& err, + double& rcond, solve_singularity_handler sing_handler) const +{ + ComplexMatrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + int typ = mattype.type (); + mattype.info (); + + if (typ == SparseType::Permuted_Upper || + typ == SparseType::Upper) + { + double anorm = 0.; + double ainvnorm = 0.; + int b_nc = b.cols (); + rcond = 0.; + + // Calculate the 1-norm of matrix for rcond calculation + for (int j = 0; j < nr; j++) + { + double atmp = 0.; + for (int i = cidx(j); i < cidx(j+1); i++) + atmp += fabs(data(i)); + if (atmp > anorm) + anorm = atmp; + } + + if (typ == SparseType::Permuted_Upper) + { + retval.resize (b.rows (), b.cols ()); + OCTAVE_LOCAL_BUFFER (Complex, work, nr); + int *p_perm = mattype.triangular_row_perm (); + int *q_perm = mattype.triangular_col_perm (); + + (*current_liboctave_warning_handler) + ("SparseMatrix::solve XXX FIXME XXX permuted triangular code not tested"); + + for (int j = 0; j < b_nc; j++) + { + for (int i = 0; i < nr; i++) + work[i] = b(i,j); + + for (int k = nr-1; k >= 0; k--) + { + int iidx = q_perm[k]; + if (work[iidx] != 0.) + { + if (ridx(cidx(iidx+1)-1) != iidx) + { + err = -2; + goto triangular_error; + } + + Complex tmp = work[iidx] / data(cidx(iidx+1)-1); + work[iidx] = tmp; + for (int i = cidx(iidx); i < cidx(iidx+1)-1; i++) + { + int idx2 = q_perm[ridx(i)]; + work[idx2] = + work[idx2] - tmp * data(i); + } + } + } + + for (int i = 0; i < nr; i++) + retval (i, j) = work[p_perm[i]]; + + } + + // Calculation of 1-norm of inv(*this) + OCTAVE_LOCAL_BUFFER (double, work2, nr); + for (int i = 0; i < nr; i++) + work2[i] = 0.; + + for (int j = 0; j < nr; j++) + { + work2[q_perm[j]] = 1.; + + for (int k = j; k >= 0; k--) + { + int iidx = q_perm[k]; + + if (work2[iidx] != 0.) + { + double tmp = work2[iidx] / data(cidx(iidx+1)-1); + work2[iidx] = tmp; + for (int i = cidx(iidx); i < cidx(iidx+1)-1; i++) + { + int idx2 = q_perm[ridx(i)]; + work2[idx2] = work2[idx2] - tmp * data(i); + } + } + } + double atmp = 0; + for (int i = 0; i < j+1; i++) + { + atmp += fabs(work2[i]); + work2[i] = 0.; + } + if (atmp > ainvnorm) + ainvnorm = atmp; + } + } + else + { + retval = b; + Complex *x_vec = retval.fortran_vec (); + + for (int j = 0; j < b_nc; j++) + { + int offset = j * nr; + for (int k = nr-1; k >= 0; k--) + { + if (x_vec[k+offset] != 0.) + { + if (ridx(cidx(k+1)-1) != k) + { + err = -2; + goto triangular_error; + } + + Complex tmp = x_vec[k+offset] / + data(cidx(k+1)-1); + x_vec[k+offset] = tmp; + for (int i = cidx(k); i < cidx(k+1)-1; i++) + { + int iidx = ridx(i); + x_vec[iidx+offset] = + x_vec[iidx+offset] - tmp * data(i); + } + } + } + } + + // Calculation of 1-norm of inv(*this) + OCTAVE_LOCAL_BUFFER (double, work, nr); + for (int i = 0; i < nr; i++) + work[i] = 0.; + + for (int j = 0; j < nr; j++) + { + work[j] = 1.; + + for (int k = j; k >= 0; k--) + { + if (work[k] != 0.) + { + double tmp = work[k] / data(cidx(k+1)-1); + work[k] = tmp; + for (int i = cidx(k); i < cidx(k+1)-1; i++) + { + int iidx = ridx(i); + work[iidx] = work[iidx] - tmp * data(i); + } + } + } + double atmp = 0; + for (int i = 0; i < j+1; i++) + { + atmp += fabs(work[i]); + work[i] = 0.; + } + if (atmp > ainvnorm) + ainvnorm = atmp; + } + } + + rcond = 1. / ainvnorm / anorm; + + triangular_error: + if (err != 0) + { + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("SparseMatrix::solve matrix singular to machine precision, rcond = %g", + rcond); + } + + volatile double rcond_plus_one = rcond + 1.0; + + if (rcond_plus_one == 1.0 || xisnan (rcond)) + { + err = -2; + + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("matrix singular to machine precision, rcond = %g", + rcond); + } + } + else + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +SparseComplexMatrix +SparseMatrix::utsolve (SparseType &mattype, const SparseComplexMatrix& b, + int& err, double& rcond, + solve_singularity_handler sing_handler) const +{ + SparseComplexMatrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + int typ = mattype.type (); + mattype.info (); + + if (typ == SparseType::Permuted_Upper || + typ == SparseType::Upper) + { + double anorm = 0.; + double ainvnorm = 0.; + rcond = 0.; + + // Calculate the 1-norm of matrix for rcond calculation + for (int j = 0; j < nr; j++) + { + double atmp = 0.; + for (int i = cidx(j); i < cidx(j+1); i++) + atmp += fabs(data(i)); + if (atmp > anorm) + anorm = atmp; + } + + int b_nr = b.rows (); + int b_nc = b.cols (); + int b_nz = b.nnz (); + retval = SparseComplexMatrix (b_nr, b_nc, b_nz); + retval.xcidx(0) = 0; + int ii = 0; + int x_nz = b_nz; + + if (typ == SparseType::Permuted_Upper) + { + OCTAVE_LOCAL_BUFFER (Complex, work, nr); + int *p_perm = mattype.triangular_row_perm (); + int *q_perm = mattype.triangular_col_perm (); + + (*current_liboctave_warning_handler) + ("SparseMatrix::solve XXX FIXME XXX permuted triangular code not tested"); + + for (int j = 0; j < b_nc; j++) + { + for (int i = 0; i < nr; i++) + work[i] = 0.; + for (int i = b.cidx(j); i < b.cidx(j+1); i++) + work[b.ridx(i)] = b.data(i); + + for (int k = nr-1; k >= 0; k--) + { + int iidx = q_perm[k]; + if (work[iidx] != 0.) + { + if (ridx(cidx(iidx+1)-1) != iidx) + { + err = -2; + goto triangular_error; + } + + Complex tmp = work[iidx] / data(cidx(iidx+1)-1); + work[iidx] = tmp; + for (int i = cidx(iidx); i < cidx(iidx+1)-1; i++) + { + int idx2 = q_perm[ridx(i)]; + work[idx2] = + work[idx2] - tmp * data(i); + } + } + } + + // Count non-zeros in work vector and adjust space in + // retval if needed + int new_nnz = 0; + for (int i = 0; i < nr; i++) + if (work[i] != 0.) + new_nnz++; + + if (ii + new_nnz > x_nz) + { + // Resize the sparse matrix + int sz = new_nnz * (b_nc - j) + x_nz; + retval.change_capacity (sz); + x_nz = sz; + } + + for (int i = 0; i < nr; i++) + if (work[p_perm[i]] != 0.) + { + retval.xridx(ii) = i; + retval.xdata(ii++) = work[p_perm[i]]; + } + retval.xcidx(j+1) = ii; + } + + retval.maybe_compress (); + + OCTAVE_LOCAL_BUFFER (double, work2, nr); + // Calculation of 1-norm of inv(*this) + for (int i = 0; i < nr; i++) + work2[i] = 0.; + + for (int j = 0; j < nr; j++) + { + work2[q_perm[j]] = 1.; + + for (int k = j; k >= 0; k--) + { + int iidx = q_perm[k]; + + if (work2[iidx] != 0.) + { + double tmp = work2[iidx] / data(cidx(iidx+1)-1); + work2[iidx] = tmp; + for (int i = cidx(iidx); i < cidx(iidx+1)-1; i++) + { + int idx2 = q_perm[ridx(i)]; + work2[idx2] = work2[idx2] - tmp * data(i); + } + } + } + double atmp = 0; + for (int i = 0; i < j+1; i++) + { + atmp += fabs(work2[i]); + work2[i] = 0.; + } + if (atmp > ainvnorm) + ainvnorm = atmp; + } + } + else + { + OCTAVE_LOCAL_BUFFER (Complex, work, nr); + + for (int j = 0; j < b_nc; j++) + { + for (int i = 0; i < nr; i++) + work[i] = 0.; + for (int i = b.cidx(j); i < b.cidx(j+1); i++) + work[b.ridx(i)] = b.data(i); + + for (int k = nr-1; k >= 0; k--) + { + if (work[k] != 0.) + { + if (ridx(cidx(k+1)-1) != k) + { + err = -2; + goto triangular_error; + } + + Complex tmp = work[k] / data(cidx(k+1)-1); + work[k] = tmp; + for (int i = cidx(k); i < cidx(k+1)-1; i++) + { + int iidx = ridx(i); + work[iidx] = work[iidx] - tmp * data(i); + } + } + } + + // Count non-zeros in work vector and adjust space in + // retval if needed + int new_nnz = 0; + for (int i = 0; i < nr; i++) + if (work[i] != 0.) + new_nnz++; + + if (ii + new_nnz > x_nz) + { + // Resize the sparse matrix + int sz = new_nnz * (b_nc - j) + x_nz; + retval.change_capacity (sz); + x_nz = sz; + } + + for (int i = 0; i < nr; i++) + if (work[i] != 0.) + { + retval.xridx(ii) = i; + retval.xdata(ii++) = work[i]; + } + retval.xcidx(j+1) = ii; + } + + retval.maybe_compress (); + + // Calculation of 1-norm of inv(*this) + OCTAVE_LOCAL_BUFFER (double, work2, nr); + for (int i = 0; i < nr; i++) + work2[i] = 0.; + + for (int j = 0; j < nr; j++) + { + work2[j] = 1.; + + for (int k = j; k >= 0; k--) + { + if (work2[k] != 0.) + { + double tmp = work2[k] / data(cidx(k+1)-1); + work2[k] = tmp; + for (int i = cidx(k); i < cidx(k+1)-1; i++) + { + int iidx = ridx(i); + work2[iidx] = work2[iidx] - tmp * data(i); + } + } + } + double atmp = 0; + for (int i = 0; i < j+1; i++) + { + atmp += fabs(work2[i]); + work2[i] = 0.; + } + if (atmp > ainvnorm) + ainvnorm = atmp; + } + } + + rcond = 1. / ainvnorm / anorm; + + triangular_error: + if (err != 0) + { + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("SparseMatrix::solve matrix singular to machine precision, rcond = %g", + rcond); + } + + volatile double rcond_plus_one = rcond + 1.0; + + if (rcond_plus_one == 1.0 || xisnan (rcond)) + { + err = -2; + + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("matrix singular to machine precision, rcond = %g", + rcond); + } + } + else + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +Matrix +SparseMatrix::ltsolve (SparseType &mattype, const Matrix& b, int& err, + double& rcond, + solve_singularity_handler sing_handler) const +{ + Matrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + int typ = mattype.type (); + mattype.info (); + + if (typ == SparseType::Permuted_Lower || + typ == SparseType::Lower) + { + double anorm = 0.; + double ainvnorm = 0.; + int b_cols = b.cols (); + rcond = 0.; + + // Calculate the 1-norm of matrix for rcond calculation + for (int j = 0; j < nr; j++) + { + double atmp = 0.; + for (int i = cidx(j); i < cidx(j+1); i++) + atmp += fabs(data(i)); + if (atmp > anorm) + anorm = atmp; + } + + if (typ == SparseType::Permuted_Lower) + { + retval.resize (b.rows (), b.cols ()); + OCTAVE_LOCAL_BUFFER (double, work, nr); + int *p_perm = mattype.triangular_row_perm (); + int *q_perm = mattype.triangular_col_perm (); + + (*current_liboctave_warning_handler) + ("SparseMatrix::solve XXX FIXME XXX permuted triangular code not tested"); + + for (int j = 0; j < b_cols; j++) + { + for (int i = 0; i < nr; i++) + work[i] = b(i,j); + + for (int k = 0; k < nr; k++) + { + int iidx = q_perm[k]; + if (work[iidx] != 0.) + { + if (ridx(cidx(iidx)) != iidx) + { + err = -2; + goto triangular_error; + } + + double tmp = work[iidx] / data(cidx(iidx+1)-1); + work[iidx] = tmp; + for (int i = cidx(iidx)+1; i < cidx(iidx+1); i++) + { + int idx2 = q_perm[ridx(i)]; + work[idx2] = + work[idx2] - tmp * data(i); + } + } + } + + for (int i = 0; i < nr; i++) + retval (i, j) = work[p_perm[i]]; + + } + + // Calculation of 1-norm of inv(*this) + for (int i = 0; i < nr; i++) + work[i] = 0.; + + for (int j = 0; j < nr; j++) + { + work[q_perm[j]] = 1.; + + for (int k = 0; k < nr; k++) + { + int iidx = q_perm[k]; + + if (work[iidx] != 0.) + { + double tmp = work[iidx] / data(cidx(iidx+1)-1); + work[iidx] = tmp; + for (int i = cidx(iidx)+1; i < cidx(iidx+1); i++) + { + int idx2 = q_perm[ridx(i)]; + work[idx2] = work[idx2] - tmp * data(i); + } + } + } + double atmp = 0; + for (int i = 0; i < j+1; i++) + { + atmp += fabs(work[i]); + work[i] = 0.; + } + if (atmp > ainvnorm) + ainvnorm = atmp; + } + } + else + { + retval = b; + double *x_vec = retval.fortran_vec (); + + for (int j = 0; j < b_cols; j++) + { + int offset = j * nr; + for (int k = 0; k < nr; k++) + { + if (x_vec[k+offset] != 0.) + { + if (ridx(cidx(k)) != k) + { + err = -2; + goto triangular_error; + } + + double tmp = x_vec[k+offset] / + data(cidx(k)); + x_vec[k+offset] = tmp; + for (int i = cidx(k)+1; i < cidx(k+1); i++) + { + int iidx = ridx(i); + x_vec[iidx+offset] = + x_vec[iidx+offset] - tmp * data(i); + } + } + } + } + + // Calculation of 1-norm of inv(*this) + OCTAVE_LOCAL_BUFFER (double, work, nr); + for (int i = 0; i < nr; i++) + work[i] = 0.; + + for (int j = 0; j < nr; j++) + { + work[j] = 1.; + + for (int k = j; k < nr; k++) + { + + if (work[k] != 0.) + { + double tmp = work[k] / data(cidx(k)); + work[k] = tmp; + for (int i = cidx(k)+1; i < cidx(k+1); i++) + { + int iidx = ridx(i); + work[iidx] = work[iidx] - tmp * data(i); + } + } + } + double atmp = 0; + for (int i = j; i < nr; i++) + { + atmp += fabs(work[i]); + work[i] = 0.; + } + if (atmp > ainvnorm) + ainvnorm = atmp; + } + + } + + rcond = 1. / ainvnorm / anorm; + + triangular_error: + if (err != 0) + { + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("SparseMatrix::solve matrix singular to machine precision, rcond = %g", + rcond); + } + + volatile double rcond_plus_one = rcond + 1.0; + + if (rcond_plus_one == 1.0 || xisnan (rcond)) + { + err = -2; + + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("matrix singular to machine precision, rcond = %g", + rcond); + } + } + else + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +SparseMatrix +SparseMatrix::ltsolve (SparseType &mattype, const SparseMatrix& b, int& err, + double& rcond, solve_singularity_handler sing_handler) const +{ + SparseMatrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + int typ = mattype.type (); + mattype.info (); + + if (typ == SparseType::Permuted_Lower || + typ == SparseType::Lower) + { + double anorm = 0.; + double ainvnorm = 0.; + rcond = 0.; + + // Calculate the 1-norm of matrix for rcond calculation + for (int j = 0; j < nr; j++) + { + double atmp = 0.; + for (int i = cidx(j); i < cidx(j+1); i++) + atmp += fabs(data(i)); + if (atmp > anorm) + anorm = atmp; + } + + int b_nr = b.rows (); + int b_nc = b.cols (); + int b_nz = b.nnz (); + retval = SparseMatrix (b_nr, b_nc, b_nz); + retval.xcidx(0) = 0; + int ii = 0; + int x_nz = b_nz; + + if (typ == SparseType::Permuted_Lower) + { + OCTAVE_LOCAL_BUFFER (double, work, nr); + int *p_perm = mattype.triangular_row_perm (); + int *q_perm = mattype.triangular_col_perm (); + + (*current_liboctave_warning_handler) + ("SparseMatrix::solve XXX FIXME XXX permuted triangular code not tested"); + + for (int j = 0; j < b_nc; j++) + { + for (int i = 0; i < nr; i++) + work[i] = 0.; + for (int i = b.cidx(j); i < b.cidx(j+1); i++) + work[b.ridx(i)] = b.data(i); + + for (int k = 0; k < nr; k++) + { + int iidx = q_perm[k]; + if (work[iidx] != 0.) + { + if (ridx(cidx(iidx)) != iidx) + { + err = -2; + goto triangular_error; + } + + double tmp = work[iidx] / data(cidx(iidx+1)-1); + work[iidx] = tmp; + for (int i = cidx(iidx)+1; i < cidx(iidx+1); i++) + { + int idx2 = q_perm[ridx(i)]; + work[idx2] = + work[idx2] - tmp * data(i); + } + } + } + + // Count non-zeros in work vector and adjust space in + // retval if needed + int new_nnz = 0; + for (int i = 0; i < nr; i++) + if (work[i] != 0.) + new_nnz++; + + if (ii + new_nnz > x_nz) + { + // Resize the sparse matrix + int sz = new_nnz * (b_nc - j) + x_nz; + retval.change_capacity (sz); + x_nz = sz; + } + + for (int i = 0; i < nr; i++) + if (work[p_perm[i]] != 0.) + { + retval.xridx(ii) = i; + retval.xdata(ii++) = work[p_perm[i]]; + } + retval.xcidx(j+1) = ii; + } + + retval.maybe_compress (); + + // Calculation of 1-norm of inv(*this) + for (int i = 0; i < nr; i++) + work[i] = 0.; + + for (int j = 0; j < nr; j++) + { + work[q_perm[j]] = 1.; + + for (int k = 0; k < nr; k++) + { + int iidx = q_perm[k]; + + if (work[iidx] != 0.) + { + double tmp = work[iidx] / data(cidx(iidx+1)-1); + work[iidx] = tmp; + for (int i = cidx(iidx)+1; i < cidx(iidx+1); i++) + { + int idx2 = q_perm[ridx(i)]; + work[idx2] = work[idx2] - tmp * data(i); + } + } + } + double atmp = 0; + for (int i = 0; i < j+1; i++) + { + atmp += fabs(work[i]); + work[i] = 0.; + } + if (atmp > ainvnorm) + ainvnorm = atmp; + } + } + else + { + OCTAVE_LOCAL_BUFFER (double, work, nr); + + for (int j = 0; j < b_nc; j++) + { + for (int i = 0; i < nr; i++) + work[i] = 0.; + for (int i = b.cidx(j); i < b.cidx(j+1); i++) + work[b.ridx(i)] = b.data(i); + + for (int k = 0; k < nr; k++) + { + if (work[k] != 0.) + { + if (ridx(cidx(k)) != k) + { + err = -2; + goto triangular_error; + } + + double tmp = work[k] / data(cidx(k)); + work[k] = tmp; + for (int i = cidx(k)+1; i < cidx(k+1); i++) + { + int iidx = ridx(i); + work[iidx] = work[iidx] - tmp * data(i); + } + } + } + + // Count non-zeros in work vector and adjust space in + // retval if needed + int new_nnz = 0; + for (int i = 0; i < nr; i++) + if (work[i] != 0.) + new_nnz++; + + if (ii + new_nnz > x_nz) + { + // Resize the sparse matrix + int sz = new_nnz * (b_nc - j) + x_nz; + retval.change_capacity (sz); + x_nz = sz; + } + + for (int i = 0; i < nr; i++) + if (work[i] != 0.) + { + retval.xridx(ii) = i; + retval.xdata(ii++) = work[i]; + } + retval.xcidx(j+1) = ii; + } + + retval.maybe_compress (); + + // Calculation of 1-norm of inv(*this) + for (int i = 0; i < nr; i++) + work[i] = 0.; + + for (int j = 0; j < nr; j++) + { + work[j] = 1.; + + for (int k = j; k < nr; k++) + { + + if (work[k] != 0.) + { + double tmp = work[k] / data(cidx(k)); + work[k] = tmp; + for (int i = cidx(k)+1; i < cidx(k+1); i++) + { + int iidx = ridx(i); + work[iidx] = work[iidx] - tmp * data(i); + } + } + } + double atmp = 0; + for (int i = j; i < nr; i++) + { + atmp += fabs(work[i]); + work[i] = 0.; + } + if (atmp > ainvnorm) + ainvnorm = atmp; + } + + } + + rcond = 1. / ainvnorm / anorm; + + triangular_error: + if (err != 0) + { + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("SparseMatrix::solve matrix singular to machine precision, rcond = %g", + rcond); + } + + volatile double rcond_plus_one = rcond + 1.0; + + if (rcond_plus_one == 1.0 || xisnan (rcond)) + { + err = -2; + + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("matrix singular to machine precision, rcond = %g", + rcond); + } + } + else + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +ComplexMatrix +SparseMatrix::ltsolve (SparseType &mattype, const ComplexMatrix& b, int& err, + double& rcond, solve_singularity_handler sing_handler) const +{ + ComplexMatrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + int typ = mattype.type (); + mattype.info (); + + if (typ == SparseType::Permuted_Lower || + typ == SparseType::Lower) + { + double anorm = 0.; + double ainvnorm = 0.; + int b_nc = b.cols (); + rcond = 0.; + + // Calculate the 1-norm of matrix for rcond calculation + for (int j = 0; j < nr; j++) + { + double atmp = 0.; + for (int i = cidx(j); i < cidx(j+1); i++) + atmp += fabs(data(i)); + if (atmp > anorm) + anorm = atmp; + } + + if (typ == SparseType::Permuted_Lower) + { + retval.resize (b.rows (), b.cols ()); + OCTAVE_LOCAL_BUFFER (Complex, work, nr); + int *p_perm = mattype.triangular_row_perm (); + int *q_perm = mattype.triangular_col_perm (); + + (*current_liboctave_warning_handler) + ("SparseMatrix::solve XXX FIXME XXX permuted triangular code not tested"); + + for (int j = 0; j < b_nc; j++) + { + for (int i = 0; i < nr; i++) + work[i] = b(i,j); + + for (int k = 0; k < nr; k++) + { + int iidx = q_perm[k]; + if (work[iidx] != 0.) + { + if (ridx(cidx(iidx)) != iidx) + { + err = -2; + goto triangular_error; + } + + Complex tmp = work[iidx] / data(cidx(iidx+1)-1); + work[iidx] = tmp; + for (int i = cidx(iidx)+1; i < cidx(iidx+1); i++) + { + int idx2 = q_perm[ridx(i)]; + work[idx2] = + work[idx2] - tmp * data(i); + } + } + } + + for (int i = 0; i < nr; i++) + retval (i, j) = work[p_perm[i]]; + + } + + // Calculation of 1-norm of inv(*this) + OCTAVE_LOCAL_BUFFER (double, work2, nr); + for (int i = 0; i < nr; i++) + work2[i] = 0.; + + for (int j = 0; j < nr; j++) + { + work2[q_perm[j]] = 1.; + + for (int k = 0; k < nr; k++) + { + int iidx = q_perm[k]; + + if (work2[iidx] != 0.) + { + double tmp = work2[iidx] / data(cidx(iidx+1)-1); + work2[iidx] = tmp; + for (int i = cidx(iidx)+1; i < cidx(iidx+1); i++) + { + int idx2 = q_perm[ridx(i)]; + work2[idx2] = work2[idx2] - tmp * data(i); + } + } + } + double atmp = 0; + for (int i = 0; i < j+1; i++) + { + atmp += fabs(work2[i]); + work2[i] = 0.; + } + if (atmp > ainvnorm) + ainvnorm = atmp; + } + } + else + { + retval = b; + Complex *x_vec = retval.fortran_vec (); + + for (int j = 0; j < b_nc; j++) + { + int offset = j * nr; + for (int k = 0; k < nr; k++) + { + if (x_vec[k+offset] != 0.) + { + if (ridx(cidx(k)) != k) + { + err = -2; + goto triangular_error; + } + + Complex tmp = x_vec[k+offset] / + data(cidx(k)); + x_vec[k+offset] = tmp; + for (int i = cidx(k)+1; i < cidx(k+1); i++) + { + int iidx = ridx(i); + x_vec[iidx+offset] = + x_vec[iidx+offset] - tmp * data(i); + } + } + } + } + + // Calculation of 1-norm of inv(*this) + OCTAVE_LOCAL_BUFFER (double, work, nr); + for (int i = 0; i < nr; i++) + work[i] = 0.; + + for (int j = 0; j < nr; j++) + { + work[j] = 1.; + + for (int k = j; k < nr; k++) + { + + if (work[k] != 0.) + { + double tmp = work[k] / data(cidx(k)); + work[k] = tmp; + for (int i = cidx(k)+1; i < cidx(k+1); i++) + { + int iidx = ridx(i); + work[iidx] = work[iidx] - tmp * data(i); + } + } + } + double atmp = 0; + for (int i = j; i < nr; i++) + { + atmp += fabs(work[i]); + work[i] = 0.; + } + if (atmp > ainvnorm) + ainvnorm = atmp; + } + + } + + rcond = 1. / ainvnorm / anorm; + + triangular_error: + if (err != 0) + { + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("SparseMatrix::solve matrix singular to machine precision, rcond = %g", + rcond); + } + + volatile double rcond_plus_one = rcond + 1.0; + + if (rcond_plus_one == 1.0 || xisnan (rcond)) + { + err = -2; + + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("matrix singular to machine precision, rcond = %g", + rcond); + } + } + else + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +SparseComplexMatrix +SparseMatrix::ltsolve (SparseType &mattype, const SparseComplexMatrix& b, + int& err, double& rcond, + solve_singularity_handler sing_handler) const +{ + SparseComplexMatrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + int typ = mattype.type (); + mattype.info (); + + if (typ == SparseType::Permuted_Lower || + typ == SparseType::Lower) + { + double anorm = 0.; + double ainvnorm = 0.; + rcond = 0.; + + // Calculate the 1-norm of matrix for rcond calculation + for (int j = 0; j < nr; j++) + { + double atmp = 0.; + for (int i = cidx(j); i < cidx(j+1); i++) + atmp += fabs(data(i)); + if (atmp > anorm) + anorm = atmp; + } + + int b_nr = b.rows (); + int b_nc = b.cols (); + int b_nz = b.nnz (); + retval = SparseComplexMatrix (b_nr, b_nc, b_nz); + retval.xcidx(0) = 0; + int ii = 0; + int x_nz = b_nz; + + if (typ == SparseType::Permuted_Lower) + { + OCTAVE_LOCAL_BUFFER (Complex, work, nr); + int *p_perm = mattype.triangular_row_perm (); + int *q_perm = mattype.triangular_col_perm (); + + (*current_liboctave_warning_handler) + ("SparseMatrix::solve XXX FIXME XXX permuted triangular code not tested"); + + for (int j = 0; j < b_nc; j++) + { + for (int i = 0; i < nr; i++) + work[i] = 0.; + for (int i = b.cidx(j); i < b.cidx(j+1); i++) + work[b.ridx(i)] = b.data(i); + + for (int k = 0; k < nr; k++) + { + int iidx = q_perm[k]; + if (work[iidx] != 0.) + { + if (ridx(cidx(iidx)) != iidx) + { + err = -2; + goto triangular_error; + } + + Complex tmp = work[iidx] / data(cidx(iidx+1)-1); + work[iidx] = tmp; + for (int i = cidx(iidx)+1; i < cidx(iidx+1); i++) + { + int idx2 = q_perm[ridx(i)]; + work[idx2] = + work[idx2] - tmp * data(i); + } + } + } + + // Count non-zeros in work vector and adjust space in + // retval if needed + int new_nnz = 0; + for (int i = 0; i < nr; i++) + if (work[i] != 0.) + new_nnz++; + + if (ii + new_nnz > x_nz) + { + // Resize the sparse matrix + int sz = new_nnz * (b_nc - j) + x_nz; + retval.change_capacity (sz); + x_nz = sz; + } + + for (int i = 0; i < nr; i++) + if (work[p_perm[i]] != 0.) + { + retval.xridx(ii) = i; + retval.xdata(ii++) = work[p_perm[i]]; + } + retval.xcidx(j+1) = ii; + } + + retval.maybe_compress (); + + // Calculation of 1-norm of inv(*this) + OCTAVE_LOCAL_BUFFER (double, work2, nr); + for (int i = 0; i < nr; i++) + work2[i] = 0.; + + for (int j = 0; j < nr; j++) + { + work2[q_perm[j]] = 1.; + + for (int k = 0; k < nr; k++) + { + int iidx = q_perm[k]; + + if (work2[iidx] != 0.) + { + double tmp = work2[iidx] / data(cidx(iidx+1)-1); + work2[iidx] = tmp; + for (int i = cidx(iidx)+1; i < cidx(iidx+1); i++) + { + int idx2 = q_perm[ridx(i)]; + work2[idx2] = work2[idx2] - tmp * data(i); + } + } + } + double atmp = 0; + for (int i = 0; i < j+1; i++) + { + atmp += fabs(work2[i]); + work2[i] = 0.; + } + if (atmp > ainvnorm) + ainvnorm = atmp; + } + } + else + { + OCTAVE_LOCAL_BUFFER (Complex, work, nr); + + for (int j = 0; j < b_nc; j++) + { + for (int i = 0; i < nr; i++) + work[i] = 0.; + for (int i = b.cidx(j); i < b.cidx(j+1); i++) + work[b.ridx(i)] = b.data(i); + + for (int k = 0; k < nr; k++) + { + if (work[k] != 0.) + { + if (ridx(cidx(k)) != k) + { + err = -2; + goto triangular_error; + } + + Complex tmp = work[k] / data(cidx(k)); + work[k] = tmp; + for (int i = cidx(k)+1; i < cidx(k+1); i++) + { + int iidx = ridx(i); + work[iidx] = work[iidx] - tmp * data(i); + } + } + } + + // Count non-zeros in work vector and adjust space in + // retval if needed + int new_nnz = 0; + for (int i = 0; i < nr; i++) + if (work[i] != 0.) + new_nnz++; + + if (ii + new_nnz > x_nz) + { + // Resize the sparse matrix + int sz = new_nnz * (b_nc - j) + x_nz; + retval.change_capacity (sz); + x_nz = sz; + } + + for (int i = 0; i < nr; i++) + if (work[i] != 0.) + { + retval.xridx(ii) = i; + retval.xdata(ii++) = work[i]; + } + retval.xcidx(j+1) = ii; + } + + retval.maybe_compress (); + + // Calculation of 1-norm of inv(*this) + OCTAVE_LOCAL_BUFFER (double, work2, nr); + for (int i = 0; i < nr; i++) + work2[i] = 0.; + + for (int j = 0; j < nr; j++) + { + work2[j] = 1.; + + for (int k = j; k < nr; k++) + { + + if (work2[k] != 0.) + { + double tmp = work2[k] / data(cidx(k)); + work2[k] = tmp; + for (int i = cidx(k)+1; i < cidx(k+1); i++) + { + int iidx = ridx(i); + work2[iidx] = work2[iidx] - tmp * data(i); + } + } + } + double atmp = 0; + for (int i = j; i < nr; i++) + { + atmp += fabs(work2[i]); + work2[i] = 0.; + } + if (atmp > ainvnorm) + ainvnorm = atmp; + } + + } + + rcond = 1. / ainvnorm / anorm; + + triangular_error: + if (err != 0) + { + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("SparseMatrix::solve matrix singular to machine precision, rcond = %g", + rcond); + } + + volatile double rcond_plus_one = rcond + 1.0; + + if (rcond_plus_one == 1.0 || xisnan (rcond)) + { + err = -2; + + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("matrix singular to machine precision, rcond = %g", + rcond); + } + } + else + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +Matrix +SparseMatrix::trisolve (SparseType &mattype, const Matrix& b, int& err, + double& rcond, + solve_singularity_handler sing_handler) const +{ + Matrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + volatile int typ = mattype.type (); + mattype.info (); + + if (typ == SparseType::Tridiagonal_Hermitian) + { + OCTAVE_LOCAL_BUFFER (double, D, nr); + OCTAVE_LOCAL_BUFFER (double, DL, nr - 1); + + if (mattype.is_dense ()) + { + int ii = 0; + + for (int j = 0; j < nc-1; j++) + { + D[j] = data(ii++); + DL[j] = data(ii); + ii += 2; + } + D[nc-1] = data(ii); + } + else + { + D[0] = 0.; + for (int i = 0; i < nr - 1; i++) + { + D[i+1] = 0.; + DL[i] = 0.; + } + + for (int j = 0; j < nc; j++) + for (int i = cidx(j); i < cidx(j+1); i++) + { + if (ridx(i) == j) + D[j] = data(i); + else if (ridx(i) == j + 1) + DL[j] = data(i); + } + } + + int b_nc = b.cols(); + retval = b; + double *result = retval.fortran_vec (); + + F77_XFCN (dptsv, DPTSV, (nr, b_nc, D, DL, result, + b.rows(), err)); + + if (f77_exception_encountered) + (*current_liboctave_error_handler) + ("unrecoverable error in dptsv"); + else if (err != 0) + { + err = 0; + mattype.mark_as_unsymmetric (); + typ = SparseType::Tridiagonal; + } + else + rcond = 1.; + } + + if (typ == SparseType::Tridiagonal) + { + OCTAVE_LOCAL_BUFFER (double, DU, nr - 1); + OCTAVE_LOCAL_BUFFER (double, D, nr); + OCTAVE_LOCAL_BUFFER (double, DL, nr - 1); + + if (mattype.is_dense ()) + { + int ii = 0; + + for (int j = 0; j < nc-1; j++) + { + D[j] = data(ii++); + DL[j] = data(ii++); + DU[j] = data(ii++); + } + D[nc-1] = data(ii); + } + else + { + D[0] = 0.; + for (int i = 0; i < nr - 1; i++) + { + D[i+1] = 0.; + DL[i] = 0.; + DU[i] = 0.; + } + + for (int j = 0; j < nc; j++) + for (int i = cidx(j); i < cidx(j+1); i++) + { + if (ridx(i) == j) + D[j] = data(i); + else if (ridx(i) == j + 1) + DL[j] = data(i); + else if (ridx(i) == j - 1) + DU[j] = data(i); + } + } + + int b_nc = b.cols(); + retval = b; + double *result = retval.fortran_vec (); + + F77_XFCN (dgtsv, DGTSV, (nr, b_nc, DL, D, DU, result, + b.rows(), err)); + + if (f77_exception_encountered) + (*current_liboctave_error_handler) + ("unrecoverable error in dgtsv"); + else if (err != 0) + { + rcond = 0.; + err = -2; + + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("matrix singular to machine precision"); + + } + else + rcond = 1.; + } + else if (typ != SparseType::Tridiagonal_Hermitian) + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +SparseMatrix +SparseMatrix::trisolve (SparseType &mattype, const SparseMatrix& b, int& err, + double& rcond, solve_singularity_handler sing_handler) const +{ + SparseMatrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + int typ = mattype.type (); + mattype.info (); + + // Note can't treat symmetric case as there is no dpttrf function + if (typ == SparseType::Tridiagonal || + typ == SparseType::Tridiagonal_Hermitian) + { + OCTAVE_LOCAL_BUFFER (double, DU2, nr - 2); + OCTAVE_LOCAL_BUFFER (double, DU, nr - 1); + OCTAVE_LOCAL_BUFFER (double, D, nr); + OCTAVE_LOCAL_BUFFER (double, DL, nr - 1); + Array ipvt (nr); + int *pipvt = ipvt.fortran_vec (); + + if (mattype.is_dense ()) + { + int ii = 0; + + for (int j = 0; j < nc-1; j++) + { + D[j] = data(ii++); + DL[j] = data(ii++); + DU[j] = data(ii++); + } + D[nc-1] = data(ii); + } + else + { + D[0] = 0.; + for (int i = 0; i < nr - 1; i++) + { + D[i+1] = 0.; + DL[i] = 0.; + DU[i] = 0.; + } + + for (int j = 0; j < nc; j++) + for (int i = cidx(j); i < cidx(j+1); i++) + { + if (ridx(i) == j) + D[j] = data(i); + else if (ridx(i) == j + 1) + DL[j] = data(i); + else if (ridx(i) == j - 1) + DU[j] = data(i); + } + } + + F77_XFCN (dgttrf, DGTTRF, (nr, DL, D, DU, DU2, pipvt, err)); + + if (f77_exception_encountered) + (*current_liboctave_error_handler) + ("unrecoverable error in dgttrf"); + else + { + rcond = 0.0; + if (err != 0) + { + err = -2; + + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("matrix singular to machine precision"); + + } + else + { + char job = 'N'; + volatile int x_nz = b.nnz (); + int b_nc = b.cols (); + retval = SparseMatrix (nr, b_nc, x_nz); + retval.xcidx(0) = 0; + volatile int ii = 0; + + OCTAVE_LOCAL_BUFFER (double, work, nr); + + for (volatile int j = 0; j < b_nc; j++) + { + for (int i = 0; i < nr; i++) + work[i] = 0.; + for (int i = b.cidx(j); i < b.cidx(j+1); i++) + work[b.ridx(i)] = b.data(i); + + F77_XFCN (dgttrs, DGTTRS, + (F77_CONST_CHAR_ARG2 (&job, 1), + nr, 1, DL, D, DU, DU2, pipvt, + work, b.rows (), err + F77_CHAR_ARG_LEN (1))); + + if (f77_exception_encountered) + { + (*current_liboctave_error_handler) + ("unrecoverable error in dgttrs"); + break; + } + + // Count non-zeros in work vector and adjust + // space in retval if needed + int new_nnz = 0; + for (int i = 0; i < nr; i++) + if (work[i] != 0.) + new_nnz++; + + if (ii + new_nnz > x_nz) + { + // Resize the sparse matrix + int sz = new_nnz * (b_nc - j) + x_nz; + retval.change_capacity (sz); + x_nz = sz; + } + + for (int i = 0; i < nr; i++) + if (work[i] != 0.) + { + retval.xridx(ii) = i; + retval.xdata(ii++) = work[i]; + } + retval.xcidx(j+1) = ii; + } + + retval.maybe_compress (); + } + } + } + else if (typ != SparseType::Tridiagonal_Hermitian) + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +ComplexMatrix +SparseMatrix::trisolve (SparseType &mattype, const ComplexMatrix& b, int& err, + double& rcond, solve_singularity_handler sing_handler) const +{ + ComplexMatrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + volatile int typ = mattype.type (); + mattype.info (); + + // Note can't treat symmetric case as there is no dpttrf function + if (typ == SparseType::Tridiagonal_Hermitian) + { + OCTAVE_LOCAL_BUFFER (Complex, D, nr); + OCTAVE_LOCAL_BUFFER (Complex, DL, nr - 1); + + if (mattype.is_dense ()) + { + int ii = 0; + + for (int j = 0; j < nc-1; j++) + { + D[j] = data(ii++); + DL[j] = data(ii); + ii += 2; + } + D[nc-1] = data(ii); + } + else + { + D[0] = 0.; + for (int i = 0; i < nr - 1; i++) + { + D[i+1] = 0.; + DL[i] = 0.; + } + + for (int j = 0; j < nc; j++) + for (int i = cidx(j); i < cidx(j+1); i++) + { + if (ridx(i) == j) + D[j] = data(i); + else if (ridx(i) == j + 1) + DL[j] = data(i); + } + } + + int b_nr = b.rows (); + int b_nc = b.cols(); + rcond = 1.; + + retval = b; + Complex *result = retval.fortran_vec (); + + F77_XFCN (zptsv, ZPTSV, (nr, b_nc, D, DL, result, + b_nr, err)); + + if (f77_exception_encountered) + { + (*current_liboctave_error_handler) + ("unrecoverable error in zptsv"); + err = -1; + } + else if (err != 0) + { + err = 0; + mattype.mark_as_unsymmetric (); + typ = SparseType::Tridiagonal; + } + } + + if (typ == SparseType::Tridiagonal) + { + OCTAVE_LOCAL_BUFFER (Complex, DU, nr - 1); + OCTAVE_LOCAL_BUFFER (Complex, D, nr); + OCTAVE_LOCAL_BUFFER (Complex, DL, nr - 1); + + if (mattype.is_dense ()) + { + int ii = 0; + + for (int j = 0; j < nc-1; j++) + { + D[j] = data(ii++); + DL[j] = data(ii++); + DU[j] = data(ii++); + } + D[nc-1] = data(ii); + } + else + { + D[0] = 0.; + for (int i = 0; i < nr - 1; i++) + { + D[i+1] = 0.; + DL[i] = 0.; + DU[i] = 0.; + } + + for (int j = 0; j < nc; j++) + for (int i = cidx(j); i < cidx(j+1); i++) + { + if (ridx(i) == j) + D[j] = data(i); + else if (ridx(i) == j + 1) + DL[j] = data(i); + else if (ridx(i) == j - 1) + DU[j] = data(i); + } + } + + int b_nr = b.rows(); + int b_nc = b.cols(); + rcond = 1.; + + retval = b; + Complex *result = retval.fortran_vec (); + + F77_XFCN (zgtsv, ZGTSV, (nr, b_nc, DL, D, DU, result, + b_nr, err)); + + if (f77_exception_encountered) + { + (*current_liboctave_error_handler) + ("unrecoverable error in zgtsv"); + err = -1; + } + else if (err != 0) + { + rcond = 0.; + err = -2; + + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("matrix singular to machine precision"); + } + } + else if (typ != SparseType::Tridiagonal_Hermitian) + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +SparseComplexMatrix +SparseMatrix::trisolve (SparseType &mattype, const SparseComplexMatrix& b, + int& err, double& rcond, + solve_singularity_handler sing_handler) const +{ + SparseComplexMatrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + int typ = mattype.type (); + mattype.info (); + + // Note can't treat symmetric case as there is no dpttrf function + if (typ == SparseType::Tridiagonal || + typ == SparseType::Tridiagonal_Hermitian) + { + OCTAVE_LOCAL_BUFFER (double, DU2, nr - 2); + OCTAVE_LOCAL_BUFFER (double, DU, nr - 1); + OCTAVE_LOCAL_BUFFER (double, D, nr); + OCTAVE_LOCAL_BUFFER (double, DL, nr - 1); + Array ipvt (nr); + int *pipvt = ipvt.fortran_vec (); + + if (mattype.is_dense ()) + { + int ii = 0; + + for (int j = 0; j < nc-1; j++) + { + D[j] = data(ii++); + DL[j] = data(ii++); + DU[j] = data(ii++); + } + D[nc-1] = data(ii); + } + else + { + D[0] = 0.; + for (int i = 0; i < nr - 1; i++) + { + D[i+1] = 0.; + DL[i] = 0.; + DU[i] = 0.; + } + + for (int j = 0; j < nc; j++) + for (int i = cidx(j); i < cidx(j+1); i++) + { + if (ridx(i) == j) + D[j] = data(i); + else if (ridx(i) == j + 1) + DL[j] = data(i); + else if (ridx(i) == j - 1) + DU[j] = data(i); + } + } + + F77_XFCN (dgttrf, DGTTRF, (nr, DL, D, DU, DU2, pipvt, err)); + + if (f77_exception_encountered) + (*current_liboctave_error_handler) + ("unrecoverable error in dgttrf"); + else + { + rcond = 0.0; + if (err != 0) + { + err = -2; + + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("matrix singular to machine precision"); + } + else + { + rcond = 1.; + char job = 'N'; + int b_nr = b.rows (); + int b_nc = b.cols (); + OCTAVE_LOCAL_BUFFER (double, Bx, b_nr); + OCTAVE_LOCAL_BUFFER (double, Bz, b_nr); + + // Take a first guess that the number of non-zero terms + // will be as many as in b + volatile int x_nz = b.nnz (); + volatile int ii = 0; + retval = SparseComplexMatrix (b_nr, b_nc, x_nz); + + retval.xcidx(0) = 0; + for (volatile int j = 0; j < b_nc; j++) + { + + for (int i = 0; i < b_nr; i++) + { + Complex c = b (i,j); + Bx[i] = ::real (c); + Bz[i] = ::imag (c); + } + + + F77_XFCN (dgttrs, DGTTRS, + (F77_CONST_CHAR_ARG2 (&job, 1), + nr, 1, DL, D, DU, DU2, pipvt, + Bx, b_nr, err + F77_CHAR_ARG_LEN (1))); + + if (f77_exception_encountered) + { + (*current_liboctave_error_handler) + ("unrecoverable error in dgttrs"); + break; + } + + if (err != 0) + { + (*current_liboctave_error_handler) + ("SparseMatrix::solve solve failed"); + + err = -1; + break; + } + + F77_XFCN (dgttrs, DGTTRS, + (F77_CONST_CHAR_ARG2 (&job, 1), + nr, 1, DL, D, DU, DU2, pipvt, + Bz, b_nr, err + F77_CHAR_ARG_LEN (1))); + + if (f77_exception_encountered) + { + (*current_liboctave_error_handler) + ("unrecoverable error in dgttrs"); + break; + } + + if (err != 0) + { + (*current_liboctave_error_handler) + ("SparseMatrix::solve solve failed"); + + err = -1; + break; + } + + // Count non-zeros in work vector and adjust + // space in retval if needed + int new_nnz = 0; + for (int i = 0; i < nr; i++) + if (Bx[i] != 0. || Bz[i] != 0.) + new_nnz++; + + if (ii + new_nnz > x_nz) + { + // Resize the sparse matrix + int sz = new_nnz * (b_nc - j) + x_nz; + retval.change_capacity (sz); + x_nz = sz; + } + + for (int i = 0; i < nr; i++) + if (Bx[i] != 0. || Bz[i] != 0.) + { + retval.xridx(ii) = i; + retval.xdata(ii++) = + Complex (Bx[i], Bz[i]); + } + + retval.xcidx(j+1) = ii; + } + + retval.maybe_compress (); + } + } + } + else if (typ != SparseType::Tridiagonal_Hermitian) + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +Matrix +SparseMatrix::bsolve (SparseType &mattype, const Matrix& b, int& err, + double& rcond, + solve_singularity_handler sing_handler) const +{ + Matrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + volatile int typ = mattype.type (); + mattype.info (); + + if (typ == SparseType::Banded_Hermitian) + { + int n_lower = mattype.nlower (); + int ldm = n_lower + 1; + Matrix m_band (ldm, nc); + double *tmp_data = m_band.fortran_vec (); + + if (! mattype.is_dense ()) + { + int ii = 0; + + for (int j = 0; j < ldm; j++) + for (int i = 0; i < nc; i++) + tmp_data[ii++] = 0.; + } + + for (int j = 0; j < nc; j++) + for (int i = cidx(j); i < cidx(j+1); i++) + { + int ri = ridx (i); + if (ri >= j) + m_band(ri - j, j) = data(i); + } + + // Calculate the norm of the matrix, for later use. + // double anorm = m_band.abs().sum().row(0).max(); + + char job = 'L'; + F77_XFCN (dpbtrf, DPBTRF, (F77_CONST_CHAR_ARG2 (&job, 1), + nr, n_lower, tmp_data, ldm, err + F77_CHAR_ARG_LEN (1))); + + if (f77_exception_encountered) + (*current_liboctave_error_handler) + ("unrecoverable error in dpbtrf"); + else + { + rcond = 0.0; + if (err != 0) + { + // Matrix is not positive definite!! Fall through to + // unsymmetric banded solver. + mattype.mark_as_unsymmetric (); + typ = SparseType::Banded; + err = 0; + } + else + { + // Unfortunately, the time to calculate the condition + // number is dominant for narrow banded matrices and + // so we rely on the "err" flag from xPBTRF to flag + // singularity. The commented code below is left here + // for reference + + //Array z (3 * nr); + //double *pz = z.fortran_vec (); + //Array iz (nr); + //int *piz = iz.fortran_vec (); + // + //F77_XFCN (dpbcon, DGBCON, + // (F77_CONST_CHAR_ARG2 (&job, 1), + // nr, n_lower, tmp_data, ldm, + // anorm, rcond, pz, piz, err + // F77_CHAR_ARG_LEN (1))); + // + // + //if (f77_exception_encountered) + // (*current_liboctave_error_handler) + // ("unrecoverable error in dpbcon"); + // + //if (err != 0) + // err = -2; + // + //volatile double rcond_plus_one = rcond + 1.0; + // + //if (rcond_plus_one == 1.0 || xisnan (rcond)) + // { + // err = -2; + // + // if (sing_handler) + // sing_handler (rcond); + // else + // (*current_liboctave_error_handler) + // ("matrix singular to machine precision, rcond = %g", + // rcond); + // } + //else + // REST OF CODE, EXCEPT rcond=1 + + rcond = 1.; + retval = b; + double *result = retval.fortran_vec (); + + int b_nc = b.cols (); + + F77_XFCN (dpbtrs, DPBTRS, + (F77_CONST_CHAR_ARG2 (&job, 1), + nr, n_lower, b_nc, tmp_data, + ldm, result, b.rows(), err + F77_CHAR_ARG_LEN (1))); + + if (f77_exception_encountered) + (*current_liboctave_error_handler) + ("unrecoverable error in dpbtrs"); + + if (err != 0) + { + (*current_liboctave_error_handler) + ("SparseMatrix::solve solve failed"); + err = -1; + } + } + } + } + + if (typ == SparseType::Banded) + { + // Create the storage for the banded form of the sparse matrix + int n_upper = mattype.nupper (); + int n_lower = mattype.nlower (); + int ldm = n_upper + 2 * n_lower + 1; + + Matrix m_band (ldm, nc); + double *tmp_data = m_band.fortran_vec (); + + if (! mattype.is_dense ()) + { + int ii = 0; + + for (int j = 0; j < ldm; j++) + for (int i = 0; i < nc; i++) + tmp_data[ii++] = 0.; + } + + for (int j = 0; j < nc; j++) + for (int i = cidx(j); i < cidx(j+1); i++) + m_band(ridx(i) - j + n_lower + n_upper, j) = data(i); + + Array ipvt (nr); + int *pipvt = ipvt.fortran_vec (); + + F77_XFCN (dgbtrf, DGBTRF, (nr, nr, n_lower, n_upper, tmp_data, + ldm, pipvt, err)); + + if (f77_exception_encountered) + (*current_liboctave_error_handler) + ("unrecoverable error in dgbtrf"); + else + { + // Throw-away extra info LAPACK gives so as to not + // change output. + rcond = 0.0; + if (err != 0) + { + err = -2; + + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("matrix singular to machine precision"); + + } + else + { + char job = '1'; + + // Unfortunately, the time to calculate the condition + // number is dominant for narrow banded matrices and + // so we rely on the "err" flag from xPBTRF to flag + // singularity. The commented code below is left here + // for reference + + //F77_XFCN (dgbcon, DGBCON, + // (F77_CONST_CHAR_ARG2 (&job, 1), + // nc, n_lower, n_upper, tmp_data, ldm, pipvt, + // anorm, rcond, pz, piz, err + // F77_CHAR_ARG_LEN (1))); + // + //if (f77_exception_encountered) + // (*current_liboctave_error_handler) + // ("unrecoverable error in dgbcon"); + // + // if (err != 0) + // err = -2; + // + //volatile double rcond_plus_one = rcond + 1.0; + // + //if (rcond_plus_one == 1.0 || xisnan (rcond)) + // { + // err = -2; + // + // if (sing_handler) + // sing_handler (rcond); + // else + // (*current_liboctave_error_handler) + // ("matrix singular to machine precision, rcond = %g", + // rcond); + // } + //else + // REST OF CODE, EXCEPT rcond=1 + + rcond = 1.; + retval = b; + double *result = retval.fortran_vec (); + + int b_nc = b.cols (); + + job = 'N'; + F77_XFCN (dgbtrs, DGBTRS, + (F77_CONST_CHAR_ARG2 (&job, 1), + nr, n_lower, n_upper, b_nc, tmp_data, + ldm, pipvt, result, b.rows(), err + F77_CHAR_ARG_LEN (1))); + + if (f77_exception_encountered) + (*current_liboctave_error_handler) + ("unrecoverable error in dgbtrs"); + } + } + } + else if (typ != SparseType::Banded_Hermitian) + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +SparseMatrix +SparseMatrix::bsolve (SparseType &mattype, const SparseMatrix& b, int& err, + double& rcond, solve_singularity_handler sing_handler) const +{ + SparseMatrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + volatile int typ = mattype.type (); + mattype.info (); + + if (typ == SparseType::Banded_Hermitian) + { + int n_lower = mattype.nlower (); + int ldm = n_lower + 1; + + Matrix m_band (ldm, nc); + double *tmp_data = m_band.fortran_vec (); + + if (! mattype.is_dense ()) + { + int ii = 0; + + for (int j = 0; j < ldm; j++) + for (int i = 0; i < nc; i++) + tmp_data[ii++] = 0.; + } + + for (int j = 0; j < nc; j++) + for (int i = cidx(j); i < cidx(j+1); i++) + { + int ri = ridx (i); + if (ri >= j) + m_band(ri - j, j) = data(i); + } + + char job = 'L'; + F77_XFCN (dpbtrf, DPBTRF, (F77_CONST_CHAR_ARG2 (&job, 1), + nr, n_lower, tmp_data, ldm, err + F77_CHAR_ARG_LEN (1))); + + if (f77_exception_encountered) + (*current_liboctave_error_handler) + ("unrecoverable error in dpbtrf"); + else + { + rcond = 0.0; + if (err != 0) + { + mattype.mark_as_unsymmetric (); + typ = SparseType::Banded; + err = 0; + } + else + { + rcond = 1.; + int b_nr = b.rows (); + int b_nc = b.cols (); + OCTAVE_LOCAL_BUFFER (double, Bx, b_nr); + + // Take a first guess that the number of non-zero terms + // will be as many as in b + volatile int x_nz = b.nnz (); + volatile int ii = 0; + retval = SparseMatrix (b_nr, b_nc, x_nz); + + retval.xcidx(0) = 0; + for (volatile int j = 0; j < b_nc; j++) + { + for (int i = 0; i < b_nr; i++) + Bx[i] = b.elem (i, j); + + F77_XFCN (dpbtrs, DPBTRS, + (F77_CONST_CHAR_ARG2 (&job, 1), + nr, n_lower, 1, tmp_data, + ldm, Bx, b_nr, err + F77_CHAR_ARG_LEN (1))); + + if (f77_exception_encountered) + { + (*current_liboctave_error_handler) + ("unrecoverable error in dpbtrs"); + err = -1; + break; + } + + if (err != 0) + { + (*current_liboctave_error_handler) + ("SparseMatrix::solve solve failed"); + err = -1; + break; + } + + for (int i = 0; i < b_nr; i++) + { + double tmp = Bx[i]; + if (tmp != 0.0) + { + if (ii == x_nz) + { + // Resize the sparse matrix + int sz = x_nz * (b_nc - j) / b_nc; + sz = (sz > 10 ? sz : 10) + x_nz; + retval.change_capacity (sz); + x_nz = sz; + } + retval.xdata(ii) = tmp; + retval.xridx(ii++) = i; + } + } + retval.xcidx(j+1) = ii; + } + + retval.maybe_compress (); + } + } + } + + if (typ == SparseType::Banded) + { + // Create the storage for the banded form of the sparse matrix + int n_upper = mattype.nupper (); + int n_lower = mattype.nlower (); + int ldm = n_upper + 2 * n_lower + 1; + + Matrix m_band (ldm, nc); + double *tmp_data = m_band.fortran_vec (); + + if (! mattype.is_dense ()) + { + int ii = 0; + + for (int j = 0; j < ldm; j++) + for (int i = 0; i < nc; i++) + tmp_data[ii++] = 0.; + } + + for (int j = 0; j < nc; j++) + for (int i = cidx(j); i < cidx(j+1); i++) + m_band(ridx(i) - j + n_lower + n_upper, j) = data(i); + + Array ipvt (nr); + int *pipvt = ipvt.fortran_vec (); + + F77_XFCN (dgbtrf, DGBTRF, (nr, nr, n_lower, n_upper, tmp_data, + ldm, pipvt, err)); + + if (f77_exception_encountered) + (*current_liboctave_error_handler) + ("unrecoverable error in dgbtrf"); + else + { + rcond = 0.0; + if (err != 0) + { + err = -2; + + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("matrix singular to machine precision"); + + } + else + { + char job = 'N'; + volatile int x_nz = b.nnz (); + int b_nc = b.cols (); + retval = SparseMatrix (nr, b_nc, x_nz); + retval.xcidx(0) = 0; + volatile int ii = 0; + + OCTAVE_LOCAL_BUFFER (double, work, nr); + + for (volatile int j = 0; j < b_nc; j++) + { + for (int i = 0; i < nr; i++) + work[i] = 0.; + for (int i = b.cidx(j); i < b.cidx(j+1); i++) + work[b.ridx(i)] = b.data(i); + + F77_XFCN (dgbtrs, DGBTRS, + (F77_CONST_CHAR_ARG2 (&job, 1), + nr, n_lower, n_upper, 1, tmp_data, + ldm, pipvt, work, b.rows (), err + F77_CHAR_ARG_LEN (1))); + + if (f77_exception_encountered) + { + (*current_liboctave_error_handler) + ("unrecoverable error in dgbtrs"); + break; + } + + // Count non-zeros in work vector and adjust + // space in retval if needed + int new_nnz = 0; + for (int i = 0; i < nr; i++) + if (work[i] != 0.) + new_nnz++; + + if (ii + new_nnz > x_nz) + { + // Resize the sparse matrix + int sz = new_nnz * (b_nc - j) + x_nz; + retval.change_capacity (sz); + x_nz = sz; + } + + for (int i = 0; i < nr; i++) + if (work[i] != 0.) + { + retval.xridx(ii) = i; + retval.xdata(ii++) = work[i]; + } + retval.xcidx(j+1) = ii; + } + + retval.maybe_compress (); + } + } + } + else if (typ != SparseType::Banded_Hermitian) + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +ComplexMatrix +SparseMatrix::bsolve (SparseType &mattype, const ComplexMatrix& b, int& err, + double& rcond, solve_singularity_handler sing_handler) const +{ + ComplexMatrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + volatile int typ = mattype.type (); + mattype.info (); + + if (typ == SparseType::Banded_Hermitian) + { + int n_lower = mattype.nlower (); + int ldm = n_lower + 1; + + Matrix m_band (ldm, nc); + double *tmp_data = m_band.fortran_vec (); + + if (! mattype.is_dense ()) + { + int ii = 0; + + for (int j = 0; j < ldm; j++) + for (int i = 0; i < nc; i++) + tmp_data[ii++] = 0.; + } + + for (int j = 0; j < nc; j++) + for (int i = cidx(j); i < cidx(j+1); i++) + { + int ri = ridx (i); + if (ri >= j) + m_band(ri - j, j) = data(i); + } + + char job = 'L'; + F77_XFCN (dpbtrf, DPBTRF, (F77_CONST_CHAR_ARG2 (&job, 1), + nr, n_lower, tmp_data, ldm, err + F77_CHAR_ARG_LEN (1))); + + if (f77_exception_encountered) + (*current_liboctave_error_handler) + ("unrecoverable error in dpbtrf"); + else + { + rcond = 0.0; + if (err != 0) + { + // Matrix is not positive definite!! Fall through to + // unsymmetric banded solver. + mattype.mark_as_unsymmetric (); + typ = SparseType::Banded; + err = 0; + } + else + { + rcond = 1.; + int b_nr = b.rows (); + int b_nc = b.cols (); + + OCTAVE_LOCAL_BUFFER (double, Bx, b_nr); + OCTAVE_LOCAL_BUFFER (double, Bz, b_nr); + + retval.resize (b_nr, b_nc); + + for (volatile int j = 0; j < b_nc; j++) + { + for (int i = 0; i < b_nr; i++) + { + Complex c = b (i,j); + Bx[i] = ::real (c); + Bz[i] = ::imag (c); + } + + F77_XFCN (dpbtrs, DPBTRS, + (F77_CONST_CHAR_ARG2 (&job, 1), + nr, n_lower, 1, tmp_data, + ldm, Bx, b_nr, err + F77_CHAR_ARG_LEN (1))); + + if (f77_exception_encountered) + { + (*current_liboctave_error_handler) + ("unrecoverable error in dpbtrs"); + err = -1; + break; + } + + if (err != 0) + { + (*current_liboctave_error_handler) + ("SparseMatrix::solve solve failed"); + err = -1; + break; + } + + F77_XFCN (dpbtrs, DPBTRS, + (F77_CONST_CHAR_ARG2 (&job, 1), + nr, n_lower, 1, tmp_data, + ldm, Bz, b.rows(), err + F77_CHAR_ARG_LEN (1))); + + if (f77_exception_encountered) + { + (*current_liboctave_error_handler) + ("unrecoverable error in dpbtrs"); + err = -1; + break; + } + + if (err != 0) + { + (*current_liboctave_error_handler) + ("SparseMatrix::solve solve failed"); + err = -1; + break; + } + + for (int i = 0; i < b_nr; i++) + retval (i, j) = Complex (Bx[i], Bz[i]); + } + } + } + } + + if (typ == SparseType::Banded) + { + // Create the storage for the banded form of the sparse matrix + int n_upper = mattype.nupper (); + int n_lower = mattype.nlower (); + int ldm = n_upper + 2 * n_lower + 1; + + Matrix m_band (ldm, nc); + double *tmp_data = m_band.fortran_vec (); + + if (! mattype.is_dense ()) + { + int ii = 0; + + for (int j = 0; j < ldm; j++) + for (int i = 0; i < nc; i++) + tmp_data[ii++] = 0.; + } + + for (int j = 0; j < nc; j++) + for (int i = cidx(j); i < cidx(j+1); i++) + m_band(ridx(i) - j + n_lower + n_upper, j) = data(i); + + Array ipvt (nr); + int *pipvt = ipvt.fortran_vec (); + + F77_XFCN (dgbtrf, DGBTRF, (nr, nr, n_lower, n_upper, tmp_data, + ldm, pipvt, err)); + + if (f77_exception_encountered) + (*current_liboctave_error_handler) + ("unrecoverable error in dgbtrf"); + else + { + rcond = 0.0; + if (err != 0) + { + err = -2; + + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("matrix singular to machine precision"); + + } + else + { + char job = 'N'; + int b_nc = b.cols (); + retval.resize (nr,b_nc); + + OCTAVE_LOCAL_BUFFER (double, Bz, nr); + OCTAVE_LOCAL_BUFFER (double, Bx, nr); + + for (volatile int j = 0; j < b_nc; j++) + { + for (int i = 0; i < nr; i++) + { + Complex c = b (i, j); + Bx[i] = ::real (c); + Bz[i] = ::imag (c); + } + + F77_XFCN (dgbtrs, DGBTRS, + (F77_CONST_CHAR_ARG2 (&job, 1), + nr, n_lower, n_upper, 1, tmp_data, + ldm, pipvt, Bx, b.rows (), err + F77_CHAR_ARG_LEN (1))); + + if (f77_exception_encountered) + { + (*current_liboctave_error_handler) + ("unrecoverable error in dgbtrs"); + break; + } + + F77_XFCN (dgbtrs, DGBTRS, + (F77_CONST_CHAR_ARG2 (&job, 1), + nr, n_lower, n_upper, 1, tmp_data, + ldm, pipvt, Bz, b.rows (), err + F77_CHAR_ARG_LEN (1))); + + if (f77_exception_encountered) + { + (*current_liboctave_error_handler) + ("unrecoverable error in dgbtrs"); + break; + } + + for (int i = 0; i < nr; i++) + retval (i, j) = Complex (Bx[i], Bz[i]); + } + } + } + } + else if (typ != SparseType::Banded_Hermitian) + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +SparseComplexMatrix +SparseMatrix::bsolve (SparseType &mattype, const SparseComplexMatrix& b, + int& err, double& rcond, + solve_singularity_handler sing_handler) const +{ + SparseComplexMatrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + volatile int typ = mattype.type (); + mattype.info (); + + if (typ == SparseType::Banded_Hermitian) + { + int n_lower = mattype.nlower (); + int ldm = n_lower + 1; + + Matrix m_band (ldm, nc); + double *tmp_data = m_band.fortran_vec (); + + if (! mattype.is_dense ()) + { + int ii = 0; + + for (int j = 0; j < ldm; j++) + for (int i = 0; i < nc; i++) + tmp_data[ii++] = 0.; + } + + for (int j = 0; j < nc; j++) + for (int i = cidx(j); i < cidx(j+1); i++) + { + int ri = ridx (i); + if (ri >= j) + m_band(ri - j, j) = data(i); + } + + char job = 'L'; + F77_XFCN (dpbtrf, DPBTRF, (F77_CONST_CHAR_ARG2 (&job, 1), + nr, n_lower, tmp_data, ldm, err + F77_CHAR_ARG_LEN (1))); + + if (f77_exception_encountered) + (*current_liboctave_error_handler) + ("unrecoverable error in dpbtrf"); + else + { + rcond = 0.0; + if (err != 0) + { + // Matrix is not positive definite!! Fall through to + // unsymmetric banded solver. + mattype.mark_as_unsymmetric (); + typ = SparseType::Banded; + + err = 0; + } + else + { + rcond = 1.; + int b_nr = b.rows (); + int b_nc = b.cols (); + OCTAVE_LOCAL_BUFFER (double, Bx, b_nr); + OCTAVE_LOCAL_BUFFER (double, Bz, b_nr); + + // Take a first guess that the number of non-zero terms + // will be as many as in b + volatile int x_nz = b.nnz (); + volatile int ii = 0; + retval = SparseComplexMatrix (b_nr, b_nc, x_nz); + + retval.xcidx(0) = 0; + for (volatile int j = 0; j < b_nc; j++) + { + + for (int i = 0; i < b_nr; i++) + { + Complex c = b (i,j); + Bx[i] = ::real (c); + Bz[i] = ::imag (c); + } + + F77_XFCN (dpbtrs, DPBTRS, + (F77_CONST_CHAR_ARG2 (&job, 1), + nr, n_lower, 1, tmp_data, + ldm, Bx, b_nr, err + F77_CHAR_ARG_LEN (1))); + + if (f77_exception_encountered) + { + (*current_liboctave_error_handler) + ("unrecoverable error in dpbtrs"); + err = -1; + break; + } + + if (err != 0) + { + (*current_liboctave_error_handler) + ("SparseMatrix::solve solve failed"); + err = -1; + break; + } + + F77_XFCN (dpbtrs, DPBTRS, + (F77_CONST_CHAR_ARG2 (&job, 1), + nr, n_lower, 1, tmp_data, + ldm, Bz, b_nr, err + F77_CHAR_ARG_LEN (1))); + + if (f77_exception_encountered) + { + (*current_liboctave_error_handler) + ("unrecoverable error in dpbtrs"); + err = -1; + break; + } + + if (err != 0) + { + (*current_liboctave_error_handler) + ("SparseMatrix::solve solve failed"); + + err = -1; + break; + } + + // Count non-zeros in work vector and adjust + // space in retval if needed + int new_nnz = 0; + for (int i = 0; i < nr; i++) + if (Bx[i] != 0. || Bz[i] != 0.) + new_nnz++; + + if (ii + new_nnz > x_nz) + { + // Resize the sparse matrix + int sz = new_nnz * (b_nc - j) + x_nz; + retval.change_capacity (sz); + x_nz = sz; + } + + for (int i = 0; i < nr; i++) + if (Bx[i] != 0. || Bz[i] != 0.) + { + retval.xridx(ii) = i; + retval.xdata(ii++) = + Complex (Bx[i], Bz[i]); + } + + retval.xcidx(j+1) = ii; + } + + retval.maybe_compress (); + } + } + } + + if (typ == SparseType::Banded) + { + // Create the storage for the banded form of the sparse matrix + int n_upper = mattype.nupper (); + int n_lower = mattype.nlower (); + int ldm = n_upper + 2 * n_lower + 1; + + Matrix m_band (ldm, nc); + double *tmp_data = m_band.fortran_vec (); + + if (! mattype.is_dense ()) + { + int ii = 0; + + for (int j = 0; j < ldm; j++) + for (int i = 0; i < nc; i++) + tmp_data[ii++] = 0.; + } + + for (int j = 0; j < nc; j++) + for (int i = cidx(j); i < cidx(j+1); i++) + m_band(ridx(i) - j + n_lower + n_upper, j) = data(i); + + Array ipvt (nr); + int *pipvt = ipvt.fortran_vec (); + + F77_XFCN (dgbtrf, DGBTRF, (nr, nr, n_lower, n_upper, tmp_data, + ldm, pipvt, err)); + + if (f77_exception_encountered) + (*current_liboctave_error_handler) + ("unrecoverable error in dgbtrf"); + else + { + rcond = 0.0; + if (err != 0) + { + err = -2; + + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("matrix singular to machine precision"); + + } + else + { + char job = 'N'; + volatile int x_nz = b.nnz (); + int b_nc = b.cols (); + retval = SparseComplexMatrix (nr, b_nc, x_nz); + retval.xcidx(0) = 0; + volatile int ii = 0; + + OCTAVE_LOCAL_BUFFER (double, Bx, nr); + OCTAVE_LOCAL_BUFFER (double, Bz, nr); + + for (volatile int j = 0; j < b_nc; j++) + { + for (int i = 0; i < nr; i++) + { + Bx[i] = 0.; + Bz[i] = 0.; + } + for (int i = b.cidx(j); i < b.cidx(j+1); i++) + { + Complex c = b.data(i); + Bx[b.ridx(i)] = ::real (c); + Bz[b.ridx(i)] = ::imag (c); + } + + F77_XFCN (dgbtrs, DGBTRS, + (F77_CONST_CHAR_ARG2 (&job, 1), + nr, n_lower, n_upper, 1, tmp_data, + ldm, pipvt, Bx, b.rows (), err + F77_CHAR_ARG_LEN (1))); + + if (f77_exception_encountered) + { + (*current_liboctave_error_handler) + ("unrecoverable error in dgbtrs"); + break; + } + + F77_XFCN (dgbtrs, DGBTRS, + (F77_CONST_CHAR_ARG2 (&job, 1), + nr, n_lower, n_upper, 1, tmp_data, + ldm, pipvt, Bz, b.rows (), err + F77_CHAR_ARG_LEN (1))); + + if (f77_exception_encountered) + { + (*current_liboctave_error_handler) + ("unrecoverable error in dgbtrs"); + break; + } + + // Count non-zeros in work vector and adjust + // space in retval if needed + int new_nnz = 0; + for (int i = 0; i < nr; i++) + if (Bx[i] != 0. || Bz[i] != 0.) + new_nnz++; + + if (ii + new_nnz > x_nz) + { + // Resize the sparse matrix + int sz = new_nnz * (b_nc - j) + x_nz; + retval.change_capacity (sz); + x_nz = sz; + } + + for (int i = 0; i < nr; i++) + if (Bx[i] != 0. || Bz[i] != 0.) + { + retval.xridx(ii) = i; + retval.xdata(ii++) = + Complex (Bx[i], Bz[i]); + } + retval.xcidx(j+1) = ii; + } + + retval.maybe_compress (); + } + } + } + else if (typ != SparseType::Banded_Hermitian) + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +void * +SparseMatrix::factorize (int& err, double &rcond, Matrix &Control, Matrix &Info, + solve_singularity_handler sing_handler) const +{ + // The return values + void *Numeric; + err = 0; + + // Setup the control parameters + Control = Matrix (UMFPACK_CONTROL, 1); + double *control = Control.fortran_vec (); + umfpack_di_defaults (control); + + double tmp = Voctave_sparse_controls.get_key ("spumoni"); + if (!xisnan (tmp)) + Control (UMFPACK_PRL) = tmp; + tmp = Voctave_sparse_controls.get_key ("piv_tol"); + if (!xisnan (tmp)) + { + Control (UMFPACK_SYM_PIVOT_TOLERANCE) = tmp; + Control (UMFPACK_PIVOT_TOLERANCE) = tmp; + } + + // Set whether we are allowed to modify Q or not + tmp = Voctave_sparse_controls.get_key ("autoamd"); + if (!xisnan (tmp)) + Control (UMFPACK_FIXQ) = tmp; + + umfpack_di_report_control (control); + + const int *Ap = cidx (); + const int *Ai = ridx (); + const double *Ax = data (); + int nr = rows (); + int nc = cols (); + + umfpack_di_report_matrix (nr, nc, Ap, Ai, Ax, 1, control); + + void *Symbolic; + Info = Matrix (1, UMFPACK_INFO); + double *info = Info.fortran_vec (); + int status = umfpack_di_qsymbolic (nr, nc, Ap, Ai, Ax, NULL, + &Symbolic, control, info); + + if (status < 0) + { + (*current_liboctave_error_handler) + ("SparseMatrix::solve symbolic factorization failed"); + err = -1; + + umfpack_di_report_status (control, status); + umfpack_di_report_info (control, info); + + umfpack_di_free_symbolic (&Symbolic) ; + } + else + { + umfpack_di_report_symbolic (Symbolic, control); + + status = umfpack_di_numeric (Ap, Ai, Ax, Symbolic, &Numeric, + control, info) ; + umfpack_di_free_symbolic (&Symbolic) ; + +#ifdef HAVE_LSSOLVE + rcond = Info (UMFPACK_RCOND); + volatile double rcond_plus_one = rcond + 1.0; + + if (status == UMFPACK_WARNING_singular_matrix || + rcond_plus_one == 1.0 || xisnan (rcond)) + { + umfpack_di_report_numeric (Numeric, control); + + err = -2; + + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("SparseMatrix::solve matrix singular to machine precision, rcond = %g", + rcond); + + } + else +#endif + if (status < 0) + { + (*current_liboctave_error_handler) + ("SparseMatrix::solve numeric factorization failed"); + + umfpack_di_report_status (control, status); + umfpack_di_report_info (control, info); + + err = -1; + } + else + { + umfpack_di_report_numeric (Numeric, control); + } + } + + if (err != 0) + umfpack_di_free_numeric (&Numeric); + + return Numeric; +} + +Matrix +SparseMatrix::fsolve (SparseType &mattype, const Matrix& b, int& err, + double& rcond, + solve_singularity_handler sing_handler) const +{ + Matrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + int typ = mattype.type (); + mattype.info (); + + if (typ == SparseType::Hermitian) + { + // XXX FIXME XXX Write the cholesky solver and only fall + // through if cholesky factorization fails + + (*current_liboctave_warning_handler) + ("SparseMatrix::solve XXX FIXME XXX Cholesky code not done"); + + mattype.mark_as_unsymmetric (); + typ = SparseType::Full; + } + + if (typ == SparseType::Full) + { + Matrix Control, Info; + void *Numeric = + factorize (err, rcond, Control, Info, sing_handler); + + if (err == 0) + { + const double *Bx = b.fortran_vec (); + retval.resize (b.rows (), b.cols()); + double *result = retval.fortran_vec (); + int b_nr = b.rows (); + int b_nc = b.cols (); + int status = 0; + double *control = Control.fortran_vec (); + double *info = Info.fortran_vec (); + const int *Ap = cidx (); + const int *Ai = ridx (); + const double *Ax = data (); + + for (int j = 0, iidx = 0; j < b_nc; j++, iidx += b_nr) + { + status = umfpack_di_solve (UMFPACK_A, Ap, Ai, Ax, + &result[iidx], &Bx[iidx], + Numeric, control, info); + if (status < 0) + { + (*current_liboctave_error_handler) + ("SparseMatrix::solve solve failed"); + + umfpack_di_report_status (control, status); + + err = -1; + + break; + } + } + +#ifndef HAVE_LSSOLVE + rcond = Info (UMFPACK_RCOND); + volatile double rcond_plus_one = rcond + 1.0; + + if (status == UMFPACK_WARNING_singular_matrix || + rcond_plus_one == 1.0 || xisnan (rcond)) + { + err = -2; + + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("SparseMatrix::solve matrix singular to machine precision, rcond = %g", + rcond); + + } +#endif + + umfpack_di_report_info (control, info); + + umfpack_di_free_numeric (&Numeric); + } + } + else if (typ != SparseType::Hermitian) + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +SparseMatrix +SparseMatrix::fsolve (SparseType &mattype, const SparseMatrix& b, int& err, double& rcond, + solve_singularity_handler sing_handler) const +{ + SparseMatrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + int typ = mattype.type (); + mattype.info (); + + if (typ == SparseType::Hermitian) + { + // XXX FIXME XXX Write the cholesky solver and only fall + // through if cholesky factorization fails + + (*current_liboctave_warning_handler) + ("SparseMatrix::solve XXX FIXME XXX Cholesky code not done"); + + mattype.mark_as_unsymmetric (); + typ = SparseType::Full; + } + + if (typ == SparseType::Full) + { + Matrix Control, Info; + void *Numeric = factorize (err, rcond, Control, Info, + sing_handler); + + if (err == 0) + { + int b_nr = b.rows (); + int b_nc = b.cols (); + int status = 0; + double *control = Control.fortran_vec (); + double *info = Info.fortran_vec (); + const int *Ap = cidx (); + const int *Ai = ridx (); + const double *Ax = data (); + + OCTAVE_LOCAL_BUFFER (double, Bx, b_nr); + OCTAVE_LOCAL_BUFFER (double, Xx, b_nr); + + // Take a first guess that the number of non-zero terms + // will be as many as in b + int x_nz = b.nnz (); + int ii = 0; + retval = SparseMatrix (b_nr, b_nc, x_nz); + + retval.xcidx(0) = 0; + for (int j = 0; j < b_nc; j++) + { + + for (int i = 0; i < b_nr; i++) + Bx[i] = b.elem (i, j); + + status = umfpack_di_solve (UMFPACK_A, Ap, Ai, Ax, Xx, + Bx, Numeric, control, + info); + if (status < 0) + { + (*current_liboctave_error_handler) + ("SparseMatrix::solve solve failed"); + + umfpack_di_report_status (control, status); + + err = -1; + + break; + } + + for (int i = 0; i < b_nr; i++) + { + double tmp = Xx[i]; + if (tmp != 0.0) + { + if (ii == x_nz) + { + // Resize the sparse matrix + int sz = x_nz * (b_nc - j) / b_nc; + sz = (sz > 10 ? sz : 10) + x_nz; + retval.change_capacity (sz); + x_nz = sz; + } + retval.xdata(ii) = tmp; + retval.xridx(ii++) = i; + } + } + retval.xcidx(j+1) = ii; + } + + retval.maybe_compress (); + +#ifndef HAVE_LSSOLVE + rcond = Info (UMFPACK_RCOND); + volatile double rcond_plus_one = rcond + 1.0; + + if (status == UMFPACK_WARNING_singular_matrix || + rcond_plus_one == 1.0 || xisnan (rcond)) + { + err = -2; + + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("SparseMatrix::solve matrix singular to machine precision, rcond = %g", + rcond); + + } +#endif + + umfpack_di_report_info (control, info); + + umfpack_di_free_numeric (&Numeric); + } + } + else if (typ != SparseType::Hermitian) + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +ComplexMatrix +SparseMatrix::fsolve (SparseType &mattype, const ComplexMatrix& b, int& err, double& rcond, + solve_singularity_handler sing_handler) const +{ + ComplexMatrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + int typ = mattype.type (); + mattype.info (); + + if (typ == SparseType::Hermitian) + { + // XXX FIXME XXX Write the cholesky solver and only fall + // through if cholesky factorization fails + + (*current_liboctave_warning_handler) + ("SparseMatrix::solve XXX FIXME XXX Cholesky code not done"); + + mattype.mark_as_unsymmetric (); + typ = SparseType::Full; + } + + if (typ == SparseType::Full) + { + Matrix Control, Info; + void *Numeric = factorize (err, rcond, Control, Info, + sing_handler); + + if (err == 0) + { + int b_nr = b.rows (); + int b_nc = b.cols (); + int status = 0; + double *control = Control.fortran_vec (); + double *info = Info.fortran_vec (); + const int *Ap = cidx (); + const int *Ai = ridx (); + const double *Ax = data (); + + OCTAVE_LOCAL_BUFFER (double, Bx, b_nr); + OCTAVE_LOCAL_BUFFER (double, Bz, b_nr); + + retval.resize (b_nr, b_nc); + + OCTAVE_LOCAL_BUFFER (double, Xx, b_nr); + OCTAVE_LOCAL_BUFFER (double, Xz, b_nr); + + for (int j = 0; j < b_nc; j++) + { + for (int i = 0; i < b_nr; i++) + { + Complex c = b (i,j); + Bx[i] = ::real (c); + Bz[i] = ::imag (c); + } + + status = umfpack_di_solve (UMFPACK_A, Ap, Ai, Ax, + Xx, Bx, Numeric, control, + info); + int status2 = umfpack_di_solve (UMFPACK_A, Ap, Ai, + Ax, Xz, Bz, Numeric, + control, info) ; + + if (status < 0 || status2 < 0) + { + (*current_liboctave_error_handler) + ("SparseMatrix::solve solve failed"); + + umfpack_di_report_status (control, status); + + err = -1; + + break; + } + + for (int i = 0; i < b_nr; i++) + retval (i, j) = Complex (Xx[i], Xz[i]); + } + +#ifndef HAVE_LSSOLVE + rcond = Info (UMFPACK_RCOND); + volatile double rcond_plus_one = rcond + 1.0; + + if (status == UMFPACK_WARNING_singular_matrix || + rcond_plus_one == 1.0 || xisnan (rcond)) + { + err = -2; + + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("SparseMatrix::solve matrix singular to machine precision, rcond = %g", + rcond); + + } +#endif + + umfpack_di_report_info (control, info); + + umfpack_di_free_numeric (&Numeric); + } + } + else if (typ != SparseType::Hermitian) + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +SparseComplexMatrix +SparseMatrix::fsolve (SparseType &mattype, const SparseComplexMatrix& b, + int& err, double& rcond, + solve_singularity_handler sing_handler) const +{ + SparseComplexMatrix retval; + + int nr = rows (); + int nc = cols (); + err = 0; + + if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ()) + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + else + { + // Print spparms("spumoni") info if requested + int typ = mattype.type (); + mattype.info (); + + if (typ == SparseType::Hermitian) + { + // XXX FIXME XXX Write the cholesky solver and only fall + // through if cholesky factorization fails + + (*current_liboctave_warning_handler) + ("SparseMatrix::solve XXX FIXME XXX Cholesky code not done"); + + mattype.mark_as_unsymmetric (); + typ = SparseType::Full; + } + + if (typ == SparseType::Full) + { + Matrix Control, Info; + void *Numeric = factorize (err, rcond, Control, Info, + sing_handler); + + if (err == 0) + { + int b_nr = b.rows (); + int b_nc = b.cols (); + int status = 0; + double *control = Control.fortran_vec (); + double *info = Info.fortran_vec (); + const int *Ap = cidx (); + const int *Ai = ridx (); + const double *Ax = data (); + + OCTAVE_LOCAL_BUFFER (double, Bx, b_nr); + OCTAVE_LOCAL_BUFFER (double, Bz, b_nr); + + // Take a first guess that the number of non-zero terms + // will be as many as in b + int x_nz = b.nnz (); + int ii = 0; + retval = SparseComplexMatrix (b_nr, b_nc, x_nz); + + OCTAVE_LOCAL_BUFFER (double, Xx, b_nr); + OCTAVE_LOCAL_BUFFER (double, Xz, b_nr); + + retval.xcidx(0) = 0; + for (int j = 0; j < b_nc; j++) + { + for (int i = 0; i < b_nr; i++) + { + Complex c = b (i,j); + Bx[i] = ::real (c); + Bz[i] = ::imag (c); + } + + status = umfpack_di_solve (UMFPACK_A, Ap, Ai, Ax, Xx, + Bx, Numeric, control, + info); + int status2 = umfpack_di_solve (UMFPACK_A, Ap, Ai, + Ax, Xz, Bz, Numeric, + control, info) ; + + if (status < 0 || status2 < 0) + { + (*current_liboctave_error_handler) + ("SparseMatrix::solve solve failed"); + + umfpack_di_report_status (control, status); + + err = -1; + + break; + } + + for (int i = 0; i < b_nr; i++) + { + Complex tmp = Complex (Xx[i], Xz[i]); + if (tmp != 0.0) + { + if (ii == x_nz) + { + // Resize the sparse matrix + int sz = x_nz * (b_nc - j) / b_nc; + sz = (sz > 10 ? sz : 10) + x_nz; + retval.change_capacity (sz); + x_nz = sz; + } + retval.xdata(ii) = tmp; + retval.xridx(ii++) = i; + } + } + retval.xcidx(j+1) = ii; + } + + retval.maybe_compress (); + +#ifndef HAVE_LSSOLVE + rcond = Info (UMFPACK_RCOND); + volatile double rcond_plus_one = rcond + 1.0; + + if (status == UMFPACK_WARNING_singular_matrix || + rcond_plus_one == 1.0 || xisnan (rcond)) + { + err = -2; + + if (sing_handler) + sing_handler (rcond); + else + (*current_liboctave_error_handler) + ("SparseMatrix::solve matrix singular to machine precision, rcond = %g", + rcond); + + } +#endif + + umfpack_di_report_info (control, info); + + umfpack_di_free_numeric (&Numeric); + } + } + else if (typ != SparseType::Hermitian) + (*current_liboctave_error_handler) ("incorrect matrix type"); + } + + return retval; +} + +Matrix +SparseMatrix::solve (SparseType &mattype, const Matrix& b) const +{ + int info; + double rcond; + return solve (mattype, b, info, rcond, 0); +} + +Matrix +SparseMatrix::solve (SparseType &mattype, const Matrix& b, int& info) const +{ + double rcond; + return solve (mattype, b, info, rcond, 0); +} + +Matrix +SparseMatrix::solve (SparseType &mattype, const Matrix& b, int& info, + double& rcond) const +{ + return solve (mattype, b, info, rcond, 0); +} + +Matrix +SparseMatrix::solve (SparseType &mattype, const Matrix& b, int& err, + double& rcond, + solve_singularity_handler sing_handler) const +{ + int typ = mattype.type (); + + if (typ == SparseType::Unknown) + typ = mattype.type (*this); + + if (typ == SparseType::Diagonal || typ == SparseType::Permuted_Diagonal) + return dsolve (mattype, b, err, rcond, sing_handler); + else if (typ == SparseType::Upper || typ == SparseType::Permuted_Upper) + return utsolve (mattype, b, err, rcond, sing_handler); + else if (typ == SparseType::Lower || typ == SparseType::Permuted_Lower) + return ltsolve (mattype, b, err, rcond, sing_handler); + else if (typ == SparseType::Banded || typ == SparseType::Banded_Hermitian) + return bsolve (mattype, b, err, rcond, sing_handler); + else if (typ == SparseType::Tridiagonal || + typ == SparseType::Tridiagonal_Hermitian) + return trisolve (mattype, b, err, rcond, sing_handler); + else if (typ == SparseType::Full || typ == SparseType::Hermitian) + return fsolve (mattype, b, err, rcond, sing_handler); + else + { + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + return Matrix (); + } +} + +SparseMatrix +SparseMatrix::solve (SparseType &mattype, const SparseMatrix& b) const +{ + int info; + double rcond; + return solve (mattype, b, info, rcond, 0); +} + +SparseMatrix +SparseMatrix::solve (SparseType &mattype, const SparseMatrix& b, + int& info) const +{ + double rcond; + return solve (mattype, b, info, rcond, 0); +} + +SparseMatrix +SparseMatrix::solve (SparseType &mattype, const SparseMatrix& b, + int& info, double& rcond) const +{ + return solve (mattype, b, info, rcond, 0); +} + +SparseMatrix +SparseMatrix::solve (SparseType &mattype, const SparseMatrix& b, + int& err, double& rcond, + solve_singularity_handler sing_handler) const +{ + int typ = mattype.type (); + + if (typ == SparseType::Unknown) + typ = mattype.type (*this); + + if (typ == SparseType::Diagonal || typ == SparseType::Permuted_Diagonal) + return dsolve (mattype, b, err, rcond, sing_handler); + else if (typ == SparseType::Upper || typ == SparseType::Permuted_Upper) + return utsolve (mattype, b, err, rcond, sing_handler); + else if (typ == SparseType::Lower || typ == SparseType::Permuted_Lower) + return ltsolve (mattype, b, err, rcond, sing_handler); + else if (typ == SparseType::Banded || typ == SparseType::Banded_Hermitian) + return bsolve (mattype, b, err, rcond, sing_handler); + else if (typ == SparseType::Tridiagonal || + typ == SparseType::Tridiagonal_Hermitian) + return trisolve (mattype, b, err, rcond, sing_handler); + else if (typ == SparseType::Full || typ == SparseType::Hermitian) + return fsolve (mattype, b, err, rcond, sing_handler); + else + { + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + return SparseMatrix (); + } +} + +ComplexMatrix +SparseMatrix::solve (SparseType &mattype, const ComplexMatrix& b) const +{ + int info; + double rcond; + return solve (mattype, b, info, rcond, 0); +} + +ComplexMatrix +SparseMatrix::solve (SparseType &mattype, const ComplexMatrix& b, + int& info) const +{ + double rcond; + return solve (mattype, b, info, rcond, 0); +} + +ComplexMatrix +SparseMatrix::solve (SparseType &mattype, const ComplexMatrix& b, + int& info, double& rcond) const +{ + return solve (mattype, b, info, rcond, 0); +} + +ComplexMatrix +SparseMatrix::solve (SparseType &mattype, const ComplexMatrix& b, + int& err, double& rcond, + solve_singularity_handler sing_handler) const +{ + int typ = mattype.type (); + + if (typ == SparseType::Unknown) + typ = mattype.type (*this); + + if (typ == SparseType::Diagonal || typ == SparseType::Permuted_Diagonal) + return dsolve (mattype, b, err, rcond, sing_handler); + else if (typ == SparseType::Upper || typ == SparseType::Permuted_Upper) + return utsolve (mattype, b, err, rcond, sing_handler); + else if (typ == SparseType::Lower || typ == SparseType::Permuted_Lower) + return ltsolve (mattype, b, err, rcond, sing_handler); + else if (typ == SparseType::Banded || typ == SparseType::Banded_Hermitian) + return bsolve (mattype, b, err, rcond, sing_handler); + else if (typ == SparseType::Tridiagonal || + typ == SparseType::Tridiagonal_Hermitian) + return trisolve (mattype, b, err, rcond, sing_handler); + else if (typ == SparseType::Full || typ == SparseType::Hermitian) + return fsolve (mattype, b, err, rcond, sing_handler); + else + { + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + return ComplexMatrix (); + } +} + +SparseComplexMatrix +SparseMatrix::solve (SparseType &mattype, const SparseComplexMatrix& b) const +{ + int info; + double rcond; + return solve (mattype, b, info, rcond, 0); +} + +SparseComplexMatrix +SparseMatrix::solve (SparseType &mattype, const SparseComplexMatrix& b, + int& info) const +{ + double rcond; + return solve (mattype, b, info, rcond, 0); +} + +SparseComplexMatrix +SparseMatrix::solve (SparseType &mattype, const SparseComplexMatrix& b, + int& info, double& rcond) const +{ + return solve (mattype, b, info, rcond, 0); +} + +SparseComplexMatrix +SparseMatrix::solve (SparseType &mattype, const SparseComplexMatrix& b, + int& err, double& rcond, + solve_singularity_handler sing_handler) const +{ + int typ = mattype.type (); + + if (typ == SparseType::Unknown) + typ = mattype.type (*this); + + if (typ == SparseType::Diagonal || typ == SparseType::Permuted_Diagonal) + return dsolve (mattype, b, err, rcond, sing_handler); + else if (typ == SparseType::Upper || typ == SparseType::Permuted_Upper) + return utsolve (mattype, b, err, rcond, sing_handler); + else if (typ == SparseType::Lower || typ == SparseType::Permuted_Lower) + return ltsolve (mattype, b, err, rcond, sing_handler); + else if (typ == SparseType::Banded || typ == SparseType::Banded_Hermitian) + return bsolve (mattype, b, err, rcond, sing_handler); + else if (typ == SparseType::Tridiagonal || + typ == SparseType::Tridiagonal_Hermitian) + return trisolve (mattype, b, err, rcond, sing_handler); + else if (typ == SparseType::Full || typ == SparseType::Hermitian) + return fsolve (mattype, b, err, rcond, sing_handler); + else + { + (*current_liboctave_error_handler) + ("matrix dimension mismatch solution of linear equations"); + return SparseComplexMatrix (); + } +} + +ColumnVector +SparseMatrix::solve (SparseType &mattype, const ColumnVector& b) const +{ + int info; double rcond; + return solve (mattype, b, info, rcond); +} + +ColumnVector +SparseMatrix::solve (SparseType &mattype, const ColumnVector& b, int& info) const +{ + double rcond; + return solve (mattype, b, info, rcond); +} + +ColumnVector +SparseMatrix::solve (SparseType &mattype, const ColumnVector& b, int& info, double& rcond) const +{ + return solve (mattype, b, info, rcond, 0); +} + +ColumnVector +SparseMatrix::solve (SparseType &mattype, const ColumnVector& b, int& info, double& rcond, + solve_singularity_handler sing_handler) const +{ + Matrix tmp (b); + return solve (mattype, tmp, info, rcond, sing_handler).column (0); +} + +ComplexColumnVector +SparseMatrix::solve (SparseType &mattype, const ComplexColumnVector& b) const +{ + int info; + double rcond; + return solve (mattype, b, info, rcond, 0); +} + +ComplexColumnVector +SparseMatrix::solve (SparseType &mattype, const ComplexColumnVector& b, int& info) const +{ + double rcond; + return solve (mattype, b, info, rcond, 0); +} + +ComplexColumnVector +SparseMatrix::solve (SparseType &mattype, const ComplexColumnVector& b, int& info, + double& rcond) const +{ + return solve (mattype, b, info, rcond, 0); +} + +ComplexColumnVector +SparseMatrix::solve (SparseType &mattype, const ComplexColumnVector& b, int& info, double& rcond, + solve_singularity_handler sing_handler) const +{ + ComplexMatrix tmp (b); + return solve (mattype, tmp, info, rcond, sing_handler).column (0); +} + +Matrix +SparseMatrix::solve (const Matrix& b) const +{ + int info; + double rcond; + return solve (b, info, rcond, 0); +} + +Matrix +SparseMatrix::solve (const Matrix& b, int& info) const +{ + double rcond; + return solve (b, info, rcond, 0); +} + +Matrix +SparseMatrix::solve (const Matrix& b, int& info, + double& rcond) const +{ + return solve (b, info, rcond, 0); +} + +Matrix +SparseMatrix::solve (const Matrix& b, int& err, + double& rcond, + solve_singularity_handler sing_handler) const +{ + SparseType mattype (*this); + return solve (mattype, b, err, rcond, sing_handler); +} + +SparseMatrix +SparseMatrix::solve (const SparseMatrix& b) const +{ + int info; + double rcond; + return solve (b, info, rcond, 0); +} + +SparseMatrix +SparseMatrix::solve (const SparseMatrix& b, + int& info) const +{ + double rcond; + return solve (b, info, rcond, 0); +} + +SparseMatrix +SparseMatrix::solve (const SparseMatrix& b, + int& info, double& rcond) const +{ + return solve (b, info, rcond, 0); +} + +SparseMatrix +SparseMatrix::solve (const SparseMatrix& b, + int& err, double& rcond, + solve_singularity_handler sing_handler) const +{ + SparseType mattype (*this); + return solve (mattype, b, err, rcond, sing_handler); +} + +ComplexMatrix +SparseMatrix::solve (const ComplexMatrix& b, + int& info) const +{ + double rcond; + return solve (b, info, rcond, 0); +} + +ComplexMatrix +SparseMatrix::solve (const ComplexMatrix& b, + int& info, double& rcond) const +{ + return solve (b, info, rcond, 0); +} + +ComplexMatrix +SparseMatrix::solve (const ComplexMatrix& b, + int& err, double& rcond, + solve_singularity_handler sing_handler) const +{ + SparseType mattype (*this); + return solve (mattype, b, err, rcond, sing_handler); +} + +SparseComplexMatrix +SparseMatrix::solve (const SparseComplexMatrix& b) const +{ + int info; + double rcond; + return solve (b, info, rcond, 0); +} + +SparseComplexMatrix +SparseMatrix::solve (const SparseComplexMatrix& b, + int& info) const +{ + double rcond; + return solve (b, info, rcond, 0); +} + +SparseComplexMatrix +SparseMatrix::solve (const SparseComplexMatrix& b, + int& info, double& rcond) const +{ + return solve (b, info, rcond, 0); +} + +SparseComplexMatrix +SparseMatrix::solve (const SparseComplexMatrix& b, + int& err, double& rcond, + solve_singularity_handler sing_handler) const +{ + SparseType mattype (*this); + return solve (mattype, b, err, rcond, sing_handler); +} + +ColumnVector +SparseMatrix::solve (const ColumnVector& b) const +{ + int info; double rcond; + return solve (b, info, rcond); +} + +ColumnVector +SparseMatrix::solve (const ColumnVector& b, int& info) const +{ + double rcond; + return solve (b, info, rcond); +} + +ColumnVector +SparseMatrix::solve (const ColumnVector& b, int& info, double& rcond) const +{ + return solve (b, info, rcond, 0); +} + +ColumnVector +SparseMatrix::solve (const ColumnVector& b, int& info, double& rcond, + solve_singularity_handler sing_handler) const +{ + Matrix tmp (b); + return solve (tmp, info, rcond, sing_handler).column (0); +} + +ComplexColumnVector +SparseMatrix::solve (const ComplexColumnVector& b) const +{ + int info; + double rcond; + return solve (b, info, rcond, 0); +} + +ComplexColumnVector +SparseMatrix::solve (const ComplexColumnVector& b, int& info) const +{ + double rcond; + return solve (b, info, rcond, 0); +} + +ComplexColumnVector +SparseMatrix::solve (const ComplexColumnVector& b, int& info, + double& rcond) const +{ + return solve (b, info, rcond, 0); +} + +ComplexColumnVector +SparseMatrix::solve (const ComplexColumnVector& b, int& info, double& rcond, + solve_singularity_handler sing_handler) const +{ + ComplexMatrix tmp (b); + return solve (tmp, info, rcond, sing_handler).column (0); +} + +Matrix +SparseMatrix::lssolve (const Matrix& b) const +{ + int info; + int rank; + return lssolve (b, info, rank); +} + +Matrix +SparseMatrix::lssolve (const Matrix& b, int& info) const +{ + int rank; + return lssolve (b, info, rank); +} + +Matrix +SparseMatrix::lssolve (const Matrix& b, int& info, int& rank) const +{ + info = -1; + (*current_liboctave_error_handler) + ("SparseMatrix::lssolve not implemented yet"); + return Matrix (); +} + +SparseMatrix +SparseMatrix::lssolve (const SparseMatrix& b) const +{ + int info; + int rank; + return lssolve (b, info, rank); +} + +SparseMatrix +SparseMatrix::lssolve (const SparseMatrix& b, int& info) const +{ + int rank; + return lssolve (b, info, rank); +} + +SparseMatrix +SparseMatrix::lssolve (const SparseMatrix& b, int& info, int& rank) const +{ + info = -1; + (*current_liboctave_error_handler) + ("SparseMatrix::lssolve not implemented yet"); + return SparseMatrix (); +} + +ComplexMatrix +SparseMatrix::lssolve (const ComplexMatrix& b) const +{ + int info; + int rank; + return lssolve (b, info, rank); +} + +ComplexMatrix +SparseMatrix::lssolve (const ComplexMatrix& b, int& info) const +{ + int rank; + return lssolve (b, info, rank); +} + +ComplexMatrix +SparseMatrix::lssolve (const ComplexMatrix& b, int& info, int& rank) const +{ + info = -1; + (*current_liboctave_error_handler) + ("SparseMatrix::lssolve not implemented yet"); + return ComplexMatrix (); +} + +SparseComplexMatrix +SparseMatrix::lssolve (const SparseComplexMatrix& b) const +{ + int info; + int rank; + return lssolve (b, info, rank); +} + +SparseComplexMatrix +SparseMatrix::lssolve (const SparseComplexMatrix& b, int& info) const +{ + int rank; + return lssolve (b, info, rank); +} + +SparseComplexMatrix +SparseMatrix::lssolve (const SparseComplexMatrix& b, int& info, + int& rank) const +{ + info = -1; + (*current_liboctave_error_handler) + ("SparseMatrix::lssolve not implemented yet"); + return SparseComplexMatrix (); +} + +ColumnVector +SparseMatrix::lssolve (const ColumnVector& b) const +{ + int info; + int rank; + return lssolve (b, info, rank); +} + +ColumnVector +SparseMatrix::lssolve (const ColumnVector& b, int& info) const +{ + int rank; + return lssolve (b, info, rank); +} + +ColumnVector +SparseMatrix::lssolve (const ColumnVector& b, int& info, int& rank) const +{ + Matrix tmp (b); + return lssolve (tmp, info, rank).column (0); +} + +ComplexColumnVector +SparseMatrix::lssolve (const ComplexColumnVector& b) const +{ + int info; + int rank; + return lssolve (b, info, rank); +} + +ComplexColumnVector +SparseMatrix::lssolve (const ComplexColumnVector& b, int& info) const +{ + int rank; + return lssolve (b, info, rank); +} + +ComplexColumnVector +SparseMatrix::lssolve (const ComplexColumnVector& b, int& info, + int& rank) const +{ + ComplexMatrix tmp (b); + return lssolve (tmp, info, rank).column (0); +} + +// other operations. + +SparseMatrix +SparseMatrix::map (d_d_Mapper f) const +{ + int nr = rows (); + int nc = cols (); + int nz = nnz (); + bool f_zero = (f(0.0) == 0.0); + + // Count number of non-zero elements + int nel = (f_zero ? 0 : nr*nc - nz); + for (int i = 0; i < nz; i++) + if (f (data(i)) != 0.0) + nel++; + + SparseMatrix retval (nr, nc, nel); + + if (f_zero) + { + int ii = 0; + for (int j = 0; j < nc; j++) + { + for (int i = 0; i < nr; i++) + { + double tmp = f (elem (i, j)); + if (tmp != 0.0) + { + retval.data(ii) = tmp; + retval.ridx(ii++) = i; + } + } + retval.cidx(j+1) = ii; + } + } + else + { + int ii = 0; + for (int j = 0; j < nc; j++) + { + for (int i = cidx(j); i < cidx(j+1); i++) + { + retval.data(ii) = f (elem(i)); + retval.ridx(ii++) = ridx(i); + } + retval.cidx(j+1) = ii; + } + } + + return retval; +} + +SparseBoolMatrix +SparseMatrix::map (b_d_Mapper f) const +{ + int nr = rows (); + int nc = cols (); + int nz = nnz (); + bool f_zero = f(0.0); + + // Count number of non-zero elements + int nel = (f_zero ? 0 : nr*nc - nz); + for (int i = 0; i < nz; i++) + if (f (data(i)) != 0.0) + nel++; + + SparseBoolMatrix retval (nr, nc, nel); + + if (f_zero) + { + int ii = 0; + for (int j = 0; j < nc; j++) + { + for (int i = 0; i < nr; i++) + { + bool tmp = f (elem (i, j)); + if (tmp) + { + retval.data(ii) = tmp; + retval.ridx(ii++) = i; + } + } + retval.cidx(j+1) = ii; + } + } + else + { + int ii = 0; + for (int j = 0; j < nc; j++) + { + for (int i = cidx(j); i < cidx(j+1); i++) + { + retval.data(ii) = f (elem(i)); + retval.ridx(ii++) = ridx(i); + } + retval.cidx(j+1) = ii; + } + } + + return retval; +} + +SparseMatrix& +SparseMatrix::apply (d_d_Mapper f) +{ + *this = map (f); + return *this; +} + +bool +SparseMatrix::any_element_is_negative (bool neg_zero) const +{ + int nel = nnz (); + + if (neg_zero) + { + for (int i = 0; i < nel; i++) + if (lo_ieee_signbit (data (i))) + return true; + } + else + { + for (int i = 0; i < nel; i++) + if (data (i) < 0) + return true; + } + + return false; +} + +bool +SparseMatrix::any_element_is_inf_or_nan (void) const +{ + int nel = nnz (); + + for (int i = 0; i < nel; i++) + { + double val = data (i); + if (xisinf (val) || xisnan (val)) + return true; + } + + return false; +} + +bool +SparseMatrix::all_elements_are_int_or_inf_or_nan (void) const +{ + int nel = nnz (); + + for (int i = 0; i < nel; i++) + { + double val = data (i); + if (xisnan (val) || D_NINT (val) == val) + continue; + else + return false; + } + + return true; +} + +// Return nonzero if any element of M is not an integer. Also extract +// the largest and smallest values and return them in MAX_VAL and MIN_VAL. + +bool +SparseMatrix::all_integers (double& max_val, double& min_val) const +{ + int nel = nnz (); + + if (nel == 0) + return false; + + max_val = data (0); + min_val = data (0); + + for (int i = 0; i < nel; i++) + { + double val = data (i); + + if (val > max_val) + max_val = val; + + if (val < min_val) + min_val = val; + + if (D_NINT (val) != val) + return false; + } + + return true; +} + +bool +SparseMatrix::too_large_for_float (void) const +{ + int nel = nnz (); + + for (int i = 0; i < nel; i++) + { + double val = data (i); + + if (val > FLT_MAX || val < FLT_MIN) + return true; + } + + return false; +} + +SparseBoolMatrix +SparseMatrix::operator ! (void) const +{ + int nr = rows (); + int nc = cols (); + int nz1 = nnz (); + int nz2 = nr*nc - nz1; + + SparseBoolMatrix r (nr, nc, nz2); + + int ii = 0; + int jj = 0; + r.cidx (0) = 0; + for (int i = 0; i < nc; i++) + { + for (int j = 0; j < nr; j++) + { + if (jj < cidx(i+1) && ridx(jj) == j) + jj++; + else + { + r.data(ii) = true; + r.ridx(ii++) = j; + } + } + r.cidx (i+1) = ii; + } + + return r; +} + +// XXX FIXME XXX Do these really belong here? Maybe they should be +// in a base class? + +SparseBoolMatrix +SparseMatrix::all (int dim) const +{ + SPARSE_ALL_OP (dim); +} + +SparseBoolMatrix +SparseMatrix::any (int dim) const +{ + SPARSE_ANY_OP (dim); +} + +SparseMatrix +SparseMatrix::cumprod (int dim) const +{ + SPARSE_CUMPROD (SparseMatrix, double, cumprod); +} + +SparseMatrix +SparseMatrix::cumsum (int dim) const +{ + SPARSE_CUMSUM (SparseMatrix, double, cumsum); +} + +SparseMatrix +SparseMatrix::prod (int dim) const +{ + SPARSE_REDUCTION_OP (SparseMatrix, double, *=, 1.0, 1.0); +} + +SparseMatrix +SparseMatrix::sum (int dim) const +{ + SPARSE_REDUCTION_OP (SparseMatrix, double, +=, 0.0, 0.0); +} + +SparseMatrix +SparseMatrix::sumsq (int dim) const +{ +#define ROW_EXPR \ + double d = elem (i, j); \ + tmp[i] += d * d + +#define COL_EXPR \ + double d = elem (i, j); \ + tmp[j] += d * d + + SPARSE_BASE_REDUCTION_OP (SparseMatrix, double, ROW_EXPR, COL_EXPR, + 0.0, 0.0); + +#undef ROW_EXPR +#undef COL_EXPR +} + +SparseMatrix +SparseMatrix::abs (void) const +{ + int nz = nnz (); + + SparseMatrix retval (*this); + + for (int i = 0; i < nz; i++) + retval.data(i) = fabs(retval.data(i)); + + return retval; +} + +SparseMatrix +SparseMatrix::diag (int k) const +{ + int nnr = rows (); + int nnc = cols (); + + if (k > 0) + nnc -= k; + else if (k < 0) + nnr += k; + + SparseMatrix d; + + if (nnr > 0 && nnc > 0) + { + int ndiag = (nnr < nnc) ? nnr : nnc; + + // Count the number of non-zero elements + int nel = 0; + if (k > 0) + { + for (int i = 0; i < ndiag; i++) + if (elem (i, i+k) != 0.) + nel++; + } + else if ( k < 0) + { + for (int i = 0; i < ndiag; i++) + if (elem (i-k, i) != 0.) + nel++; + } + else + { + for (int i = 0; i < ndiag; i++) + if (elem (i, i) != 0.) + nel++; + } + + d = SparseMatrix (ndiag, 1, nel); + d.xcidx (0) = 0; + d.xcidx (1) = nel; + + int ii = 0; + if (k > 0) + { + for (int i = 0; i < ndiag; i++) + { + double tmp = elem (i, i+k); + if (tmp != 0.) + { + d.xdata (ii) = tmp; + d.xridx (ii++) = i; + } + } + } + else if ( k < 0) + { + for (int i = 0; i < ndiag; i++) + { + double tmp = elem (i-k, i); + if (tmp != 0.) + { + d.xdata (ii) = tmp; + d.xridx (ii++) = i; + } + } + } + else + { + for (int i = 0; i < ndiag; i++) + { + double tmp = elem (i, i); + if (tmp != 0.) + { + d.xdata (ii) = tmp; + d.xridx (ii++) = i; + } + } + } + } + else + (*current_liboctave_error_handler) + ("diag: requested diagonal out of range"); + + return d; +} + +Matrix +SparseMatrix::matrix_value (void) const +{ + int nr = rows (); + int nc = cols (); + + Matrix retval (nr, nc, 0.0); + for (int j = 0; j < nc; j++) + for (int i = cidx(j); i < cidx(j+1); i++) + retval.elem (ridx(i), j) = data (i); + + return retval; +} + +std::ostream& +operator << (std::ostream& os, const SparseMatrix& a) +{ + int nc = a.cols (); + + // add one to the printed indices to go from + // zero-based to one-based arrays + for (int j = 0; j < nc; j++) { + OCTAVE_QUIT; + for (int i = a.cidx(j); i < a.cidx(j+1); i++) { + os << a.ridx(i) + 1 << " " << j + 1 << " "; + octave_write_double (os, a.data(i)); + os << "\n"; + } + } + + return os; +} + +std::istream& +operator >> (std::istream& is, SparseMatrix& a) +{ + int nr = a.rows (); + int nc = a.cols (); + int nz = a.nnz (); + + if (nr < 1 || nc < 1) + is.clear (std::ios::badbit); + else + { + int itmp, jtmp, jold = 0; + double tmp; + int ii = 0; + + a.cidx (0) = 0; + for (int i = 0; i < nz; i++) + { + is >> itmp; + itmp--; + is >> jtmp; + jtmp--; + tmp = octave_read_double (is); + + if (is) + { + if (jold != jtmp) + { + for (int j = jold; j < jtmp; j++) + a.cidx(j+1) = ii; + + jold = jtmp; + } + a.data (ii) = tmp; + a.ridx (ii++) = itmp; + } + else + goto done; + } + + for (int j = jold; j < nc; j++) + a.cidx(j+1) = ii; + } + + done: + + return is; +} + +SparseMatrix +SparseMatrix::squeeze (void) const +{ + return MSparse::squeeze (); +} + +SparseMatrix +SparseMatrix::index (idx_vector& i, int resize_ok) const +{ + return MSparse::index (i, resize_ok); +} + +SparseMatrix +SparseMatrix::index (idx_vector& i, idx_vector& j, int resize_ok) const +{ + return MSparse::index (i, j, resize_ok); +} + +SparseMatrix +SparseMatrix::index (Array& ra_idx, int resize_ok) const +{ + return MSparse::index (ra_idx, resize_ok); +} + +SparseMatrix +SparseMatrix::reshape (const dim_vector& new_dims) const +{ + return MSparse::reshape (new_dims); +} + +SparseMatrix +SparseMatrix::permute (const Array& vec, bool inv) const +{ + return MSparse::permute (vec, inv); +} + +SparseMatrix +SparseMatrix::ipermute (const Array& vec) const +{ + return MSparse::ipermute (vec); +} + +// matrix by matrix -> matrix operations + +SparseMatrix +operator * (const SparseMatrix& m, const SparseMatrix& a) +{ +#ifdef HAVE_SPARSE_BLAS + // XXX FIXME XXX Isn't there a sparse BLAS ?? +#else + // Use Andy's sparse matrix multiply function + SPARSE_SPARSE_MUL (SparseMatrix, double); +#endif +} + +// XXX FIXME XXX -- it would be nice to share code among the min/max +// functions below. + +#define EMPTY_RETURN_CHECK(T) \ + if (nr == 0 || nc == 0) \ + return T (nr, nc); + +SparseMatrix +min (double d, const SparseMatrix& m) +{ + SparseMatrix result; + + int nr = m.rows (); + int nc = m.columns (); + + EMPTY_RETURN_CHECK (SparseMatrix); + + // Count the number of non-zero elements + if (d < 0.) + { + result = SparseMatrix (nr, nc, d); + for (int j = 0; j < nc; j++) + for (int i = m.cidx(j); i < m.cidx(j+1); i++) + { + double tmp = xmin (d, m.data (i)); + if (tmp != 0.) + { + int idx = m.ridx(i) + j * nr; + result.xdata(idx) = tmp; + result.xridx(idx) = m.ridx(i); + } + } + } + else + { + int nel = 0; + for (int j = 0; j < nc; j++) + for (int i = m.cidx(j); i < m.cidx(j+1); i++) + if (xmin (d, m.data (i)) != 0.) + nel++; + + result = SparseMatrix (nr, nc, nel); + + int ii = 0; + result.xcidx(0) = 0; + for (int j = 0; j < nc; j++) + { + for (int i = m.cidx(j); i < m.cidx(j+1); i++) + { + double tmp = xmin (d, m.data (i)); + + if (tmp != 0.) + { + result.xdata(ii) = tmp; + result.xridx(ii++) = m.ridx(i); + } + } + result.xcidx(j+1) = ii; + } + } + + return result; +} + +SparseMatrix +min (const SparseMatrix& m, double d) +{ + return min (d, m); +} + +SparseMatrix +min (const SparseMatrix& a, const SparseMatrix& b) +{ + SparseMatrix r; + + if ((a.rows() == b.rows()) && (a.cols() == b.cols())) + { + int a_nr = a.rows (); + int a_nc = a.cols (); + + int b_nr = b.rows (); + int b_nc = b.cols (); + + if (a_nr != b_nr || a_nc != b_nc) + gripe_nonconformant ("min", a_nr, a_nc, b_nr, b_nc); + else + { + r = SparseMatrix (a_nr, a_nc, (a.nnz () + b.nnz ())); + + int jx = 0; + r.cidx (0) = 0; + for (int i = 0 ; i < a_nc ; i++) + { + int ja = a.cidx(i); + int ja_max = a.cidx(i+1); + bool ja_lt_max= ja < ja_max; + + int jb = b.cidx(i); + int jb_max = b.cidx(i+1); + bool jb_lt_max = jb < jb_max; + + while (ja_lt_max || jb_lt_max ) + { + OCTAVE_QUIT; + if ((! jb_lt_max) || + (ja_lt_max && (a.ridx(ja) < b.ridx(jb)))) + { + double tmp = xmin (a.data(ja), 0.); + if (tmp != 0.) + { + r.ridx(jx) = a.ridx(ja); + r.data(jx) = tmp; + jx++; + } + ja++; + ja_lt_max= ja < ja_max; + } + else if (( !ja_lt_max ) || + (jb_lt_max && (b.ridx(jb) < a.ridx(ja)) ) ) + { + double tmp = xmin (0., b.data(jb)); + if (tmp != 0.) + { + r.ridx(jx) = b.ridx(jb); + r.data(jx) = tmp; + jx++; + } + jb++; + jb_lt_max= jb < jb_max; + } + else + { + double tmp = xmin (a.data(ja), b.data(jb)); + if (tmp != 0.) + { + r.data(jx) = tmp; + r.ridx(jx) = a.ridx(ja); + jx++; + } + ja++; + ja_lt_max= ja < ja_max; + jb++; + jb_lt_max= jb < jb_max; + } + } + r.cidx(i+1) = jx; + } + + r.maybe_compress (); + } + } + else + (*current_liboctave_error_handler) ("matrix size mismatch"); + + return r; +} + +SparseMatrix +max (double d, const SparseMatrix& m) +{ + SparseMatrix result; + + int nr = m.rows (); + int nc = m.columns (); + + EMPTY_RETURN_CHECK (SparseMatrix); + + // Count the number of non-zero elements + if (d > 0.) + { + result = SparseMatrix (nr, nc, d); + for (int j = 0; j < nc; j++) + for (int i = m.cidx(j); i < m.cidx(j+1); i++) + { + double tmp = xmax (d, m.data (i)); + + if (tmp != 0.) + { + int idx = m.ridx(i) + j * nr; + result.xdata(idx) = tmp; + result.xridx(idx) = m.ridx(i); + } + } + } + else + { + int nel = 0; + for (int j = 0; j < nc; j++) + for (int i = m.cidx(j); i < m.cidx(j+1); i++) + if (xmax (d, m.data (i)) != 0.) + nel++; + + result = SparseMatrix (nr, nc, nel); + + int ii = 0; + result.xcidx(0) = 0; + for (int j = 0; j < nc; j++) + { + for (int i = m.cidx(j); i < m.cidx(j+1); i++) + { + double tmp = xmax (d, m.data (i)); + if (tmp != 0.) + { + result.xdata(ii) = tmp; + result.xridx(ii++) = m.ridx(i); + } + } + result.xcidx(j+1) = ii; + } + } + + return result; +} + +SparseMatrix +max (const SparseMatrix& m, double d) +{ + return max (d, m); +} + +SparseMatrix +max (const SparseMatrix& a, const SparseMatrix& b) +{ + SparseMatrix r; + + if ((a.rows() == b.rows()) && (a.cols() == b.cols())) + { + int a_nr = a.rows (); + int a_nc = a.cols (); + + int b_nr = b.rows (); + int b_nc = b.cols (); + + if (a_nr != b_nr || a_nc != b_nc) + gripe_nonconformant ("min", a_nr, a_nc, b_nr, b_nc); + else + { + r = SparseMatrix (a_nr, a_nc, (a.nnz () + b.nnz ())); + + int jx = 0; + r.cidx (0) = 0; + for (int i = 0 ; i < a_nc ; i++) + { + int ja = a.cidx(i); + int ja_max = a.cidx(i+1); + bool ja_lt_max= ja < ja_max; + + int jb = b.cidx(i); + int jb_max = b.cidx(i+1); + bool jb_lt_max = jb < jb_max; + + while (ja_lt_max || jb_lt_max ) + { + OCTAVE_QUIT; + if ((! jb_lt_max) || + (ja_lt_max && (a.ridx(ja) < b.ridx(jb)))) + { + double tmp = xmax (a.data(ja), 0.); + if (tmp != 0.) + { + r.ridx(jx) = a.ridx(ja); + r.data(jx) = tmp; + jx++; + } + ja++; + ja_lt_max= ja < ja_max; + } + else if (( !ja_lt_max ) || + (jb_lt_max && (b.ridx(jb) < a.ridx(ja)) ) ) + { + double tmp = xmax (0., b.data(jb)); + if (tmp != 0.) + { + r.ridx(jx) = b.ridx(jb); + r.data(jx) = tmp; + jx++; + } + jb++; + jb_lt_max= jb < jb_max; + } + else + { + double tmp = xmax (a.data(ja), b.data(jb)); + if (tmp != 0.) + { + r.data(jx) = tmp; + r.ridx(jx) = a.ridx(ja); + jx++; + } + ja++; + ja_lt_max= ja < ja_max; + jb++; + jb_lt_max= jb < jb_max; + } + } + r.cidx(i+1) = jx; + } + + r.maybe_compress (); + } + } + else + (*current_liboctave_error_handler) ("matrix size mismatch"); + + return r; +} + +SPARSE_SMS_CMP_OPS (SparseMatrix, 0.0, , double, 0.0, ) +SPARSE_SMS_BOOL_OPS (SparseMatrix, double, 0.0) + +SPARSE_SSM_CMP_OPS (double, 0.0, , SparseMatrix, 0.0, ) +SPARSE_SSM_BOOL_OPS (double, SparseMatrix, 0.0) + +SPARSE_SMSM_CMP_OPS (SparseMatrix, 0.0, , SparseMatrix, 0.0, ) +SPARSE_SMSM_BOOL_OPS (SparseMatrix, SparseMatrix, 0.0) + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/dSparse.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/dSparse.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,412 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#if !defined (octave_dSparse_h) +#define octave_dSparse_h 1 + +#include "dMatrix.h" +#include "dNDArray.h" +#include "CMatrix.h" +#include "dColVector.h" +#include "CColVector.h" + +#include "dbleDET.h" +#include "MSparse.h" +#include "MSparse-defs.h" +#include "Sparse-op-defs.h" +#include "SparseType.h" + +class SparseComplexMatrix; +class SparseBoolMatrix; + +class +SparseMatrix : public MSparse +{ + public: + + typedef void (*solve_singularity_handler) (double rcond); + + SparseMatrix (void) : MSparse () { } + + SparseMatrix (int r, int c) : MSparse (r, c) { } + + explicit SparseMatrix (int r, int c, double val) + : MSparse (r, c, val) { } + + SparseMatrix (const SparseMatrix& a) : MSparse (a) { } + + SparseMatrix (const SparseMatrix& a, const dim_vector& dv) + : MSparse (a, dv) { } + + SparseMatrix (const MSparse& a) : MSparse (a) { } + + explicit SparseMatrix (const SparseBoolMatrix& a); + + explicit SparseMatrix (const Matrix& a) : MSparse (a) { } + + explicit SparseMatrix (const NDArray& a) : MSparse (a) { } + + explicit SparseMatrix (const Array a, const Array& r, + const Array& c, int nr = -1, + int nc = -1, bool sum_terms = true) + : MSparse (a, r, c, nr, nc, sum_terms) { } + + explicit SparseMatrix (const Array a, const Array& r, + const Array& c, int nr = -1, + int nc = -1, bool sum_terms = true) + : MSparse (a, r, c, nr, nc, sum_terms) { } + + SparseMatrix (int r, int c, int num_nz) : MSparse (r, c, num_nz) { } + + SparseMatrix& operator = (const SparseMatrix& a) + { + MSparse::operator = (a); + return *this; + } + + bool operator == (const SparseMatrix& a) const; + bool operator != (const SparseMatrix& a) const; + + bool is_symmetric (void) const; + + SparseMatrix max (int dim = 0) const; + SparseMatrix max (Array2& index, int dim = 0) const; + SparseMatrix min (int dim = 0) const; + SparseMatrix min (Array2& index, int dim = 0) const; + + // destructive insert/delete/reorder operations + + SparseMatrix& insert (const SparseMatrix& a, int r, int c); + + SparseMatrix concat (const SparseMatrix& rb, const Array& ra_idx); + SparseComplexMatrix concat (const SparseComplexMatrix& rb, + const Array& ra_idx); + + friend SparseMatrix real (const SparseComplexMatrix& a); + friend SparseMatrix imag (const SparseComplexMatrix& a); + + friend SparseMatrix atan2 (const double& x, const SparseMatrix& y); + friend SparseMatrix atan2 (const SparseMatrix& x, const double& y); + friend SparseMatrix atan2 (const SparseMatrix& x, const SparseMatrix& y); + + SparseMatrix transpose (void) const + { + return MSparse::transpose (); + } + + SparseMatrix inverse (void) const; + SparseMatrix inverse (int& info) const; + SparseMatrix inverse (int& info, double& rcond, int force = 0, + int calc_cond = 1) const; + + DET determinant (void) const; + DET determinant (int& info) const; + DET determinant (int& info, double& rcond, int calc_cond = 1) const; + +private: + // Diagonal matrix solvers + Matrix dsolve (SparseType &typ, const Matrix& b, int& info, double& rcond, + solve_singularity_handler sing_handler) const; + + ComplexMatrix dsolve (SparseType &typ, const ComplexMatrix& b, int& info, + double& rcond, solve_singularity_handler sing_handler) const; + + SparseMatrix dsolve (SparseType &typ, const SparseMatrix& b, int& info, + double& rcond, solve_singularity_handler sing_handler) const; + + SparseComplexMatrix dsolve (SparseType &typ, const SparseComplexMatrix& b, + int& info, double& rcond, + solve_singularity_handler sing_handler) const; + + // Upper triangular matrix solvers + Matrix utsolve (SparseType &typ, const Matrix& b, int& info, double& rcond, + solve_singularity_handler sing_handler) const; + + ComplexMatrix utsolve (SparseType &typ, const ComplexMatrix& b, int& info, + double& rcond, solve_singularity_handler sing_handler) const; + + SparseMatrix utsolve (SparseType &typ, const SparseMatrix& b, int& info, + double& rcond, solve_singularity_handler sing_handler) const; + + SparseComplexMatrix utsolve (SparseType &typ, const SparseComplexMatrix& b, + int& info, double& rcond, + solve_singularity_handler sing_handler) const; + + // Lower triangular matrix solvers + Matrix ltsolve (SparseType &typ, const Matrix& b, int& info, double& rcond, + solve_singularity_handler sing_handler) const; + + ComplexMatrix ltsolve (SparseType &typ, const ComplexMatrix& b, int& info, + double& rcond, solve_singularity_handler sing_handler) const; + + SparseMatrix ltsolve (SparseType &typ, const SparseMatrix& b, int& info, + double& rcond, solve_singularity_handler sing_handler) const; + + SparseComplexMatrix ltsolve (SparseType &typ, const SparseComplexMatrix& b, + int& info, double& rcond, + solve_singularity_handler sing_handler) const; + + // Tridiagonal matrix solvers + Matrix trisolve (SparseType &typ, const Matrix& b, int& info, double& rcond, + solve_singularity_handler sing_handler) const; + + ComplexMatrix trisolve (SparseType &typ, const ComplexMatrix& b, int& info, + double& rcond, solve_singularity_handler sing_handler) const; + + SparseMatrix trisolve (SparseType &typ, const SparseMatrix& b, int& info, + double& rcond, solve_singularity_handler sing_handler) const; + + SparseComplexMatrix trisolve (SparseType &typ, const SparseComplexMatrix& b, + int& info, double& rcond, + solve_singularity_handler sing_handler) const; + + // Banded matrix solvers (umfpack/cholesky) + Matrix bsolve (SparseType &typ, const Matrix& b, int& info, double& rcond, + solve_singularity_handler sing_handler) const; + + ComplexMatrix bsolve (SparseType &typ, const ComplexMatrix& b, int& info, + double& rcond, solve_singularity_handler sing_handler) const; + + SparseMatrix bsolve (SparseType &typ, const SparseMatrix& b, int& info, + double& rcond, solve_singularity_handler sing_handler) const; + + SparseComplexMatrix bsolve (SparseType &typ, const SparseComplexMatrix& b, + int& info, double& rcond, + solve_singularity_handler sing_handler) const; + + // Full matrix solvers (umfpack/cholesky) + void * factorize (int& err, double &rcond, Matrix &Control, Matrix &Info, + solve_singularity_handler sing_handler) const; + + Matrix fsolve (SparseType &typ, const Matrix& b, int& info, double& rcond, + solve_singularity_handler sing_handler) const; + + ComplexMatrix fsolve (SparseType &typ, const ComplexMatrix& b, int& info, + double& rcond, solve_singularity_handler sing_handler) const; + + SparseMatrix fsolve (SparseType &typ, const SparseMatrix& b, int& info, + double& rcond, solve_singularity_handler sing_handler) const; + + SparseComplexMatrix fsolve (SparseType &typ, const SparseComplexMatrix& b, + int& info, double& rcond, + solve_singularity_handler sing_handler) const; + +public: + // Generic interface to solver with no probing of type + Matrix solve (SparseType &typ, const Matrix& b) const; + Matrix solve (SparseType &typ, const Matrix& b, int& info) const; + Matrix solve (SparseType &typ, const Matrix& b, int& info, + double& rcond) const; + Matrix solve (SparseType &typ, const Matrix& b, int& info, double& rcond, + solve_singularity_handler sing_handler) const; + + ComplexMatrix solve (SparseType &typ, const ComplexMatrix& b) const; + ComplexMatrix solve (SparseType &typ, const ComplexMatrix& b, + int& info) const; + ComplexMatrix solve (SparseType &typ, const ComplexMatrix& b, int& info, + double& rcond) const; + ComplexMatrix solve (SparseType &typ, const ComplexMatrix& b, int& info, + double& rcond, solve_singularity_handler sing_handler) const; + + SparseMatrix solve (SparseType &typ, const SparseMatrix& b) const; + SparseMatrix solve (SparseType &typ, const SparseMatrix& b, + int& info) const; + SparseMatrix solve (SparseType &typ, const SparseMatrix& b, int& info, + double& rcond) const; + SparseMatrix solve (SparseType &typ, const SparseMatrix& b, int& info, + double& rcond, solve_singularity_handler sing_handler) const; + + SparseComplexMatrix solve (SparseType &typ, + const SparseComplexMatrix& b) const; + SparseComplexMatrix solve (SparseType &typ, const SparseComplexMatrix& b, + int& info) const; + SparseComplexMatrix solve (SparseType &typ, const SparseComplexMatrix& b, + int& info, double& rcond) const; + SparseComplexMatrix solve (SparseType &typ, const SparseComplexMatrix& b, int& info, + double& rcond, solve_singularity_handler sing_handler) const; + + ColumnVector solve (SparseType &typ, const ColumnVector& b) const; + ColumnVector solve (SparseType &typ, const ColumnVector& b, + int& info) const; + ColumnVector solve (SparseType &typ, const ColumnVector& b, + int& info, double& rcond) const; + ColumnVector solve (SparseType &typ, const ColumnVector& b, int& info, + double& rcond, solve_singularity_handler sing_handler) const; + + ComplexColumnVector solve (SparseType &typ, + const ComplexColumnVector& b) const; + ComplexColumnVector solve (SparseType &typ, + const ComplexColumnVector& b, int& info) const; + ComplexColumnVector solve (SparseType &typ, const ComplexColumnVector& b, + int& info, double& rcond) const; + ComplexColumnVector solve (SparseType &typ, const ComplexColumnVector& b, + int& info, double& rcond, + solve_singularity_handler sing_handler) const; + + // Generic interface to solver with probing of type + Matrix solve (const Matrix& b) const; + Matrix solve (const Matrix& b, int& info) const; + Matrix solve (const Matrix& b, int& info, double& rcond) const; + Matrix solve (const Matrix& b, int& info, double& rcond, + solve_singularity_handler sing_handler) const; + + ComplexMatrix solve (const ComplexMatrix& b) const; + ComplexMatrix solve (const ComplexMatrix& b, int& info) const; + ComplexMatrix solve (const ComplexMatrix& b, int& info, + double& rcond) const; + ComplexMatrix solve (const ComplexMatrix& b, int& info, double& rcond, + solve_singularity_handler sing_handler) const; + + SparseMatrix solve (const SparseMatrix& b) const; + SparseMatrix solve (const SparseMatrix& b, int& info) const; + SparseMatrix solve (const SparseMatrix& b, int& info, + double& rcond) const; + SparseMatrix solve (const SparseMatrix& b, int& info, double& rcond, + solve_singularity_handler sing_handler) const; + + SparseComplexMatrix solve (const SparseComplexMatrix& b) const; + SparseComplexMatrix solve (const SparseComplexMatrix& b, int& info) const; + SparseComplexMatrix solve (const SparseComplexMatrix& b, int& info, + double& rcond) const; + SparseComplexMatrix solve (const SparseComplexMatrix& b, int& info, + double& rcond, + solve_singularity_handler sing_handler) const; + + ColumnVector solve (const ColumnVector& b) const; + ColumnVector solve (const ColumnVector& b, int& info) const; + ColumnVector solve (const ColumnVector& b, int& info, double& rcond) const; + ColumnVector solve (const ColumnVector& b, int& info, double& rcond, + solve_singularity_handler sing_handler) const; + + ComplexColumnVector solve (const ComplexColumnVector& b) const; + ComplexColumnVector solve (const ComplexColumnVector& b, int& info) const; + ComplexColumnVector solve (const ComplexColumnVector& b, int& info, + double& rcond) const; + ComplexColumnVector solve (const ComplexColumnVector& b, int& info, + double& rcond, + solve_singularity_handler sing_handler) const; + + // Minimum-norm solvers + Matrix lssolve (const Matrix& b) const; + Matrix lssolve (const Matrix& b, int& info) const; + Matrix lssolve (const Matrix& b, int& info, int& rank) const; + + ComplexMatrix lssolve (const ComplexMatrix& b) const; + ComplexMatrix lssolve (const ComplexMatrix& b, int& info) const; + ComplexMatrix lssolve (const ComplexMatrix& b, int& info, + int& rank) const; + + SparseMatrix lssolve (const SparseMatrix& b) const; + SparseMatrix lssolve (const SparseMatrix& b, int& info) const; + SparseMatrix lssolve (const SparseMatrix& b, int& info, int& rank) const; + + SparseComplexMatrix lssolve (const SparseComplexMatrix& b) const; + SparseComplexMatrix lssolve (const SparseComplexMatrix& b, + int& info) const; + SparseComplexMatrix lssolve (const SparseComplexMatrix& b, int& info, + int& rank) const; + + ColumnVector lssolve (const ColumnVector& b) const; + ColumnVector lssolve (const ColumnVector& b, int& info) const; + ColumnVector lssolve (const ColumnVector& b, int& info, int& rank) const; + + ComplexColumnVector lssolve (const ComplexColumnVector& b) const; + ComplexColumnVector lssolve (const ComplexColumnVector& b, int& info) const; + ComplexColumnVector lssolve (const ComplexColumnVector& b, int& info, + int& rank) const; + + // other operations + SparseMatrix map (d_d_Mapper f) const; + SparseBoolMatrix map (b_d_Mapper f) const; + + SparseMatrix& apply (d_d_Mapper f); + + bool any_element_is_negative (bool = false) const; + bool any_element_is_inf_or_nan (void) const; + bool all_elements_are_int_or_inf_or_nan (void) const; + bool all_integers (double& max_val, double& min_val) const; + bool too_large_for_float (void) const; + + SparseBoolMatrix operator ! (void) const; + + SparseBoolMatrix all (int dim = -1) const; + SparseBoolMatrix any (int dim = -1) const; + + SparseMatrix cumprod (int dim = -1) const; + SparseMatrix cumsum (int dim = -1) const; + SparseMatrix prod (int dim = -1) const; + SparseMatrix sum (int dim = -1) const; + SparseMatrix sumsq (int dim = -1) const; + SparseMatrix abs (void) const; + + SparseMatrix diag (int k = 0) const; + + Matrix matrix_value (void) const; + + SparseMatrix squeeze (void) const; + + SparseMatrix index (idx_vector& i, int resize_ok) const; + + SparseMatrix index (idx_vector& i, idx_vector& j, int resize_ok) const; + + SparseMatrix index (Array& ra_idx, int resize_ok) const; + + SparseMatrix reshape (const dim_vector& new_dims) const; + + SparseMatrix permute (const Array& vec, bool inv = false) const; + + SparseMatrix ipermute (const Array& vec) const; + + // i/o + + friend std::ostream& operator << (std::ostream& os, const SparseMatrix& a); + friend std::istream& operator >> (std::istream& is, SparseMatrix& a); +}; + +extern SparseMatrix operator * (const SparseMatrix& a, + const SparseMatrix& b); + +extern SparseMatrix min (double d, const SparseMatrix& m); +extern SparseMatrix min (const SparseMatrix& m, double d); +extern SparseMatrix min (const SparseMatrix& a, const SparseMatrix& b); + +extern SparseMatrix max (double d, const SparseMatrix& m); +extern SparseMatrix max (const SparseMatrix& m, double d); +extern SparseMatrix max (const SparseMatrix& a, const SparseMatrix& b); + +SPARSE_SMS_CMP_OP_DECLS (SparseMatrix, double) +SPARSE_SMS_BOOL_OP_DECLS (SparseMatrix, double) + +SPARSE_SSM_CMP_OP_DECLS (double, SparseMatrix) +SPARSE_SSM_BOOL_OP_DECLS (double, SparseMatrix) + +SPARSE_SMSM_CMP_OP_DECLS (SparseMatrix, SparseMatrix) +SPARSE_SMSM_BOOL_OP_DECLS (SparseMatrix, SparseMatrix) + +SPARSE_FORWARD_DEFS (MSparse, SparseMatrix, Matrix, double) + +#endif + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/dbleDET.h --- a/liboctave/dbleDET.h Fri Feb 25 17:42:55 2005 +0000 +++ b/liboctave/dbleDET.h Fri Feb 25 19:55:28 2005 +0000 @@ -29,6 +29,7 @@ DET { friend class Matrix; +friend class SparseMatrix; public: diff -r 9f3299378193 -r 57077d0ddc8e liboctave/mx-base.h --- a/liboctave/mx-base.h Fri Feb 25 17:42:55 2005 +0000 +++ b/liboctave/mx-base.h Fri Feb 25 19:55:28 2005 +0000 @@ -45,6 +45,12 @@ #include "dDiagMatrix.h" #include "CDiagMatrix.h" +// Sparse Matrix classes. + +#include "boolSparse.h" +#include "dSparse.h" +#include "CSparse.h" + // N-d Array classes. #include "boolNDArray.h" diff -r 9f3299378193 -r 57077d0ddc8e liboctave/oct-spparms.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/oct-spparms.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,122 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#include "config.h" +#include "lo-ieee.h" + +#include "oct-spparms.h" + +SparseParams Voctave_sparse_controls; + +void +SparseParams::defaults (void) +{ + Voctave_sparse_controls (0) = 0; // spumoni + Voctave_sparse_controls (1) = 1; // ths_rel + Voctave_sparse_controls (2) = 1; // ths_abs + Voctave_sparse_controls (3) = 0; // exact_d + Voctave_sparse_controls (4) = 3; // supernd + Voctave_sparse_controls (5) = 3; // rreduce + Voctave_sparse_controls (6) = 0.5; // wh_frac + Voctave_sparse_controls (7) = 1; // autommd + Voctave_sparse_controls (8) = 1; // autoamd + Voctave_sparse_controls (9) = 0.1; // piv_tol + Voctave_sparse_controls (10) = 0.5; // bandden + Voctave_sparse_controls (11) = 1; // umfpack +} + +void +SparseParams::tight (void) +{ + Voctave_sparse_controls (0) = 0; // spumoni + Voctave_sparse_controls (1) = 1; // ths_rel + Voctave_sparse_controls (2) = 0; // ths_abs + Voctave_sparse_controls (3) = 1; // exact_d + Voctave_sparse_controls (4) = 1; // supernd + Voctave_sparse_controls (5) = 1; // rreduce + Voctave_sparse_controls (6) = 0.5; // wh_frac + Voctave_sparse_controls (7) = 1; // autommd + Voctave_sparse_controls (8) = 1; // autoamd + Voctave_sparse_controls (9) = 0.1; // piv_tol + Voctave_sparse_controls (10) = 0.5; // bandden + Voctave_sparse_controls (11) = 1; // umfpack +} + +void +SparseParams::init_keys (void) +{ + keys (0) = "spumoni"; + keys (1) = "ths_rel"; + keys (2) = "ths_abs"; + keys (3) = "exact_d"; + keys (4) = "supernd"; + keys (5) = "rreduce"; + keys (6) = "wh_frac"; + keys (7) = "autommd"; + keys (8) = "autoamd"; + keys (9) = "piv_tol"; + keys (10) = "bandden"; + keys (11) = "umfpack"; +} + +SparseParams& +SparseParams::operator = (const SparseParams& a) +{ + for (int i = 0; i < OCTAVE_SPARSE_CONTROLS_SIZE; i++) + params (i) = a.params (i); + + return *this; +} + +bool +SparseParams::set_key (const std::string key, const double& val) +{ + for (int i = 0; i < OCTAVE_SPARSE_CONTROLS_SIZE; i++) + if (keys (i) == key) + { + params(i) = val; + return true; + } + return false; +} + +double +SparseParams::get_key (const std::string key) +{ + for (int i = 0; i < OCTAVE_SPARSE_CONTROLS_SIZE; i++) + if (keys (i) == key) + return params(i); + + return octave_NaN; +} + +void +SparseParams::print_info (std::ostream& os, const std::string& prefix) const +{ + for (int i = 0; i < OCTAVE_SPARSE_CONTROLS_SIZE; i++) + os << prefix << keys(i) << ": " << params(i) << "\n"; +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/oct-spparms.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/oct-spparms.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,78 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#if !defined (octave_oct_spparms_h) +#define octave_oct_spparms_h 1 + +#include +#include + +#include + +#include "str-vec.h" +#include "dColVector.h" + +#define OCTAVE_SPARSE_CONTROLS_SIZE 12 + +class +SparseParams +{ + public: + SparseParams (void) : params (ColumnVector (OCTAVE_SPARSE_CONTROLS_SIZE)), + keys (string_vector (OCTAVE_SPARSE_CONTROLS_SIZE)) + { defaults (); init_keys (); } + + void defaults (void); + + void tight (void); + + SparseParams& operator = (const SparseParams& a); + + double& operator () (int n) { return params (n); } + double operator () (int n) const { return params (n); } + + string_vector get_keys (void) const { return keys; } + + ColumnVector get_vals (void) const { return params; } + + bool set_key (const std::string key, const double& val); + + double get_key (const std::string key); + + void print_info (std::ostream& os, const std::string& prefix) const; + + private: + void init_keys (void); + + ColumnVector params; + + string_vector keys; +}; + +extern SparseParams Voctave_sparse_controls; + +#endif + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/sparse-base-lu.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/sparse-base-lu.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,70 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "sparse-base-lu.h" + +template +p_type +sparse_base_lu :: Pr (void) const +{ + int nr = Lfact.rows (); + + p_type Pout (nr, nr, nr); + + for (int i = 0; i < nr; i++) + { + Pout.cidx (i) = i; + Pout.ridx (P (i)) = i; + Pout.data (i) = 1; + } + Pout.cidx (nr) = nr; + + return Pout; +} + +template +p_type +sparse_base_lu :: Pc (void) const +{ + int nc = Ufact.cols (); + + p_type Pout (nc, nc, nc); + + for (int i = 0; i < nc; i++) + { + Pout.cidx (i) = i; + Pout.ridx (i) = Q (i); + Pout.data (i) = 1; + } + Pout.cidx (nc) = nc; + + return Pout; +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/sparse-base-lu.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/sparse-base-lu.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,85 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + + +#if !defined (octave_sparse_base_lu_h) +#define octave_sparse_base_lu_h 1 + +#include "MArray.h" + +template +class +sparse_base_lu +{ +public: + + sparse_base_lu (void) { } + + sparse_base_lu (const sparse_base_lu& a) + : Lfact (a.Lfact), Ufact (a.Ufact), cond (a.cond), P (a.P), Q (a.Q) { } + + sparse_base_lu& operator = (const sparse_base_lu& a) + { + if (this != &a) + { + Lfact = a.Lfact; + Ufact = a.Ufact; + cond = a.cond; + P = a.P; + Q = a.Q; + } + return *this; + } + + ~sparse_base_lu (void) { } + + lu_type L (void) const { return Lfact; } + + lu_type U (void) const { return Ufact; } + + p_type Pc (void) const; + + p_type Pr (void) const; + + MArray row_perm (void) const { return P; } + + MArray col_perm (void) const { return Q; } + + double rcond (void) const { return cond; } + +protected: + + lu_type Lfact; + lu_type Ufact; + + double cond; + + MArray P; + MArray Q; +}; + +#endif + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/sparse-mk-ops.awk --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/sparse-mk-ops.awk Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,239 @@ +BEGIN { + declare_types = 0; + generate_ops = 0; + ntypes = 0; +} { + if (NR == 1 && make_inclusive_header) + { + print "// DO NOT EDIT -- generated by sparse-mk-ops"; + tmp = make_inclusive_header; + gsub (/[\.-]/, "_", tmp); + printf ("#if !defined (octave_%s)\n", tmp); + printf ("#define octave_%s 1\n", tmp); + } +} +/^#/ { + if ($2 == "types") + declare_types = 1; + else if ($2 == "ops") + { + generate_ops = 1; + declare_types = 0; + } + next; +} { + if (declare_types) + { + ntypes++; + + if (NF == 6) + { + scalar_zero_val[ntypes] = $6; + fwd_decl_ok[ntypes] = $5 == "YES"; + header[ntypes] = $4 == "NONE" ? "" : $4; + class[ntypes] = $3; + type[ntypes] = $2; + tag[ntypes] = $1; + rev_tag[$1] = ntypes; + } + else + printf ("skipping line %d: %s\n", NR, $0); + } + else if (generate_ops) + { + if (NF >= 5) + { + result_tag_1 = $1; + result_tag_2 = $2; + lhs_tag = $3; + rhs_tag = $4; + op_type = $5; + + bin_ops = index (op_type, "B") != 0; + cmp_ops = index (op_type, "C") != 0; + eqne_ops = index (op_type, "E") != 0; + bool_ops = index (op_type, "L") != 0; + + n = 5; + + lhs_conv = cmp_ops ? $(++n) : ""; + rhs_conv = cmp_ops ? $(++n) : ""; + + if (lhs_conv == "NONE") + lhs_conv = ""; + + if (rhs_conv == "NONE") + rhs_conv = ""; + + k = 0 + while (NF > n) + bool_headers[k++] = $(++n); + + cc_file = sprintf ("%s-%s-%s.cc", prefix, lhs_tag, rhs_tag); + h_file = sprintf ("%s-%s-%s.h", prefix, lhs_tag, rhs_tag); + + if (list_cc_files) + { + print cc_file; + next; + } + + if (list_h_files) + { + print h_file; + next; + } + + if (make_inclusive_header) + { + printf ("#include \"%s\"\n", h_file); + next; + } + + h_guard = sprintf ("octave_%s_%s_%s_h", prefix, lhs_tag, rhs_tag); + + result_num_1 = rev_tag[result_tag_1]; + result_num_2 = rev_tag[result_tag_2]; + lhs_num = rev_tag[lhs_tag]; + rhs_num = rev_tag[rhs_tag]; + + result_type_1 = type[result_num_1]; + result_type_2 = type[result_num_2]; + lhs_type = type[lhs_num]; + rhs_type = type[rhs_num]; + + result_scalar_zero_val_1 = scalar_zero_val[result_num_1]; + result_scalar_zero_val_2 = scalar_zero_val[result_num_2]; + lhs_scalar_zero_val = scalar_zero_val[lhs_num]; + rhs_scalar_zero_val = scalar_zero_val[rhs_num]; + + result_header_1 = header[result_num_1]; + result_header_2 = header[result_num_2]; + lhs_header = header[lhs_num]; + rhs_header = header[rhs_num]; + + lhs_class = class[lhs_num]; + rhs_class = class[rhs_num]; + + print "// DO NOT EDIT -- generated by sparse-mk-ops" > h_file; + + printf ("#if !defined (%s)\n", h_guard) >> h_file; + printf ("#define %s 1\n", h_guard) >> h_file; + + if (result_header_1) + { + if (result_fwd_decl_ok) + printf ("class %s\n", result_type_1) >> h_file; + else + printf ("#include \"%s\"\n", result_header_1) >> h_file; + } + + if (result_header_2 && ! (result_header_2 == result_header_1)) + { + if (result_fwd_decl_ok) + printf ("class %s\n", result_type_2) >> h_file; + else + printf ("#include \"%s\"\n", result_header_2) >> h_file; + } + + if (lhs_header && ! (lhs_header == result_header_1 || lhs_header == result_header_2)) + { + if (result_fwd_decl_ok) + printf ("class %s\n", lhs_type) >> h_file; + else + printf ("#include \"%s\"\n", lhs_header) >> h_file; + } + + if (rhs_header && ! (rhs_header == lhs_header || rhs_header == result_header_1 || rhs_header == result_header_2)) + { + if (result_fwd_decl_ok) + printf ("class %s\n", rhs_type) >> h_file; + else + printf ("#include \"%s\"\n", rhs_header) >> h_file; + } + + printf ("#include \"Sparse-op-defs.h\"\n") >> h_file; + + if (bin_ops) + printf ("SPARSE_%s%s_BIN_OP_DECLS (%s, %s, %s, %s)\n", lhs_class, + rhs_class, result_type_1, result_type_2, lhs_type, + rhs_type) >> h_file + + if (cmp_ops) + printf ("SPARSE_%s%s_CMP_OP_DECLS (%s, %s)\n", lhs_class, + rhs_class, lhs_type, rhs_type) >> h_file + + if (eqne_ops) + printf ("SPARSE_%s%s_EQNE_OP_DECLS (%s, %s)\n", lhs_class, + rhs_class, lhs_type, rhs_type) >> h_file + + if (bool_ops) + printf ("SPARSE_%s%s_BOOL_OP_DECLS (%s, %s)\n", lhs_class, + rhs_class, lhs_type, rhs_type) >> h_file + + + print "#endif" >> h_file; + + close (h_file); + + + print "// DO NOT EDIT -- generated by sparse-mk-ops" > cc_file; + + ## print "#ifdef HAVE_CONFIG_H" >> cc_file; + print "#include " >> cc_file; + ## print "#endif" >> cc_file; + + print "#include \"Array-util.h\"" >> cc_file; + print "#include \"quit.h\"" >> cc_file; + + printf ("#include \"%s\"\n", h_file) >> cc_file; + + for (i in bool_headers) + { + printf ("#include \"%s\"\n", bool_headers[i]) >> cc_file; + delete bool_headers[i]; + } + + if (result_header_1) + printf ("#include \"%s\"\n", result_header_1) >> cc_file; + + if (result_header_2 && ! (result_header_2 == result_header_1)) + printf ("#include \"%s\"\n", result_header_2) >> cc_file; + + if (lhs_header && ! (lhs_header == result_header_1 || lhs_header == result_header_2)) + printf ("#include \"%s\"\n", lhs_header) >> cc_file; + + if (rhs_header && ! (rhs_header == lhs_header || rhs_header == result_header_1 || rhs_heaer == result_header_2)) + printf ("#include \"%s\"\n", rhs_header) >> cc_file; + + if (bin_ops) + printf ("SPARSE_%s%s_BIN_OPS (%s, %s, %s, %s)\n", lhs_class, + rhs_class, result_type_1, result_type_2, lhs_type, + rhs_type) >> cc_file + + if (cmp_ops) + printf ("SPARSE_%s%s_CMP_OPS (%s, %s, %s, %s, %s, %s)\n", + lhs_class, rhs_class, lhs_type, lhs_scalar_zero_val, + lhs_conv, rhs_type, rhs_scalar_zero_val, rhs_conv) >> cc_file + + if (eqne_ops) + printf ("SPARSE_%s%s_EQNE_OPS (%s, %s, %s, %s, %s, %s)\n", + lhs_class, rhs_class, lhs_type, lhs_scalar_zero_val, + lhs_conv, rhs_type, rhs_scalar_zero_val, rhs_conv) >> cc_file + + if (bool_ops) + printf ("SPARSE_%s%s_BOOL_OPS2 (%s, %s, %s, %s)\n", lhs_class, + rhs_class, lhs_type, rhs_type, lhs_scalar_zero_val, + rhs_scalar_zero_val) >> cc_file + + + close (cc_file); + } + else + printf ("skipping line %d: %s\n", NR, $0); + } +} +END { + if (make_inclusive_header) + print "#endif"; +} diff -r 9f3299378193 -r 57077d0ddc8e liboctave/sparse-mx-ops --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/sparse-mx-ops Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,45 @@ +# types +# +# key typename object-type header fwd-decl-ok scalar-zero +# +# S: scalar +# M: matrix +# DM: diagonal matrix +# ND: N-d array +# SM: sparse matrix +# +sm SparseMatrix SM dSparse.h YES 0.0 +scm SparseComplexMatrix SM CSparse.h YES 0.0 +sbm SparseBoolMatrix SM boolSparse.h YES false +b bool S NONE NO false +bm boolMatrix M boolMatrix.h YES false +s double S NONE NO 0.0 +cs Complex S oct-cmplx.h NO 0.0 +m Matrix M dMatrix.h YES 0.0 +cm ComplexMatrix M CMatrix.h YES 0.0 +# ops +# result_t_1 result_t_2 lhs_t rhs_t op-type lhs_conv rhs_conv headers ... +# +# op-type is one of +# +# B: binary ops, + - * / +# C: comparison ops, < <= == != >= > +# E: == != (Only one of C or E can be used!!) +# L: logical ops, & | +# +cm scm sm cs BCL NONE real boolSparse.h +cm scm cs sm BCL real NONE boolSparse.h +cm scm scm s BCL real NONE boolSparse.h +cm scm s scm BCL NONE real boolSparse.h +scm scm scm sm BCL real NONE boolSparse.h +scm scm sm scm BCL NONE real boolSparse.h +m sm m sm BCL NONE NONE boolSparse.h +cm scm m scm BCL NONE real boolSparse.h +cm scm cm sm BCL real NONE boolSparse.h +cm scm cm scm BCL real real boolSparse.h +m sm sm m BCL NONE NONE boolSparse.h +cm scm scm m BCL real NONE boolSparse.h +cm scm sm cm BCL NONE real boolSparse.h +cm scm scm cm BCL real real boolSparse.h +bm sbm bm sbm EL +bm sbm sbm bm EL diff -r 9f3299378193 -r 57077d0ddc8e liboctave/sparse-sort.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/sparse-sort.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,56 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "oct-sort.cc" +#include "quit.h" + +#include "sparse-sort.h" + +// A simple class and instantiation of the octave merge sort class +// to sort sparse data before matrix creation. This is significantly +// faster than using octave_qsort. + +bool +octave_sparse_sidxl_comp (octave_sparse_sort_idxl* i, + octave_sparse_sort_idxl* j) +{ + int tmp = i->c - j->c; + if (tmp < 0) + return true; + else if (tmp > 0) + return false; + return (i->r < j->r); +} + +// Instantiate the sparse sorting class +template class octave_sort; + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e liboctave/sparse-sort.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/sparse-sort.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,45 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#if !defined (octave_sparse_sort_h) +#define octave_sparse_sort_h + +#include "oct-sort.h" + +class +octave_sparse_sort_idxl +{ + public: + unsigned int r; + unsigned int c; + unsigned int idx; +}; + +bool octave_sparse_sidxl_comp (octave_sparse_sort_idxl* i, + octave_sparse_sort_idxl* j); + +#endif + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e scripts/ChangeLog --- a/scripts/ChangeLog Fri Feb 25 17:42:55 2005 +0000 +++ b/scripts/ChangeLog Fri Feb 25 19:55:28 2005 +0000 @@ -1,3 +1,42 @@ +2005-02-25 John W. Eaton + + Sparse merge. + + 2005-01-23 David Bateman + + * sparse/randperm.m: Delete duplicate randperm.m. + + 2005-01-10 John W. Eaton + + * sparse/Makefile.in: New file. + * configure.in (AC_CONFIG_FILES): Add sparse/Makefile to the list. + + 2005-01-07 David Bateman + + * set/unique.m: import file from octave-forge. + + 2005-01-05 David Bateman + + * Makefile.in: include sparse directory in SUBDIRS. + + 2004-12-30 John W. Eaton + + * sparse/nzmax.m: Delete (there is an nzmax function in + src/DLD-FUNCTIONS/sparse.cc). + + 2004-12-28 John W. Eaton + + Merge of sparse code from David Bateman and + Andy Adler . + + * sparse/colperm.m, sparse/nonzeros.m, sparse/nzmax.m, + sparse/randperm.m, sparse/spalloc.m, sparse/spconvert.m, + sparse/spdiags.m, sparse/speye.m, sparse/spfun.m, sparse/sphcat.m, + sparse/spones.m, sparse/sprand.m, sparse/sprandn.m, + sparse/spstats.m, sparse/spvcat.m, sparse/spy.m: New files. + + * sparse: New directory. + 2005-02-22 John W. Eaton * polynomial/residue.m: Force prepad to always create row vectors. diff -r 9f3299378193 -r 57077d0ddc8e scripts/Makefile.in --- a/scripts/Makefile.in Fri Feb 25 17:42:55 2005 +0000 +++ b/scripts/Makefile.in Fri Feb 25 19:55:28 2005 +0000 @@ -31,8 +31,8 @@ SUBDIRS = audio control deprecated elfun finance general image io \ linear-algebra miscellaneous plot polynomial quaternion \ - set signal specfun special-matrix startup statistics \ - strings time + set signal sparse specfun special-matrix startup \ + statistics strings time DISTSUBDIRS = $(SUBDIRS) diff -r 9f3299378193 -r 57077d0ddc8e scripts/configure.in --- a/scripts/configure.in Fri Feb 25 17:42:55 2005 +0000 +++ b/scripts/configure.in Fri Feb 25 19:55:28 2005 +0000 @@ -34,8 +34,9 @@ finance/Makefile general/Makefile image/Makefile io/Makefile \ linear-algebra/Makefile miscellaneous/Makefile plot/Makefile \ polynomial/Makefile quaternion/Makefile set/Makefile \ - signal/Makefile specfun/Makefile special-matrix/Makefile \ - startup/Makefile statistics/Makefile statistics/base/Makefile \ - statistics/distributions/Makefile statistics/models/Makefile \ - statistics/tests/Makefile strings/Makefile time/Makefile]) + signal/Makefile sparse/Makefile specfun/Makefile \ + special-matrix/Makefile startup/Makefile statistics/Makefile \ + statistics/base/Makefile statistics/distributions/Makefile \ + statistics/models/Makefile statistics/tests/Makefile \ + strings/Makefile time/Makefile]) AC_OUTPUT diff -r 9f3299378193 -r 57077d0ddc8e scripts/sparse/Makefile.in --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scripts/sparse/Makefile.in Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,69 @@ +# +# Makefile for octave's scripts/sparse directory +# +# John W. Eaton +# jwe@bevo.che.wisc.edu +# University of Wisconsin-Madison +# Department of Chemical Engineering + +TOPDIR = ../.. + +script_sub_dir = sparse + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ + +include $(TOPDIR)/Makeconf + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ + +SOURCES = *.m + +DISTFILES = Makefile.in $(SOURCES) + +FCN_FILES = $(wildcard $(srcdir)/*.m) +FCN_FILES_NO_DIR = $(notdir $(FCN_FILES)) + +BINDISTFILES = $(FCN_FILES) + +all: +.PHONY: all + +install install-strip: + $(do-script-install) +.PHONY: install install-strip + +uninstall: + $(do-script-uninstall) +.PHONY: uninstall + +clean: +.PHONY: clean + +tags: $(SOURCES) + ctags $(SOURCES) + +TAGS: $(SOURCES) + etags $(SOURCES) + +mostlyclean: clean +.PHONY: mostlyclean + +distclean: clean + rm -f Makefile +.PHONY: distclean + +maintainer-clean: distclean + rm -f tags TAGS +.PHONY: maintainer-clean + +dist: + ln $(DISTFILES) ../../`cat ../../.fname`/scripts/sparse +.PHONY: dist + +bin-dist: + ln $(BINDISTFILES) ../../`cat ../../.fname`/scripts/sparse +.PHONY: bin-dist diff -r 9f3299378193 -r 57077d0ddc8e scripts/sparse/colperm.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scripts/sparse/colperm.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,30 @@ +## Copyright (C) 2004 David Bateman & Andy Adler +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +## -*- texinfo -*- +## @deftypefn {Function File} {@var{p} =} colperm (@var{s}) +## Returns the column permutations such that the columns of +## @code{@var{s} (:, @var{p})} are ordered in terms of increase number +## of non-zero elements. If @var{s} is symmetric, then @var{p} is chosen +## such that @code{@var{s} (@var{p}, @var{p})} orders the rows and +## columns with increasing number of non zeros elements. +## @end deftypefn + +function p = colperm (s) + [i, j] = spfind (s); + idx = find (diff ([j; Inf]) != 0); + [dummy, p] = sort (idx - [0; idx(1:(end-1))]); +endfunction diff -r 9f3299378193 -r 57077d0ddc8e scripts/sparse/nonzeros.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scripts/sparse/nonzeros.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,19 @@ +## Copyright (C) 2004 Paul Kienzle +## +## This program is free software and is in the public domain + +## -*- texinfo -*- +## @deftypefn {Function File} {} nonzeros (@var{s}) +## Returns a vector of the non-zero values of the sparse matrix @var{s}. +## @end deftypefn + +function t = nonzeros(s) + if issparse(s) + [i,j,t] = spfind(s); + else + [i,j,t] = find(s); + endif +endfunction + +%!assert(nonzeros([1,2;3,0]),[1;3;2]) +%!assert(nonzeros(sparse([1,2;3,0])),[1;3;2]) diff -r 9f3299378193 -r 57077d0ddc8e scripts/sparse/spalloc.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scripts/sparse/spalloc.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,43 @@ +## Copyright (C) 2004 David Bateman & Andy Adler +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +## -*- texinfo -*- +## @deftypefn {Function File} {@var{s} =} spalloc (@var{r}, @var{c}, @var{nz}) +## Returns an empty sparse matrix of size @var{r}-by-@var{c}. As Octave +## resizes sparse matrices at the first opportunity, so that no additional +## space is needed, the argument @var{nz} is ignored. This function is +## provided only for compatiability reasons. +## +## It should be noted that this means that code like +## +## @example +## k = 5; +## nz = r * k; +## s = spalloc (r, c, nz) +## for j = 1:c +## idx = randperm (r); +## s (:, j) = [zeros(r - k, 1); rand(k, 1)] (idx); +## endfor +## @end example +## +## will reallocate memory at each step. It is therefore vitally important +## that code like this is vectorized as much as possible. +## @end deftypefn +## @seealso{sparse, nzmax} + +function s = spalloc (r, c, nz) + s = sparse (r, c); +endfunction diff -r 9f3299378193 -r 57077d0ddc8e scripts/sparse/spconvert.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scripts/sparse/spconvert.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,43 @@ +## Copyright (C) 2004 David Bateman & Andy Adler +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +## -*- texinfo -*- +## @deftypefn {Function File} {@var{x} =} spconvert (@var{m}) +## This function converts for a simple sparse matrix format easily +## produced by other programs into Octave's internal sparse format. The +## input @var{x} is either a 3 or 4 column real matrix, containing +## the row, column, real and imaginary parts of the elements of the +## sparse matrix. An element with a zero real and imaginay part can +## be used to force a particular matrix size. +## @end deftypefn + +function s = spconvert (m) + + if issparse(m) + s = m; + else + sz = size(m); + if (nargin != 1 || !ismatrix(m) || !isreal(m) || length(sz) != 2 || + (sz(2) != 3 && sz(2) != 4)) + error ("spconvert: input matrix must be either sparse or a three or four column"); + error (" real matrix"); + elseif (sz(2) == 3) + s = sparse (m(:,1), m(:,2), m(:,3)); + else + s = sparse (m(:,1), m(:,2), m(:,3) + 1i*m(:,4)); + endif + endif +endfunction diff -r 9f3299378193 -r 57077d0ddc8e scripts/sparse/spdiags.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scripts/sparse/spdiags.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,92 @@ +## Copyright (C) 2000-2001 Paul Kienzle +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +## -*- texinfo -*- +## @deftypefn {function File} {[@var{b}, @var{c}]} = spdiags (@var{a}) +## @deftypefnx {function File} {@var{b}} = spdiags (@var{a}, @var{c}) +## @deftypefnx {function File} {@var{b}} = spdiags (@var{v}, @var{c}, @var{a}) +## @deftypefnx {function File} {@var{b}} = spdiags (@var{v}, @var{c}, @var{m}, @var{n}) +## A generalization of the function @code{spdiag}. Called with a single +## input argument, the non-zero diagonals @var{c} of @var{A} are extracted. +## With two arguments the diagonals to extract are given by the vector +## @var{c}. +## +## The other two forms of @code{spdiags} modify the input matrix by +## replacing the diagonals. They use the columns of @var{v} to replace +## the columns represented by the vector @var{c}. If the sparse matrix +## @var{a} is defined then the diagonals of this matrix are replaced. +## Otherwise a matrix of @var{m} by @var{n} is created with the +## diagonals given by @var{v}. +## +## Negative values of @var{c} representive diagonals below the main +## diagonal, and positive values of @var{c} diagonals above the main +## diagonal. +## +## For example +## +## @example +## @group +## spdiags (reshape (1:12, 4, 3), [-1 0 1], 5, 4) +## @result{} 5 10 0 0 +## 1 6 11 0 +## 0 2 7 12 +## 0 0 3 8 +## 0 0 0 4 +## @end group +## @end example +## +## @end deftypefn + +function [A, c] = spdiags(v,c,m,n) + + wfi = warn_fortran_indexing; + unwind_protect + warn_fortran_indexing = 0; + + if nargin == 1 || nargin == 2 + ## extract nonzero diagonals of v into A,c + [i,j,v,nr,nc] = spfind(v); + if nargin == 1 + c = unique(j-i); # c contains the active diagonals + endif + ## FIXME: we can do this without a loop if we are clever + offset = max(min(c,nc-nr),0); + A = zeros(min(nr,nc),length(c)); + for k=1:length(c) + idx = find(j-i == c(k)); + A(j(idx)-offset(k),k) = v(idx); + end + elseif nargin == 3 + ## Replace specific diagonals c of m with v,c + [nr,nc] = size(m); + B = spdiags(m,c); + A = m - spdiags(B,c,nr,nc) + spdiags(v,c,nr,nc); + else + ## Create new matrix of size mxn using v,c + [j,i,v] = find(v); + offset = max(min(c(:),n-m),0); + j+=offset(i); + i=j-c(:)(i); + idx = i>0 & i<=m & j>0 & j<=n; + A = sparse(i(idx),j(idx),v(idx),m,n); + + endif + + unwind_protect_cleanup + warn_fortran_indexing = wfi; + end_unwind_protect + +endfunction diff -r 9f3299378193 -r 57077d0ddc8e scripts/sparse/speye.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scripts/sparse/speye.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,55 @@ +## Copyright (C) 2004 David Bateman & Andy Adler +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +## -*- texinfo -*- +## @deftypefn {Function File} {@var{y} =} speye (@var{m}) +## @deftypefnx {Function File} {@var{y} =} speye (@var{m}, @var{n}) +## @deftypefnx {Function File} {@var{y} =} speye (@var{sz}) +## Returns a sparse identity matrix. This is significantly more +## efficient than @code{sparse (eye (@var{m}))} as the full matrix +## is not constructed. +## +## Called with a single argument a square matrix of size @var{m} by +## @var{m} is created. Otherwise a matrix of @var{m} by @var{n} is +## created. If called with a single vector argument, this argument +## is taken to be the size of the matrix to create. +## @end deftypefn + +function s = speye(m,n) + if (nargin == 1) + if (isvector (m) && length(m) == 2) + n = m(2); + m = m(1); + elseif (isscalar (m)) + n = m; + else + error ("speye: invalid matrix dimension"); + endif + else + if (!isscalar (m) || !isscalar (n)) + error ("speye: invalid matrix dimension"); + endif + endif + + lo = min([m,n]); + s = sparse(1:lo,1:lo,1,m,n); +endfunction + +%!assert(issparse(speye(4))) +%!assert(speye(4),sparse(1:4,1:4,1)) +%!assert(speye(2,4),sparse(1:2,1:2,1,2,4)) +%!assert(speye(4,2),sparse(1:2,1:2,1,4,2)) +%!assert(speye([4,2]),sparse(1:2,1:2,1,4,2)) diff -r 9f3299378193 -r 57077d0ddc8e scripts/sparse/spfun.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scripts/sparse/spfun.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,49 @@ +## Copyright (C) 2004 David Bateman & Andy Adler +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +## -*- texinfo -*- +## @deftypefn {Function File} {@var{y} =} spfun (@var{f},@var{x}) +## Compute @code{f(@var{x})} for the non-zero values of @var{x}. +## This results in a sparse matrix with the same structure as +## @var{x}. The function @var{f} can be passed as a string, a +## function handle or an inline function. +## @end deftypefn + +function t = spfun(f,s) + if (nargin != 2) + usage ("spfun(f,s)") + endif + + if issparse(s) + [i,j,v,m,n] = spfind(s); + else + [i,j,v] = find(s); + [m,n] = size(s); + end + + if (isa (f, "function handle") || isa (f, "inline function")) + t = sparse(i,j,f(v),m,n); + else + t = sparse(i,j,feval(f,v),m,n); + endif + +endfunction + +%!assert(spfun('exp',[1,2;3,0]),sparse([exp(1),exp(2);exp(3),0])) +%!assert(spfun('exp',sparse([1,2;3,0])),sparse([exp(1),exp(2);exp(3),0])) +%!assert(spfun(@exp,[1,2;3,0]),sparse([exp(1),exp(2);exp(3),0])) +%!assert(spfun(@exp,sparse([1,2;3,0])),sparse([exp(1),exp(2);exp(3),0])) + diff -r 9f3299378193 -r 57077d0ddc8e scripts/sparse/sphcat.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scripts/sparse/sphcat.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,34 @@ +## Copyright (C) 2004 David Bateman & Andy Adler +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +## -*- texinfo -*- +## @deftypefn {Function File} {@var{y} =} sphcat (@var{a1}, @var{a2}, @dots{}, @var{aN}) +## Return the horizontal concatenation of sparse matrices. This function +## is obselete and @code{horzcat} should be used +## @end deftypefn +## @seealso {spvcat, vertcat, horzcat, cat} + +function y = sphcat (varargin) + + persistent sphcat_warned = false; + + if (!sphcat_warned) + sphcat_warned = true; + warning ("sphcat: This function is depreciated. Use horzcat instead"); + endif + + y = horzcat (varargin{:}); +endfunction diff -r 9f3299378193 -r 57077d0ddc8e scripts/sparse/spones.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scripts/sparse/spones.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,35 @@ +## Copyright (C) 2004 David Bateman & Andy Adler +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +## -*- texinfo -*- +## @deftypefn {Function File} {@var{y} =} spones (@var{x}) +## Replace the non-zero entries of @var{x} with ones. This creates a +## sparse matrix with the same structure as @var{x}. +## @end deftypefn + +function s = spones(s) + if issparse(s) + [i,j,v,m,n] = spfind(s); + else + [i,j,v] = find(s); + [m,n] = size(s); + end + s = sparse(i,j,1,m,n); +endfunction + +%!assert(issparse(spones([1,2;3,0]))) +%!assert(spones([1,2;3,0]),sparse([1,1;1,0])) +%!assert(spones(sparse([1,2;3,0])),sparse([1,1;1,0])) diff -r 9f3299378193 -r 57077d0ddc8e scripts/sparse/sprand.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scripts/sparse/sprand.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,58 @@ +## Copyright (C) 2004 Paul Kienzle +## +## This program is free software and is in the public domain + +## -*- texinfo -*- +## @deftypefn {Function File} {} sprand (@var{m}, @var{n}, @var{d}) +## @deftypefnx {Function File} {} sprand (@var{s}) +## Generate a random sparse matrix. The size of the matrix will be +## @var{m} by @var{n}, with a density of values given by @var{d}. +## @var{d} should be between 0 and 1. Values will be normally +## distributed with mean of zero and variance 1. +## +## Note: sometimes the actual density may be a bit smaller than @var{d}. +## This is unlikely to happen for large really sparse matrices. +## +## If called with a single matrix argument, a random sparse matrix is +## generated wherever the matrix @var{S} is non-zero. +## @end deftypefn +## @seealso{sprandn} + + +## This program is public domain +## Author: Paul Kienzle +## +## Changelog: +## +## Piotr Krzyzanowski +## 2004-09-27 use Paul's hint to allow larger random matrices +## at the price of sometimes lower density than desired +## David Bateman +## 2004-10-20 Texinfo help and copyright message + +function S = sprand (m, n, d) + if nargin == 1 + [i,j,v,nr,nc] = spfind(m); + S = sparse (i,j,rand(size(v)),nr,nc); + elseif nargin == 3 + mn = n*m; + k = round(d*mn); # how many entries in S would be satisfactory? + idx=unique(fix(rand(min(k*1.01,k+10),1)*mn))+1; + # idx contains random numbers in [1,mn] + # generate 1% or 10 more random values than necessary + # in order to reduce the probability that there are less than k + # distinct values; + # maybe a better strategy could be used + # but I don't think it's worth the price + k = min(length(idx),k); # actual number of entries in S + j = floor((idx(1:k)-1)/m); + i = idx(1:k) - j*m; + if isempty(i) + S = sparse(m,n); + else + S = sparse(i,j+1,rand(k,1),m,n); + endif + else + usage("sprand(m,n,density) OR sprand(S)"); + endif +endfunction diff -r 9f3299378193 -r 57077d0ddc8e scripts/sparse/sprandn.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scripts/sparse/sprandn.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,49 @@ +## Copyright (C) 2004 Paul Kienzle +## +## This program is free software and is in the public domain + +## -*- texinfo -*- +## @deftypefn {Function File} {} sprand (@var{m}, @var{n}, @var{d}) +## @deftypefnx {Function File} {} sprand (@var{s}) +## Generate a random sparse matrix. The size of the matrix will be +## @var{m} by @var{n}, with a density of values given by @var{d}. +## @var{d} should be between 0 and 1. Values will be normally +## distributed with mean of zero and variance 1. +## +## Note: sometimes the actual density may be a bit smaller than @var{d}. +## This is unlikely to happen for large really sparse matrices. +## +## If called with a single matrix argument, a random sparse matrix is +## generated wherever the matrix @var{S} is non-zero. +## @end deftypefn +## @seealso{sprandn} + +## This program is public domain +## Author: Paul Kienzle + +function S = sprandn(m,n,d) + if nargin == 1 + [i,j,v,nr,nc] = spfind(m); + S = sparse(i,j,randn(size(v)),nr,nc); + elseif nargin == 3 + mn = m*n; + k = round(d*mn); + idx=unique(fix(rand(min(k*1.01,k+10),1)*mn))+1; + # idx contains random numbers in [1,mn] + # generate 1% or 10 more random values than necessary + # in order to reduce the probability that there are less than k + # distinct values; + # maybe a better strategy could be used + # but I don't think it's worth the price + k = min(length(idx),k); # actual number of entries in S + j = floor((idx(1:k)-1)/m); + i = idx(1:k) - j*m; + if isempty(i) + S = sparse(m,n); + else + S = sparse(i,j+1,randn(k,1),m,n); + endif + else + usage("sprandn(m,n,density) OR sprandn(S)"); + endif +endfunction diff -r 9f3299378193 -r 57077d0ddc8e scripts/sparse/spstats.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scripts/sparse/spstats.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,48 @@ +## Copyright (C) 2004 Paul Kienzle +## +## This program is free software and is in the public domain + +## -*- texinfo -*- +## @deftypefn {Function File} {[@var{count}, @var{mean}, @var{var}]} = spstats (@var{s}) +## @deftypefnx {Function File} {[@var{count}, @var{mean}, @var{var}]} = spstats (@var{s}, @var{j}) +## Return the stats for the non-zero elements of the sparse matrix @var{s}. +## @var{count} is the number of non-zeros in each column, @var{mean} +## is the mean of the non-zeros in each column, and @var{var} is the +## variance of the non-zeros in each column. +## +## Called with two output arguments, if @var{s} is the data and @var{j} +## is the bin number for the data, compute the stats for each bin. In +## this case, bins can contain data values of zero, whereas with +## @code{spstats (@var{s})} the zeros may disappear. +## @end deftypefn + +function [count,mean,var] = spstats(S,j) + if nargin < 1 || nargin > 2 + usage("[count, mean, var] = spstats(S) OR spstats(x,j)"); + endif + + [n, m] = size (S); + if nargin == 1 + [i,j,v] = spfind (S); + else + v = S; + i = 1:length (v); + S = sparse (i, j, v); + endif + + count = spsum (sparse (i, j, 1, n, m)); + if (nargout > 1) + mean = spsum(S) ./ count; + end + if (nargout > 2) + ## XXX FIXME XXX Variance with count = 0 or 1? + diff = S - sparse (i, j, mean(j), n, m); + var = spsum (diff .* diff) ./ (count - 1); + end +endfunction + +%!test +%! [n,m,v] = spstats([1 2 1 2 3 4],[2 2 1 1 1 1]); +%! assert(n,[4,2]); +%! assert(m,[10/4,3/2],10*eps); +%! assert(v,[5/3,1/2],10*eps); diff -r 9f3299378193 -r 57077d0ddc8e scripts/sparse/spvcat.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scripts/sparse/spvcat.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,34 @@ +## Copyright (C) 2004 David Bateman & Andy Adler +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +## -*- texinfo -*- +## @deftypefn {Function File} {@var{y} =} spvcat (@var{a1}, @var{a2}, @dots{}, @var{aN}) +## Return the vertical concatenation of sparse matrices. This function +## is obselete and @code{vertcat} should be used +## @end deftypefn +## @seealso {sphcat, vertcat, horzcat, cat} + +function y = spvcat (varargin) + + persistent spvcat_warned = false; + + if (!spvcat_warned) + spvcat_warned = true; + warning ("spvcat: This function is depreciated. Use vertcat instead"); + endif + + y = vertcat (varargin{:}); +endfunction diff -r 9f3299378193 -r 57077d0ddc8e scripts/sparse/spy.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scripts/sparse/spy.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,50 @@ +## Copyright (C) 1998-2004 Andy Adler +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +## -*- texinfo -*- +## @deftypefn {Function File} {} spy (@var{x}) +## Plot the sparsity pattern of the sparse matrix @var{x}. +## @end deftypefn + +function spy(S) + if issparse(S) + [i,j,s,m,n]= spfind(S); + else + [i,j,s] = find(S); + [m,n] = size(S); + endif + + arp = automatic_replot; + unwind_protect + automatic_replot = 0; + + eval(sprintf('gset nokey')) + eval(sprintf('gset yrange [0:%d] reverse',m+1)) + eval(sprintf('gset xrange [0:%d] noreverse',n+1)) + + if (length(i)<1000) + plot(j,i,'*'); + else + plot(j,i,'.'); + endif + + #TODO: we should store the reverse state so we don't undo it + gset yrange [0:1] noreverse + axis; + unwind_protect_cleanup + automatic_replot = arp; + end_unwind_protect +endfunction diff -r 9f3299378193 -r 57077d0ddc8e src/ChangeLog --- a/src/ChangeLog Fri Feb 25 17:42:55 2005 +0000 +++ b/src/ChangeLog Fri Feb 25 19:55:28 2005 +0000 @@ -1,3 +1,282 @@ +2005-02-25 John W. Eaton + + Sparse merge. + + 2005-02-25 John W. Eaton + + * DLD-SRC/rand.cc (Frand): Accept "state" as an alias for "seed". + + * DLD-SRC/dispatch.cc: New file. + * Makefile.in (DLD_XSRC): Add it to the list. + + 2005-02-13 David Bateman + + * ov-fcn-inline.h, DLD-FUNCTIONS/spparms.cc, DLD-FUNCTIONS/gcd.cc: + Remove additional licensing clause, with authors permission + + * ov-base-sparse.h: New constructor to cache SparseType, not yet + used + * ov-re-sparse.h: likewise + * ov-cx-sparse.h: likewise + * ov.h: Likewise + + * sparse-xdiv.cc: Remove spparms umfpack flag + + * DLD-FUNCTIONS/spparms.cc: Warning that umfpack flag is ignored. + + 2005-01-16 David Bateman + + * ls-mat5.cc (read_mat5_integer_data): Change "T &m" to "T *m" and + instantiate with values like octave_int8 rather than int8NDArray. + Modify function to fit + (read_mat5_binary_element): Use new form of read_mat_integer_data + to read data directly into sparse matrix + (write_mat5_integer_data): Change "const T &m" to "T *m", etc. New + instantiation with int. + (save_mat5_binary_element): Modify to save sparse data + + 2005-01-15 David Bateman + + * data.cc (do_cat): Use first non-empty matrix as base for + concatenation. + * pt-mat.cc (tree_matrix::rvalue): ditto. + + 2005-01-14 John W. Eaton + + * ov.cc (do_cat_op): When checking for empty args, use + all_zero_dims, not numel. + * ov.h (octave_value::all_zero_dims): New function. + + * ov-bool-sparse.cc (try_narrowing_conversion): Convert to + bool_matrix, not matrix. + + 2005-01-13 David Bateman + + * data.cc (make_diag): Use numel not capacity to remove ambiguity. + * ov.h (octave_value::capacity): New virtual funtion. + * ov-base.h (octave_base_value::capacity): New function calls numel. + * data.cc (Freshape): Use arg.numel() rather than arg.dims().numel() + since sparse numel now consistent. + * symtab.h (symbol_record::symbol_def::capacity, + symbol_record::capacity): New methods. + * symtab.cc (symbol_record::print_symbol_info_line, + symbol_table::parse_whos_line_format, symbol_table::maybe_list): + used capacity() and not numel() to properly assess size of + sparse objects. + * ov-base-sparse.h (octave_base_sparse::capacity): New function, + (octave_base_sparse::numel): Delete. + * ov-re-sparse.cc (octave_sparse_matrix::streamoff_array_value): + Only fill from non-zero elements of sparse array. + * DLD-FUNCTIONS/splu.cc (Fsplu): Change use of nelem to numel. + * ov.cc (do_cat_op): Early return for concatenation with empty + objects. + + 2005-01-12 John W. Eaton + + * DLD-FUNCTIONS/find.cc (Ffind): Make it work for character strings. + + 2005-01-11 John W. Eaton + + * OPERATORS/op-double-conv.cc: New conversions for sparse_matrix + and sparse_bool_matrix to matrix. + + 2005-01-11 David Bateman + + * ov-base-sparse.h (octave_base_sparse::any, + octave_base_sparse::all): Use new constructors, etc as pointed out + by JWE. + + 2005-01-10 John W. Eaton + + * DLD-FUNCTIONS/sparse.cc (MINMAX_BODY, Fspatan2, make_spdiag): + Write retval(0) = result instead of retval(0) = octave_value (result). + * DLD-FUNCTIONS/splu.cc (Fsplu): Likewise. + + 2005-01-08 David Bateman + + * ls-mat5.cc (read_mat5_integer_data): Instantiate for Array + (read_mat5_binary_element): Add code to read sparse matrices + saved in matlab v5 format + + 2005-01-07 David Bateman + + * OPERATORS/op-bm-sbm.cc, OPERATORS/op-b-sbm.cc, + OPERATORS/op-cm-scm.cc, OPERATORS/op-cm-sm.cc, + OPERATORS/op-cs-scm.cc, OPERATORS/op-cs-sm.cc, + OPERATORS/op-m-scm.cc, OPERATORS/op-m-sm.cc, + OPERATORS/op-sbm-b.cc, OPERATORS/op-sbm-bm.cc, + OPERATORS/op-sbm-sbm.cc, OPERATORS/op-scm-cm.cc, + OPERATORS/op-scm-cs.cc, OPERATORS/op-scm-m.cc, + OPERATORS/op-scm-s.cc, OPERATORS/op-scm-scm.cc, + OPERATORS/op-scm-sm.cc, OPERATORS/op-sm-cm.cc, + OPERATORS/op-sm-cs.cc, OPERATORS/op-sm-m.cc, + OPERATORS/op-sm-s.cc, OPERATORS/op-sm-scm.cc, + OPERATORS/op-sm-sm.cc, OPERATORS/op-s-scm.cc, + OPERATORS/op-s-sm.cc: New octave_value constructors allow + macros from ops.h to be used rather than sparse-ops.h. Remove + other explicit uses of maybe_mutate. + + * sparse-ops.h: delete file. + + * colamd.cc (Fcolamd, Fsymamd, Fetree): Remove no longer needed + use of get_rep() and use the sparse matrix conversion functions + directly. + + * data.cc (Freshape): Use arg.dims().numel() rather than + arg.numel() due to definition of numel for sparse matrices. + + * sparse.cc (Ffull, Fspfind, SPARSE_DIM_ARG_BODY, MINMAX_BODY, + Fspatan2, make_spdiag): Convert to use new octave_value sparse + constructors, sparse matrix conversion functions and remove + maybe_mutate calls. + (Fspreshape): Delete + + * splu.cc (Fsplu): Remove remaining explicit octave_value + construction. + + * ov-base-sparse.h (do_index_op, resize, reshape, permute, squeeze): + Move these methods from the derived classes. + * ov-base-spase.cc (do_index_op): Move this method from the derived + classes. + * ov-bool-sparse.h (do_index_op, resize, reshape, permute, squeeze): + delete. + * ov-re-spase.cc (do_index_op): delete. + * ov-cx-sparse.h (do_index_op, resize, reshape, permute, squeeze): + delete. + * ov-cx-spase.cc (do_index_op): delete. + * ov-bool-spase.cc (do_index_op): delete. + * ov-re-sparse.h (do_index_op, resize, reshape, permute, squeeze): + delete. + + * DLD-FUNCTIONS/spdet.cc (Fspdet): Remove use of SparseDet and + SparseComplexDET classes and use DET and ComplexDET classes. + + * DLD-FUNCTIONS/colamd.cc op-bm-sbm.cc OPERATORS/op-b-sbm.cc + OPERATORS/op-cm-scm.cc OPERATORS/op-cm-sm.cc OPERATORS/op-cs-scm.cc + OPERATORS/op-cs-sm.cc OPERATORS/op-fil-sbm.cc OPERATORS/op-fil-scm.cc + OPERATORS/op-fil-sm.cc OPERATORS/op-m-scm.cc OPERATORS/op-m-sm.cc + OPERATORS/op-sbm-b.cc OPERATORS/op-sbm-bm.cc OPERATORS/op-sbm-sbm.cc + OPERATORS/op-scm-cm.cc OPERATORS/op-scm-cs.cc OPERATORS/op-scm-m.cc + OPERATORS/op-scm-s.cc OPERATORS/op-scm-scm.cc OPERATORS/op-scm-sm.cc + OPERATORS/op-sm-cm.cc OPERATORS/op-sm-cs.cc OPERATORS/op-sm-m.cc + OPERATORS/op-sm-s.cc OPERATORS/op-sm-scm.cc OPERATORS/op-sm-sm.cc + OPERATORS/op-s-scm.cc OPERATORS/op-s-sm.cc ov-base-sparse.cc + ov-base-sparse.h ov-bool-sparse.cc ov-bool-sparse.h ov-cx-sparse.cc + ov-cx-sparse.h ov-re-sparse.cc ov-re-sparse.h sparse-base-lu.cc + sparse-base-lu.h DLD-FUNCTIONS/sparse.cc sparse-xdiv.cc sparse-xdiv.h + sparse-xpow.cc sparse-xpow.h DLD-FUNCTIONS/spdet.cc + DLD-FUNCTIONS/splu.cc DLD-FUNCTIONS/spparms.cc: Remove additional + licensing clause with authors permission. + + 2005-01-05 David Bateman + + * DLD-FUNCTIONS/colamd.cc: Rename from colamdoct.cc. Base colamd.h + now found in COLAMD/colamd.h. + (Fcolamd): Return value is now used. + (Fsymamd): ditto. + + * Makefile.in: include colamd.cc in DLD_XSRC. + + * ov.h (sparse_matrix_value, sparse_complex_matrix_value, + sparse_bool_matrix_value): New virtual functions + + * ov-base.cc (octave_base_value::sparse_matrix_value, + octave_base_value::sparse_complex_matrix_value, + octave_base_value::sparse_bool_matrix_value): New default sparse + matrix extraction functions. + + * ov-base.h (sparse_matrix_value, sparse_complex_matrix_value, + sparse_bool_matrix_value): Declare them. + + * ov-re-mat.cc (octave_matrix::sparse_matrix_value, + octave_matrix::sparse_complex_matrix_value): Conversion functions. + + * ov-re-mat.h (sparse_matrix_value, sparse_complex_matrix_value): + Declare them. + + * ov-cx-mat.cc (octave_complex_matrix::sparse_matrix_value, + octave_complex_matrix::sparse_complex_matrix_value): Conversion + functions. + + * ov-cx-mat.h (sparse_matrix_value, sparse_complex_matrix_value): + Declare them. + + * ov-bool-mat.h (sparse_matrix_value, sparse_complex_matrix_value, + sparse_bool_matrix_value): Conversion functions. + + * DLD_FUNCTIONS/spdet.cc (Fspdet): Use the above constructors + and conversion functions. + * DLD_FUNCTIONS/splu.cc (Fsplu): ditto. + + 2004-12-30 John W. Eaton + + * DLD-FUNCTIONS/splu.cc (Fsplu): Avoid shadow warnings. + + * sparse-xpow.cc (elem_xpow): Delete unsed variables. + * sparse-xdiv.cc (x_el_div): Likewise. + + * DLD-FUNCTIONS/det.cc (Fdet): Delete unused argument nargout. + * DLD-FUNCTIONS/spdet.cc (Fspdet): Likewise. + + * DLD-FUNCTIONS/sparse.cc (Fnzmax): Return a value. + + * ov.cc, ov.h (octave_value::octave_value (const SparseMatrix&), + (octave_value::octave_value (const SparseBoolMatrix&), + (octave_value::octave_value (const SparseComplexMatrix&)): + New constructors. + + 2004-12-29 John W. Eaton + + * DLD-FUNCTIONS/sparse.cc (SPARSE_DIM_ARG_BODY): Rename from + DEFUN_DLD_SPARSE_DIM_ARG. Omit HELP arg. Omit DEFUN_DLD, so the + macro only defines the function body. + (Fspprod, Fspcumprod, Fspsum, Fspcumsum, Fspsumsq): Define with + DEFUN_DLD, not DEFUN_DLD_SPARSE_DIM_ARG. Use SPARSE_DIM_ARG_BODY + to define function body. + + * DLD-FUNCTIONS/sparse.cc (load_sparse_type, sparse_type_loaded): + Delete function, variable, and all uses. + * ov.cc: Include ov-bool-sparse.h, ov-re-sparse.h, ov-cx-sparse.h. + (install_types): Register sparse types. + + Merge of sparse code from David Bateman and + Andy Adler . + + * sparse-xdiv.cc, sparse-xpow.cc: New files. + * Makefile.in (DIST_SRC): Add them to the list. + + * sparse-ops.h sparse-xdiv.h, sparse-xpow.h: New files. + * Makefile.in (INCLUDES): Add them to the list. + + * DLD-FUNCTIONS/colamdoct.cc, DLD-FUNCTIONS/sparse.cc, + DLD-FUNCTIONS/spdet.cc, DLD-FUNCTIONS/splu.cc, + DLD-FUNCTIONS/spparms.cc: New files. + * Makefile.in (DLD_XSRC): Add them to the list. + + * ov-base-sparse.cc, ov-base-sparse.h, ov-bool-sparse.cc, + ov-bool-sparse.h, ov-cx-sparse.cc, ov-cx-sparse.h, + ov-re-sparse.cc, ov-re-sparse.h: New files. + * Makefile.in (OV_SPARSE_SRC, OV_SPARSE_INCLUDES): New lists. + (OV_SRC): Add $(OV_SPARSE_SRC) to the list. + (INCLUDES): Add $(OV_SPARSE_INCLUDES) to the list. + + * OPERATORS/op-bm-sbm.cc, OPERATORS/op-b-sbm.cc, + OPERATORS/op-cm-scm.cc, OPERATORS/op-cm-sm.cc, + OPERATORS/op-cs-scm.cc, OPERATORS/op-cs-sm.cc, + OPERATORS/op-fil-sbm.cc, OPERATORS/op-fil-scm.cc, + OPERATORS/op-fil-sm.cc, OPERATORS/op-m-scm.cc, + OPERATORS/op-m-sm.cc, OPERATORS/op-sbm-b.cc, + OPERATORS/op-sbm-bm.cc, OPERATORS/op-sbm-sbm.cc, + OPERATORS/op-scm-cm.cc, OPERATORS/op-scm-cs.cc, + OPERATORS/op-scm-m.cc, OPERATORS/op-scm-s.cc, + OPERATORS/op-scm-scm.cc, OPERATORS/op-scm-sm.cc, + OPERATORS/op-sm-cm.cc, OPERATORS/op-sm-cs.cc, + OPERATORS/op-sm-m.cc, OPERATORS/op-sm-s.cc, + OPERATORS/op-sm-scm.cc, OPERATORS/op-sm-sm.cc, + OPERATORS/op-s-scm.cc, OPERATORS/op-s-sm.cc: New files. + * Makefile.in (SPARSE_OP_XSRC): New list. + (OP_XSRC): Add $(SPARSE_OP_XSRC) to the list. + 2005-02-23 John W. Eaton * parse.y (fold (tree_binary_expression*)): Skip constant folding diff -r 9f3299378193 -r 57077d0ddc8e src/DLD-FUNCTIONS/colamd.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/DLD-FUNCTIONS/colamd.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,726 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +// This is the octave interface to colamd, which bore the copyright given +// in the help of the functions. + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include +#include + +#include "ov.h" +#include "defun-dld.h" +#include "pager.h" +#include "ov-re-mat.h" + +#include "ov-re-sparse.h" +#include "ov-cx-sparse.h" + +// External COLAMD functions in C +extern "C" { +#include "COLAMD/colamd.h" +} + +// The symmetric column elimination tree code take from the Davis LDL code. +// Copyright given elsewhere in this file. +static +void symetree (const int *ridx, const int *cidx, int *Parent, int *P, int n) +{ + OCTAVE_LOCAL_BUFFER (int, Flag, n); + OCTAVE_LOCAL_BUFFER (int, Pinv, (P ? n : 0)); + if (P) + // If P is present then compute Pinv, the inverse of P + for (int k = 0 ; k < n ; k++) + Pinv [P [k]] = k ; + + for (int k = 0 ; k < n ; k++) + { + // L(k,:) pattern: all nodes reachable in etree from nz in A(0:k-1,k) + Parent [k] = n ; // parent of k is not yet known + Flag [k] = k ; // mark node k as visited + int kk = (P) ? (P [k]) : (k) ; // kth original, or permuted, column + int p2 = cidx [kk+1] ; + for (int p = cidx [kk] ; p < p2 ; p++) + { + // A (i,k) is nonzero (original or permuted A) + int i = (Pinv) ? (Pinv [ridx [p]]) : (ridx [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] == n) + Parent [i] = k ; + Flag [i] = k ; // mark i as visited + } + } + } + } +} + +// The elimination tree post-ordering code below is taken from SuperLU +static inline +int make_set (int i, int *pp) +{ + pp[i] = i; + return i; +} + +static inline +int link (int s, int t, int *pp) +{ + pp[s] = t; + return t; +} + +static inline +int find (int i, int *pp) +{ + register int p, gp; + + p = pp[i]; + gp = pp[p]; + while (gp != p) { + pp[i] = gp; + i = gp; + p = pp[i]; + gp = pp[p]; + } + return (p); +} + +static +int etdfs (int v, int *first_kid, int *next_kid, int *post, int postnum) +{ + for (int w = first_kid[v]; w != -1; w = next_kid[w]) { + postnum = etdfs (w, first_kid, next_kid, post, postnum); + } + post[postnum++] = v; + + return postnum; +} + +static +void TreePostorder(int n, int *parent, int *post) +{ + // Allocate storage for working arrays and results + OCTAVE_LOCAL_BUFFER (int, first_kid, n+1); + OCTAVE_LOCAL_BUFFER (int, next_kid, n+1); + + // Set up structure describing children + for (int v = 0; v <= n; first_kid[v++] = -1); + for (int v = n-1; v >= 0; v--) + { + int dad = parent[v]; + next_kid[v] = first_kid[dad]; + first_kid[dad] = v; + } + + // Depth-first search from dummy root vertex #n + etdfs (n, first_kid, next_kid, post, 0); +} + +static +void coletree (const int *ridx, const int *colbeg, int *colend, + int *parent, int nr, int nc) +{ + OCTAVE_LOCAL_BUFFER (int, root, nc); + OCTAVE_LOCAL_BUFFER (int, pp, nc); + OCTAVE_LOCAL_BUFFER (int, firstcol, nr); + + // Compute firstcol[row] = first nonzero column in row + for (int row = 0; row < nr; firstcol[row++] = nc); + for (int col = 0; col < nc; col++) + for (int p = colbeg[col]; p < colend[col]; p++) + { + int row = ridx[p]; + if (firstcol[row] > col) + firstcol[row] = col; + } + + // Compute etree by Liu's algorithm for symmetric matrices, + // except use (firstcol[r],c) in place of an edge (r,c) of A. + // Thus each row clique in A'*A is replaced by a star + // centered at its first vertex, which has the same fill. + for (int col = 0; col < nc; col++) + { + int cset = make_set (col, pp); + root[cset] = col; + parent[col] = nc; + for (int p = colbeg[col]; p < colend[col]; p++) + { + int row = firstcol[ridx[p]]; + if (row >= col) + continue; + int rset = find (row, pp); + int rroot = root[rset]; + if (rroot != col) + { + parent[rroot] = col; + cset = link (cset, rset, pp); + root[cset] = col; + } + } + } +} + +DEFUN_DLD (colamd, args, nargout, + "-*- texinfo -*-\n\ +@deftypefn {Loadable Function} {@var{p} =} colamd (@var{s})\n\ +@deftypefnx {Loadable Function} {@var{p} =} colamd (@var{s}, @var{knobs})\n\ +@deftypefnx {Loadable Function} {[@var{p}, @var{stats}] =} colamd (@var{s})\n\ +@deftypefnx {Loadable Function} {[@var{p}, @var{stats}] =} colamd (@var{s}, @var{knobs})\n\ +\n\ +Column approximate minimum degree permutation. @code{@var{p} = colamd\n\ +(@var{s})} returns the column approximate minimum degree permutation\n\ +vector for the sparse matrix @var{s}. For a non-symmetric matrix @var{s},\n\ +@code{@var{s} (:,@var{p})} tends to have sparser LU factors than @var{s}.\n\ +The Cholesky factorization of @code{@var{s} (:,@var{p})' * @var{s}\n\ +(:,@var{p})} also tends to be sparser than that of @code{@var{s}' *\n\ +@var{s}}.\n\ +\n\ +@var{knobs} is an optional two-element input vector. If @var{s} is\n\ +m-by-n, then rows with more than @code{(@var{knobs} (1)) * @var{n}}\n\ +entries are ignored. Columns with more than @code{(@var{knobs} (2)) *\n\ +@var{m}} entries are removed prior to ordering, and ordered last in the\n\ +output permutation @var{p}. If the knobs parameter is not present, then\n\ +0.5 is used instead, for both @code{@var{knobs} (1)} and\n\ +@code{@var{knobs} (2)}. @code{@var{knobs} (3)} controls the printing of\n\ +statistics and error messages.\n\ +\n\ +@var{stats} is an optional 20-element output vector that provides data\n\ +about the ordering and the validity of the input matrix @var{s}. Ordering\n\ +statistics are in @code{@var{stats} (1:3)}. @code{@var{stats} (1)} and\n\ +@code{@var{stats} (2)} are the number of dense or empty rows and columns\n\ +ignored by COLAMD and @code{@var{stats} (3)} is the number of garbage\n\ +collections performed on the internal data structure used by COLAMD\n\ +(roughly of size @code{2.2 * nnz(@var{s}) + 4 * @var{m} + 7 * @var{n}}\n\ +integers).\n\ +\n\ +Octave built-in functions are intended to generate valid sparse matrices,\n\ +with no duplicate entries, with ascending row indices of the nonzeros\n\ +in each column, with a non-negative number of entries in each column (!)\n\ +and so on. If a matrix is invalid, then COLAMD may or may not be able\n\ +to continue. If there are duplicate entries (a row index appears two or\n\ +more times in the same column) or if the row indices in a column are out\n\ +of order, then COLAMD can correct these errors by ignoring the duplicate\n\ +entries and sorting each column of its internal copy of the matrix\n\ +@var{s} (the input matrix @var{s} is not repaired, however). If a matrix\n\ +is invalid in other ways then COLAMD cannot continue, an error message is\n\ +printed, and no output arguments (@var{p} or @var{stats}) are returned.\n\ +COLAMD is thus a simple way to check a sparse matrix to see if it's\n\ +valid.\n\ +\n\ +@code{@var{stats} (4:7)} provide information if COLAMD was able to\n\ +continue. The matrix is OK if @code{@var{stats} (4)} is zero, or 1 if\n\ +invalid. @code{@var{stats} (5)} is the rightmost column index that is\n\ +unsorted or contains duplicate entries, or zero if no such column exists.\n\ +@code{@var{stats} (6)} is the last seen duplicate or out-of-order row\n\ +index in the column index given by @code{@var{stats} (5)}, or zero if no\n\ +such row index exists. @code{@var{stats} (7)} is the number of duplicate\n\ +or out-of-order row indices. @code{@var{stats} (8:20)} is always zero in\n\ +the current version of COLAMD (reserved for future use).\n\ +\n\ +The ordering is followed by a column elimination tree post-ordering.\n\ +\n\ +The authors of the code itself are Stefan I. Larimore and Timothy A.\n\ +Davis (davis@@cise.ufl.edu), University of Florida. The algorithm was\n\ +developed in collaboration with John Gilbert, Xerox PARC, and Esmond\n\ +Ng, Oak Ridge National Laboratory. (see\n\ +@url{http://www.cise.ufl.edu/research/sparse/colamd})\n\ +@end deftypefn\n\ +@seealso{colperm, symamd}") +{ + octave_value_list retval; + int nargin = args.length (); + int spumoni = 0; + + if (nargout < 0 || nargout > 2 || nargin < 0 || nargin > 2) + usage ("colamd: incorrect number of input and/or output arguments"); + else + { + // Get knobs + OCTAVE_LOCAL_BUFFER (double, knobs, COLAMD_KNOBS); + colamd_set_defaults (knobs); + + // Check for user-passed knobs + if (nargin == 2) + { + NDArray User_knobs = args(1).array_value (); + int nel_User_knobs = User_knobs.length (); + + if (nel_User_knobs > 0) + knobs [COLAMD_DENSE_ROW] = User_knobs (COLAMD_DENSE_ROW); + if (nel_User_knobs > 1) + knobs [COLAMD_DENSE_COL] = User_knobs (COLAMD_DENSE_COL) ; + if (nel_User_knobs > 2) + spumoni = (int) User_knobs (2); + } + + // print knob settings if spumoni is set + if (spumoni > 0) + { + octave_stdout << "colamd: dense row fraction: " + << knobs [COLAMD_DENSE_ROW] << std::endl; + octave_stdout << "colamd: dense col fraction: " + << knobs [COLAMD_DENSE_COL] << std::endl; + } + + int n_row, n_col, nnz; + int *ridx, *cidx; + SparseComplexMatrix scm; + SparseMatrix sm; + + if (args(0).class_name () == "sparse") + { + if (args(0).is_complex_type ()) + { + scm = args(0). sparse_complex_matrix_value (); + n_row = scm.rows (); + n_col = scm.cols (); + nnz = scm.nnz (); + ridx = scm.xridx (); + cidx = scm.xcidx (); + } + else + { + sm = args(0).sparse_matrix_value (); + + n_row = sm.rows (); + n_col = sm.cols (); + nnz = sm.nnz (); + ridx = sm.xridx (); + cidx = sm.xcidx (); + } + } + else + { + if (args(0).is_complex_type ()) + sm = SparseMatrix (real (args(0).complex_matrix_value ())); + else + sm = SparseMatrix (args(0).matrix_value ()); + + n_row = sm.rows (); + n_col = sm.cols (); + nnz = sm.nnz (); + ridx = sm.xridx (); + cidx = sm.xcidx (); + } + + // Allocate workspace for colamd + OCTAVE_LOCAL_BUFFER (int, p, n_col+1); + for (int i = 0; i < n_col+1; i++) + p[i] = cidx [i]; + + int Alen = colamd_recommended (nnz, n_row, n_col); + OCTAVE_LOCAL_BUFFER (int, A, Alen); + for (int i = 0; i < nnz; i++) + A[i] = ridx [i]; + + // Order the columns (destroys A) + OCTAVE_LOCAL_BUFFER (int, stats, COLAMD_STATS); + if (!colamd (n_row, n_col, Alen, A, p, knobs, stats)) + { + colamd_report (stats) ; + error ("colamd: internal error!"); + return retval; + } + + // column elimination tree post-ordering (reuse variables) + OCTAVE_LOCAL_BUFFER (int, colbeg, n_col + 1); + OCTAVE_LOCAL_BUFFER (int, colend, n_col + 1); + OCTAVE_LOCAL_BUFFER (int, etree, n_col + 1); + + for (int i = 0; i < n_col; i++) + { + colbeg[i] = cidx[p[i]]; + colend[i] = cidx[p[i]+1]; + } + + coletree (ridx, colbeg, colend, etree, n_row, n_col); + + // Calculate the tree post-ordering + TreePostorder (n_col, etree, colbeg); + + // return the permutation vector + NDArray out_perm (dim_vector (1, n_col)); + for (int i = 0; i < n_col; i++) + out_perm(i) = p [colbeg [i]] + 1; + + retval (0) = out_perm; + + // print stats if spumoni > 0 + if (spumoni > 0) + colamd_report (stats) ; + + // Return the stats vector + if (nargout == 2) + { + NDArray out_stats (dim_vector (1, COLAMD_STATS)); + for (int i = 0 ; i < COLAMD_STATS ; i++) + out_stats (i) = stats [i] ; + retval(1) = out_stats; + + // fix stats (5) and (6), for 1-based information on + // jumbled matrix. note that this correction doesn't + // occur if symamd returns FALSE + out_stats (COLAMD_INFO1) ++ ; + out_stats (COLAMD_INFO2) ++ ; + } + } + + return retval; +} + +DEFUN_DLD (symamd, args, nargout, + "-*- texinfo -*-\n\ +@deftypefn {Loadable Function} {@var{p} =} symamd (@var{s})\n\ +@deftypefnx {Loadable Function} {@var{p} =} symamd (@var{s}, @var{knobs})\n\ +@deftypefnx {Loadable Function} {[@var{p}, @var{stats}] =} symamd (@var{s})\n\ +@deftypefnx {Loadable Function} {[@var{p}, @var{stats}] =} symamd (@var{s}, @var{knobs})\n\ +\n\ +For a symmetric positive definite matrix @var{s}, returns the permutation\n\ +vector p such that @code{@var{s} (@var{p}, @var{p})} tends to have a\n\ +sparser Cholesky factor than @var{s}. Sometimes SYMAMD works well for\n\ +symmetric indefinite matrices too. The matrix @var{s} is assumed to be\n\ +symmetric; only the strictly lower triangular part is referenced. @var{s}\n\ +must be square.\n\ +\n\ +@var{knobs} is an optional input argument. If @var{s} is n-by-n, then\n\ +rows and columns with more than @code{@var{knobs} (1) * @var{n}} entries\n\ +are removed prior to ordering, and ordered last in the output permutation\n\ +@var{p}. If the @var{knobs} parameter is not present, then the default of\n\ +0.5 is used instead. @code{@var{knobs} (2)} controls the printing of\n\ +statistics and error messages.\n\ +\n\ +@var{stats} is an optional 20-element output vector that provides data\n\ +about the ordering and the validity of the input matrix @var{s}. Ordering\n\ +statistics are in @code{@var{stats} (1:3)}. @code{@var{stats} (1) =\n\ +@var{stats} (2)} is the number of dense or empty rows and columns\n\ +ignored by SYMAMD and @code{@var{stats} (3)} is the number of garbage\n\ +collections performed on the internal data structure used by SYMAMD\n\ +(roughly of size @code{8.4 * nnz (tril (@var{s}, -1)) + 9 * @var{n}}\n\ +integers).\n\ +\n\ +Octave built-in functions are intended to generate valid sparse matrices,\n\ +with no duplicate entries, with ascending row indices of the nonzeros\n\ +in each column, with a non-negative number of entries in each column (!)\n\ +and so on. If a matrix is invalid, then SYMAMD may or may not be able\n\ +to continue. If there are duplicate entries (a row index appears two or\n\ +more times in the same column) or if the row indices in a column are out\n\ +of order, then SYMAMD can correct these errors by ignoring the duplicate\n\ +entries and sorting each column of its internal copy of the matrix S (the\n\ +input matrix S is not repaired, however). If a matrix is invalid in\n\ +other ways then SYMAMD cannot continue, an error message is printed, and\n\ +no output arguments (@var{p} or @var{stats}) are returned. SYMAMD is\n\ +thus a simple way to check a sparse matrix to see if it's valid.\n\ +\n\ +@code{@var{stats} (4:7)} provide information if SYMAMD was able to\n\ +continue. The matrix is OK if @code{@var{stats} (4)} is zero, or 1\n\ +if invalid. @code{@var{stats} (5)} is the rightmost column index that\n\ +is unsorted or contains duplicate entries, or zero if no such column\n\ +exists. @code{@var{stats} (6)} is the last seen duplicate or out-of-order\n\ +row index in the column index given by @code{@var{stats} (5)}, or zero\n\ +if no such row index exists. @code{@var{stats} (7)} is the number of\n\ +duplicate or out-of-order row indices. @code{@var{stats} (8:20)} is\n\ +always zero in the current version of SYMAMD (reserved for future use).\n\ +\n\ +The ordering is followed by a column elimination tree post-ordering.\n\ +\n\ +\n\ +The authors of the code itself are Stefan I. Larimore and Timothy A.\n\ +Davis (davis@@cise.ufl.edu), University of Florida. The algorithm was\n\ +developed in collaboration with John Gilbert, Xerox PARC, and Esmond\n\ +Ng, Oak Ridge National Laboratory. (see\n\ +@url{http://www.cise.ufl.edu/research/sparse/colamd})\n\ +@end deftypefn\n\ +@seealso{colperm, colamd}") +{ + octave_value_list retval; + int nargin = args.length (); + int spumoni = 0; + + if (nargout < 0 || nargout > 2 || nargin < 0 || nargin > 2) + usage ("symamd: incorrect number of input and/or output arguments"); + else + { + // Get knobs + OCTAVE_LOCAL_BUFFER (double, knobs, COLAMD_KNOBS); + colamd_set_defaults (knobs); + + // Check for user-passed knobs + if (nargin == 2) + { + NDArray User_knobs = args(1).array_value (); + int nel_User_knobs = User_knobs.length (); + + if (nel_User_knobs > 0) + knobs [COLAMD_DENSE_ROW] = User_knobs (COLAMD_DENSE_ROW); + if (nel_User_knobs > 1) + spumoni = (int) User_knobs (1); + } + + // print knob settings if spumoni is set + if (spumoni > 0) + octave_stdout << "symamd: dense row/col fraction: " + << knobs [COLAMD_DENSE_ROW] << std::endl; + + int n_row, n_col, nnz; + int *ridx, *cidx; + SparseMatrix sm; + SparseComplexMatrix scm; + + if (args(0).class_name () == "sparse") + { + if (args(0).is_complex_type ()) + { + scm = args(0).sparse_complex_matrix_value (); + n_row = scm.rows (); + n_col = scm.cols (); + nnz = scm.nnz (); + ridx = scm.xridx (); + cidx = scm.xcidx (); + } + else + { + sm = args(0).sparse_matrix_value (); + n_row = sm.rows (); + n_col = sm.cols (); + nnz = sm.nnz (); + ridx = sm.xridx (); + cidx = sm.xcidx (); + } + } + else + { + if (args(0).is_complex_type ()) + sm = SparseMatrix (real (args(0).complex_matrix_value ())); + else + sm = SparseMatrix (args(0).matrix_value ()); + + n_row = sm.rows (); + n_col = sm.cols (); + nnz = sm.nnz (); + ridx = sm.xridx (); + cidx = sm.xcidx (); + } + + if (n_row != n_col) + { + error ("symamd: matrix must be square"); + return retval; + } + + // Allocate workspace for symamd + OCTAVE_LOCAL_BUFFER (int, perm, n_col+1); + OCTAVE_LOCAL_BUFFER (int, stats, COLAMD_STATS); + if (!symamd (n_col, ridx, cidx, perm, knobs, stats, &calloc, &free)) + { + symamd_report (stats) ; + error ("symamd: internal error!") ; + return retval; + } + + // column elimination tree post-ordering + OCTAVE_LOCAL_BUFFER (int, etree, n_col + 1); + symetree (ridx, cidx, etree, perm, n_col); + + // Calculate the tree post-ordering + OCTAVE_LOCAL_BUFFER (int, post, n_col + 1); + TreePostorder (n_col, etree, post); + + // return the permutation vector + NDArray out_perm (dim_vector (1, n_col)); + for (int i = 0; i < n_col; i++) + out_perm(i) = perm [post [i]] + 1; + + retval (0) = out_perm; + + // print stats if spumoni > 0 + if (spumoni > 0) + symamd_report (stats) ; + + // Return the stats vector + if (nargout == 2) + { + NDArray out_stats (dim_vector (1, COLAMD_STATS)); + for (int i = 0 ; i < COLAMD_STATS ; i++) + out_stats (i) = stats [i] ; + retval(1) = out_stats; + + // fix stats (5) and (6), for 1-based information on + // jumbled matrix. note that this correction doesn't + // occur if symamd returns FALSE + out_stats (COLAMD_INFO1) ++ ; + out_stats (COLAMD_INFO2) ++ ; + } + } + + return retval; +} + +DEFUN_DLD (etree, args, nargout, + "-*- texinfo -*-\n\ +@deftypefn {Loadable Function} {@var{p} =} etree (@var{s})\n\ +@deftypefnx {Loadable Function} {@var{p} =} etree (@var{s}, @var{typ})\n\ +@deftypefnx {Loadable Function} {[@var{p}, @var{q}] =} etree (@var{s}, @var{typ})\n\ +\n\ +Returns the elimination tree for the matrix @var{s}. By default @var{s}\n\ +is assumed to be symmetric and the symmetric elimination tree is\n\ +returned. The argument @var{typ} controls whether a symmetric or\n\ +column elimination tree is returned. Valid values of @var{typ} are\n\ +'sym' or 'col', for symmetric or column elimination tree respectively\n\ +\n\ +Called with a second argument, @dfn{etree} also returns the postorder\n\ +permutations on the tree.\n\ +@end deftypefn") +{ + octave_value_list retval; + int nargin = args.length (); + + if (nargout < 0 || nargout > 2 || nargin < 0 || nargin > 2) + usage ("etree: incorrect number of input and/or output arguments"); + else + { + int n_row, n_col, nnz; + int *ridx, *cidx; + bool is_sym = true; + SparseMatrix sm; + SparseComplexMatrix scm; + + if (args(0).class_name () == "sparse") + { + if (args(0).is_complex_type ()) + { + scm = args(0).sparse_complex_matrix_value (); + n_row = scm.rows (); + n_col = scm.cols (); + nnz = scm.nnz (); + ridx = scm.xridx (); + cidx = scm.xcidx (); + } + else + { + sm = args(0).sparse_matrix_value (); + n_row = sm.rows (); + n_col = sm.cols (); + nnz = sm.nnz (); + ridx = sm.xridx (); + cidx = sm.xcidx (); + } + + } + else + { + error ("etree: must be called with a sparse matrix"); + return retval; + } + + if (nargin == 2) + if (args(1).is_string ()) + { + std::string str = args(1).string_value (); + if (str.find("C") == 0 || str.find("c") == 0) + is_sym = false; + } + else + { + error ("etree: second argument must be a string"); + return retval; + } + + // column elimination tree post-ordering (reuse variables) + OCTAVE_LOCAL_BUFFER (int, etree, n_col + 1); + + + if (is_sym) + { + if (n_row != n_col) + { + error ("etree: matrix is marked as symmetric, but not square"); + return retval; + } + symetree (ridx, cidx, etree, NULL, n_col); + } + else + { + OCTAVE_LOCAL_BUFFER (int, colbeg, n_col); + OCTAVE_LOCAL_BUFFER (int, colend, n_col); + + for (int i = 0; i < n_col; i++) + { + colbeg[i] = cidx[i]; + colend[i] = cidx[i+1]; + } + + coletree (ridx, colbeg, colend, etree, n_row, n_col); + } + + NDArray tree (dim_vector (1, n_col)); + for (int i = 0; i < n_col; i++) + // We flag a root with n_col while Matlab does it with zero + // Convert for matlab compatiable output + if (etree[i] == n_col) + tree (i) = 0; + else + tree (i) = etree[i] + 1; + + retval (0) = tree; + + if (nargout == 2) + { + // Calculate the tree post-ordering + OCTAVE_LOCAL_BUFFER (int, post, n_col + 1); + TreePostorder (n_col, etree, post); + + NDArray postorder (dim_vector (1, n_col)); + for (int i = 0; i < n_col; i++) + postorder (i) = post[i] + 1; + + retval (1) = postorder; + } + } + + return retval; +} + +DEFUN_DLD (symbfact, args, nargout, + "-*- texinfo -*-\n\ +@deftypefn {Loadable Function} {[@var{count}, @var{h}, @var{parent}, @var{post}, @var{r}]} = symbfact (@var{s}, @var{typ})\n\ +\n\ +Performs a symbolic factorization analysis on the sparse matrix @var{s}.\n\ +@end deftypefn") +{ + error ("symbfact: not implemented yet"); + return octave_value (); +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/DLD-FUNCTIONS/det.cc --- a/src/DLD-FUNCTIONS/det.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/DLD-FUNCTIONS/det.cc Fri Feb 25 19:55:28 2005 +0000 @@ -33,7 +33,7 @@ #include "oct-obj.h" #include "utils.h" -DEFUN_DLD (det, args, nargout, +DEFUN_DLD (det, args, , "-*- texinfo -*-\n\ @deftypefn {Loadable Function} {[@var{d}, @var{rcond}] = } det (@var{a})\n\ Compute the determinant of @var{a} using @sc{Lapack}. Return an estimate\n\ @@ -111,9 +111,7 @@ } } else - { - gripe_wrong_type_arg ("det", arg); - } + gripe_wrong_type_arg ("det", arg); return retval; } diff -r 9f3299378193 -r 57077d0ddc8e src/DLD-FUNCTIONS/dispatch.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/DLD-FUNCTIONS/dispatch.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,599 @@ +/* + +Copyright (C) 2001 John W. Eaton and Paul Kienzle + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with Octave; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include "defun-dld.h" +#include "ov.h" +#include "ov-fcn.h" +#include "ov-typeinfo.h" +#include "pager.h" +#include "parse.h" +#include "symtab.h" +#include "variables.h" + +// XXX FIXME XXX should be using a map from type_id->name, rather +// than type_name->name + +template class std::map; + +typedef std::map Table; + +class +octave_dispatch : public octave_function +{ +public: + + // XXX FIXME XXX need to handle doc strings of dispatched functions, for + // example, by appending "for (,...) see " for each + // time dispatch(f,type,name) is called. + octave_dispatch (const std::string &nm) + : octave_function (nm, "Overloaded function"), tab (), base (nm), + has_alias (false) + { } + + // XXX FIXME XXX if we get deleted, we should restore the original + // symbol_record from base before dying. + ~octave_dispatch (void) { } + + bool is_builtin_function (void) const { return true; } + + octave_function *function_value (bool) { return this; } + + octave_value do_index_op (const octave_value_list&, int) + { + error ("dispatch: do_index_op"); + return octave_value (); + } + + octave_value subsref (const std::string&, + const std::list&) + { + error ("dispatch: subsref (str, list)"); + panic_impossible (); + return octave_value (); + } + + octave_value_list subsref (const std::string& type, + const std::list& idx, + int nargout); + + octave_value_list do_multi_index_op (int, const octave_value_list&); + + void add (const std::string t, const std::string n); + + void clear (const std::string t); + + void print (std::ostream& os, bool pr_as_read=false) const; + +private: + + Table tab; + std::string base; + bool has_alias; + + octave_dispatch (void) + : octave_function (), tab (), base (), has_alias (false) { } + + DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA + + DECLARE_OCTAVE_ALLOCATOR +}; + +DEFINE_OCTAVE_ALLOCATOR (octave_dispatch); + +DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA (octave_dispatch, + "overloaded function", "function"); + +void +octave_dispatch::add (const std::string t, const std::string n) +{ + if (tab.count (t) > 0 && tab[t] != n) + warning ("replacing %s(%s,...)->%s with %s", + base.c_str (), t.c_str (), tab[t].c_str (), n.c_str ()); + + tab[t] = n; + + if (t == "any") + has_alias = true; +} + +void +octave_dispatch::clear (const std::string t) +{ + tab.erase (t); + + if (t == "any") + has_alias = false; +} + +octave_value_list +octave_dispatch::subsref (const std::string& type, + const std::list& idx, + int nargout) +{ + octave_value_list retval; + + switch (type[0]) + { + case '(': + retval = do_multi_index_op (nargout, idx.front ()); + break; + + case '{': + case '.': + { + const std::string nm = type_name (); + error ("%s cannot be indexed with %c", nm.c_str (), type[0]); + } + break; + + default: + panic_impossible (); + } + + if (idx.size () > 1) + retval = retval(0).next_subsref (type, idx); + + return retval; +} + +static octave_function* +builtin (const std::string& base) +{ + octave_function *fcn = 0; + + // Check if we are overriding a builtin function. This is the + // case if builtin is protected. + symbol_record *builtin = fbi_sym_tab->lookup ("builtin:" + base, 0); + + if (! builtin) + error ("builtin record has gone missing"); + + if (error_state) + return fcn; + + if (builtin->is_read_only ()) + { + // builtin is read only, so checking for updates is pointless + if (builtin->is_function ()) + fcn = builtin->def().function_value (); + else + error ("builtin %s is not a function", base.c_str ()); + } + else + { + // Check that builtin is up to date. + + // Don't try to fight octave's function name handling + // mechanism. Instead, move dispatch record out of the way, + // and restore the builtin to its original name. + symbol_record *dispatch = fbi_sym_tab->lookup (base, 0); + if (! dispatch) + error ("dispatch record has gone missing"); + + dispatch->unprotect (); + + fbi_sym_tab->rename (base, "dispatch:" + base); + + fbi_sym_tab->rename ("builtin:" + base, base); + + // check for updates to builtin function; ignore errors that + // appear (they interfere with renaming), and remove the updated + // name from the current symbol table. XXX FIXME XXX check that + // updating a function updates it in all contexts --- it may be + // that it is updated only in the current symbol table, and not + // the caller. I believe this won't be a problem because the + // caller will go through the same logic and end up with the + // newer version. + fcn = is_valid_function (base, "dispatch", 1); + int cache_error = error_state; + error_state = 0; + curr_sym_tab->clear_function (base); + + // Move the builtin function out of the way and restore the + // dispatch fuction. + // XXX FIXME XXX what if builtin wants to protect itself? + symbol_record *found=fbi_sym_tab->lookup (base, 0); + bool readonly = found->is_read_only (); + found->unprotect (); + fbi_sym_tab->rename (base, "builtin:" + base); + fbi_sym_tab->rename ("dispatch:" + base, base); + if (readonly) + found->protect (); + dispatch->protect (); + + // remember if there were any errors. + error_state = cache_error; + } + + return fcn; +} + +static bool +any_arg_is_magic_colon (const octave_value_list& args) +{ + int nargin = args.length (); + + for (int i = 0; i < nargin; i++) + if (args(i).is_magic_colon ()) + return true; + + return false; +} + + +octave_value_list +octave_dispatch::do_multi_index_op (int nargout, const octave_value_list& args) +{ + octave_value_list retval; + + if (error_state) return retval; + + if (any_arg_is_magic_colon (args)) + { + ::error ("invalid use of colon in function argument list"); + return retval; + } + + // If more than one argument, check if argument template matches any + // overloaded functions. Also provide a catch-all '*' type to provide + // single level pseudo rename and replace functionality. + if (args.length () > 0 && tab.count (args(0).type_name ()) > 0) + retval = feval (tab[args(0).type_name()], args, nargout); + else if (has_alias) + retval = feval (tab["any"], args, nargout); + else + { + octave_function *fcn = builtin (base); + if (! error_state && fcn) + retval = fcn->do_multi_index_op (nargout, args); + } + + return retval; +} + +void +octave_dispatch::print (std::ostream& os, bool) const +{ + os << "Overloaded function " << base << std::endl; + + for (Table::const_iterator it = tab.begin (); it != tab.end (); it++) + os << base << "(" << it->first << ",...)->" + << it->second << "(" << it->first << ",...)" + << std::endl; +} + +DEFUN_DLD (builtin, args, nargout, + "-*- texinfo -*-\n\ +@deftypefn {Loadable Function} {[@dots{}]} builtin (@var{f}, @dots{})\n\ +Call the base function @var{f} even if @var{f} is overloaded to\n\ +some other function for the given type signature.\n\ +@end deftypefn\n\ +@seealso{dispatch}") +{ + octave_value_list retval; + + int nargin = args.length (); + + if (nargin > 0) + { + const std::string name (args(0).string_value ()); + + if (error_state) + return retval; + + symbol_record *sr = fbi_sym_tab->lookup (name, 0); + if (sr->def().type_id () == octave_dispatch::static_type_id ()) + { + octave_function *fcn = builtin (name); + + if (!error_state && fcn) + retval = fcn->do_multi_index_op (nargout, + args.splice (0, 1, retval)); + } + else + retval = feval (name, args, nargout); + } + else + print_usage ("builtin"); + + return retval; +} + +DEFUN_DLD (dispatch_help, args, nargout, + "-*- texinfo -*-\n\ +@deftypefn {Loadable Function} {} dispatch_help (@var{name}, @dots{})\n\ +Delayed loading of help messages for dispatched functions.\n\ +@end deftypefn\n\ +@seealso{builtin, dispatch}") +{ + octave_value_list retval; + + int nargin = args.length (); + + for (int i = 0; i < nargin; i++) + { + if (args(i).is_string ()) + { + const std::string name (args(i).string_value ()); + + if (error_state) + return retval; + + symbol_record *sr = fbi_sym_tab->lookup (name, false); + + if (sr) + { + std::string help = sr->help (); + + if (help[0] == '<' && help[1] == '>' + && sr->def().type_id () == octave_dispatch::static_type_id ()) + { + builtin (name); + + symbol_record *builtin_record + = fbi_sym_tab->lookup ("builtin:" + name, 0); + + help.replace (0, 2, builtin_record->help ()); + + sr->document (help); + } + } + } + } + + return feval ("builtin:help", args, nargout); +} + +static void +dispatch_record (const std::string &f, const std::string &n, + const std::string &t) +{ + // find the base function in the symbol table, loading it if it + // is not already there; if it is already a dispatch, then bonus + + symbol_record *sr = fbi_sym_tab->lookup (f, true); + + if (sr->def().type_id () != octave_dispatch::static_type_id ()) + { + // Preserve mark_as_command status + bool iscommand = sr->is_command (); + + // Not an overloaded name, so if only display or clear then we are done + if (t.empty ()) + return; + + // sr is the base symbol; rename it to keep it safe. When we need + // it we will rename it back again. + if (sr->is_read_only ()) + { + sr->unprotect (); + fbi_sym_tab->rename (f, "builtin:" + f); + sr = fbi_sym_tab->lookup (f, true); + sr->protect (); + } + else + fbi_sym_tab->rename (f, "builtin:" + f); + + std::string basedoc ("<>"); + + if (! sr->help().empty ()) + basedoc = sr->help (); + + // Problem: when a function is first called a new record + // is created for it in the current symbol table, so calling + // dispatch on a function that has already been called, we + // should also clear it from all existing symbol tables. + // This is too much work, so we will only do it for the + // top level symbol table. We can't use the clear_function() + // method, because it won't clear builtin functions. Instead + // we check if the symbol is a function and clear it then. This + // won't properly clear shadowed functions, or functions in + // other namespaces (such as the current, if called from a + // function). + symbol_record *local = top_level_sym_tab->lookup (f, false); + if (local && local->is_function ()) + local->clear (); + + // Build a new dispatch object based on the function definition + octave_dispatch *dispatch = new octave_dispatch (f); + + // Create a symbol record for the dispatch object. + sr = fbi_sym_tab->lookup (f, true); + sr->unprotect (); + sr->define (octave_value (dispatch), symbol_record::BUILTIN_FUNCTION); + // std::cout << "iscommand('"<mark_as_command(); + sr->document (basedoc + "\n\nOverloaded function\n"); + sr->make_eternal (); // XXX FIXME XXX why?? + sr->mark_as_static (); + sr->protect (); + } + + // clear/replace/extend the map with the new type-function pair + const octave_dispatch& rep + = reinterpret_cast (sr->def().get_rep ()); + + if (t.empty ()) + // XXX FIXME XXX should return the list if nargout > 1 + rep.print (octave_stdout); + else if (n.empty ()) + { + // XXX FIXME XXX should we eliminate the dispatch function if + // there are no more elements? + // XXX FIXME XXX should clear the " $t:\w+" from the help string. + // XXX FIXME XXX -- seems bad to cast away const here... + octave_dispatch& xrep = const_cast (rep); + + xrep.clear (t); + } + else + { + // XXX FIXME XXX -- seems bad to cast away const here... + octave_dispatch& xrep = const_cast (rep); + + xrep.add (t, n); + + if (! sr->help().empty ()) + sr->document (sr->help() + "\n " + n + "(" + t + ",...)"); + } +} + +DEFUN_DLD (dispatch, args, , + "-*- texinfo -*-\n\ +@deftypefn {Loadable Function} {} dispatch (@var{f}, @var{r}, @var{type})\n\ +\n\ +Replace the function @var{f} with a dispatch so that function @var{r}\n\ +is called when @var{f} is called with the first argument of the named\n\ +@var{type}. If the type is @var{any} then call @var{r} if no other type\n\ +matches. The original function @var{f} is accessible using\n\ +@code{builtin (@var{f}, @dots{}).\n\ +\n\ +If @var{r} is omitted, clear dispatch function associated with @var{type}.\n\ +\n\ +If both @var{r} and @var{type} are omitted, list dispatch functions\n\ +for @var{f}\n\ +@end deftypefn\n\ +@seealso{builtin}") +{ + octave_value retval; + int nargin = args.length (); + + if (nargin < 1 || nargin > 3) + { + print_usage ("dispatch"); + return retval; + } + + std::string f, t, n; + if (nargin > 0) + f = args(0).string_value (); + + if (nargin == 2) + t = args(1).string_value (); + else if (nargin > 2) + { + n = args(1).string_value (); + t = args(2).string_value (); + } + + if (error_state) + return retval; + + static bool register_type = true; + + // register dispatch function type if you have not already done so + if (register_type) + { + octave_dispatch::register_type (); + register_type = false; + fbi_sym_tab->lookup("dispatch")->mark_as_static (); + dispatch_record ("help", "dispatch_help", "string"); + } + + dispatch_record (f, n, t); + + return retval; +} + +/* + +%!test # builtin function replacement +%! dispatch('sin','length','string') +%! assert(sin('abc'),3) +%! assert(sin(0),0,10*eps); +%!test # 'any' function +%! dispatch('sin','exp','any') +%! assert(sin(0),1,eps); +%! assert(sin('abc'),3); +%!test # 'builtin' function +%! assert(builtin('sin',0),0,eps); +%! builtin('eval','x=1;'); +%! assert(x,1); +%!test # clear function mapping +%! dispatch('sin','string') +%! dispatch('sin','any') +%! assert(sin(0),0,10*eps); +%!test # oct-file replacement +%! dispatch('fft','length','string') +%! assert(fft([1,1]),[2,0]); +%! assert(fft('abc'),3) +%! dispatch('fft','string'); +%!test # m-file replacement +%! dispatch('hamming','length','string') +%! assert(hamming(1),1) +%! assert(hamming('abc'),3) +%! dispatch('hamming','string') + +%!test # override preloaded builtin +%! evalin('base','cos(1);'); +%! dispatch('cos','length','string') +%! evalin('base',"assert(cos('abc'),3)"); +%! evalin('base',"assert(cos(0),1,eps)"); +%! dispatch('cos','string') +%!test # override pre-loaded oct-file +%! evalin('base','qr(1);'); +%! dispatch('qr','length','string') +%! evalin('base',"assert(qr('abc'),3)"); +%! evalin('base',"assert(qr(1),1)"); +%! dispatch('qr','string'); +%!test # override pre-loaded m-file +%! evalin('base','hanning(1);'); +%! dispatch('hanning','length','string') +%! evalin('base','assert(hanning("abc"),3)'); +%! evalin('base','assert(hanning(1),1)'); +%! dispatch('hanning','string'); + +XXX FIXME XXX I would rather not create dispatch_x/dispatch_y +in the current directory! I don't want them installed accidentally. + +%!test # replace base m-file +%! system("echo 'function a=dispatch_x(a)'>dispatch_x.m"); +%! dispatch('dispatch_x','length','string') +%! assert(dispatch_x(3),3) +%! assert(dispatch_x('a'),1) +%! pause(1); +%! system("echo 'function a=dispatch_x(a),++a;'>dispatch_x.m"); +%! assert(dispatch_x(3),4) +%! assert(dispatch_x('a'),1) +%!test +%! system("rm dispatch_x.m"); + +%!test # replace dispatch m-file +%! system("echo 'function a=dispatch_y(a)'>dispatch_y.m"); +%! dispatch('hello','dispatch_y','complex scalar') +%! assert(hello(3i),3i) +%! pause(1); +%! system("echo 'function a=dispatch_y(a),++a;'>dispatch_y.m"); +%! assert(hello(3i),1+3i) +%!test +%! system("rm dispatch_y.m"); + +XXX FIXME XXX add tests for preservation of mark_as_command status. + +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/DLD-FUNCTIONS/gcd.cc --- a/src/DLD-FUNCTIONS/gcd.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/DLD-FUNCTIONS/gcd.cc Fri Feb 25 19:55:28 2005 +0000 @@ -17,10 +17,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -In addition to the terms of the GPL, you are permitted to link -this program with any Open Source program, as defined by the -Open Source Initiative (www.opensource.org) - */ #ifdef HAVE_CONFIG_H diff -r 9f3299378193 -r 57077d0ddc8e src/DLD-FUNCTIONS/rand.cc --- a/src/DLD-FUNCTIONS/rand.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/DLD-FUNCTIONS/rand.cc Fri Feb 25 19:55:28 2005 +0000 @@ -72,7 +72,7 @@ { retval = octave_rand::distribution (); } - else if (s_arg == "seed") + else if (s_arg == "seed" || s_arg == "state") { retval = octave_rand::seed (); } @@ -179,7 +179,9 @@ if (nargin == 2 && tmp.is_string ()) { - if (tmp.string_value () == "seed") + std::string ts = tmp.string_value (); + + if (ts == "seed" || ts == "state") { double d = args(1).double_value (); diff -r 9f3299378193 -r 57077d0ddc8e src/DLD-FUNCTIONS/sort.cc --- a/src/DLD-FUNCTIONS/sort.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/DLD-FUNCTIONS/sort.cc Fri Feb 25 19:55:28 2005 +0000 @@ -25,6 +25,8 @@ #include #endif +#include + #include "lo-mappers.h" #include "quit.h" diff -r 9f3299378193 -r 57077d0ddc8e src/DLD-FUNCTIONS/sparse.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/DLD-FUNCTIONS/sparse.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,1369 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include "variables.h" +#include "utils.h" +#include "pager.h" +#include "defun-dld.h" +#include "gripes.h" +#include "quit.h" + +#include "ov-re-sparse.h" +#include "ov-cx-sparse.h" +#include "ov-bool-sparse.h" + +static bool +is_sparse (const octave_value& arg) +{ + return (arg.class_name () == "sparse"); +} + +DEFUN_DLD (issparse, args, , + "-*- texinfo -*-\n\ +@deftypefn {Loadable Function} {} issparse (@var{expr})\n\ +Return 1 if the value of the expression @var{expr} is a sparse matrix.\n\ +@end deftypefn") +{ + if (args.length() != 1) + { + print_usage("issparse"); + return octave_value (); + } + else + return octave_value (is_sparse (args(0))); +} + +DEFUN_DLD (sparse, args, , + "-*- texinfo -*-\n\ +@deftypefn {Loadable Function} {@var{sparse_val} =} sparse (...)\n\ +SPARSE: create a sparse matrix\n\ +\n\ +sparse can be called in the following ways:\n\ +\n\ +@enumerate\n\ +@item @var{S} = sparse(@var{A}) where @var{A} is a full matrix\n\ +\n\ +@item @var{S} = sparse(@var{A},1) where @var{A} is a full matrix, result\n\ +is forced back to a full matrix is resulting matrix is sparse\n\ +\n\ +@item @var{S} = sparse(@var{i},@var{j},@var{s},@var{m},@var{n},@var{nzmax}) where\n\ + @itemize @w \n\ +@var{i},@var{j} are integer index vectors (1 x nnz) @* \n\ +@var{s} is the vector of real or complex entries (1 x nnz) @* \n\ +@var{m},@var{n} are the scalar dimentions of S @* \n\ +@var{nzmax} is ignored (here for compatability with Matlab) @* \n\ +\n\ + if multiple values are specified with the same @var{i},@var{j}\n\ + position, the corresponding values in @var{s} will be added\n\ + @end itemize\n\ +\n\ +@item The following usages are equivalent to (2) above:\n\ + @itemize @w \n\ +@var{S} = sparse(@var{i},@var{j},@var{s},@var{m},@var{n})@*\n\ +@var{S} = sparse(@var{i},@var{j},@var{s},@var{m},@var{n},'summation')@*\n\ +@var{S} = sparse(@var{i},@var{j},@var{s},@var{m},@var{n},'sum')@*\n\ + @end itemize\n\ +\n\ +@item @var{S} = sparse(@var{i},@var{j},@var{s},@var{m},@var{n},'unique')@*\n\ +\n\ + @itemize @w \n\ +same as (2) above, except that rather than adding,\n\ +if more than two values are specified for the same @var{i},@var{j}\n\ +position, then the last specified value will be kept\n\ + @end itemize\n\ +\n\ +@item @var{S}= sparse(@var{i},@var{j},@var{sv}) uses @var{m}=max(@var{i}), @var{n}=max(@var{j})\n\ +\n\ +@item @var{S}= sparse(@var{m},@var{n}) does sparse([],[],[],@var{m},@var{n},0)\n\ +\n\ +@var{sv}, and @var{i} or @var{j} may be scalars, in\n\ +which case they are expanded to all have the same length\n\ +@end enumerate\n\ +@seealso{full}\n\ +@end deftypefn") +{ + octave_value retval; + bool mutate = false; + + // WARNING: This function should always use constructions like + // retval = new octave_sparse_matrix (sm); + // To avoid calling the maybe_mutate function. This is the only + // function that should not call maybe_mutate, or at least only + // in very particular cases. + + int nargin= args.length(); + if (nargin < 1 || (nargin == 4 && !args(3).is_string ()) || nargin > 6) + { + print_usage ("sparse"); + return retval; + } + + bool use_complex = false; + bool use_bool = false; + if (nargin > 2) + { + use_complex= args(2).is_complex_type(); + use_bool = args(2).is_bool_type (); + } + else + { + use_complex= args(0).is_complex_type(); + use_bool = args(0).is_bool_type (); + } + + if (nargin == 2 && ! args(0).is_scalar_type() && args(1).is_scalar_type()) + mutate = (args(1).double_value() != 0.); + + if (nargin == 1 || (nargin == 2 && mutate)) + { + octave_value arg = args (0); + + if (is_sparse (arg)) + { + if (use_complex) + { + SparseComplexMatrix sm (((const octave_sparse_complex_matrix&) arg + .get_rep ()) + .sparse_complex_matrix_value ()); + retval = new octave_sparse_complex_matrix (sm); + } + else if (use_bool) + { + SparseBoolMatrix sm (((const octave_sparse_bool_matrix&) arg + .get_rep ()) + .sparse_bool_matrix_value ()); + retval = new octave_sparse_bool_matrix (sm); + } + else + { + SparseMatrix sm (((const octave_sparse_matrix&) arg + .get_rep ()) + .sparse_matrix_value ()); + retval = new octave_sparse_matrix (sm); + } + } + else + { + if (use_complex) + { + SparseComplexMatrix sm (args (0).complex_matrix_value ()); + if (error_state) + return retval; + retval = new octave_sparse_complex_matrix (sm); + } + else if (use_bool) + { + SparseBoolMatrix sm (args (0).bool_matrix_value ()); + if (error_state) + return retval; + retval = new octave_sparse_bool_matrix (sm); + } + else + { + SparseMatrix sm (args (0).matrix_value ()); + if (error_state) + return retval; + retval = new octave_sparse_matrix (sm); + } + } + } + else + { + int m = 1, n = 1; + if (nargin == 2) + { + m = args(0).int_value(); + n = args(1).int_value(); + if (error_state) return retval; + + if (use_complex) + retval = new octave_sparse_complex_matrix + (SparseComplexMatrix (m, n)); + else if (use_bool) + retval = new octave_sparse_bool_matrix + (SparseBoolMatrix (m, n)); + else + retval = new octave_sparse_matrix + (SparseMatrix (m, n)); + } + else + { + if (args(0).is_empty () || args (1).is_empty () + || args(2).is_empty ()) + { + if (nargin > 4) + { + m = args(3).int_value(); + n = args(4).int_value(); + } + + if (use_bool) + retval = new octave_sparse_bool_matrix + (SparseBoolMatrix (m, n)); + else + retval = new octave_sparse_matrix (SparseMatrix (m, n)); + } + else + { +// +// I use this clumsy construction so that we can use +// any orientation of args + ColumnVector ridxA = ColumnVector (args(0).vector_value + (false, true)); + ColumnVector cidxA = ColumnVector (args(1).vector_value + (false, true)); + ColumnVector coefA; + boolNDArray coefAB; + ComplexColumnVector coefAC; + bool assemble_do_sum = true; // this is the default in matlab6 + + if (use_complex) + { + if (args(2).is_empty ()) + coefAC = ComplexColumnVector (0); + else + coefAC = ComplexColumnVector + (args(2).complex_vector_value (false, true)); + } + else if (use_bool) + { + if (args(2).is_empty ()) + coefAB = boolNDArray (dim_vector (1, 0)); + else + coefAB = args(2).bool_array_value (); + dim_vector AB_dims = coefAB.dims (); + if (AB_dims.length() > 2 || (AB_dims(0) != 1 && + AB_dims(1) != 1)) + error ("sparse: vector arguments required"); + } + else + if (args(2).is_empty ()) + coefA = ColumnVector (0); + else + coefA = ColumnVector (args(2).vector_value (false, true)); + + if (error_state) + return retval; + + // Confirm that i,j,s all have the same number of elements + int ns; + if (use_complex) + ns = coefAC.length(); + else if (use_bool) + ns = coefAB.length(); + else + ns = coefA.length(); + + int ni = ridxA.length(); + int nj = cidxA.length(); + int nnz = (ni > nj ? ni : nj); + if ((ns != 1 && ns != nnz) || + (ni != 1 && ni != nnz) || + (nj != 1 && nj != nnz)) + { + error ("sparse i, j and s must have the same length"); + return retval; + } + + if (nargin == 3 || nargin == 4) + { + m = static_cast (ridxA.max()); + n = static_cast (cidxA.max()); + + // if args(3) is not string, then ignore the value + // otherwise check for summation or unique + if (nargin == 4 && args(3).is_string()) + { + std::string vv= args(3).string_value(); + if (error_state) return retval; + + if ( vv == "summation" || + vv == "sum" ) + assemble_do_sum = true; + else + if ( vv == "unique" ) + assemble_do_sum = false; + else { + error("sparse repeat flag must be 'sum' or 'unique'"); + return retval; + } + } + } + else + { + m = args(3).int_value(); + n = args(4).int_value(); + if (error_state) + return retval; + + // if args(5) is not string, then ignore the value + // otherwise check for summation or unique + if (nargin >= 6 && args(5).is_string()) + { + std::string vv= args(5).string_value(); + if (error_state) return retval; + + if ( vv == "summation" || + vv == "sum" ) + assemble_do_sum = true; + else + if ( vv == "unique" ) + assemble_do_sum = false; + else { + error("sparse repeat flag must be 'sum' or 'unique'"); + return retval; + } + } + + } + + // Convert indexing to zero-indexing used internally + ridxA -= 1.; + cidxA -= 1.; + + if (use_complex) + retval = new octave_sparse_complex_matrix + (SparseComplexMatrix (coefAC, ridxA, cidxA, m, n, + assemble_do_sum)); + else if (use_bool) + retval = new octave_sparse_bool_matrix + (SparseBoolMatrix (coefAB, ridxA, cidxA, m, n, + assemble_do_sum)); + else + retval = new octave_sparse_matrix + (SparseMatrix (coefA, ridxA, cidxA, m, n, + assemble_do_sum)); + } + } + } + + // Only called in very particular cases, not the default case + if (mutate) + retval.maybe_mutate (); + + return retval; +} + +DEFUN_DLD (full, args, , + "-*- texinfo -*-\n\ +@deftypefn {Loadable Function} {@var{FM} =} full (@var{SM})\n\ + returns a full storage matrix from a sparse one\n\ +@seealso{sparse}\n\ +@end deftypefn") +{ + octave_value retval; + + if (args.length() < 1) { + print_usage ("full"); + return retval; + } + + if (args(0).class_name () == "sparse") + { + if (args(0).type_name () == "sparse matrix") + retval = args(0).matrix_value (); + else if (args(0).type_name () == "sparse complex matrix") + retval = args(0).complex_matrix_value (); + else if (args(0).type_name () == "sparse bool matrix") + retval = args(0).bool_matrix_value (); + } + else if (args(0).is_real_type()) + retval = args(0).matrix_value(); + else if (args(0).is_complex_type()) + retval = args(0).complex_matrix_value(); + else + gripe_wrong_type_arg ("full", args(0)); + + return retval; +} + +DEFUN_DLD (nnz, args, , + "-*- texinfo -*-\n\ +@deftypefn {Loadable Function} {@var{scalar} =} nnz (@var{SM})\n\ +returns number of non zero elements in SM\n\ +@seealso{sparse}\n\ +@end deftypefn") +{ + octave_value retval; + + if (args.length() < 1) + { + print_usage ("nnz"); + return retval; + } + + if (args(0).class_name () == "sparse") + { + // XXX FIXME XXX should nonzero be a method of octave_base_value so that the + // below can be replaced with "retval = (double) (args(0).nonzero ());" + const octave_value& rep = args(0).get_rep (); + + if (args(0).type_name () == "sparse matrix") + retval = (double) ((const octave_sparse_matrix&) rep) .nonzero (); + else if (args(0).type_name () == "sparse complex matrix") + retval = (double) ((const octave_sparse_complex_matrix&) rep) .nonzero (); + else if (args(0).type_name () == "sparse bool matrix") + retval = (double) ((const octave_sparse_bool_matrix&) rep) .nonzero (); + } + else if (args(0).type_name () == "complex matrix") + { + const ComplexMatrix M = args(0).complex_matrix_value(); + int nnz = 0; + for( int j = 0; j < M.cols(); j++) + for( int i = 0; i < M.rows(); i++) + if (M (i, j) != 0.) + nnz++; + retval = (double) nnz; + } + else if (args(0).type_name () == "matrix") + { + const Matrix M = args(0).matrix_value(); + int nnz = 0; + for( int j = 0; j < M.cols(); j++) + for( int i = 0; i < M.rows(); i++) + if (M (i, j) != 0.) + nnz++; + retval = (double) nnz; + } + else if (args(0).type_name () == "string") + { + const charMatrix M = args(0).char_matrix_value(); + int nnz = 0; + for( int j = 0; j < M.cols(); j++) + for( int i = 0; i < M.rows(); i++) + if (M (i, j) != 0) + nnz++; + retval = (double) nnz; + } + else if (args(0).type_name () == "scalar") + retval = args(0).scalar_value() != 0.0 ? 1.0 : 0.0; + else if (args(0).type_name () == "complex scalar") + retval = args(0).complex_value() != 0.0 ? 1.0 : 0.0; + else + gripe_wrong_type_arg ("nnz", args(0)); + + return retval; +} + +DEFUN_DLD (nzmax, args, , + "-*- texinfo -*-\n\ +@deftypefn {Loadable Function} {@var{scalar} =} nzmax (@var{SM})\n\ +Returns the amount of storage allocated to the sparse matrix @var{SM}.\n\ +Note that @sc{Octave} tends to crop unused memory at the first oppurtunity\n\ +for sparse objects. There are some cases of user created sparse objects\n\ +where the value returned by @dfn{nzmaz} will not be the same as @dfn{nnz},\n\ +but in general they will give the same result.\n\ +@seealso{sparse, spalloc}\n\ +@end deftypefn") +{ + octave_value retval; + + if (args.length() < 1) + { + print_usage ("nzmax"); + return retval; + } + + if (args(0).class_name () == "sparse") + { + // XXX FIXME XXX should nnz be a method of octave_base_value so that the + // below can be replaced with "retval = (double) (args(0).nz ());" + const octave_value& rep = args(0).get_rep (); + + if (args(0).type_name () == "sparse matrix") + retval = (double) ((const octave_sparse_matrix&) rep) .nnz (); + else if (args(0).type_name () == "sparse complex matrix") + retval = (double) ((const octave_sparse_complex_matrix&) rep) .nnz (); + else if (args(0).type_name () == "sparse bool matrix") + retval = (double) ((const octave_sparse_bool_matrix&) rep) .nnz (); + } + else + error ("nzmax: argument must be a sparse matrix"); + + return retval; +} + +static octave_value_list +sparse_find (const SparseMatrix& v) +{ + octave_value_list retval; + int nnz = v.nnz (); + dim_vector dv = v.dims (); + int nr = dv(0); + int nc = dv (1); + + ColumnVector I (nnz), J (nnz); + ColumnVector S (nnz); + + for (int i = 0, cx = 0; i < nc; i++) + { + OCTAVE_QUIT; + for (int j = v.cidx(i); j < v.cidx(i+1); j++ ) + { + I (cx) = static_cast (v.ridx(j) + 1); + J (cx) = static_cast (i + 1); + S (cx) = v.data(j); + cx++; + } + } + + if (dv(0) == 1) + { + retval(0)= I.transpose (); + retval(1)= J.transpose (); + retval(2)= S.transpose (); + } + else + { + retval(0)= I; + retval(1)= J; + retval(2)= S; + } + retval(3)= (double) nr; + retval(4)= (double) nc; + return retval; +} + +static octave_value_list +sparse_find (const SparseComplexMatrix& v) +{ + octave_value_list retval; + int nnz = v.nnz (); + dim_vector dv = v.dims (); + int nr = dv(0); + int nc = dv (1); + + ColumnVector I (nnz), J (nnz); + ComplexColumnVector S (nnz); + + for (int i = 0, cx = 0; i < nc; i++) + { + OCTAVE_QUIT; + for (int j = v.cidx(i); j < v.cidx(i+1); j++ ) + { + I (cx) = static_cast (v.ridx(j) + 1); + J (cx) = static_cast (i + 1); + S (cx) = v.data(j); + cx++; + } + } + + if (dv(0) == 1) + { + retval(0)= I.transpose (); + retval(1)= J.transpose (); + retval(2)= S.transpose (); + } + else + { + retval(0)= I; + retval(1)= J; + retval(2)= S; + } + retval(3)= (double) nr; + retval(4)= (double) nc; + return retval; +} + +static octave_value_list +sparse_find (const SparseBoolMatrix& v) +{ + octave_value_list retval; + int nnz = v.nnz (); + dim_vector dv = v.dims (); + int nr = dv(0); + int nc = dv (1); + + ColumnVector I (nnz), J (nnz); + ColumnVector S (nnz); + + for (int i = 0, cx = 0; i < nc; i++) + { + OCTAVE_QUIT; + for (int j = v.cidx(i); j < v.cidx(i+1); j++ ) + { + I (cx) = static_cast (v.ridx(j) + 1); + J (cx) = static_cast (i + 1); + S (cx) = static_cast (v.data(j)); + cx++; + } + } + + if (dv(0) == 1) + { + retval(0)= I.transpose (); + retval(1)= J.transpose (); + retval(2)= S.transpose (); + } + else + { + retval(0)= I; + retval(1)= J; + retval(2)= S; + } + retval(3)= (double) nr; + retval(4)= (double) nc; + return retval; +} + +// PKG_ADD: dispatch ("find", "spfind", "sparse matrix") +// PKG_ADD: dispatch ("find", "spfind", "sparse complex matrix") +// PKG_ADD: dispatch ("find", "spfind", "sparse bool matrix") +DEFUN_DLD (spfind, args, nargout , + "-*- texinfo -*-\n\ +@deftypefn {Loadable Function} {[...] =} spfind (...)\n\ +SPFIND: a sparse version of the find operator\n\ +@enumerate\n\ + @item\n\ +@var{x }= spfind( @var{a })\n\ + @itemize @w\n\ +is analagous to @var{x}= find(@var{A}(:))@*\n\ +where @var{A}= full(@var{a})\n\ + @end itemize\n\ + @item\n\ +[@var{i},@var{j},@var{v},@var{nr},@var{nc}] = spfind( @var{a} )\n\ + @itemize @w\n\ +returns column vectors @var{i},@var{j},@var{v} such that@*\n\ +@var{a}= sparse(@var{i},@var{j},@var{v},@var{nr},@var{nc})\n\ + @end itemize\n\ +@end enumerate\n\ +@seealso{sparse}\n\ +@end deftypefn") +{ + octave_value_list retval; + int nargin = args.length (); + + if (nargin != 1) + { + print_usage ("spfind"); + return retval; + } + + + octave_value arg = args(0); + + if (arg.class_name () == "sparse") + { + if (arg.type_name () == "sparse matrix") + retval = sparse_find (args(0).sparse_matrix_value ()); + else if (arg.type_name () == "sparse complex matrix" ) + retval = sparse_find (args(0).sparse_complex_matrix_value ()); + else if (arg.type_name () == "sparse bool matrix" ) + retval = sparse_find (args(0).sparse_bool_matrix_value ()); + else + gripe_wrong_type_arg ("spfind", arg); + } + else + gripe_wrong_type_arg ("spfind", arg); + + if (nargout == 1 || nargout ==0 ) + { + // only find location as fortran index + octave_value_list tmp; + tmp(0) = retval(0) + (retval(1)-1)*retval(3); + retval = tmp; + } + + return retval; +} + +#define SPARSE_DIM_ARG_BODY(NAME, FUNC) \ + int nargin = args.length(); \ + octave_value retval; \ + if ((nargin != 1 ) && (nargin != 2)) \ + print_usage (#NAME); \ + else { \ + int dim = (nargin == 1 ? -1 : args(1).int_value(true) - 1); \ + if (error_state) return retval; \ + if (dim < -1 || dim > 1) { \ + error (#NAME ": invalid dimension argument = %d", dim + 1); \ + return retval; \ + } \ + if (args(0).type_id () == \ + octave_sparse_matrix::static_type_id () || args(0).type_id () == \ + octave_sparse_bool_matrix::static_type_id ()) { \ + retval = args(0).sparse_matrix_value () .FUNC (dim); \ + } else if (args(0).type_id () == \ + octave_sparse_complex_matrix::static_type_id ()) { \ + retval = args(0).sparse_complex_matrix_value () .FUNC (dim); \ + } else \ + print_usage (#NAME); \ + } \ + return retval + +// PKG_ADD: dispatch ("prod", "spprod", "sparse matrix"); +// PKG_ADD: dispatch ("prod", "spprod", "sparse complex matrix"); +// PKG_ADD: dispatch ("prod", "spprod", "sparse bool matrix"); +DEFUN_DLD (spprod, args, , + "-*- texinfo -*-\n\ +@deftypefn {Loadable Function} {@var{y} =} spprod (@var{x},@var{dim})\n\ +Product of elements along dimension @var{dim}. If @var{dim} is omitted,\n\ +it defaults to 1 (column-wise products).\n\ +@end deftypefn\n\ +@seealso{spsum, spsumsq}") +{ + SPARSE_DIM_ARG_BODY (spprod, prod); +} + +// PKG_ADD: dispatch ("cumprod", "spcumprod", "sparse matrix"); +// PKG_ADD: dispatch ("cumprod", "spcumprod", "sparse complex matrix"); +// PKG_ADD: dispatch ("cumprod", "spcumprod", "sparse bool matrix"); +DEFUN_DLD (spcumprod, args, , + "-*- texinfo -*-\n\ +@deftypefn {Loadable Function} {@var{y} =} spcumprod (@var{x},@var{dim})\n\ +Cumulative product of elements along dimension @var{dim}. If @var{dim}\n\ +is omitted, it defaults to 1 (column-wise cumulative products).\n\ +@end deftypefn\n\ +@seealso{spcumsum}") +{ + SPARSE_DIM_ARG_BODY (spcumprod, cumprod); +} + +// PKG_ADD: dispatch ("sum", "spsum", "sparse matrix"); +// PKG_ADD: dispatch ("sum", "spsum", "sparse complex matrix"); +// PKG_ADD: dispatch ("sum", "spsum", "sparse bool matrix"); +DEFUN_DLD (spsum, args, , + "-*- texinfo -*-\n\ +@deftypefn {Loadable Function} {@var{y} =} spsum (@var{x},@var{dim})\n\ +Sum of elements along dimension @var{dim}. If @var{dim} is omitted, it\n\ +defaults to 1 (column-wise sum).\n\ +@end deftypefn\n\ +@seealso{spprod, spsumsq}") +{ + SPARSE_DIM_ARG_BODY (spsum, sum); +} + +// PKG_ADD: dispatch ("cumsum", "spcumsum", "sparse matrix"); +// PKG_ADD: dispatch ("cumsum", "spcumsum", "sparse complex matrix"); +// PKG_ADD: dispatch ("cumsum", "spcumsum", "sparse bool matrix"); +DEFUN_DLD (spcumsum, args, , + "-*- texinfo -*-\n\ +@deftypefn {Loadable Function} {@var{y} =} spcumsum (@var{x},@var{dim})\n\ +Cumulative sum of elements along dimension @var{dim}. If @var{dim}\n\ +is omitted, it defaults to 1 (column-wise cumulative sums).\n\ +@end deftypefn\n\ +@seealso{spcumprod}") +{ + SPARSE_DIM_ARG_BODY (spcumsum, cumsum); +} + +// PKG_ADD: dispatch ("sumsq", "spsumsq", "sparse matrix"); +// PKG_ADD: dispatch ("sumsq", "spsumsq", "sparse complex matrix"); +// PKG_ADD: dispatch ("sumsq", "spsumsq", "sparse bool matrix"); +DEFUN_DLD (spsumsq, args, , + "-*- texinfo -*-\n\ +@deftypefn {Loadable Function} {@var{y} =} spsumsq (@var{x},@var{dim})\n\ +Sum of squares of elements along dimension @var{dim}. If @var{dim}\n\ +is omitted, it defaults to 1 (column-wise sum of squares).\n\ +This function is equivalent to computing\n\ +@example\n\ +spsum (x .* spconj (x), dim)\n\ +@end example\n\ +but it uses less memory and avoids calling @code{spconj} if @var{x} is\n\ +real.\n\ +@end deftypefn\n\ +@seealso{spprod, spsum}") +{ + SPARSE_DIM_ARG_BODY (spsumsq, sumsq); +} + +#define MINMAX_BODY(FCN) \ + \ + octave_value_list retval; \ + \ + int nargin = args.length (); \ + \ + if (nargin < 1 || nargin > 3 || nargout > 2) \ + { \ + print_usage (#FCN); \ + return retval; \ + } \ + \ + octave_value arg1; \ + octave_value arg2; \ + octave_value arg3; \ + \ + switch (nargin) \ + { \ + case 3: \ + arg3 = args(2); \ + \ + case 2: \ + arg2 = args(1); \ + \ + case 1: \ + arg1 = args(0); \ + break; \ + \ + default: \ + panic_impossible (); \ + break; \ + } \ + \ + int dim; \ + dim_vector dv = ((const octave_sparse_matrix&) arg1) .dims (); \ + if (error_state) \ + { \ + gripe_wrong_type_arg (#FCN, arg1); \ + return retval; \ + } \ + \ + if (nargin == 3) \ + { \ + dim = arg3.nint_value () - 1; \ + if (dim < 0 || dim >= dv.length ()) \ + { \ + error ("%s: invalid dimension", #FCN); \ + return retval; \ + } \ + } \ + else \ + { \ + dim = 0; \ + while ((dim < dv.length ()) && (dv (dim) <= 1)) \ + dim++; \ + if (dim == dv.length ()) \ + dim = 0; \ + } \ + \ + bool single_arg = (nargin == 1) || arg2.is_empty(); \ + \ + if (single_arg && (nargout == 1 || nargout == 0)) \ + { \ + if (arg1.type_id () == octave_sparse_matrix::static_type_id ()) \ + retval(0) = arg1.sparse_matrix_value () .FCN (dim); \ + else if (arg1.type_id () == \ + octave_sparse_complex_matrix::static_type_id ()) \ + retval(0) = arg1.sparse_complex_matrix_value () .FCN (dim); \ + else \ + gripe_wrong_type_arg (#FCN, arg1); \ + } \ + else if (single_arg && nargout == 2) \ + { \ + Array2 index; \ + \ + if (arg1.type_id () == octave_sparse_matrix::static_type_id ()) \ + retval(0) = arg1.sparse_matrix_value () .FCN (index, dim); \ + else if (arg1.type_id () == \ + octave_sparse_complex_matrix::static_type_id ()) \ + retval(0) = arg1.sparse_complex_matrix_value () .FCN (index, dim); \ + else \ + gripe_wrong_type_arg (#FCN, arg1); \ + \ + int len = index.numel (); \ + \ + if (len > 0) \ + { \ + double nan_val = lo_ieee_nan_value (); \ + \ + NDArray idx (index.dims ()); \ + \ + for (int i = 0; i < len; i++) \ + { \ + OCTAVE_QUIT; \ + int tmp = index.elem (i) + 1; \ + idx.elem (i) = (tmp <= 0) \ + ? nan_val : static_cast (tmp); \ + } \ + \ + retval(1) = idx; \ + } \ + else \ + retval(1) = NDArray (); \ + } \ + else \ + { \ + int arg1_is_scalar = arg1.is_scalar_type (); \ + int arg2_is_scalar = arg2.is_scalar_type (); \ + \ + int arg1_is_complex = arg1.is_complex_type (); \ + int arg2_is_complex = arg2.is_complex_type (); \ + \ + if (arg1_is_scalar) \ + { \ + if (arg1_is_complex || arg2_is_complex) \ + { \ + Complex c1 = arg1.complex_value (); \ + \ + SparseComplexMatrix m2 = arg2.sparse_complex_matrix_value (); \ + \ + if (! error_state) \ + { \ + SparseComplexMatrix result = FCN (c1, m2); \ + if (! error_state) \ + retval(0) = result; \ + } \ + } \ + else \ + { \ + double d1 = arg1.double_value (); \ + SparseMatrix m2 = arg2.sparse_matrix_value (); \ + \ + if (! error_state) \ + { \ + SparseMatrix result = FCN (d1, m2); \ + if (! error_state) \ + retval(0) = result; \ + } \ + } \ + } \ + else if (arg2_is_scalar) \ + { \ + if (arg1_is_complex || arg2_is_complex) \ + { \ + SparseComplexMatrix m1 = arg1.sparse_complex_matrix_value (); \ + \ + if (! error_state) \ + { \ + Complex c2 = arg2.complex_value (); \ + SparseComplexMatrix result = FCN (m1, c2); \ + if (! error_state) \ + retval(0) = result; \ + } \ + } \ + else \ + { \ + SparseMatrix m1 = arg1.sparse_matrix_value (); \ + \ + if (! error_state) \ + { \ + double d2 = arg2.double_value (); \ + SparseMatrix result = FCN (m1, d2); \ + if (! error_state) \ + retval(0) = result; \ + } \ + } \ + } \ + else \ + { \ + if (arg1_is_complex || arg2_is_complex) \ + { \ + SparseComplexMatrix m1 = arg1.sparse_complex_matrix_value (); \ + \ + if (! error_state) \ + { \ + SparseComplexMatrix m2 = arg2.sparse_complex_matrix_value (); \ + \ + if (! error_state) \ + { \ + SparseComplexMatrix result = FCN (m1, m2); \ + if (! error_state) \ + retval(0) = result; \ + } \ + } \ + } \ + else \ + { \ + SparseMatrix m1 = arg1.sparse_matrix_value (); \ + \ + if (! error_state) \ + { \ + SparseMatrix m2 = arg2.sparse_matrix_value (); \ + \ + if (! error_state) \ + { \ + SparseMatrix result = FCN (m1, m2); \ + if (! error_state) \ + retval(0) = result; \ + } \ + } \ + } \ + } \ + } \ + \ + return retval + +// PKG_ADD: dispatch ("min", "spmin", "sparse matrix"); +// PKG_ADD: dispatch ("min", "spmin", "sparse complex matrix"); +// PKG_ADD: dispatch ("min", "spmin", "sparse bool matrix"); +DEFUN_DLD (spmin, args, nargout, + "-*- texinfo -*-\n\ +@deftypefn {Mapping Function} {} spmin (@var{x}, @var{y}, @var{dim})\n\ +@deftypefnx {Mapping Function} {[@var{w}, @var{iw}] =} spmin (@var{x})\n\ +@cindex Utility Functions\n\ +For a vector argument, return the minimum value. For a matrix\n\ +argument, return the minimum value from each column, as a row\n\ +vector, or over the dimension @var{dim} if defined. For two matrices\n\ +(or a matrix and scalar), return the pair-wise minimum.\n\ +Thus,\n\ +\n\ +@example\n\ +min (min (@var{x}))\n\ +@end example\n\ +\n\ +@noindent\n\ +returns the smallest element of @var{x}, and\n\ +\n\ +@example\n\ +@group\n\ +min (2:5, pi)\n\ + @result{} 2.0000 3.0000 3.1416 3.1416\n\ +@end group\n\ +@end example\n\ +@noindent\n\ +compares each element of the range @code{2:5} with @code{pi}, and\n\ +returns a row vector of the minimum values.\n\ +\n\ +For complex arguments, the magnitude of the elements are used for\n\ +comparison.\n\ +\n\ +If called with one input and two output arguments,\n\ +@code{min} also returns the first index of the\n\ +minimum value(s). Thus,\n\ +\n\ +@example\n\ +@group\n\ +[x, ix] = min ([1, 3, 0, 2, 5])\n\ + @result{} x = 0\n\ + ix = 3\n\ +@end group\n\ +@end example\n\ +@end deftypefn") +{ + MINMAX_BODY (min); +} + +// PKG_ADD: dispatch ("max", "spmax", "sparse matrix"); +// PKG_ADD: dispatch ("max", "spmax", "sparse complex matrix"); +// PKG_ADD: dispatch ("max", "spmax", "sparse bool matrix"); +DEFUN_DLD (spmax, args, nargout, + "-*- texinfo -*-\n\ +@deftypefn {Mapping Function} {} spmax (@var{x}, @var{y}, @var{dim})\n\ +@deftypefnx {Mapping Function} {[@var{w}, @var{iw}] =} spmax (@var{x})\n\ +@cindex Utility Functions\n\ +For a vector argument, return the maximum value. For a matrix\n\ +argument, return the maximum value from each column, as a row\n\ +vector, or over the dimension @var{dim} if defined. For two matrices\n\ +(or a matrix and scalar), return the pair-wise maximum.\n\ +Thus,\n\ +\n\ +@example\n\ +max (max (@var{x}))\n\ +@end example\n\ +\n\ +@noindent\n\ +returns the largest element of @var{x}, and\n\ +\n\ +@example\n\ +@group\n\ +max (2:5, pi)\n\ + @result{} 3.1416 3.1416 4.0000 5.0000\n\ +@end group\n\ +@end example\n\ +@noindent\n\ +compares each element of the range @code{2:5} with @code{pi}, and\n\ +returns a row vector of the maximum values.\n\ +\n\ +For complex arguments, the magnitude of the elements are used for\n\ +comparison.\n\ +\n\ +If called with one input and two output arguments,\n\ +@code{max} also returns the first index of the\n\ +maximum value(s). Thus,\n\ +\n\ +@example\n\ +@group\n\ +[x, ix] = max ([1, 3, 5, 2, 5])\n\ + @result{} x = 5\n\ + ix = 3\n\ +@end group\n\ +@end example\n\ +@end deftypefn") +{ + MINMAX_BODY (max); +} + +// PKG_ADD: dispatch ("atan2", "spatan2", "sparse matrix"); +// PKG_ADD: dispatch ("atan2", "spatan2", "sparse complex matrix"); +// PKG_ADD: dispatch ("atan2", "spatan2", "sparse bool matrix"); +DEFUN_DLD (spatan2, args, , + "-*- texinfo -*-\n\ +@deftypefn {Loadable Function} {} spatan2 (@var{y}, @var{x})\n\ +Compute atan (Y / X) for corresponding sparse matrix elements of Y and X.\n\ +The result is in range -pi to pi.\n\ +@end deftypefn\n") +{ + octave_value retval; + int nargin = args.length (); + if (nargin == 2) { + SparseMatrix a, b; + double da, db; + bool is_double_a = false; + bool is_double_b = false; + + if (args(0).is_scalar_type ()) + { + is_double_a = true; + da = args(0).double_value(); + } + else + a = args(0).sparse_matrix_value (); + + if (args(1).is_scalar_type ()) + { + is_double_b = true; + db = args(1).double_value(); + } + else + b = args(1).sparse_matrix_value (); + + if (is_double_a && is_double_b) + retval = Matrix (1, 1, atan2(da, db)); + else if (is_double_a) + retval = atan2 (da, b); + else if (is_double_b) + retval = atan2 (a, db); + else + retval = atan2 (a, b); + + } else + print_usage("spatan2"); + + return retval; +} + +static octave_value +make_spdiag (const octave_value& a, const octave_value& b) +{ + octave_value retval; + + if (a.is_complex_type ()) + { + SparseComplexMatrix m = a.sparse_complex_matrix_value (); + int k = b.nint_value(true); + + if (error_state) + return retval; + + int nr = m.rows (); + int nc = m.columns (); + + if (nr == 0 || nc == 0) + retval = m; + else if (nr == 1 || nc == 1) + { + int roff = 0; + int coff = 0; + if (k > 0) + { + roff = 0; + coff = k; + } + else if (k < 0) + { + k = -k; + roff = k; + coff = 0; + } + + if (nr == 1) + { + int n = nc + k; + int nz = m.nnz (); + SparseComplexMatrix r (n, n, nz); + for (int i = 0; i < coff+1; i++) + r.xcidx (i) = 0; + for (int j = 0; j < nc; j++) + { + for (int i = m.cidx(j); i < m.cidx(j+1); i++) + { + r.xdata (i) = m.data (i); + r.xridx (i) = j + roff; + } + r.xcidx (j+coff+1) = m.cidx(j+1); + } + for (int i = nc+coff+1; i < n+1; i++) + r.xcidx (i) = nz; + retval = r; + } + else + { + int n = nr + k; + int nz = m.nnz (); + int ii = 0; + int ir = m.ridx(0); + SparseComplexMatrix r (n, n, nz); + for (int i = 0; i < coff+1; i++) + r.xcidx (i) = 0; + for (int i = 0; i < nr; i++) + { + if (ir == i) + { + r.xdata (ii) = m.data (ii); + r.xridx (ii++) = ir + roff; + if (ii != nz) + ir = m.ridx (ii); + } + r.xcidx (i+coff+1) = ii; + } + for (int i = nr+coff+1; i < n+1; i++) + r.xcidx (i) = nz; + retval = r; + } + } + else + { + SparseComplexMatrix r = m.diag (k); + // Don't use numel, since it can overflow for very large matrices + if (r.rows () > 0 && r.cols () > 0) + retval = r; + } + } + else if (a.is_real_type ()) + { + SparseMatrix m = a.sparse_matrix_value (); + + int k = b.nint_value(true); + + if (error_state) + return retval; + + int nr = m.rows (); + int nc = m.columns (); + + if (nr == 0 || nc == 0) + retval = m; + else if (nr == 1 || nc == 1) + { + int roff = 0; + int coff = 0; + if (k > 0) + { + roff = 0; + coff = k; + } + else if (k < 0) + { + k = -k; + roff = k; + coff = 0; + } + + if (nr == 1) + { + int n = nc + k; + int nz = m.nnz (); + SparseMatrix r (n, n, nz); + + for (int i = 0; i < coff+1; i++) + r.xcidx (i) = 0; + for (int j = 0; j < nc; j++) + { + for (int i = m.cidx(j); i < m.cidx(j+1); i++) + { + r.xdata (i) = m.data (i); + r.xridx (i) = j + roff; + } + r.xcidx (j+coff+1) = m.cidx(j+1); + } + for (int i = nc+coff+1; i < n+1; i++) + r.xcidx (i) = nz; + retval = r; + } + else + { + int n = nr + k; + int nz = m.nnz (); + int ii = 0; + int ir = m.ridx(0); + SparseMatrix r (n, n, nz); + for (int i = 0; i < coff+1; i++) + r.xcidx (i) = 0; + for (int i = 0; i < nr; i++) + { + if (ir == i) + { + r.xdata (ii) = m.data (ii); + r.xridx (ii++) = ir + roff; + if (ii != nz) + ir = m.ridx (ii); + } + r.xcidx (i+coff+1) = ii; + } + for (int i = nr+coff+1; i < n+1; i++) + r.xcidx (i) = nz; + retval = r; + } + } + else + { + SparseMatrix r = m.diag (k); + if (r.rows () > 0 && r.cols () > 0) + retval = r; + } + } + else + gripe_wrong_type_arg ("spdiag", a); + + return retval; +} + +// PKG_ADD: dispatch ("diag", "spdiag", "sparse matrix"); +// PKG_ADD: dispatch ("diag", "spdiag", "sparse complex matrix"); +// PKG_ADD: dispatch ("diag", "spdiag", "sparse bool matrix"); +DEFUN_DLD (spdiag, args, , + "-*- texinfo -*-\n\ +@deftypefn {Loadable Function} {} spdiag (@var{v}, @var{k})\n\ +Return a diagonal matrix with the sparse vector @var{v} on diagonal\n\ +@var{k}. The second argument is optional. If it is positive, the vector is\n\ +placed on the @var{k}-th super-diagonal. If it is negative, it is placed\n\ +on the @var{-k}-th sub-diagonal. The default value of @var{k} is 0, and\n\ +the vector is placed on the main diagonal. For example,\n\ +\n\ +@example\n\ +spdiag ([1, 2, 3], 1)\n\ +ans =\n\ +\n\ +Compressed Column Sparse (rows=4, cols=4, nnz=3)\n\ + (1 , 2) -> 1\n\ + (2 , 3) -> 2\n\ + (3 , 4) -> 3\n\ +@end example\n\ +\n\ +@end deftypefn\n\ +@seealso{diag}") +{ + octave_value retval; + + int nargin = args.length (); + + if (nargin == 1 && args(0).is_defined ()) + retval = make_spdiag (args(0), octave_value(0.)); + else if (nargin == 2 && args(0).is_defined () && args(1).is_defined ()) + retval = make_spdiag (args(0), args(1)); + else + print_usage ("spdiag"); + + return retval; +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/DLD-FUNCTIONS/spdet.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/DLD-FUNCTIONS/spdet.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,130 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "defun-dld.h" +#include "error.h" +#include "gripes.h" +#include "oct-obj.h" +#include "utils.h" + +#include "dbleDET.h" +#include "CmplxDET.h" + +#include "ov-re-sparse.h" +#include "ov-cx-sparse.h" + +// PKG_ADD: dispatch ("det", "spdet", "sparse matrix") +// PKG_ADD: dispatch ("det", "spdet", "sparse complex matrix") +// PKG_ADD: dispatch ("det", "spdet", "sparse bool matrix") +DEFUN_DLD (spdet, args, , + "-*- texinfo -*-\n\ +@deftypefn {Loadable Function} {[@var{d}, @var{rcond}] = } spdet (@var{a})\n\ +Compute the determinant of sparse matrix @var{a} using UMFPACK. Return\n\ +an estimate of the reciprocal condition number if requested.\n\ +@end deftypefn") +{ + octave_value_list retval; + + int nargin = args.length (); + + if (nargin != 1) + { + print_usage ("spdet"); + return retval; + } + + octave_value arg = args(0); + + int nr = arg.rows (); + int nc = arg.columns (); + + if (nr == 0 && nc == 0) + { + retval(0) = 1.0; + return retval; + } + + int arg_is_empty = empty_arg ("spdet", nr, nc); + if (arg_is_empty < 0) + return retval; + if (arg_is_empty > 0) + return octave_value (Matrix (1, 1, 1.0)); + + if (nr != nc) + { + gripe_square_matrix_required ("spdet"); + return retval; + } + + if (arg.is_real_type ()) + { + SparseMatrix m = args(0).sparse_matrix_value (); + + if (! error_state) + { + // Always compute rcond, so we can detect numerically + // singular matrices. + + int info; + double rcond = 0.0; + DET det = m.determinant (info, rcond); + retval(1) = rcond; + volatile double xrcond = rcond; + xrcond += 1.0; + retval(0) = ((info == -1 || xrcond == 1.0) ? 0.0 : det.value ()); + } + } + else if (arg.is_complex_type ()) + { + SparseComplexMatrix m = args(0).sparse_complex_matrix_value (); + + if (! error_state) + { + // Always compute rcond, so we can detect numerically + // singular matrices. + + int info; + double rcond = 0.0; + ComplexDET det = m.determinant (info, rcond); + retval(1) = rcond; + volatile double xrcond = rcond; + xrcond += 1.0; + retval(0) = ((info == -1 || xrcond == 1.0) + ? Complex (0.0) : det.value ()); + } + } + else + { + gripe_wrong_type_arg ("spdet", arg); + } + + return retval; +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/DLD-FUNCTIONS/splu.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/DLD-FUNCTIONS/splu.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,400 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "defun-dld.h" +#include "error.h" +#include "gripes.h" +#include "oct-obj.h" +#include "utils.h" + +#include "SparseCmplxLU.h" +#include "SparsedbleLU.h" +#include "ov-re-sparse.h" +#include "ov-cx-sparse.h" + +// PKG_ADD: dispatch ("lu", "splu", "sparse matrix") +// PKG_ADD: dispatch ("lu", "splu", "sparse complex matrix") +// PKG_ADD: dispatch ("lu", "splu", "sparse bool matrix") +DEFUN_DLD (splu, args, nargout, + "-*- texinfo -*-\n\ +@deftypefn {Loadable Function} {[@var{l}, @var{u}] =} splu (@var{a})\n\ +@deftypefnx {Loadable Function} {[@var{l}, @var{u}, @var{P}] =} splu (@var{a})\n\ +@deftypefnx {Loadable Function} {[@var{l}, @var{u}, @var{P}, @var{Q}] =} splu (@var{a})\n\ +@deftypefnx {Loadable Function} {[@var{l}, @var{u}, @var{P}, @var{Q}] =} splu (@dots{}, @var{thres})\n\ +@deftypefnx {Loadable Function} {[@var{l}, @var{u}, @var{P}] =} splu (@dots{}, @var{Q})\n\ +@cindex LU decomposition\n\ +Compute the LU decomposition of the sparse matrix @var{a}, using\n\ +subroutines from UMFPACK. The result is returned in a permuted\n\ +form, according to the optional return values @var{P} and @var{Q}.\n\ +\n\ +Called with two or three output arguments and a single input argument,\n\ +@dfn{splu} is a replacement for @dfn{lu}, and therefore the sparsity\n\ +preserving column permutations @var{Q} are not performed. Called with\n\ +a fourth output argument, the sparsity preserving column transformation\n\ +@var{Q} is returned, such that @code{@var{P} * @var{a} * @var{Q} =\n\ +@var{l} * @var{u}}.\n\ +\n\ +An additional input argument @var{thres}, that defines the pivoting\n\ +threshold can be given. Alternatively, the desired sparsity preserving\n\ +column permutations @var{Q} can be passed. Note that @var{Q} is assumed\n\ +to be fixed if three are fewer than four output arguments. Otherwise,\n\ +the updated column permutations are returned as the fourth argument.\n\ +\n\ +With two output arguments, returns the permuted forms of the upper and\n\ +lower triangular matrices, such that @code{@var{a} = @var{l} * @var{u}}.\n\ +With two or three output arguments, if a user-defined @var{Q} is given,\n\ +then @code{@var{u} * @var{Q}'} is returned. The matrix is not required to\n\ +be square.\n\ +@end deftypefn\n\ +@seealso{sparse, spinv, colamd, symamd}") +{ + octave_value_list retval; + + int nargin = args.length (); + + if (nargin < 1 || nargin > 3 || nargout > 4) + { + print_usage ("splu"); + return retval; + } + + octave_value arg = args(0); + + int nr = arg.rows (); + int nc = arg.columns (); + + int arg_is_empty = empty_arg ("splu", nr, nc); + + if (arg_is_empty < 0) + return retval; + else if (arg_is_empty > 0) + return octave_value_list (3, SparseMatrix ()); + + ColumnVector Qinit; + bool have_Qinit = false; + double thres = -1.; + + for (int k = 1; k < nargin; k++) + { + if (args(k).class_name () == "sparse") + { + SparseMatrix tmp = args (k).sparse_matrix_value (); + + if (error_state) + { + error ("splu: Not a valid permutation/threshold"); + return retval; + } + + dim_vector dv = tmp.dims (); + + if (dv(0) == 1 && dv(1) == 1) + thres = tmp (0); + else if (dv(0) == 1 || dv(1) == 1) + { + int nel = tmp.numel (); + Qinit.resize (nel); + for (int i = 0; i < nel; i++) + Qinit (i) = tmp (i) - 1; + have_Qinit = true; + } + else + { + int t_nc = tmp.cols (); + + if (tmp.nnz () != t_nc) + error ("splu: Not a valid permutation matrix"); + else + { + for (int i = 0; i < t_nc + 1; i++) + if (tmp.cidx(i) != i) + { + error ("splu: Not a valid permutation matrix"); + break; + } + } + + if (!error_state) + { + for (int i = 0; i < t_nc; i++) + if (tmp.data (i) != 1.) + { + error ("splu: Not a valid permutation matrix"); + break; + } + else + Qinit (i) = tmp.ridx (i) - 1; + } + + if (! error_state) + have_Qinit = true; + } + } + else + { + NDArray tmp = args(k).array_value (); + + if (error_state) + return retval; + + dim_vector dv = tmp.dims (); + if (dv.length () > 2) + { + error ("splu: second argument must be a vector/matrix or a scalar"); + } + else if (dv(0) == 1 && dv(1) == 1) + thres = tmp (0); + else if (dv(0) == 1 || dv(1) == 1) + { + int nel = tmp.numel (); + Qinit.resize (nel); + for (int i = 0; i < nel; i++) + Qinit (i) = tmp (i) - 1; + have_Qinit = true; + } + else + { + SparseMatrix tmp2 (tmp); + + int t_nc = tmp2.cols (); + + if (tmp2.nnz () != t_nc) + error ("splu: Not a valid permutation matrix"); + else + { + for (int i = 0; i < t_nc + 1; i++) + if (tmp2.cidx(i) != i) + { + error ("splu: Not a valid permutation matrix"); + break; + } + } + + if (!error_state) + { + for (int i = 0; i < t_nc; i++) + if (tmp2.data (i) != 1.) + { + error ("splu: Not a valid permutation matrix"); + break; + } + else + Qinit (i) = tmp2.ridx (i) - 1; + } + + if (! error_state) + have_Qinit = true; + } + } + } + + if (error_state) + return retval; + + if (arg.is_real_type ()) + { + SparseMatrix m = arg.sparse_matrix_value (); + + if (nargout < 4 && ! have_Qinit) + { + int m_nc = m.cols (); + Qinit.resize (m_nc); + for (int i = 0; i < m_nc; i++) + Qinit (i) = i; + } + + if (! error_state) + { + switch (nargout) + { + case 0: + case 1: + case 2: + { + SparseLU fact (m, Qinit, thres, true); + + SparseMatrix P = fact.Pr (); + SparseMatrix L = P.transpose () * fact.L (); + if (have_Qinit) + retval(1) = fact.U () * fact.Pc ().transpose (); + else + retval(1) = fact.U (); + + retval(0) = L; + } + break; + + case 3: + { + SparseLU fact (m, Qinit, thres, true); + + retval(2) = fact.Pr (); + if (have_Qinit) + retval(1) = fact.U () * fact.Pc ().transpose (); + else + retval(1) = fact.U (); + retval(0) = fact.L (); + } + break; + + case 4: + default: + { + if (have_Qinit) + { + SparseLU fact (m, Qinit, thres, false); + + retval(3) = fact.Pc (); + retval(2) = fact.Pr (); + retval(1) = fact.U (); + retval(0) = fact.L (); + } + else + { + SparseLU fact (m, thres); + + retval(3) = fact.Pc (); + retval(2) = fact.Pr (); + retval(1) = fact.U (); + retval(0) = fact.L (); + } + } + break; + } + } + } + else if (arg.is_complex_type ()) + { + SparseComplexMatrix m = arg.sparse_complex_matrix_value (); + + if (nargout < 4 && ! have_Qinit) + { + int m_nc = m.cols (); + Qinit.resize (m_nc); + for (int i = 0; i < m_nc; i++) + Qinit (i) = i; + } + + if (! error_state) + { + switch (nargout) + { + case 0: + case 1: + case 2: + { + SparseComplexLU fact (m, Qinit, thres, true); + + SparseMatrix P = fact.Pr (); + SparseComplexMatrix L = P.transpose () * fact.L (); + + if (have_Qinit) + retval(1) = fact.U () * fact.Pc ().transpose (); + else + retval(1) = fact.U (); + retval(0) = L; + } + break; + + case 3: + { + SparseComplexLU fact (m, Qinit, thres, true); + + retval(2) = fact.Pr (); + if (have_Qinit) + retval(1) = fact.U () * fact.Pc ().transpose (); + else + retval(1) = fact.U (); + retval(0) = fact.L (); + } + break; + + case 4: + default: + { + if (have_Qinit) + { + SparseComplexLU fact (m, Qinit, thres, false); + + retval(3) = fact.Pc (); + retval(2) = fact.Pr (); + retval(1) = fact.U (); + retval(0) = fact.L (); + } + else + { + SparseComplexLU fact (m, thres); + + retval(3) = fact.Pc (); + retval(2) = fact.Pr (); + retval(1) = fact.U (); + retval(0) = fact.L (); + } + } + break; + } + } + } + else + { + gripe_wrong_type_arg ("splu", arg); + } + + return retval; +} + +// PKG_ADD: dispatch ("inv", "spinv", "sparse matrix") +// PKG_ADD: dispatch ("inv", "spinv", "sparse complex matrix") +// PKG_ADD: dispatch ("inv", "spinv", "sparse bool matrix") +// PKG_ADD: dispatch ("inverse", "spinv", "sparse matrix") +// PKG_ADD: dispatch ("inverse", "spinv", "sparse complex matrix") +// PKG_ADD: dispatch ("inverse", "spinv", "sparse bool matrix") +DEFUN_DLD (spinv, args, nargout, + "-*- texinfo -*-\n\ +@deftypefn {Loadable Function} {[@var{x}, @var{rcond}] = } spinv (@var{a}, @var{Q})\n\ +@deftypefnx {Loadable Function} {[@var{x}, @var{rcond}, @var{Q}] = } spinv (@var{a}, @var{Q})\n\ +Compute the inverse of the square matrix @var{a}. Return an estimate\n\ +of the reciprocal condition number if requested, otherwise warn of an\n\ +ill-conditioned matrix if the reciprocal condition number is small.\n\ +\n\ +An optional second input argument @var{Q} is the optional pre-ordering of\n\ +the matrix, such that @code{@var{x} = inv (@var{a} (:, @var{Q}))}. @var{Q}\n\ +can equally be a matrix, in which case @code{@var{x} = inv (@var{a} *\n\ +@var{Q}))}.\n\ +\n\ +If a third output argument is given then the permuations to achieve a sparse\n\ +inverse are returned. It is not required that the return column permutations\n\ +@var{Q} and the same as the user supplied permutations\n\ +@end deftypefn") +{ + error ("spinv: not implemented yet"); + return octave_value (); +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/DLD-FUNCTIONS/spparms.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/DLD-FUNCTIONS/spparms.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,167 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "defun-dld.h" +#include "ov.h" +#include "pager.h" +#include "error.h" +#include "gripes.h" + +#include "oct-spparms.h" + +DEFUN_DLD (spparms, args, nargout, + "-*- texinfo -*-\n\ +@deftypefn {Loadable Function} { } spparms ()\n\ +@deftypefnx {Loadable Function} {@var{vals} =} spparms ()\n\ +@deftypefnx {Loadable Function} {[@var{keys}, @var{vals}] =} spparms ()\n\ +@deftypefnx {Loadable Function} {@var{val} =} spparms (@var{key})\n\ +@deftypefnx {Loadable Function} { } spparms (@var{vals})\n\ +@deftypefnx {Loadable Function} { } spparms ('defaults')\n\ +@deftypefnx {Loadable Function} { } spparms ('tight')\n\ +@deftypefnx {Loadable Function} { } spparms (@var{key}, @var{val})\n\ +Sets or displays the parameters used by the sparse solvers and factorization\n\ +functions. The first four calls above get information about the current\n\ +settings, while the others change the current settings. The parameters are\n\ +stored as pairs of keys and values, where the values are all floats and the\n\ +keys are one of the strings\n\ +\n\ +@itemize\n\ +@item spumoni\n\ +Printing level of debugging information of the solvers (default 0)\n\ +@item ths_rel\n\ +?? (default 1)\n\ +@item ths_abs\n\ +?? (default 1)\n\ +@item exact_d\n\ +?? (default 0)\n\ +@item supernd\n\ +?? (default 3)\n\ +@item rreduce\n\ +?? (default 3)\n\ +@item wh_frac\n\ +?? (default 0.5)\n\ +@item autommd\n\ +Flag whether the LU/QR and the '\\' and '/' operators will automatically\n\ +use the sparsity preserving mmd functions (default 1)\n\ +@item autoamd\n\ +Flag whether the LU and the '\\' and '/' operators will automatically\n\ +use the sparsity preserving amd functions (default 1)\n\ +@item piv_tol\n\ +The pivot tolerance of the UMFPACK solvers (default 0.1)\n\ +@item bandden\n\ +?? (default 0.5)\n\ +@item umfpack\n\ +Flag whether the UMFPACK or mmd solvers are used for the LU, '\\' and\n\ +'/' operations (default 1)\n\ +@end itemize\n\ +\n\ +The value of individual keys can be set with @code{spparms (@var{key},\n\ +@var{val})}. The default values can be restored with the special keyword\n\ +'defaults'. The special keyword 'tight' can be used to set the mmd solvers\n\ +to attempt for a sparser solution at the potetial cost of longer running\n\ +time.\n\ +@end deftypefn") +{ + octave_value_list retval; + int nargin = args.length (); + + if (nargin == 0) + { + if (nargout == 0) + Voctave_sparse_controls.print_info (octave_stdout, ""); + else if (nargout == 1) + retval(0) = Voctave_sparse_controls.get_vals (); + else if (nargout == 2) + { + retval (0) = Voctave_sparse_controls.get_keys (); + retval (1) = Voctave_sparse_controls.get_vals (); + } + else + error ("spparms: too many outpu arguments"); + } + else if (nargin == 1) + { + if (args(0).is_string ()) + { + std::string str = args(0).string_value (); + int len = str.length (); + for (int i = 0; i < len; i++) + str [i] = tolower (str [i]); + + if (str == "defaults") + Voctave_sparse_controls.defaults (); + else if (str == "tight") + Voctave_sparse_controls.tight (); + else + { + double val = Voctave_sparse_controls.get_key (str); + if (xisnan (val)) + error ("spparams: unrecognized key"); + else + retval (0) = val; + } + } + else + { + NDArray vals = args(0).array_value (); + + if (error_state) + error ("spparms: input must be a string or a vector"); + else if (vals.numel () > OCTAVE_SPARSE_CONTROLS_SIZE) + error ("spparams: too many elements in values vector"); + else + for (int i = 0; i < vals.length (); i++) + Voctave_sparse_controls (i) = vals (i); + } + } + else if (nargin == 2) + { + if (args(0).is_string ()) + { + std::string str = args(0).string_value (); + + double val = args(1).double_value (); + + if (error_state) + error ("spparms: second argument must be a real scalar"); + else if (str == "umfpack") + warning ("spparms: request to disable umfpack solvers ignored"); + else if (!Voctave_sparse_controls.set_key (str, val)) + error ("spparms: key not found"); + } + else + error ("spparms: first argument must be a string"); + } + else + error ("spparms: too many input arguments"); + + return retval; +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/Makefile.in --- a/src/Makefile.in Fri Feb 25 17:42:55 2005 +0000 +++ b/src/Makefile.in Fri Feb 25 19:55:28 2005 +0000 @@ -42,13 +42,14 @@ OPT_HANDLERS := DASPK-opts.cc DASRT-opts.cc DASSL-opts.cc \ LSODE-opts.cc NLEqn-opts.cc ODESSA-opts.cc Quad-opts.cc -DLD_XSRC := balance.cc besselj.cc betainc.cc chol.cc colloc.cc \ - daspk.cc dasrt.cc dassl.cc det.cc eig.cc expm.cc fft.cc fft2.cc \ - fftn.cc fftw_wisdom.cc filter.cc find.cc fsolve.cc gammainc.cc \ - gcd.cc getgrent.cc getpwent.cc getrusage.cc givens.cc hess.cc \ - inv.cc kron.cc lpsolve.cc lsode.cc lu.cc minmax.cc \ - odessa.cc pinv.cc qr.cc quad.cc qz.cc rand.cc schur.cc \ - sort.cc sqrtm.cc svd.cc syl.cc time.cc gplot.l +DLD_XSRC := balance.cc besselj.cc betainc.cc chol.cc colamd.cc \ + colloc.cc daspk.cc dasrt.cc dassl.cc det.cc dispatch.cc \ + eig.cc expm.cc fft.cc fft2.cc fftn.cc fftw_wisdom.cc \ + filter.cc find.cc fsolve.cc gammainc.cc gcd.cc getgrent.cc \ + getpwent.cc getrusage.cc givens.cc hess.cc inv.cc kron.cc \ + lpsolve.cc lsode.cc lu.cc minmax.cc odessa.cc pinv.cc qr.cc \ + quad.cc qz.cc rand.cc schur.cc sort.cc sparse.cc spdet.cc \ + splu.cc spparms.cc sqrtm.cc svd.cc syl.cc time.cc gplot.l DLD_SRC := $(addprefix DLD-FUNCTIONS/, $(DLD_XSRC)) @@ -79,6 +80,9 @@ ov-typeinfo.h ov-type-conv.h \ $(OV_INTTYPE_INC) +OV_SPARSE_INCLUDES := \ + ov-base-sparse.h ov-bool-sparse.h ov-cx-sparse.h ov-re-sparse.h + PT_INCLUDES := pt.h pt-all.h pt-arg-list.h pt-assign.h pt-binop.h \ pt-bp.h pt-cell.h pt-check.h pt-cmd.h pt-colon.h pt-const.h \ pt-decl.h pt-except.h pt-exp.h pt-fcn-handle.h pt-id.h pt-idx.h \ @@ -94,8 +98,12 @@ oct-prcstrm.h oct-procbuf.h oct-stdstrm.h oct-stream.h \ oct-strstrm.h oct-lvalue.h oct.h octave.h ops.h pager.h \ parse.h pr-output.h procstream.h sighandlers.h siglist.h \ - symtab.h sysdep.h token.h toplev.h unwind-prot.h utils.h \ - variables.h version.h xdiv.h xpow.h $(OV_INCLUDES) $(PT_INCLUDES) + sparse-ops.h sparse-xdiv.h sparse-xpow.h symtab.h sysdep.h \ + token.h toplev.h unwind-prot.h utils.h variables.h version.h \ + xdiv.h xpow.h \ + $(OV_INCLUDES) \ + $(PT_INCLUDES) \ + $(OV_SPARSE_INCLUDES) TI_XSRC := Array-os.cc Array-sym.cc Array-tc.cc @@ -105,6 +113,14 @@ op-i8-i8.cc op-i16-i16.cc op-i32-i32.cc op-i64-i64.cc \ op-ui8-ui8.cc op-ui16-ui16.cc op-ui32-ui32.cc op-ui64-ui64.cc +SPARSE_OP_XSRC := op-bm-sbm.cc op-b-sbm.cc op-cm-scm.cc op-cm-sm.cc \ + op-cs-scm.cc op-cs-sm.cc op-fil-sbm.cc op-fil-scm.cc \ + op-fil-sm.cc op-m-scm.cc op-m-sm.cc op-sbm-b.cc op-sbm-bm.cc \ + op-sbm-sbm.cc op-scm-cm.cc op-scm-cs.cc op-scm-m.cc \ + op-scm-s.cc op-scm-scm.cc op-scm-sm.cc op-sm-cm.cc \ + op-sm-cs.cc op-sm-m.cc op-sm-s.cc op-sm-scm.cc op-sm-sm.cc \ + op-s-scm.cc op-s-sm.cc + OP_XSRC := op-b-b.cc op-b-bm.cc op-bm-b.cc op-bm-bm.cc \ op-cell.cc op-chm.cc op-cm-cm.cc op-cm-cs.cc op-cm-m.cc \ op-cm-s.cc op-cs-cm.cc op-cs-cs.cc op-cs-m.cc \ @@ -114,7 +130,8 @@ op-m-cs.cc op-m-m.cc op-m-s.cc op-range.cc op-s-cm.cc \ op-s-cs.cc op-s-m.cc op-s-s.cc op-str-m.cc \ op-str-s.cc op-str-str.cc op-streamoff.cc op-struct.cc \ - $(INTTYPE_OP_XSRC) + $(INTTYPE_OP_XSRC) \ + $(SPARSE_OP_XSRC) OP_SRC := $(addprefix OPERATORS/, $(OP_XSRC)) @@ -124,6 +141,9 @@ ov-int8.cc ov-int16.cc ov-int32.cc ov-int64.cc \ ov-uint8.cc ov-uint16.cc ov-uint32.cc ov-uint64.cc +OV_SPARSE_SRC := \ + ov-base-sparse.cc ov-bool-sparse.cc ov-cx-sparse.cc ov-re-sparse.cc + OV_SRC := ov-base.cc ov-ch-mat.cc \ ov-cs-list.cc ov-list.cc ov-re-mat.cc ov-cx-mat.cc \ ov-range.cc ov-scalar.cc ov-complex.cc ov-str-mat.cc \ @@ -131,7 +151,8 @@ ov-colon.cc ov-bool-mat.cc ov-bool.cc ov-file.cc ov-cell.cc \ ov.cc ov-fcn.cc ov-builtin.cc ov-dld-fcn.cc ov-mapper.cc \ ov-usr-fcn.cc ov-fcn-handle.cc ov-fcn-inline.cc ov-typeinfo.cc \ - $(OV_INTTYPE_SRC) + $(OV_INTTYPE_SRC) \ + $(OV_SPARSE_SRC) PT_SRC := pt.cc pt-arg-list.cc pt-assign.cc pt-bp.cc pt-binop.cc \ pt-cell.cc pt-check.cc pt-cmd.cc pt-colon.cc pt-const.cc \ @@ -149,9 +170,10 @@ oct-obj.cc oct-prcstrm.cc oct-procbuf.cc oct-stdstrm.cc \ oct-stream.cc oct-strstrm.cc oct-lvalue.cc pager.cc \ parse.y pr-output.cc procstream.cc sighandlers.cc \ - siglist.c strcasecmp.c strncase.c strfns.cc symtab.cc \ - syscalls.cc sysdep.cc token.cc toplev.cc \ - unwind-prot.cc utils.cc variables.cc xdiv.cc xpow.cc \ + siglist.c sparse-xdiv.cc sparse-xpow.cc strcasecmp.c \ + strncase.c strfns.cc symtab.cc syscalls.cc sysdep.cc \ + token.cc toplev.cc unwind-prot.cc utils.cc variables.cc \ + xdiv.cc xpow.cc \ $(OV_SRC) \ $(PT_SRC) diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-b-b.cc --- a/src/OPERATORS/op-b-b.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-b-b.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-b-bm.cc --- a/src/OPERATORS/op-b-bm.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-b-bm.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-b-sbm.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/OPERATORS/op-b-sbm.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,96 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "gripes.h" +#include "oct-obj.h" +#include "ov.h" +#include "ov-typeinfo.h" +#include "ov-bool.h" +#include "ov-scalar.h" +#include "ops.h" + +#include "ov-re-sparse.h" + +// bool by sparse bool matrix ops. + +DEFBINOP_FN (ne, bool, sparse_bool_matrix, mx_el_ne) +DEFBINOP_FN (eq, bool, sparse_bool_matrix, mx_el_eq) + +DEFBINOP_FN (el_and, bool, sparse_bool_matrix, mx_el_and) +DEFBINOP_FN (el_or, bool, sparse_bool_matrix, mx_el_or) + +DEFCATOP (b_sbm, bool, sparse_bool_matrix) +{ + CAST_BINOP_ARGS (octave_bool&, const octave_sparse_bool_matrix&); + SparseBoolMatrix tmp (1, 1, v1.bool_value ()); + return octave_value (tmp. concat (v2.sparse_bool_matrix_value (), + ra_idx)); +} + +DEFCATOP (b_sm, bool, sparse_matrix) +{ + CAST_BINOP_ARGS (octave_bool&, const octave_sparse_matrix&); + SparseMatrix tmp (1, 1, v1.scalar_value ()); + return octave_value (tmp. concat (v2.sparse_matrix_value (), ra_idx)); +} + +DEFCATOP (s_sbm, scalar, sparse_bool_matrix) +{ + CAST_BINOP_ARGS (octave_scalar&, const octave_sparse_bool_matrix&); + SparseMatrix tmp (1, 1, v1.scalar_value ()); + return octave_value(tmp. concat (v2.sparse_matrix_value (), ra_idx)); +} + +DEFCONV (sparse_bool_matrix_conv, bool, sparse_bool_matrix) +{ + CAST_CONV_ARG (const octave_bool&); + + return new octave_sparse_bool_matrix + (SparseBoolMatrix (1, 1, v.bool_value ())); +} + +void +install_b_sbm_ops (void) +{ + INSTALL_BINOP (op_eq, octave_bool, octave_sparse_bool_matrix, eq); + INSTALL_BINOP (op_ne, octave_bool, octave_sparse_bool_matrix, ne); + + INSTALL_BINOP (op_el_and, octave_bool, octave_sparse_bool_matrix, el_and); + INSTALL_BINOP (op_el_or, octave_bool, octave_sparse_bool_matrix, el_or); + + INSTALL_CATOP (octave_bool, octave_sparse_bool_matrix, b_sbm); + INSTALL_CATOP (octave_bool, octave_sparse_matrix, b_sm); + INSTALL_CATOP (octave_scalar, octave_sparse_bool_matrix, s_sbm); + + INSTALL_ASSIGNCONV (octave_bool, octave_sparse_bool_matrix, octave_sparse_bool_matrix); + + INSTALL_WIDENOP (octave_bool, octave_sparse_bool_matrix, sparse_bool_matrix_conv); +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-bm-b.cc --- a/src/OPERATORS/op-bm-b.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-bm-b.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-bm-bm.cc --- a/src/OPERATORS/op-bm-bm.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-bm-bm.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-bm-sbm.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/OPERATORS/op-bm-sbm.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,102 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "gripes.h" +#include "oct-obj.h" +#include "ov.h" +#include "ov-typeinfo.h" +#include "ov-bool-mat.h" +#include "boolMatrix.h" +#include "ov-scalar.h" +#include "ops.h" + +#include "ov-re-sparse.h" +#include "smx-bm-sbm.h" +#include "smx-sbm-bm.h" + +// bool matrix by sparse bool matrix ops. + +DEFBINOP_FN (eq, bool_matrix, sparse_bool_matrix, mx_el_eq) +DEFBINOP_FN (ne, bool_matrix, sparse_bool_matrix, mx_el_ne) + +DEFBINOP_FN (el_and, bool_matrix, sparse_bool_matrix, mx_el_and) +DEFBINOP_FN (el_or, bool_matrix, sparse_bool_matrix, mx_el_or) + +DEFCATOP (bm_sbm, bool_matrix, sparse_bool_matrix) +{ + CAST_BINOP_ARGS (octave_bool_matrix&, const octave_sparse_bool_matrix&); + SparseBoolMatrix tmp (v1.bool_matrix_value ()); + return octave_value (tmp. concat (v2.sparse_bool_matrix_value (), + ra_idx)); +} + +DEFCATOP (m_sbm, matrix, sparse_bool_matrix) +{ + CAST_BINOP_ARGS (octave_matrix&, const octave_sparse_bool_matrix&); + SparseMatrix tmp (v1.matrix_value ()); + return octave_value (tmp. concat (v2.sparse_matrix_value (), ra_idx)); +} + +DEFCATOP (bm_sm, bool_matrix, sparse_matrix) +{ + CAST_BINOP_ARGS (octave_bool_matrix&, const octave_sparse_matrix&); + SparseMatrix tmp (v1.matrix_value ()); + return octave_value (tmp. concat (v2.sparse_matrix_value (), ra_idx)); +} + +DEFCONV (sparse_bool_matrix_conv, bool_matrix, sparse_bool_matrix) +{ + CAST_CONV_ARG (const octave_bool_matrix&); + return new octave_sparse_bool_matrix + (SparseBoolMatrix (v.bool_matrix_value ())); +} + +void +install_bm_sbm_ops (void) +{ + INSTALL_BINOP (op_eq, octave_bool_matrix, octave_sparse_bool_matrix, eq); + INSTALL_BINOP (op_ne, octave_bool_matrix, octave_sparse_bool_matrix, ne); + + INSTALL_BINOP (op_el_and, octave_bool_matrix, octave_sparse_bool_matrix, + el_and); + INSTALL_BINOP (op_el_or, octave_bool_matrix, octave_sparse_bool_matrix, + el_or); + + INSTALL_CATOP (octave_bool_matrix, octave_sparse_bool_matrix, bm_sbm); + INSTALL_CATOP (octave_bool_matrix, octave_sparse_matrix, bm_sm); + INSTALL_CATOP (octave_matrix, octave_sparse_bool_matrix, m_sbm); + + INSTALL_ASSIGNCONV (octave_bool_matrix, octave_sparse_bool_matrix, + octave_sparse_bool_matrix); + + INSTALL_WIDENOP (octave_bool_matrix, octave_sparse_bool_matrix, + sparse_bool_matrix_conv); +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-cell.cc --- a/src/OPERATORS/op-cell.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-cell.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-chm.cc --- a/src/OPERATORS/op-chm.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-chm.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-cm-cm.cc --- a/src/OPERATORS/op-cm-cm.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-cm-cm.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-cm-cs.cc --- a/src/OPERATORS/op-cm-cs.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-cm-cs.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-cm-m.cc --- a/src/OPERATORS/op-cm-m.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-cm-m.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-cm-s.cc --- a/src/OPERATORS/op-cm-s.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-cm-s.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-cm-scm.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/OPERATORS/op-cm-scm.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,182 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "gripes.h" +#include "oct-obj.h" +#include "ov.h" +#include "ov-typeinfo.h" +#include "ov-cx-mat.h" +#include "ops.h" +#include "xdiv.h" + +#include "sparse-xpow.h" +#include "sparse-xdiv.h" +#include "smx-scm-cm.h" +#include "smx-cm-scm.h" +#include "ov-cx-sparse.h" + +// complex matrix by sparse complex matrix ops. + +DEFBINOP_OP (add, complex_matrix, sparse_complex_matrix,+) +DEFBINOP_OP (sub, complex_matrix, sparse_complex_matrix,-) + +DEFBINOP (mul, complex_matrix, sparse_complex_matrix) +{ + CAST_BINOP_ARGS (const octave_complex_matrix&, + const octave_sparse_complex_matrix&); + + ComplexMatrix tmp (v2.complex_matrix_value ()); + + return octave_value ( v1.complex_matrix_value() * tmp); +} + +DEFBINOP (div, complex_matrix, sparse_complex_matrix) +{ + CAST_BINOP_ARGS (const octave_complex_matrix&, + const octave_sparse_complex_matrix&); + + return xdiv (v1.complex_matrix_value (), + v2.sparse_complex_matrix_value ()); +} + +DEFBINOPX (pow, complex_matrix, sparse_complex_matrix) +{ + error ("can't do A ^ B for A and B both matrices"); + return octave_value (); +} + +DEFBINOP (ldiv, complex_matrix, sparse_complex_matrix) +{ + CAST_BINOP_ARGS (const octave_complex_matrix&, + const octave_sparse_complex_matrix&); + + return xleftdiv (v1.complex_matrix_value (), + v2.complex_matrix_value ()); +} + +DEFBINOP_FN (lt, complex_matrix, sparse_complex_matrix, mx_el_lt) +DEFBINOP_FN (le, complex_matrix, sparse_complex_matrix, mx_el_le) +DEFBINOP_FN (eq, complex_matrix, sparse_complex_matrix, mx_el_eq) +DEFBINOP_FN (ge, complex_matrix, sparse_complex_matrix, mx_el_ge) +DEFBINOP_FN (gt, complex_matrix, sparse_complex_matrix, mx_el_gt) +DEFBINOP_FN (ne, complex_matrix, sparse_complex_matrix, mx_el_ne) + +DEFBINOP_FN (el_mul, complex_matrix, sparse_complex_matrix, product) +DEFBINOP_FN (el_div, complex_matrix, sparse_complex_matrix, quotient) + +DEFBINOP (el_pow, complex_matrix, sparse_complex_matrix) +{ + CAST_BINOP_ARGS (const octave_complex_matrix&, + const octave_sparse_complex_matrix&); + + return octave_value + (elem_xpow (SparseComplexMatrix (v1.complex_matrix_value ()), + v2.sparse_complex_matrix_value ())); +} + +DEFBINOP (el_ldiv, sparse_complex_matrix, matrix) +{ + CAST_BINOP_ARGS (const octave_complex_matrix&, + const octave_sparse_complex_matrix&); + + return octave_value (quotient (v2.sparse_complex_matrix_value (), + v1.complex_matrix_value ())); +} + +DEFBINOP_FN (el_and, complex_matrix, sparse_complex_matrix, mx_el_and) +DEFBINOP_FN (el_or, complex_matrix, sparse_complex_matrix, mx_el_or) + +DEFCATOP (cm_scm, complex_matrix, sparse_complex_matrix) +{ + CAST_BINOP_ARGS (octave_complex_matrix&, + const octave_sparse_complex_matrix&); + SparseComplexMatrix tmp (v1.complex_matrix_value ()); + return octave_value (tmp. concat (v2.sparse_complex_matrix_value (), + ra_idx)); +} + +DEFCONV (sparse_complex_matrix_conv, complex_matrix, + sparse_complex_matrix) +{ + CAST_CONV_ARG (const octave_complex_matrix&); + return new octave_sparse_complex_matrix + (SparseComplexMatrix (v.complex_matrix_value ())); +} + +void +install_cm_scm_ops (void) +{ + INSTALL_BINOP (op_add, octave_complex_matrix, + octave_sparse_complex_matrix, add); + INSTALL_BINOP (op_sub, octave_complex_matrix, + octave_sparse_complex_matrix, sub); + INSTALL_BINOP (op_mul, octave_complex_matrix, + octave_sparse_complex_matrix, mul); + INSTALL_BINOP (op_div, octave_complex_matrix, + octave_sparse_complex_matrix, div); + INSTALL_BINOP (op_pow, octave_complex_matrix, + octave_sparse_complex_matrix, pow); + INSTALL_BINOP (op_ldiv, octave_complex_matrix, + octave_sparse_complex_matrix, ldiv); + INSTALL_BINOP (op_lt, octave_complex_matrix, + octave_sparse_complex_matrix, lt); + INSTALL_BINOP (op_le, octave_complex_matrix, + octave_sparse_complex_matrix, le); + INSTALL_BINOP (op_eq, octave_complex_matrix, + octave_sparse_complex_matrix, eq); + INSTALL_BINOP (op_ge, octave_complex_matrix, + octave_sparse_complex_matrix, ge); + INSTALL_BINOP (op_gt, octave_complex_matrix, + octave_sparse_complex_matrix, gt); + INSTALL_BINOP (op_ne, octave_complex_matrix, + octave_sparse_complex_matrix, ne); + INSTALL_BINOP (op_el_mul, octave_complex_matrix, + octave_sparse_complex_matrix, el_mul); + INSTALL_BINOP (op_el_div, octave_complex_matrix, + octave_sparse_complex_matrix, el_div); + INSTALL_BINOP (op_el_pow, octave_complex_matrix, + octave_sparse_complex_matrix, el_pow); + INSTALL_BINOP (op_el_ldiv, octave_complex_matrix, + octave_sparse_complex_matrix, el_ldiv); + INSTALL_BINOP (op_el_and, octave_complex_matrix, + octave_sparse_complex_matrix, el_and); + INSTALL_BINOP (op_el_or, octave_complex_matrix, + octave_sparse_complex_matrix, el_or); + + INSTALL_CATOP (octave_complex_matrix, + octave_sparse_complex_matrix, cm_scm); + + INSTALL_ASSIGNCONV (octave_complex_matrix, octave_sparse_complex_matrix, + octave_sparse_complex_matrix); + + INSTALL_WIDENOP (octave_complex_matrix, octave_sparse_complex_matrix, + sparse_complex_matrix_conv); +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-cm-sm.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/OPERATORS/op-cm-sm.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,151 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "gripes.h" +#include "oct-obj.h" +#include "ov.h" +#include "ov-typeinfo.h" +#include "ov-cx-mat.h" +#include "ops.h" +#include "xdiv.h" + +#include "sparse-xpow.h" +#include "sparse-xdiv.h" +#include "smx-sm-cm.h" +#include "smx-cm-sm.h" +#include "ov-re-sparse.h" + +// complex matrix by sparse matrix ops. + +DEFBINOP_OP (add, complex_matrix, sparse_matrix, +) +DEFBINOP_OP (sub, complex_matrix, sparse_matrix, -) + +DEFBINOP (mul, complex_matrix, sparse_matrix) +{ + CAST_BINOP_ARGS (const octave_complex_matrix&, + const octave_sparse_matrix&); + + Matrix tmp (v2.matrix_value ()); + + return octave_value (v1.complex_matrix_value() * tmp); +} + +DEFBINOP (div, complex_matrix, sparse_matrix) +{ + CAST_BINOP_ARGS (const octave_complex_matrix&, + const octave_sparse_matrix&); + + return xdiv (v1.complex_matrix_value (), v2.sparse_matrix_value ()); +} + +DEFBINOPX (pow, complex_matrix, sparse_matrix) +{ + error ("can't do A ^ B for A and B both matrices"); + return octave_value (); +} + +DEFBINOP (ldiv, complex_matrix, sparse_matrix) +{ + CAST_BINOP_ARGS (const octave_complex_matrix&, + const octave_sparse_matrix&); + + return xleftdiv (v1.complex_matrix_value (), v2.matrix_value ()); +} + +DEFBINOP_FN (lt, complex_matrix, sparse_matrix, mx_el_lt) +DEFBINOP_FN (le, complex_matrix, sparse_matrix, mx_el_le) +DEFBINOP_FN (eq, complex_matrix, sparse_matrix, mx_el_eq) +DEFBINOP_FN (ge, complex_matrix, sparse_matrix, mx_el_ge) +DEFBINOP_FN (gt, complex_matrix, sparse_matrix, mx_el_gt) +DEFBINOP_FN (ne, complex_matrix, sparse_matrix, mx_el_ne) + +DEFBINOP_FN (el_mul, complex_matrix, sparse_matrix, product) +DEFBINOP_FN (el_div, complex_matrix, sparse_matrix, quotient) + +DEFBINOP (el_pow, complex_matrix, sparse_matrix) +{ + CAST_BINOP_ARGS (const octave_complex_matrix&, + const octave_sparse_matrix&); + + return octave_value + (elem_xpow ( SparseComplexMatrix (v1.complex_matrix_value ()), + v2.sparse_matrix_value ())); +} + +DEFBINOP (el_ldiv, complex_matrix, sparse_matrix) +{ + CAST_BINOP_ARGS (const octave_complex_matrix&, + const octave_sparse_matrix&); + return octave_value + (quotient (v2.sparse_matrix_value (), v1.complex_matrix_value ())); +} + +DEFBINOP_FN (el_and, complex_matrix, sparse_matrix, mx_el_and) +DEFBINOP_FN (el_or, complex_matrix, sparse_matrix, mx_el_or) + +DEFCATOP (cm_sm, complex_matrix, sparse_matrix) +{ + CAST_BINOP_ARGS (octave_complex_matrix&, const octave_sparse_matrix&); + SparseComplexMatrix tmp (v1.complex_matrix_value ()); + return octave_value (tmp. concat (v2.sparse_matrix_value (), ra_idx)); +} + +void +install_cm_sm_ops (void) +{ + INSTALL_BINOP (op_add, octave_complex_matrix, octave_sparse_matrix, add); + INSTALL_BINOP (op_sub, octave_complex_matrix, octave_sparse_matrix, sub); + INSTALL_BINOP (op_mul, octave_complex_matrix, octave_sparse_matrix, mul); + INSTALL_BINOP (op_div, octave_complex_matrix, octave_sparse_matrix, div); + INSTALL_BINOP (op_pow, octave_complex_matrix, octave_sparse_matrix, pow); + INSTALL_BINOP (op_ldiv, octave_complex_matrix, octave_sparse_matrix, ldiv); + INSTALL_BINOP (op_lt, octave_complex_matrix, octave_sparse_matrix, lt); + INSTALL_BINOP (op_le, octave_complex_matrix, octave_sparse_matrix, le); + INSTALL_BINOP (op_eq, octave_complex_matrix, octave_sparse_matrix, eq); + INSTALL_BINOP (op_ge, octave_complex_matrix, octave_sparse_matrix, ge); + INSTALL_BINOP (op_gt, octave_complex_matrix, octave_sparse_matrix, gt); + INSTALL_BINOP (op_ne, octave_complex_matrix, octave_sparse_matrix, ne); + INSTALL_BINOP (op_el_mul, octave_complex_matrix, octave_sparse_matrix, + el_mul); + INSTALL_BINOP (op_el_div, octave_complex_matrix, octave_sparse_matrix, + el_div); + INSTALL_BINOP (op_el_pow, octave_complex_matrix, octave_sparse_matrix, + el_pow); + INSTALL_BINOP (op_el_ldiv, octave_complex_matrix, octave_sparse_matrix, + el_ldiv); + INSTALL_BINOP (op_el_and, octave_complex_matrix, octave_sparse_matrix, + el_and); + INSTALL_BINOP (op_el_or, octave_complex_matrix, octave_sparse_matrix, + el_or); + + INSTALL_CATOP (octave_complex_matrix, octave_sparse_matrix, cm_sm); + +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-cs-cm.cc --- a/src/OPERATORS/op-cs-cm.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-cs-cm.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-cs-cs.cc --- a/src/OPERATORS/op-cs-cs.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-cs-cs.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-cs-m.cc --- a/src/OPERATORS/op-cs-m.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-cs-m.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-cs-s.cc --- a/src/OPERATORS/op-cs-s.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-cs-s.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-cs-scm.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/OPERATORS/op-cs-scm.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,167 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "gripes.h" +#include "oct-obj.h" +#include "ov.h" +#include "ov-typeinfo.h" +#include "ov-cx-mat.h" +#include "ov-complex.h" +#include "ops.h" +#include "xpow.h" + +#include "sparse-xpow.h" +#include "sparse-xdiv.h" +#include "ov-cx-sparse.h" + +// complex scalar by sparse complex matrix ops. + +DEFBINOP_OP (add, complex, sparse_complex_matrix, +) +DEFBINOP_OP (sub, complex, sparse_complex_matrix, -) +DEFBINOP_OP (mul, complex, sparse_complex_matrix, *) + +DEFBINOP (div, complex, sparse_complex_matrix) +{ + CAST_BINOP_ARGS (const octave_complex&, + const octave_sparse_complex_matrix&); + + ComplexMatrix m1 = ComplexMatrix (1, 1, v1.complex_value ()); + SparseComplexMatrix m2 = v2.sparse_complex_matrix_value (); + + return xdiv (m1, m2); +} + +DEFBINOP (pow, complex, sparse_complex_matrix) +{ + CAST_BINOP_ARGS (const octave_complex&, + const octave_sparse_complex_matrix&); + return xpow (v1.complex_value (), v2.complex_matrix_value ()); +} + +DEFBINOP (ldiv, complex, sparse_complex_matrix) +{ + CAST_BINOP_ARGS (const octave_complex&, const octave_sparse_complex_matrix&); + + Complex d = v1.complex_value (); + + if (d == 0.0) + gripe_divide_by_zero (); + + return octave_value (v2.sparse_complex_matrix_value () / d); +} + +DEFBINOP_FN (lt, complex, sparse_complex_matrix, mx_el_lt) +DEFBINOP_FN (le, complex, sparse_complex_matrix, mx_el_le) +DEFBINOP_FN (eq, complex, sparse_complex_matrix, mx_el_eq) +DEFBINOP_FN (ge, complex, sparse_complex_matrix, mx_el_ge) +DEFBINOP_FN (gt, complex, sparse_complex_matrix, mx_el_gt) +DEFBINOP_FN (ne, complex, sparse_complex_matrix, mx_el_ne) + +DEFBINOP_OP (el_mul, complex, sparse_complex_matrix, *) +DEFBINOP_FN (el_div, complex, sparse_complex_matrix, x_el_div) + +DEFBINOP_FN (el_pow, complex, sparse_complex_matrix, elem_xpow) + +DEFBINOP (el_ldiv, complex, sparse_complex_matrix) +{ + CAST_BINOP_ARGS (const octave_complex&, const octave_sparse_complex_matrix&); + + Complex d = v1.complex_value (); + octave_value retval; + + if (d == 0.0) + { + gripe_divide_by_zero (); + + retval = octave_value (v2.complex_matrix_value () / d); + } + else + retval = octave_value (v2.sparse_complex_matrix_value () / d); + + return retval; +} + +DEFBINOP_FN (el_and, complex, sparse_complex_matrix, mx_el_and) +DEFBINOP_FN (el_or, complex, sparse_complex_matrix, mx_el_or) + +DEFCATOP (cs_scm, complex, sparse_complex_matrix) +{ + CAST_BINOP_ARGS (octave_complex&, const octave_sparse_complex_matrix&); + SparseComplexMatrix tmp (1, 1, v1.complex_value ()); + return octave_value (tmp. concat (v2.sparse_complex_matrix_value (), + ra_idx)); +} + +DEFCONV (sparse_complex_matrix_conv, complex, sparse_complex_matrix) +{ + CAST_CONV_ARG (const octave_complex&); + + return new octave_sparse_complex_matrix + (SparseComplexMatrix (v.complex_matrix_value ())); +} + +void +install_cs_scm_ops (void) +{ + INSTALL_BINOP (op_add, octave_complex, octave_sparse_complex_matrix, add); + INSTALL_BINOP (op_sub, octave_complex, octave_sparse_complex_matrix, sub); + INSTALL_BINOP (op_mul, octave_complex, octave_sparse_complex_matrix, mul); + INSTALL_BINOP (op_div, octave_complex, octave_sparse_complex_matrix, div); + INSTALL_BINOP (op_pow, octave_complex, octave_sparse_complex_matrix, pow); + INSTALL_BINOP (op_ldiv, octave_complex, octave_sparse_complex_matrix, + ldiv); + INSTALL_BINOP (op_lt, octave_complex, octave_sparse_complex_matrix, lt); + INSTALL_BINOP (op_le, octave_complex, octave_sparse_complex_matrix, le); + INSTALL_BINOP (op_eq, octave_complex, octave_sparse_complex_matrix, eq); + INSTALL_BINOP (op_ge, octave_complex, octave_sparse_complex_matrix, ge); + INSTALL_BINOP (op_gt, octave_complex, octave_sparse_complex_matrix, gt); + INSTALL_BINOP (op_ne, octave_complex, octave_sparse_complex_matrix, ne); + INSTALL_BINOP (op_el_mul, octave_complex, octave_sparse_complex_matrix, + el_mul); + INSTALL_BINOP (op_el_div, octave_complex, octave_sparse_complex_matrix, + el_div); + INSTALL_BINOP (op_el_pow, octave_complex, octave_sparse_complex_matrix, + el_pow); + INSTALL_BINOP (op_el_ldiv, octave_complex, octave_sparse_complex_matrix, + el_ldiv); + INSTALL_BINOP (op_el_and, octave_complex, octave_sparse_complex_matrix, + el_and); + INSTALL_BINOP (op_el_or, octave_complex, octave_sparse_complex_matrix, + el_or); + + INSTALL_CATOP (octave_complex, octave_sparse_complex_matrix, cs_scm); + + INSTALL_ASSIGNCONV (octave_complex, octave_sparse_complex_matrix, + octave_sparse_complex_matrix); + + INSTALL_WIDENOP (octave_complex, octave_sparse_complex_matrix, + sparse_complex_matrix_conv); +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-cs-sm.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/OPERATORS/op-cs-sm.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,163 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "gripes.h" +#include "oct-obj.h" +#include "ov.h" +#include "ov-typeinfo.h" +#include "ov-complex.h" +#include "ops.h" +#include "xpow.h" + +#include "sparse-xpow.h" +#include "sparse-xdiv.h" +#include "ov-re-sparse.h" +#include "ov-cx-sparse.h" +#include "smx-cs-sm.h" +#include "smx-sm-cs.h" + +// complex by sparse matrix ops. + +DEFBINOP_OP (add, complex, sparse_matrix, +) +DEFBINOP_OP (sub, complex, sparse_matrix, -) +DEFBINOP_OP (mul, complex, sparse_matrix, *) + +DEFBINOP (div, complex, sparse_matrix) +{ + CAST_BINOP_ARGS (const octave_complex&, const octave_sparse_matrix&); + + ComplexMatrix m1 = ComplexMatrix (1, 1, v1.complex_value ()); + SparseMatrix m2 = v2.sparse_matrix_value (); + + return xdiv (m1, m2); +} + +DEFBINOP (pow, complex, sparse_matrix) +{ + CAST_BINOP_ARGS (const octave_complex&, const octave_sparse_matrix&); + return xpow (v1.complex_value (), v2.matrix_value ()); +} + +DEFBINOP (ldiv, complex, sparse_matrix) +{ + CAST_BINOP_ARGS (const octave_complex&, const octave_sparse_matrix&); + + Complex d = v1.complex_value (); + octave_value retval; + + if (d == 0.0) + { + gripe_divide_by_zero (); + + retval = octave_value (v2.matrix_value () / d); + } + else + retval = octave_value (v2.sparse_matrix_value () / d); + + return retval; +} + +DEFBINOP_FN (lt, complex, sparse_matrix, mx_el_lt) +DEFBINOP_FN (le, complex, sparse_matrix, mx_el_le) +DEFBINOP_FN (eq, complex, sparse_matrix, mx_el_eq) +DEFBINOP_FN (ge, complex, sparse_matrix, mx_el_ge) +DEFBINOP_FN (gt, complex, sparse_matrix, mx_el_gt) +DEFBINOP_FN (ne, complex, sparse_matrix, mx_el_ne) + +DEFBINOP_OP (el_mul, complex, sparse_matrix, *) +DEFBINOP_FN (el_div, complex, sparse_matrix, x_el_div) +DEFBINOP_FN (el_pow, complex, sparse_matrix, elem_xpow) + +DEFBINOP (el_ldiv, complex, sparse_matrix) +{ + CAST_BINOP_ARGS (const octave_complex&, const octave_sparse_matrix&); + + Complex d = v1.complex_value (); + octave_value retval; + + if (d == 0.0) + { + gripe_divide_by_zero (); + + retval = octave_value (v2.matrix_value () / d); + } + else + retval = octave_value (v2.sparse_matrix_value () / d); + + return retval; +} + +DEFBINOP_FN (el_and, complex, sparse_matrix, mx_el_and) +DEFBINOP_FN (el_or, complex, sparse_matrix, mx_el_or) + +DEFCATOP (cs_sm, sparse_matrix, complex) +{ + CAST_BINOP_ARGS (octave_complex&, const octave_sparse_matrix&); + SparseComplexMatrix tmp (1, 1, v1.complex_value ()); + return octave_value (tmp. concat (v2.sparse_matrix_value (), ra_idx)); +} + +DEFCONV (sparse_matrix_conv, complex, sparse_matrix) +{ + CAST_CONV_ARG (const octave_complex&); + + return new octave_sparse_matrix + (SparseMatrix (v.matrix_value ())); +} + +void +install_cs_sm_ops (void) +{ + INSTALL_BINOP (op_add, octave_complex, octave_sparse_matrix, add); + INSTALL_BINOP (op_sub, octave_complex, octave_sparse_matrix, sub); + INSTALL_BINOP (op_mul, octave_complex, octave_sparse_matrix, mul); + INSTALL_BINOP (op_div, octave_complex, octave_sparse_matrix, div); + INSTALL_BINOP (op_pow, octave_complex, octave_sparse_matrix, pow); + INSTALL_BINOP (op_ldiv, octave_complex, octave_sparse_matrix, ldiv); + INSTALL_BINOP (op_lt, octave_complex, octave_sparse_matrix, lt); + INSTALL_BINOP (op_le, octave_complex, octave_sparse_matrix, le); + INSTALL_BINOP (op_eq, octave_complex, octave_sparse_matrix, eq); + INSTALL_BINOP (op_ge, octave_complex, octave_sparse_matrix, ge); + INSTALL_BINOP (op_gt, octave_complex, octave_sparse_matrix, gt); + INSTALL_BINOP (op_ne, octave_complex, octave_sparse_matrix, ne); + INSTALL_BINOP (op_el_mul, octave_complex, octave_sparse_matrix, el_mul); + INSTALL_BINOP (op_el_div, octave_complex, octave_sparse_matrix, el_div); + INSTALL_BINOP (op_el_pow, octave_complex, octave_sparse_matrix, el_pow); + INSTALL_BINOP (op_el_ldiv, octave_complex, octave_sparse_matrix, el_ldiv); + INSTALL_BINOP (op_el_and, octave_complex, octave_sparse_matrix, el_and); + INSTALL_BINOP (op_el_or, octave_complex, octave_sparse_matrix, el_or); + + INSTALL_CATOP (octave_complex, octave_sparse_matrix, cs_sm); + + INSTALL_ASSIGNCONV (octave_complex, octave_sparse_matrix, octave_sparse_matrix); + + INSTALL_WIDENOP (octave_complex, octave_sparse_matrix, sparse_matrix_conv); +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-double-conv.cc --- a/src/OPERATORS/op-double-conv.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-double-conv.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif @@ -41,6 +37,8 @@ #include "ov-uint64.h" #include "ov-bool.h" #include "ov-bool-mat.h" +#include "ov-re-sparse.h" +#include "ov-bool-sparse.h" #include "ov-range.h" #include "ov-scalar.h" #include "ov-re-mat.h" @@ -73,6 +71,9 @@ DEFDBLCONVFN (bool_matrix_to_double_matrix, bool_matrix, bool_array) DEFDBLCONVFN (bool_scalar_to_double_matrix, bool, bool_array) +DEFDBLCONVFN (sparse_matrix_to_double_matrix, sparse_matrix, array) +DEFDBLCONVFN (sparse_bool_matrix_to_double_matrix, sparse_bool_matrix, array) + DEFDBLCONVFN (range_to_double_matrix, range, array) DEFSTRDBLCONVFN(char_matrix_str_to_double_matrix) @@ -105,6 +106,9 @@ INSTALL_CONVOP (octave_bool_matrix, octave_matrix, bool_matrix_to_double_matrix); INSTALL_CONVOP (octave_bool, octave_matrix, bool_scalar_to_double_matrix); + INSTALL_CONVOP (octave_sparse_matrix, octave_matrix, sparse_matrix_to_double_matrix); + INSTALL_CONVOP (octave_sparse_bool_matrix, octave_matrix, sparse_bool_matrix_to_double_matrix); + INSTALL_CONVOP (octave_range, octave_matrix, range_to_double_matrix); INSTALL_CONVOP (octave_char_matrix_str, octave_matrix, char_matrix_str_to_double_matrix); diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-fil-b.cc --- a/src/OPERATORS/op-fil-b.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-fil-b.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-fil-bm.cc --- a/src/OPERATORS/op-fil-bm.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-fil-bm.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-fil-cm.cc --- a/src/OPERATORS/op-fil-cm.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-fil-cm.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-fil-cs.cc --- a/src/OPERATORS/op-fil-cs.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-fil-cs.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-fil-lis.cc --- a/src/OPERATORS/op-fil-lis.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-fil-lis.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-fil-m.cc --- a/src/OPERATORS/op-fil-m.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-fil-m.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-fil-rec.cc --- a/src/OPERATORS/op-fil-rec.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-fil-rec.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-fil-s.cc --- a/src/OPERATORS/op-fil-s.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-fil-s.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-fil-sbm.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/OPERATORS/op-fil-sbm.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,74 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "mach-info.h" +#include "error.h" +#include "oct-obj.h" +#include "oct-stream.h" +#include "ops.h" +#include "ov.h" +#include "ov-file.h" +#include "ov-typeinfo.h" + +#include "ov-bool-sparse.h" + +// file by sparse bool matrix ops. + +DEFBINOP (lshift, file, sparse_bool_matrix) +{ + CAST_BINOP_ARGS (const octave_file&, const octave_sparse_bool_matrix&); + + octave_stream oct_stream = v1.stream_value (); + + if (oct_stream) + { + std::ostream *osp = oct_stream.output_stream (); + + if (osp) + { + std::ostream& os = *osp; + + v2.print_raw (os); + } + else + error ("invalid file specified for binary operator `<<'"); + } + + return octave_value (oct_stream, v1.stream_number ()); +} + +void +install_fil_sbm_ops (void) +{ + INSTALL_BINOP (op_lshift, octave_file, octave_sparse_bool_matrix, lshift); +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-fil-scm.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/OPERATORS/op-fil-scm.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,75 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "mach-info.h" +#include "error.h" +#include "oct-obj.h" +#include "oct-stream.h" +#include "ops.h" +#include "ov.h" +#include "ov-file.h" +#include "ov-typeinfo.h" + +#include "ov-cx-sparse.h" + +// file by sparse complex matrix ops. + +DEFBINOP (lshift, file, sparse_complex_matrix) +{ + CAST_BINOP_ARGS (const octave_file&, const octave_sparse_complex_matrix&); + + octave_stream oct_stream = v1.stream_value (); + + if (oct_stream) + { + std::ostream *osp = oct_stream.output_stream (); + + if (osp) + { + std::ostream& os = *osp; + + v2.print_raw (os); + } + else + error ("invalid file specified for binary operator `<<'"); + } + + return octave_value (oct_stream, v1.stream_number ()); +} + +void +install_fil_scm_ops (void) +{ + INSTALL_BINOP (op_lshift, octave_file, octave_sparse_complex_matrix, + lshift); +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-fil-sm.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/OPERATORS/op-fil-sm.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,74 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "mach-info.h" +#include "error.h" +#include "oct-obj.h" +#include "oct-stream.h" +#include "ops.h" +#include "ov.h" +#include "ov-file.h" +#include "ov-typeinfo.h" + +#include "ov-re-sparse.h" + +// file by sparse matrix ops. + +DEFBINOP (lshift, file, sparse_matrix) +{ + CAST_BINOP_ARGS (const octave_file&, const octave_sparse_matrix&); + + octave_stream oct_stream = v1.stream_value (); + + if (oct_stream) + { + std::ostream *osp = oct_stream.output_stream (); + + if (osp) + { + std::ostream& os = *osp; + + v2.print_raw (os); + } + else + error ("invalid file specified for binary operator `<<'"); + } + + return octave_value (oct_stream, v1.stream_number ()); +} + +void +install_fil_sm_ops (void) +{ + INSTALL_BINOP (op_lshift, octave_file, octave_sparse_matrix, lshift); +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-fil-str.cc --- a/src/OPERATORS/op-fil-str.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-fil-str.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-i16-i16.cc --- a/src/OPERATORS/op-i16-i16.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-i16-i16.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-i32-i32.cc --- a/src/OPERATORS/op-i32-i32.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-i32-i32.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-i64-i64.cc --- a/src/OPERATORS/op-i64-i64.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-i64-i64.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-i8-i8.cc --- a/src/OPERATORS/op-i8-i8.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-i8-i8.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-int-conv.cc --- a/src/OPERATORS/op-int-conv.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-int-conv.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-list.cc --- a/src/OPERATORS/op-list.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-list.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-m-cm.cc --- a/src/OPERATORS/op-m-cm.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-m-cm.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-m-cs.cc --- a/src/OPERATORS/op-m-cs.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-m-cs.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-m-m.cc --- a/src/OPERATORS/op-m-m.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-m-m.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-m-s.cc --- a/src/OPERATORS/op-m-s.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-m-s.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-m-scm.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/OPERATORS/op-m-scm.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,165 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "gripes.h" +#include "oct-obj.h" +#include "ov.h" +#include "ov-typeinfo.h" +#include "ov-re-mat.h" +#include "ov-cx-mat.h" +#include "ops.h" +#include "xdiv.h" + +#include "sparse-xpow.h" +#include "sparse-xdiv.h" +#include "smx-scm-m.h" +#include "smx-m-scm.h" +#include "ov-cx-sparse.h" + +// matrix by sparse complex matrix ops. + +DEFBINOP_OP (add, matrix, sparse_complex_matrix, +) +DEFBINOP_OP (sub, matrix, sparse_complex_matrix, -) + +DEFBINOP (mul, matrix, sparse_complex_matrix) +{ + CAST_BINOP_ARGS (const octave_matrix&, + const octave_sparse_complex_matrix&); + + ComplexMatrix tmp (v2.complex_matrix_value ()); + + return octave_value ( v1.matrix_value() * tmp); +} + +DEFBINOP (div, matrix, sparse_complex_matrix) +{ + CAST_BINOP_ARGS (const octave_matrix&, + const octave_sparse_complex_matrix&); + + return xdiv (v1.matrix_value (), v2.sparse_complex_matrix_value ()); +} + +DEFBINOPX (pow, matrix, sparse_complex_matrix) +{ + error ("can't do A ^ B for A and B both matrices"); + return octave_value (); +} + +DEFBINOP (ldiv, matrix, sparse_complex_matrix) +{ + CAST_BINOP_ARGS (const octave_matrix&, + const octave_sparse_complex_matrix&); + + return xleftdiv (v1.matrix_value (), v2.complex_matrix_value ()); +} + +DEFBINOP_FN (lt, matrix, sparse_complex_matrix, mx_el_lt) +DEFBINOP_FN (le, matrix, sparse_complex_matrix, mx_el_le) +DEFBINOP_FN (eq, matrix, sparse_complex_matrix, mx_el_eq) +DEFBINOP_FN (ge, matrix, sparse_complex_matrix, mx_el_ge) +DEFBINOP_FN (gt, matrix, sparse_complex_matrix, mx_el_gt) +DEFBINOP_FN (ne, matrix, sparse_complex_matrix, mx_el_ne) + +DEFBINOP_FN (el_mul, matrix, sparse_complex_matrix, product) +DEFBINOP_FN (el_div, matrix, sparse_complex_matrix, quotient) + +DEFBINOP (el_pow, matrix, sparse_complex_matrix) +{ + CAST_BINOP_ARGS (const octave_matrix&, + const octave_sparse_complex_matrix&); + + return octave_value + (elem_xpow (SparseMatrix (v1.matrix_value ()), + v2.sparse_complex_matrix_value ())); +} + +DEFBINOP (el_ldiv, matrix, sparse_complex_matrix) +{ + CAST_BINOP_ARGS (const octave_matrix&, + const octave_sparse_complex_matrix&); + return octave_value + (quotient (v2.sparse_complex_matrix_value (), v1.matrix_value ())); +} + +DEFBINOP_FN (el_and, matrix, sparse_complex_matrix, mx_el_and) +DEFBINOP_FN (el_or, matrix, sparse_complex_matrix, mx_el_or) + +DEFCATOP (m_scm, matrix, sparse_complex_matrix) +{ + CAST_BINOP_ARGS (octave_matrix&, const octave_sparse_complex_matrix&); + SparseMatrix tmp (v1.matrix_value ()); + return octave_value (tmp. concat (v2.sparse_complex_matrix_value (), + ra_idx)); +} + +DEFCONV (sparse_complex_matrix_conv, matrix, sparse_complex_matrix) +{ + CAST_CONV_ARG (const octave_matrix&); + return new octave_sparse_complex_matrix + (SparseComplexMatrix (v.complex_matrix_value ())); +} + +void +install_m_scm_ops (void) +{ + INSTALL_BINOP (op_add, octave_matrix, octave_sparse_complex_matrix, add); + INSTALL_BINOP (op_sub, octave_matrix, octave_sparse_complex_matrix, sub); + INSTALL_BINOP (op_mul, octave_matrix, octave_sparse_complex_matrix, mul); + INSTALL_BINOP (op_div, octave_matrix, octave_sparse_complex_matrix, div); + INSTALL_BINOP (op_pow, octave_matrix, octave_sparse_complex_matrix, pow); + INSTALL_BINOP (op_ldiv, octave_matrix, octave_sparse_complex_matrix, ldiv); + INSTALL_BINOP (op_lt, octave_matrix, octave_sparse_complex_matrix, lt); + INSTALL_BINOP (op_le, octave_matrix, octave_sparse_complex_matrix, le); + INSTALL_BINOP (op_eq, octave_matrix, octave_sparse_complex_matrix, eq); + INSTALL_BINOP (op_ge, octave_matrix, octave_sparse_complex_matrix, ge); + INSTALL_BINOP (op_gt, octave_matrix, octave_sparse_complex_matrix, gt); + INSTALL_BINOP (op_ne, octave_matrix, octave_sparse_complex_matrix, ne); + INSTALL_BINOP (op_el_mul, octave_matrix, octave_sparse_complex_matrix, + el_mul); + INSTALL_BINOP (op_el_div, octave_matrix, octave_sparse_complex_matrix, + el_div); + INSTALL_BINOP (op_el_pow, octave_matrix, octave_sparse_complex_matrix, + el_pow); + INSTALL_BINOP (op_el_ldiv, octave_matrix, octave_sparse_complex_matrix, + el_ldiv); + INSTALL_BINOP (op_el_and, octave_matrix, octave_sparse_complex_matrix, + el_and); + INSTALL_BINOP (op_el_or, octave_matrix, octave_sparse_complex_matrix, + el_or); + + INSTALL_CATOP (octave_matrix, octave_sparse_complex_matrix, m_scm); + + INSTALL_ASSIGNCONV (octave_matrix, octave_sparse_complex_matrix, + octave_sparse_complex_matrix); + + INSTALL_WIDENOP (octave_matrix, octave_sparse_complex_matrix, + sparse_complex_matrix_conv); +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-m-sm.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/OPERATORS/op-m-sm.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,151 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "gripes.h" +#include "oct-obj.h" +#include "ov.h" +#include "ov-typeinfo.h" +#include "ov-re-mat.h" +#include "ops.h" +#include "xdiv.h" + +#include "sparse-xpow.h" +#include "sparse-xdiv.h" +#include "smx-sm-m.h" +#include "smx-m-sm.h" +#include "ov-re-sparse.h" + +// matrix by sparse matrix ops. + +DEFBINOP_OP (add, matrix, sparse_matrix, +) +DEFBINOP_OP (sub, matrix, sparse_matrix, -) + +DEFBINOP (mul, matrix, sparse_matrix) +{ + CAST_BINOP_ARGS (const octave_matrix&, const octave_sparse_matrix&); + + Matrix tmp (v2.matrix_value ()); + + return octave_value ( v1.matrix_value() * tmp); +} + +DEFBINOP (div, matrix, sparse_matrix) +{ + CAST_BINOP_ARGS (const octave_matrix&, const octave_sparse_matrix&); + + return xdiv (v1.matrix_value (), v2.sparse_matrix_value ()); +} + +DEFBINOPX (pow, matrix, sparse_matrix) +{ + error ("can't do A ^ B for A and B both matrices"); + return octave_value (); +} + +DEFBINOP (ldiv, matrix, sparse_matrix) +{ + CAST_BINOP_ARGS (const octave_matrix&, const octave_sparse_matrix&); + + return xleftdiv (v1.matrix_value (), v2.matrix_value ()); +} + +DEFBINOP_FN (lt, matrix, sparse_matrix, mx_el_lt) +DEFBINOP_FN (le, matrix, sparse_matrix, mx_el_le) +DEFBINOP_FN (eq, matrix, sparse_matrix, mx_el_eq) +DEFBINOP_FN (ge, matrix, sparse_matrix, mx_el_ge) +DEFBINOP_FN (gt, matrix, sparse_matrix, mx_el_gt) +DEFBINOP_FN (ne, matrix, sparse_matrix, mx_el_ne) + +DEFBINOP_FN (el_mul, matrix, sparse_matrix, product) +DEFBINOP_FN (el_div, matrix, sparse_matrix, quotient) + +DEFBINOP (el_pow, matrix, sparse_matrix) +{ + CAST_BINOP_ARGS (const octave_matrix&, const octave_sparse_matrix&); + + return octave_value (elem_xpow (SparseMatrix (v1.matrix_value ()), + v2.sparse_matrix_value ())); +} + +DEFBINOP (el_ldiv, matrix, sparse_matrix) +{ + CAST_BINOP_ARGS (const octave_matrix&, const octave_sparse_matrix&); + + return octave_value + (quotient (v2.sparse_matrix_value (), v1.matrix_value ())); +} + +DEFBINOP_FN (el_and, matrix, sparse_matrix, mx_el_and) +DEFBINOP_FN (el_or, matrix, sparse_matrix, mx_el_or) + +DEFCATOP (m_sm, matrix, sparse_matrix) +{ + CAST_BINOP_ARGS (octave_matrix&, const octave_sparse_matrix&); + SparseMatrix tmp (v1.matrix_value ()); + return octave_value (tmp. concat (v2.sparse_matrix_value (), ra_idx)); +} + +DEFCONV (sparse_matrix_conv, matrix, sparse_matrix) +{ + CAST_CONV_ARG (const octave_matrix&); + return new octave_sparse_matrix (SparseMatrix (v.matrix_value ())); +} + +void +install_m_sm_ops (void) +{ + INSTALL_BINOP (op_add, octave_matrix, octave_sparse_matrix, add); + INSTALL_BINOP (op_sub, octave_matrix, octave_sparse_matrix, sub); + INSTALL_BINOP (op_mul, octave_matrix, octave_sparse_matrix, mul); + INSTALL_BINOP (op_div, octave_matrix, octave_sparse_matrix, div); + INSTALL_BINOP (op_pow, octave_matrix, octave_sparse_matrix, pow); + INSTALL_BINOP (op_ldiv, octave_matrix, octave_sparse_matrix, ldiv); + INSTALL_BINOP (op_lt, octave_matrix, octave_sparse_matrix, lt); + INSTALL_BINOP (op_le, octave_matrix, octave_sparse_matrix, le); + INSTALL_BINOP (op_eq, octave_matrix, octave_sparse_matrix, eq); + INSTALL_BINOP (op_ge, octave_matrix, octave_sparse_matrix, ge); + INSTALL_BINOP (op_gt, octave_matrix, octave_sparse_matrix, gt); + INSTALL_BINOP (op_ne, octave_matrix, octave_sparse_matrix, ne); + INSTALL_BINOP (op_el_mul, octave_matrix, octave_sparse_matrix, el_mul); + INSTALL_BINOP (op_el_div, octave_matrix, octave_sparse_matrix, el_div); + INSTALL_BINOP (op_el_pow, octave_matrix, octave_sparse_matrix, el_pow); + INSTALL_BINOP (op_el_ldiv, octave_matrix, octave_sparse_matrix, el_ldiv); + INSTALL_BINOP (op_el_and, octave_matrix, octave_sparse_matrix, el_and); + INSTALL_BINOP (op_el_or, octave_matrix, octave_sparse_matrix, el_or); + + INSTALL_CATOP (octave_matrix, octave_sparse_matrix, m_sm); + + INSTALL_ASSIGNCONV (octave_matrix, octave_sparse_matrix, + octave_sparse_matrix); + + INSTALL_WIDENOP (octave_matrix, octave_sparse_matrix, + sparse_matrix_conv); +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-range.cc --- a/src/OPERATORS/op-range.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-range.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-s-cm.cc --- a/src/OPERATORS/op-s-cm.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-s-cm.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-s-cs.cc --- a/src/OPERATORS/op-s-cs.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-s-cs.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-s-m.cc --- a/src/OPERATORS/op-s-m.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-s-m.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-s-s.cc --- a/src/OPERATORS/op-s-s.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-s-s.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-s-scm.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/OPERATORS/op-s-scm.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,177 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "gripes.h" +#include "oct-obj.h" +#include "ov.h" +#include "ov-typeinfo.h" +#include "ov-cx-mat.h" +#include "ov-scalar.h" +#include "ops.h" +#include "xpow.h" + +#include "sparse-xpow.h" +#include "sparse-xdiv.h" +#include "smx-s-scm.h" +#include "smx-scm-s.h" +#include "ov-re-sparse.h" +#include "ov-cx-sparse.h" + +// scalar by sparse complex matrix ops. + +DEFBINOP_OP (add, scalar, sparse_complex_matrix, +) +DEFBINOP_OP (sub, scalar, sparse_complex_matrix, -) +DEFBINOP_OP (mul, scalar, sparse_complex_matrix, *) + +DEFBINOP (div, scalar, sparse_complex_matrix) +{ + CAST_BINOP_ARGS (const octave_scalar&, + const octave_sparse_complex_matrix&); + + Matrix m1 = Matrix (1, 1, v1.scalar_value ()); + SparseComplexMatrix m2 = v2.sparse_complex_matrix_value (); + + return xdiv (m1, m2); +} + +DEFBINOP (pow, scalar, sparse_complex_matrix) +{ + CAST_BINOP_ARGS (const octave_scalar&, + const octave_sparse_complex_matrix&); + return xpow (v1.scalar_value (), v2.complex_matrix_value ()); +} + +DEFBINOP (ldiv, scalar, sparse_complex_matrix) +{ + CAST_BINOP_ARGS (const octave_scalar&, + const octave_sparse_complex_matrix&); + + double d = v1.double_value (); + octave_value retval; + + if (d == 0.0) + { + gripe_divide_by_zero (); + + retval = octave_value (v2.complex_matrix_value () / d); + } + else + retval = octave_value (v2.sparse_complex_matrix_value () / d); + + return retval; +} + +DEFBINOP_FN (lt, scalar, sparse_complex_matrix, mx_el_lt) +DEFBINOP_FN (le, scalar, sparse_complex_matrix, mx_el_le) +DEFBINOP_FN (eq, scalar, sparse_complex_matrix, mx_el_eq) +DEFBINOP_FN (ge, scalar, sparse_complex_matrix, mx_el_ge) +DEFBINOP_FN (gt, scalar, sparse_complex_matrix, mx_el_gt) +DEFBINOP_FN (ne, scalar, sparse_complex_matrix, mx_el_ne) + +DEFBINOP_OP (el_mul, scalar, sparse_complex_matrix, *) +DEFBINOP_FN (el_div, scalar, sparse_complex_matrix, x_el_div) +DEFBINOP_FN (el_pow, scalar, sparse_complex_matrix, elem_xpow) + +DEFBINOP (el_ldiv, scalar, sparse_complex_matrix) +{ + CAST_BINOP_ARGS (const octave_scalar&, + const octave_sparse_complex_matrix&); + + double d = v1.double_value (); + octave_value retval; + + if (d == 0.0) + { + gripe_divide_by_zero (); + + retval = octave_value (v2.complex_matrix_value () / d); + } + else + retval = octave_value (v2.sparse_complex_matrix_value () / d); + + return retval; +} + +DEFBINOP_FN (el_and, scalar, sparse_complex_matrix, mx_el_and) +DEFBINOP_FN (el_or, scalar, sparse_complex_matrix, mx_el_or) + +DEFCATOP (s_scm, scalar, sparse_compelx_matrix) +{ + CAST_BINOP_ARGS (octave_scalar&, const octave_sparse_complex_matrix&); + SparseMatrix tmp (1, 1, v1.scalar_value ()); + return octave_value + (tmp. concat (v2.sparse_complex_matrix_value (), ra_idx)); +} + +DEFCONV (sparse_complex_matrix_conv, scalar, sparse_complex_matrix) +{ + CAST_CONV_ARG (const octave_scalar&); + + return new octave_sparse_complex_matrix + (SparseComplexMatrix (v.complex_matrix_value ())); +} + +void +install_s_scm_ops (void) +{ + INSTALL_BINOP (op_add, octave_scalar, octave_sparse_complex_matrix, add); + INSTALL_BINOP (op_sub, octave_scalar, octave_sparse_complex_matrix, sub); + INSTALL_BINOP (op_mul, octave_scalar, octave_sparse_complex_matrix, mul); + INSTALL_BINOP (op_div, octave_scalar, octave_sparse_complex_matrix, div); + INSTALL_BINOP (op_pow, octave_scalar, octave_sparse_complex_matrix, pow); + INSTALL_BINOP (op_ldiv, octave_scalar, octave_sparse_complex_matrix, ldiv); + INSTALL_BINOP (op_lt, octave_scalar, octave_sparse_complex_matrix, lt); + INSTALL_BINOP (op_le, octave_scalar, octave_sparse_complex_matrix, le); + INSTALL_BINOP (op_eq, octave_scalar, octave_sparse_complex_matrix, eq); + INSTALL_BINOP (op_ge, octave_scalar, octave_sparse_complex_matrix, ge); + INSTALL_BINOP (op_gt, octave_scalar, octave_sparse_complex_matrix, gt); + INSTALL_BINOP (op_ne, octave_scalar, octave_sparse_complex_matrix, ne); + INSTALL_BINOP (op_el_mul, octave_scalar, octave_sparse_complex_matrix, + el_mul); + INSTALL_BINOP (op_el_div, octave_scalar, octave_sparse_complex_matrix, + el_div); + INSTALL_BINOP (op_el_pow, octave_scalar, octave_sparse_complex_matrix, + el_pow); + INSTALL_BINOP (op_el_ldiv, octave_scalar, octave_sparse_complex_matrix, + el_ldiv); + INSTALL_BINOP (op_el_and, octave_scalar, octave_sparse_complex_matrix, + el_and); + INSTALL_BINOP (op_el_or, octave_scalar, octave_sparse_complex_matrix, + el_or); + + INSTALL_CATOP (octave_scalar, octave_sparse_complex_matrix, s_scm); + + INSTALL_ASSIGNCONV (octave_scalar, octave_sparse_complex_matrix, + octave_sparse_complex_matrix); + + INSTALL_WIDENOP (octave_scalar, octave_sparse_complex_matrix, + sparse_complex_matrix_conv); +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-s-sm.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/OPERATORS/op-s-sm.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,159 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "gripes.h" +#include "oct-obj.h" +#include "ov.h" +#include "ov-typeinfo.h" +#include "ov-scalar.h" +#include "ops.h" +#include "xpow.h" + +#include "sparse-xpow.h" +#include "sparse-xdiv.h" +#include "ov-re-sparse.h" + +// scalar by sparse matrix ops. + +DEFBINOP_OP (add, scalar, sparse_matrix, +) +DEFBINOP_OP (sub, scalar, sparse_matrix, -) +DEFBINOP_OP (mul, scalar, sparse_matrix, *) + +DEFBINOP (div, scalar, sparse_matrix) +{ + CAST_BINOP_ARGS (const octave_scalar&, const octave_sparse_matrix&); + + Matrix m1 = Matrix (1, 1, v1.double_value ()); + SparseMatrix m2 = v2.sparse_matrix_value (); + + return xdiv (m1, m2); +} + +DEFBINOP (pow, scalar, sparse_matrix) +{ + CAST_BINOP_ARGS (const octave_scalar&, const octave_sparse_matrix&); + return xpow (v1.scalar_value (), v2.matrix_value ()); +} + +DEFBINOP (ldiv, scalar, sparse_matrix) +{ + CAST_BINOP_ARGS (const octave_scalar&, const octave_sparse_matrix&); + + double d = v1.double_value (); + octave_value retval; + + if (d == 0.0) + { + gripe_divide_by_zero (); + + retval = octave_value (v2.matrix_value () / d); + } + else + retval = octave_value (v2.sparse_matrix_value () / d); + + return retval; +} + +DEFBINOP_FN (lt, scalar, sparse_matrix, mx_el_lt) +DEFBINOP_FN (le, scalar, sparse_matrix, mx_el_le) +DEFBINOP_FN (eq, scalar, sparse_matrix, mx_el_eq) +DEFBINOP_FN (ge, scalar, sparse_matrix, mx_el_ge) +DEFBINOP_FN (gt, scalar, sparse_matrix, mx_el_gt) +DEFBINOP_FN (ne, scalar, sparse_matrix, mx_el_ne) + +DEFBINOP_OP (el_mul, scalar, sparse_matrix, *) +DEFBINOP_FN (el_div, scalar, sparse_matrix, x_el_div) +DEFBINOP_FN (el_pow, scalar, sparse_matrix, elem_xpow) + +DEFBINOP (el_ldiv, scalar, sparse_matrix) +{ + CAST_BINOP_ARGS (const octave_scalar&, const octave_sparse_matrix&); + + double d = v1.double_value (); + octave_value retval; + + if (d == 0.0) + { + gripe_divide_by_zero (); + + retval = octave_value (v2.matrix_value () / d); + } + else + retval = octave_value (v2.sparse_matrix_value () / d); + + return retval; +} + +DEFBINOP_FN (el_and, scalar, sparse_matrix, mx_el_and) +DEFBINOP_FN (el_or, scalar, sparse_matrix, mx_el_or) + +DEFCATOP (s_sm, scalar, sparse_matrix) +{ + CAST_BINOP_ARGS (octave_scalar&, const octave_sparse_matrix&); + SparseMatrix tmp (1, 1, v1.scalar_value ()); + return octave_value (tmp. concat (v2.sparse_matrix_value (), ra_idx)); +} + +DEFCONV (sparse_matrix_conv, scalar, sparse_matrix) +{ + CAST_CONV_ARG (const octave_scalar&); + + return new octave_sparse_matrix (SparseMatrix (v.matrix_value ())); +} + +void +install_s_sm_ops (void) +{ + INSTALL_BINOP (op_add, octave_scalar, octave_sparse_matrix, add); + INSTALL_BINOP (op_sub, octave_scalar, octave_sparse_matrix, sub); + INSTALL_BINOP (op_mul, octave_scalar, octave_sparse_matrix, mul); + INSTALL_BINOP (op_div, octave_scalar, octave_sparse_matrix, div); + INSTALL_BINOP (op_pow, octave_scalar, octave_sparse_matrix, pow); + INSTALL_BINOP (op_ldiv, octave_scalar, octave_sparse_matrix, ldiv); + INSTALL_BINOP (op_lt, octave_scalar, octave_sparse_matrix, lt); + INSTALL_BINOP (op_le, octave_scalar, octave_sparse_matrix, le); + INSTALL_BINOP (op_eq, octave_scalar, octave_sparse_matrix, eq); + INSTALL_BINOP (op_ge, octave_scalar, octave_sparse_matrix, ge); + INSTALL_BINOP (op_gt, octave_scalar, octave_sparse_matrix, gt); + INSTALL_BINOP (op_ne, octave_scalar, octave_sparse_matrix, ne); + INSTALL_BINOP (op_el_mul, octave_scalar, octave_sparse_matrix, el_mul); + INSTALL_BINOP (op_el_div, octave_scalar, octave_sparse_matrix, el_div); + INSTALL_BINOP (op_el_pow, octave_scalar, octave_sparse_matrix, el_pow); + INSTALL_BINOP (op_el_ldiv, octave_scalar, octave_sparse_matrix, el_ldiv); + INSTALL_BINOP (op_el_and, octave_scalar, octave_sparse_matrix, el_and); + INSTALL_BINOP (op_el_or, octave_scalar, octave_sparse_matrix, el_or); + + INSTALL_CATOP (octave_scalar, octave_sparse_matrix, s_sm); + + INSTALL_ASSIGNCONV (octave_scalar, octave_sparse_matrix, octave_matrix); + + INSTALL_WIDENOP (octave_scalar, octave_sparse_matrix, sparse_matrix_conv); +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-sbm-b.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/OPERATORS/op-sbm-b.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,97 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "gripes.h" +#include "oct-obj.h" +#include "ov.h" +#include "ov-typeinfo.h" +#include "ov-bool.h" +#include "ov-scalar.h" +#include "ops.h" + +#include "ov-re-sparse.h" + +// sparse bool matrix by bool ops. + +DEFBINOP_FN (ne, sparse_bool_matrix, bool, mx_el_ne) +DEFBINOP_FN (eq, sparse_bool_matrix, bool, mx_el_eq) + +DEFBINOP_FN (el_and, sparse_bool_matrix, bool, mx_el_and) +DEFBINOP_FN (el_or, sparse_bool_matrix, bool, mx_el_or) + +DEFCATOP (sbm_b, sparse_bool_matrix, bool) +{ + CAST_BINOP_ARGS (octave_sparse_bool_matrix&, const octave_bool&); + + SparseBoolMatrix tmp (1, 1, v2.bool_value ()); + return octave_value (v1.sparse_bool_matrix_value (). concat (tmp, ra_idx)); +} + +DEFCATOP (sm_b, sparse_matrix, bool) +{ + CAST_BINOP_ARGS (octave_sparse_matrix&, const octave_bool&); + + SparseMatrix tmp (1, 1, v2.scalar_value ()); + return octave_value (v1.sparse_matrix_value (). concat (tmp, ra_idx)); +} + +DEFCATOP (sbm_s, sparse_bool_matrix, scalar) +{ + CAST_BINOP_ARGS (octave_sparse_bool_matrix&, const octave_scalar&); + + SparseMatrix tmp (1, 1, v2.scalar_value ()); + return octave_value (v1.sparse_matrix_value (). concat (tmp, ra_idx)); +} + +DEFASSIGNOP (assign, sparse_bool_matrix, bool) +{ + CAST_BINOP_ARGS (octave_sparse_bool_matrix&, const octave_bool&); + + SparseBoolMatrix tmp (1, 1, v2.bool_value ()); + v1.assign (idx, tmp); + return octave_value (); +} + +void +install_sbm_b_ops (void) +{ + INSTALL_BINOP (op_eq, octave_sparse_bool_matrix, octave_bool, eq); + INSTALL_BINOP (op_ne, octave_sparse_bool_matrix, octave_bool, ne); + + INSTALL_BINOP (op_el_and, octave_sparse_bool_matrix, octave_bool, el_and); + INSTALL_BINOP (op_el_or, octave_sparse_bool_matrix, octave_bool, el_or); + + INSTALL_CATOP (octave_sparse_bool_matrix, octave_bool, sbm_b); + INSTALL_CATOP (octave_sparse_bool_matrix, octave_scalar, sbm_s); + INSTALL_CATOP (octave_sparse_matrix, octave_bool, sm_b); + + INSTALL_ASSIGNOP (op_asn_eq, octave_sparse_bool_matrix, octave_bool, assign); +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-sbm-bm.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/OPERATORS/op-sbm-bm.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,102 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "gripes.h" +#include "oct-obj.h" +#include "ov.h" +#include "ov-typeinfo.h" +#include "ov-bool-mat.h" +#include "boolMatrix.h" +#include "ov-scalar.h" +#include "ops.h" + +#include "ov-re-sparse.h" +#include "smx-bm-sbm.h" +#include "smx-sbm-bm.h" + +// sparse bool matrix by bool matrix ops. + +DEFBINOP_FN (eq, sparse_bool_matrix, bool_matrix, mx_el_eq) +DEFBINOP_FN (ne, sparse_bool_matrix, bool_matrix, mx_el_ne) + +DEFBINOP_FN (el_and, sparse_bool_matrix, bool_matrix, mx_el_and) +DEFBINOP_FN (el_or, sparse_bool_matrix, bool_matrix, mx_el_or) + +DEFCATOP (sbm_bm, sparse_bool_matrix, bool_matrix) +{ + CAST_BINOP_ARGS (octave_sparse_bool_matrix&, const octave_bool_matrix&); + + SparseBoolMatrix tmp (v2.bool_matrix_value ()); + return octave_value (v1.sparse_bool_matrix_value (). concat (tmp, ra_idx)); +} + +DEFCATOP (sbm_m, sparse_bool_matrix, matrix) +{ + CAST_BINOP_ARGS (octave_sparse_bool_matrix&, const octave_matrix&); + + SparseMatrix tmp (v2.matrix_value ()); + return octave_value (v1.sparse_matrix_value (). concat (tmp, ra_idx)); +} + +DEFCATOP (sm_bm, sparse_matrix, bool_matrix) +{ + CAST_BINOP_ARGS (octave_sparse_matrix&, const octave_bool_matrix&); + + SparseMatrix tmp (v2.matrix_value ()); + return octave_value (v1.sparse_matrix_value (). concat (tmp, ra_idx)); +} + +DEFASSIGNOP (assign, sparse_bool_matrix, bool_matrix) +{ + CAST_BINOP_ARGS (octave_sparse_bool_matrix&, const octave_bool_matrix&); + + v1.assign (idx, SparseBoolMatrix (v2.bool_matrix_value ())); + return octave_value (); +} + +void +install_sbm_bm_ops (void) +{ + INSTALL_BINOP (op_eq, octave_sparse_bool_matrix, octave_bool_matrix, eq); + INSTALL_BINOP (op_ne, octave_sparse_bool_matrix, octave_bool_matrix, ne); + + INSTALL_BINOP (op_el_and, octave_sparse_bool_matrix, octave_bool_matrix, + el_and); + INSTALL_BINOP (op_el_or, octave_sparse_bool_matrix, octave_bool_matrix, + el_or); + + INSTALL_CATOP (octave_sparse_bool_matrix, octave_bool_matrix, sbm_bm); + INSTALL_CATOP (octave_sparse_matrix, octave_bool_matrix, sm_bm); + INSTALL_CATOP (octave_sparse_bool_matrix, octave_matrix, sbm_m); + + INSTALL_ASSIGNOP (op_asn_eq, octave_sparse_bool_matrix, + octave_bool_matrix, assign); +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-sbm-sbm.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/OPERATORS/op-sbm-sbm.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,108 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "gripes.h" +#include "oct-obj.h" +#include "ov.h" +#include "ov-typeinfo.h" +#include "ov-bool-mat.h" +#include "ov-scalar.h" +#include "ops.h" + +#include "ov-re-sparse.h" +#include "ov-bool-sparse.h" + +// unary sparse bool matrix ops. + +DEFUNOP_OP (not, sparse_bool_matrix, !) + +DEFUNOP (uplus, sparse_bool_matrix) +{ + CAST_UNOP_ARG (const octave_sparse_bool_matrix&); + return octave_value (v.sparse_matrix_value ()); +} + +DEFUNOP (uminus, sparse_bool_matrix) +{ + CAST_UNOP_ARG (const octave_sparse_bool_matrix&); + return octave_value ( - v.sparse_matrix_value ()); +} + +DEFUNOP (transpose, sparse_bool_matrix) +{ + CAST_UNOP_ARG (const octave_sparse_bool_matrix&); + return octave_value (v.sparse_bool_matrix_value().transpose ()); +} + +// sparse bool matrix by sparse bool matrix ops. + +DEFBINOP_FN (eq, sparse_bool_matrix, sparse_bool_matrix, mx_el_eq) +DEFBINOP_FN (ne, sparse_bool_matrix, sparse_bool_matrix, mx_el_ne) +DEFBINOP_FN (el_and, sparse_bool_matrix, sparse_bool_matrix, mx_el_and) +DEFBINOP_FN (el_or, sparse_bool_matrix, sparse_bool_matrix, mx_el_or) + +DEFNDCATOP_FN (sbm_sbm, sparse_bool_matrix, sparse_bool_matrix, + sparse_bool_matrix, sparse_bool_matrix, concat) +DEFNDCATOP_FN (sbm_sm, sparse_bool_matrix, sparse_matrix, sparse_matrix, + sparse_matrix, concat) +DEFNDCATOP_FN (sm_sbm, sparse_matrix, sparse_bool_matrix, sparse_matrix, + sparse_matrix, concat) + +DEFASSIGNOP_FN (assign, sparse_bool_matrix, sparse_bool_matrix, + assign) + +void +install_sbm_sbm_ops (void) +{ + INSTALL_UNOP (op_not, octave_sparse_bool_matrix, not); + INSTALL_UNOP (op_uplus, octave_sparse_bool_matrix, uplus); + INSTALL_UNOP (op_uminus, octave_sparse_bool_matrix, uminus); + INSTALL_UNOP (op_transpose, octave_sparse_bool_matrix, transpose); + INSTALL_UNOP (op_hermitian, octave_sparse_bool_matrix, transpose); + + INSTALL_BINOP (op_eq, octave_sparse_bool_matrix, + octave_sparse_bool_matrix, eq); + INSTALL_BINOP (op_ne, octave_sparse_bool_matrix, + octave_sparse_bool_matrix, ne); + + INSTALL_BINOP (op_el_and, octave_sparse_bool_matrix, + octave_sparse_bool_matrix, el_and); + INSTALL_BINOP (op_el_or, octave_sparse_bool_matrix, + octave_sparse_bool_matrix, el_or); + + INSTALL_CATOP (octave_sparse_bool_matrix, octave_sparse_bool_matrix, + sbm_sbm); + INSTALL_CATOP (octave_sparse_bool_matrix, octave_sparse_matrix, sbm_sm); + INSTALL_CATOP (octave_sparse_matrix, octave_sparse_bool_matrix, sm_sbm); + + INSTALL_ASSIGNOP (op_asn_eq, octave_sparse_bool_matrix, + octave_sparse_bool_matrix, assign); +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-scm-cm.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/OPERATORS/op-scm-cm.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,180 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "gripes.h" +#include "oct-obj.h" +#include "ov.h" +#include "ov-typeinfo.h" +#include "ov-cx-mat.h" +#include "ops.h" +#include "xdiv.h" + +#include "sparse-xpow.h" +#include "sparse-xdiv.h" +#include "smx-scm-cm.h" +#include "smx-cm-scm.h" +#include "ov-cx-sparse.h" + +// sparse complex matrix by complex matrix ops. + +DEFBINOP_OP (add, sparse_complex_matrix, complex_matrix, +) +DEFBINOP_OP (sub, sparse_complex_matrix, complex_matrix, -) + +DEFBINOP (mul, sparse_complex_matrix, complex_matrix) +{ + CAST_BINOP_ARGS (const octave_sparse_complex_matrix&, + const octave_complex_matrix&); + + ComplexMatrix tmp (v1.complex_matrix_value ()); + + return octave_value ( tmp * v2.complex_matrix_value()); +} + +DEFBINOP (div, sparse_complex_matrix, complex_matrix) +{ + CAST_BINOP_ARGS (const octave_sparse_complex_matrix&, + const octave_complex_matrix&); + + return xdiv (v1.complex_matrix_value (), v2.complex_matrix_value ()); +} + +DEFBINOPX (pow, sparse_complex_matrix, complex_matrix) +{ + error ("can't do A ^ B for A and B both matrices"); + return octave_value (); +} + +DEFBINOP (ldiv, sparse_complex_matrix, complex_matrix) +{ + CAST_BINOP_ARGS (const octave_sparse_complex_matrix&, + const octave_complex_matrix&); + + return xleftdiv (v1.sparse_complex_matrix_value (), + v2.complex_matrix_value ()); +} + +DEFBINOP_FN (lt, sparse_complex_matrix, complex_matrix, mx_el_lt) +DEFBINOP_FN (le, sparse_complex_matrix, complex_matrix, mx_el_le) +DEFBINOP_FN (eq, sparse_complex_matrix, complex_matrix, mx_el_eq) +DEFBINOP_FN (ge, sparse_complex_matrix, complex_matrix, mx_el_ge) +DEFBINOP_FN (gt, sparse_complex_matrix, complex_matrix, mx_el_gt) +DEFBINOP_FN (ne, sparse_complex_matrix, complex_matrix, mx_el_ne) + +DEFBINOP_FN (el_mul, sparse_complex_matrix, complex_matrix, product) +DEFBINOP_FN (el_div, sparse_complex_matrix, complex_matrix, quotient) + +DEFBINOP (el_pow, sparse_complex_matrix, complex_matrix) +{ + CAST_BINOP_ARGS (const octave_sparse_complex_matrix&, + const octave_complex_matrix&); + + return octave_value + (elem_xpow (v1.sparse_complex_matrix_value (), SparseComplexMatrix + (v2.complex_matrix_value ()))); +} + +DEFBINOP (el_ldiv, sparse_complex_matrix, matrix) +{ + CAST_BINOP_ARGS (const octave_sparse_complex_matrix&, + const octave_complex_matrix&); + + return octave_value (quotient (v2.complex_matrix_value (), + v1.sparse_complex_matrix_value ())); +} + +DEFBINOP_FN (el_and, sparse_complex_matrix, complex_matrix, mx_el_and) +DEFBINOP_FN (el_or, sparse_complex_matrix, complex_matrix, mx_el_or) + +DEFCATOP (scm_cm, sparse_complex_matrix, complex_matrix) +{ + CAST_BINOP_ARGS (octave_sparse_complex_matrix&, + const octave_complex_matrix&); + SparseComplexMatrix tmp (v2.complex_matrix_value ()); + return octave_value + (v1.sparse_complex_matrix_value (). concat (tmp, ra_idx)); +} + +DEFASSIGNOP (assign, sparse_complex_matrix, complex_matrix) +{ + CAST_BINOP_ARGS (octave_sparse_complex_matrix&, + const octave_complex_matrix&); + + SparseComplexMatrix tmp (v2.complex_matrix_value ()); + v1.assign (idx, tmp); + return octave_value (); +} + +void +install_scm_cm_ops (void) +{ + INSTALL_BINOP (op_add, octave_sparse_complex_matrix, + octave_complex_matrix, add); + INSTALL_BINOP (op_sub, octave_sparse_complex_matrix, + octave_complex_matrix, sub); + INSTALL_BINOP (op_mul, octave_sparse_complex_matrix, + octave_complex_matrix, mul); + INSTALL_BINOP (op_div, octave_sparse_complex_matrix, + octave_complex_matrix, div); + INSTALL_BINOP (op_pow, octave_sparse_complex_matrix, + octave_complex_matrix, pow); + INSTALL_BINOP (op_ldiv, octave_sparse_complex_matrix, + octave_complex_matrix, ldiv); + INSTALL_BINOP (op_lt, octave_sparse_complex_matrix, + octave_complex_matrix, lt); + INSTALL_BINOP (op_le, octave_sparse_complex_matrix, + octave_complex_matrix, le); + INSTALL_BINOP (op_eq, octave_sparse_complex_matrix, + octave_complex_matrix, eq); + INSTALL_BINOP (op_ge, octave_sparse_complex_matrix, + octave_complex_matrix, ge); + INSTALL_BINOP (op_gt, octave_sparse_complex_matrix, + octave_complex_matrix, gt); + INSTALL_BINOP (op_ne, octave_sparse_complex_matrix, + octave_complex_matrix, ne); + INSTALL_BINOP (op_el_mul, octave_sparse_complex_matrix, + octave_complex_matrix, el_mul); + INSTALL_BINOP (op_el_div, octave_sparse_complex_matrix, + octave_complex_matrix, el_div); + INSTALL_BINOP (op_el_pow, octave_sparse_complex_matrix, + octave_complex_matrix, el_pow); + INSTALL_BINOP (op_el_ldiv, octave_sparse_complex_matrix, + octave_complex_matrix, el_ldiv); + INSTALL_BINOP (op_el_and, octave_sparse_complex_matrix, + octave_complex_matrix, el_and); + INSTALL_BINOP (op_el_or, octave_sparse_complex_matrix, + octave_complex_matrix, el_or); + + INSTALL_CATOP (octave_sparse_complex_matrix, + octave_complex_matrix, scm_cm); + + INSTALL_ASSIGNOP (op_asn_eq, octave_sparse_complex_matrix, + octave_complex_matrix, assign); +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-scm-cs.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/OPERATORS/op-scm-cs.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,183 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "gripes.h" +#include "oct-obj.h" +#include "ov.h" +#include "ov-typeinfo.h" +#include "ov-cx-mat.h" +#include "ov-complex.h" +#include "ops.h" +#include "xpow.h" + +#include "sparse-xpow.h" +#include "sparse-xdiv.h" +#include "ov-cx-sparse.h" + +// sparse complex matrix by complex scalar ops. + +DEFBINOP_OP (add, sparse_complex_matrix, complex, +) +DEFBINOP_OP (sub, sparse_complex_matrix, complex, -) +DEFBINOP_OP (mul, sparse_complex_matrix, complex, *) + +DEFBINOP (div, sparse_complex_matrix, complex) +{ + CAST_BINOP_ARGS (const octave_sparse_complex_matrix&, + const octave_complex&); + + Complex d = v2.complex_value (); + octave_value retval; + + if (d == 0.0) + { + gripe_divide_by_zero (); + + retval = (v1.complex_matrix_value () / d); + } + else + retval = octave_value (v1.sparse_complex_matrix_value () / d); + + return retval; +} + +DEFBINOP (pow, sparse_complex_matrix, complex) +{ + CAST_BINOP_ARGS (const octave_sparse_complex_matrix&, + const octave_complex&); + return xpow (v1.complex_matrix_value (), v2.scalar_value ()); +} + +DEFBINOP (ldiv, sparse_complex_matrix, complex) +{ + CAST_BINOP_ARGS (const octave_sparse_complex_matrix&, + const octave_complex&); + + SparseComplexMatrix m1 = v1.sparse_complex_matrix_value (); + ComplexMatrix m2 = ComplexMatrix (1, 1, v2.complex_value ()); + + return xleftdiv (m1, m2); +} + +DEFBINOP_FN (lt, sparse_complex_matrix, complex, mx_el_lt) +DEFBINOP_FN (le, sparse_complex_matrix, complex, mx_el_le) +DEFBINOP_FN (eq, sparse_complex_matrix, complex, mx_el_eq) +DEFBINOP_FN (ge, sparse_complex_matrix, complex, mx_el_ge) +DEFBINOP_FN (gt, sparse_complex_matrix, complex, mx_el_gt) +DEFBINOP_FN (ne, sparse_complex_matrix, complex, mx_el_ne) + +DEFBINOP_OP (el_mul, sparse_complex_matrix, complex, *) + +DEFBINOP (el_div, sparse_complex_matrix, complex) +{ + CAST_BINOP_ARGS (const octave_sparse_complex_matrix&, + const octave_complex&); + + octave_value retval; + + Complex d = v2.complex_value (); + + if (d == 0.0) + { + gripe_divide_by_zero (); + + retval = octave_value (v1.complex_matrix_value () / d); + } + else + retval = octave_value (v1.sparse_complex_matrix_value () / d); + + return retval; +} + +DEFBINOP_FN (el_pow, sparse_complex_matrix, complex, elem_xpow) + +DEFBINOP (el_ldiv, sparse_complex_matrix, complex) +{ + CAST_BINOP_ARGS (const octave_sparse_complex_matrix&, + const octave_complex&); + + return octave_value + (x_el_div (v2.complex_value (), v1.sparse_complex_matrix_value ())); +} + +DEFBINOP_FN (el_and, sparse_complex_matrix, complex, mx_el_and) +DEFBINOP_FN (el_or, sparse_complex_matrix, complex, mx_el_or) + +DEFCATOP (scm_cs, sparse_complex_matrix, complex) +{ + CAST_BINOP_ARGS (octave_sparse_complex_matrix&, const octave_complex&); + SparseComplexMatrix tmp (1, 1, v2.complex_value ()); + return octave_value + (v1.sparse_complex_matrix_value (). concat (tmp, ra_idx)); +} + +DEFASSIGNOP (assign, sparse_complex_matrix, complex) +{ + CAST_BINOP_ARGS (octave_sparse_complex_matrix&, const octave_complex&); + + SparseComplexMatrix tmp (1, 1, v2.complex_value ()); + v1.assign (idx, tmp); + return octave_value (); +} + +void +install_scm_cs_ops (void) +{ + INSTALL_BINOP (op_add, octave_sparse_complex_matrix, octave_complex, add); + INSTALL_BINOP (op_sub, octave_sparse_complex_matrix, octave_complex, sub); + INSTALL_BINOP (op_mul, octave_sparse_complex_matrix, octave_complex, mul); + INSTALL_BINOP (op_div, octave_sparse_complex_matrix, octave_complex, div); + INSTALL_BINOP (op_pow, octave_sparse_complex_matrix, octave_complex, pow); + INSTALL_BINOP (op_ldiv, octave_sparse_complex_matrix, octave_complex, + ldiv); + INSTALL_BINOP (op_lt, octave_sparse_complex_matrix, octave_complex, lt); + INSTALL_BINOP (op_le, octave_sparse_complex_matrix, octave_complex, le); + INSTALL_BINOP (op_eq, octave_sparse_complex_matrix, octave_complex, eq); + INSTALL_BINOP (op_ge, octave_sparse_complex_matrix, octave_complex, ge); + INSTALL_BINOP (op_gt, octave_sparse_complex_matrix, octave_complex, gt); + INSTALL_BINOP (op_ne, octave_sparse_complex_matrix, octave_complex, ne); + INSTALL_BINOP (op_el_mul, octave_sparse_complex_matrix, octave_complex, + el_mul); + INSTALL_BINOP (op_el_div, octave_sparse_complex_matrix, octave_complex, + el_div); + INSTALL_BINOP (op_el_pow, octave_sparse_complex_matrix, octave_complex, + el_pow); + INSTALL_BINOP (op_el_ldiv, octave_sparse_complex_matrix, octave_complex, + el_ldiv); + INSTALL_BINOP (op_el_and, octave_sparse_complex_matrix, octave_complex, + el_and); + INSTALL_BINOP (op_el_or, octave_sparse_complex_matrix, octave_complex, + el_or); + + INSTALL_CATOP (octave_sparse_complex_matrix, octave_complex, scm_cs); + + INSTALL_ASSIGNOP (op_asn_eq, octave_sparse_complex_matrix, octave_complex, + assign); +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-scm-m.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/OPERATORS/op-scm-m.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,165 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "gripes.h" +#include "oct-obj.h" +#include "ov.h" +#include "ov-typeinfo.h" +#include "ov-re-mat.h" +#include "ov-cx-mat.h" +#include "ops.h" +#include "xdiv.h" + +#include "sparse-xpow.h" +#include "sparse-xdiv.h" +#include "smx-scm-m.h" +#include "smx-m-scm.h" +#include "ov-cx-sparse.h" + +// sparse complex matrix by matrix ops. + +DEFBINOP_OP (add, sparse_complex_matrix, matrix, +) +DEFBINOP_OP (sub, sparse_complex_matrix, matrix, -) + +DEFBINOP (mul, sparse_complex_matrix, matrix) +{ + CAST_BINOP_ARGS (const octave_sparse_complex_matrix&, + const octave_matrix&); + + ComplexMatrix tmp (v1.complex_matrix_value ()); + + return octave_value ( tmp * v2.matrix_value()); +} + +DEFBINOP (div, sparse_complex_matrix, matrix) +{ + CAST_BINOP_ARGS (const octave_sparse_complex_matrix&, + const octave_matrix&); + + return xdiv (v1.complex_matrix_value (), v2.matrix_value ()); +} + +DEFBINOPX (pow, sparse_complex_matrix, matrix) +{ + error ("can't do A ^ B for A and B both matrices"); + return octave_value (); +} + +DEFBINOP (ldiv, sparse_complex_matrix, matrix) +{ + CAST_BINOP_ARGS (const octave_sparse_complex_matrix&, + const octave_matrix&); + + return xleftdiv (v1.sparse_complex_matrix_value (), v2.matrix_value ()); +} + +DEFBINOP_FN (lt, sparse_complex_matrix, matrix, mx_el_lt) +DEFBINOP_FN (le, sparse_complex_matrix, matrix, mx_el_le) +DEFBINOP_FN (eq, sparse_complex_matrix, matrix, mx_el_eq) +DEFBINOP_FN (ge, sparse_complex_matrix, matrix, mx_el_ge) +DEFBINOP_FN (gt, sparse_complex_matrix, matrix, mx_el_gt) +DEFBINOP_FN (ne, sparse_complex_matrix, matrix, mx_el_ne) + +DEFBINOP_FN (el_mul, sparse_complex_matrix, matrix, product) +DEFBINOP_FN (el_div, sparse_complex_matrix, matrix, quotient) + +DEFBINOP (el_pow, sparse_complex_matrix, matrix) +{ + CAST_BINOP_ARGS (const octave_sparse_complex_matrix&, + const octave_matrix&); + + return octave_value + (elem_xpow (v1.sparse_complex_matrix_value (), SparseMatrix + (v2.matrix_value ()))); +} + +DEFBINOP (el_ldiv, sparse_complex_matrix, matrix) +{ + CAST_BINOP_ARGS (const octave_sparse_complex_matrix&, + const octave_matrix&); + + return octave_value + (quotient (v2.matrix_value (), v1.sparse_complex_matrix_value ())); +} + +DEFBINOP_FN (el_and, sparse_complex_matrix, matrix, mx_el_and) +DEFBINOP_FN (el_or, sparse_complex_matrix, matrix, mx_el_or) + +DEFCATOP (scm_m, sparse_complex_matrix, matrix) +{ + CAST_BINOP_ARGS (octave_sparse_complex_matrix&, const octave_matrix&); + SparseMatrix tmp (v2.matrix_value ()); + return octave_value + (v1.sparse_complex_matrix_value (). concat (tmp, ra_idx)); +} + +DEFASSIGNOP (assign, sparse_complex_matrix, matrix) +{ + CAST_BINOP_ARGS (octave_sparse_complex_matrix&, const octave_matrix&); + + SparseComplexMatrix tmp (v2.complex_matrix_value ()); + v1.assign (idx, tmp); + return octave_value (); +} + +void +install_scm_m_ops (void) +{ + INSTALL_BINOP (op_add, octave_sparse_complex_matrix, octave_matrix, add); + INSTALL_BINOP (op_sub, octave_sparse_complex_matrix, octave_matrix, sub); + INSTALL_BINOP (op_mul, octave_sparse_complex_matrix, octave_matrix, mul); + INSTALL_BINOP (op_div, octave_sparse_complex_matrix, octave_matrix, div); + INSTALL_BINOP (op_pow, octave_sparse_complex_matrix, octave_matrix, pow); + INSTALL_BINOP (op_ldiv, octave_sparse_complex_matrix, octave_matrix, ldiv); + INSTALL_BINOP (op_lt, octave_sparse_complex_matrix, octave_matrix, lt); + INSTALL_BINOP (op_le, octave_sparse_complex_matrix, octave_matrix, le); + INSTALL_BINOP (op_eq, octave_sparse_complex_matrix, octave_matrix, eq); + INSTALL_BINOP (op_ge, octave_sparse_complex_matrix, octave_matrix, ge); + INSTALL_BINOP (op_gt, octave_sparse_complex_matrix, octave_matrix, gt); + INSTALL_BINOP (op_ne, octave_sparse_complex_matrix, octave_matrix, ne); + INSTALL_BINOP (op_el_mul, octave_sparse_complex_matrix, octave_matrix, + el_mul); + INSTALL_BINOP (op_el_div, octave_sparse_complex_matrix, octave_matrix, + el_div); + INSTALL_BINOP (op_el_pow, octave_sparse_complex_matrix, octave_matrix, + el_pow); + INSTALL_BINOP (op_el_ldiv, octave_sparse_complex_matrix, octave_matrix, + el_ldiv); + INSTALL_BINOP (op_el_and, octave_sparse_complex_matrix, octave_matrix, + el_and); + INSTALL_BINOP (op_el_or, octave_sparse_complex_matrix, octave_matrix, + el_or); + + INSTALL_CATOP (octave_sparse_complex_matrix, octave_matrix, scm_m); + + INSTALL_ASSIGNOP (op_asn_eq, octave_sparse_complex_matrix, octave_matrix, + assign); +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-scm-s.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/OPERATORS/op-scm-s.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,188 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "gripes.h" +#include "oct-obj.h" +#include "ov.h" +#include "ov-typeinfo.h" +#include "ov-cx-mat.h" +#include "ov-scalar.h" +#include "ops.h" +#include "xpow.h" + +#include "sparse-xpow.h" +#include "sparse-xdiv.h" +#include "smx-scm-s.h" +#include "smx-s-scm.h" +#include "ov-re-sparse.h" +#include "ov-cx-sparse.h" + +// sparse complex matrix by scalar ops. + +DEFBINOP_OP (add, sparse_complex_matrix, scalar, +) +DEFBINOP_OP (sub, sparse_complex_matrix, scalar, -) +DEFBINOP_OP (mul, sparse_complex_matrix, scalar, *) + +DEFBINOP (div, sparse_complex_matrix, scalar) +{ + CAST_BINOP_ARGS (const octave_sparse_complex_matrix&, + const octave_scalar&); + + double d = v2.double_value (); + octave_value retval; + + if (d == 0.0) + { + gripe_divide_by_zero (); + + retval = octave_value (v1.complex_matrix_value () / d); + } + else + retval = octave_value (v1.sparse_complex_matrix_value () / d); + + return retval; +} + +DEFBINOP (pow, sparse_complex_matrix, scalar) +{ + CAST_BINOP_ARGS (const octave_sparse_complex_matrix&, + const octave_scalar&); + + double tmp = v2.scalar_value (); + if (static_cast (tmp) == tmp) + return xpow (v1.sparse_complex_matrix_value (), tmp); + else + return xpow (v1.complex_matrix_value (), tmp); +} + +DEFBINOP (ldiv, sparse_complex_matrix, scalar) +{ + CAST_BINOP_ARGS (const octave_sparse_complex_matrix&, + const octave_scalar&); + + SparseComplexMatrix m1 = v1.sparse_complex_matrix_value (); + Matrix m2 = Matrix (1, 1, v2.scalar_value ()); + + return xleftdiv (m1, m2); +} + +DEFBINOP_FN (lt, sparse_complex_matrix, scalar, mx_el_lt) +DEFBINOP_FN (le, sparse_complex_matrix, scalar, mx_el_le) +DEFBINOP_FN (eq, sparse_complex_matrix, scalar, mx_el_eq) +DEFBINOP_FN (ge, sparse_complex_matrix, scalar, mx_el_ge) +DEFBINOP_FN (gt, sparse_complex_matrix, scalar, mx_el_gt) +DEFBINOP_FN (ne, sparse_complex_matrix, scalar, mx_el_ne) + +DEFBINOP_OP (el_mul, sparse_complex_matrix, scalar, *) + +DEFBINOP (el_div, sparse_complex_matrix, scalar) +{ + CAST_BINOP_ARGS (const octave_sparse_complex_matrix&, + const octave_scalar&); + + double d = v2.double_value (); + octave_value retval; + + if (d == 0.0) + { + gripe_divide_by_zero (); + + retval = octave_value (v1.complex_matrix_value () / d); + } + else + retval = octave_value (v1.sparse_complex_matrix_value () / d); + + return retval; +} + +DEFBINOP_FN (el_pow, sparse_complex_matrix, scalar, elem_xpow) + +DEFBINOP (el_ldiv, sparse_complex_matrix, scalar) +{ + CAST_BINOP_ARGS (const octave_sparse_complex_matrix&, const octave_scalar&); + + return octave_value + (x_el_div (v2.double_value (), v1.sparse_complex_matrix_value ())); +} + +DEFBINOP_FN (el_and, sparse_complex_matrix, scalar, mx_el_and) +DEFBINOP_FN (el_or, sparse_complex_matrix, scalar, mx_el_or) + +DEFCATOP (scm_s, sparse_complex_matrix, scalar) +{ + CAST_BINOP_ARGS (octave_sparse_complex_matrix&, const octave_scalar&); + SparseComplexMatrix tmp (1, 1, v2.complex_value ()); + return octave_value + (v1.sparse_complex_matrix_value (). concat (tmp, ra_idx)); +} + +DEFASSIGNOP (assign, sparse_complex_matrix, scalar) +{ + CAST_BINOP_ARGS (octave_sparse_complex_matrix&, const octave_scalar&); + + SparseComplexMatrix tmp (1, 1, v2.complex_value ()); + v1.assign (idx, tmp); + return octave_value (); +} + +void +install_scm_s_ops (void) +{ + INSTALL_BINOP (op_add, octave_sparse_complex_matrix, octave_scalar, add); + INSTALL_BINOP (op_sub, octave_sparse_complex_matrix, octave_scalar, sub); + INSTALL_BINOP (op_mul, octave_sparse_complex_matrix, octave_scalar, mul); + INSTALL_BINOP (op_div, octave_sparse_complex_matrix, octave_scalar, div); + INSTALL_BINOP (op_pow, octave_sparse_complex_matrix, octave_scalar, pow); + INSTALL_BINOP (op_ldiv, octave_sparse_complex_matrix, octave_scalar, ldiv); + INSTALL_BINOP (op_lt, octave_sparse_complex_matrix, octave_scalar, lt); + INSTALL_BINOP (op_le, octave_sparse_complex_matrix, octave_scalar, le); + INSTALL_BINOP (op_eq, octave_sparse_complex_matrix, octave_scalar, eq); + INSTALL_BINOP (op_ge, octave_sparse_complex_matrix, octave_scalar, ge); + INSTALL_BINOP (op_gt, octave_sparse_complex_matrix, octave_scalar, gt); + INSTALL_BINOP (op_ne, octave_sparse_complex_matrix, octave_scalar, ne); + INSTALL_BINOP (op_el_mul, octave_sparse_complex_matrix, octave_scalar, + el_mul); + INSTALL_BINOP (op_el_div, octave_sparse_complex_matrix, octave_scalar, + el_div); + INSTALL_BINOP (op_el_pow, octave_sparse_complex_matrix, octave_scalar, + el_pow); + INSTALL_BINOP (op_el_ldiv, octave_sparse_complex_matrix, octave_scalar, + el_ldiv); + INSTALL_BINOP (op_el_and, octave_sparse_complex_matrix, octave_scalar, + el_and); + INSTALL_BINOP (op_el_or, octave_sparse_complex_matrix, octave_scalar, + el_or); + + INSTALL_CATOP (octave_sparse_complex_matrix, octave_scalar, scm_s); + + INSTALL_ASSIGNOP (op_asn_eq, octave_sparse_complex_matrix, octave_scalar, + assign); +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-scm-scm.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/OPERATORS/op-scm-scm.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,196 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "gripes.h" +#include "oct-obj.h" +#include "ov.h" +#include "ov-typeinfo.h" +#include "ops.h" + +#include "sparse-xdiv.h" +#include "sparse-xpow.h" +#include "ov-re-sparse.h" +#include "ov-cx-sparse.h" + +#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) +#pragma implementation +#endif + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "gripes.h" +#include "oct-obj.h" +#include "ov.h" +#include "ov-cx-mat.h" +#include "ov-typeinfo.h" +#include "ops.h" +#include "xdiv.h" +#include "xpow.h" + +// unary sparse complex matrix ops. + +DEFUNOP_OP (not, sparse_complex_matrix, !) +DEFUNOP_OP (uplus, sparse_complex_matrix, /* no-op */) +DEFUNOP_OP (uminus, sparse_complex_matrix, -) + +DEFUNOP (transpose, sparse_complex_matrix) +{ + CAST_UNOP_ARG (const octave_sparse_complex_matrix&); + + return octave_value (v.sparse_complex_matrix_value().transpose ()); +} + +DEFUNOP (hermitian, sparse_complex_matrix) +{ + CAST_UNOP_ARG (const octave_sparse_complex_matrix&); + + return octave_value (v.sparse_complex_matrix_value().hermitian ()); +} + +#if 0 +DEFUNOP (incr, sparse_complex_matrix) +{ + CAST_UNOP_ARG (const octave_sparse_complex_matrix&); + + return octave_value (v.complex_matrix_value () .increment ()); +} + +DEFUNOP (decr, sparse_complex_matrix) +{ + CAST_UNOP_ARG (const octave_sparse_complex_matrix&); + + return octave_value (v.complex_matrix_value () .decrement ()); +} +#endif + +// complex matrix by complex matrix ops. + +DEFBINOP_OP (add, sparse_complex_matrix, sparse_complex_matrix, +) +DEFBINOP_OP (sub, sparse_complex_matrix, sparse_complex_matrix, -) + +DEFBINOP_OP (mul, sparse_complex_matrix, sparse_complex_matrix, *) + +DEFBINOP_FN (div, sparse_complex_matrix, sparse_complex_matrix, xdiv) + +DEFBINOPX (pow, sparse_complex_matrix, sparse_complex_matrix) +{ + error ("can't do A ^ B for A and B both matrices"); + return octave_value (); +} + +DEFBINOP_FN (ldiv, sparse_complex_matrix, sparse_complex_matrix, xleftdiv) + +DEFBINOP_FN (lt, sparse_complex_matrix, sparse_complex_matrix, mx_el_lt) +DEFBINOP_FN (le, sparse_complex_matrix, sparse_complex_matrix, mx_el_le) +DEFBINOP_FN (eq, sparse_complex_matrix, sparse_complex_matrix, mx_el_eq) +DEFBINOP_FN (ge, sparse_complex_matrix, sparse_complex_matrix, mx_el_ge) +DEFBINOP_FN (gt, sparse_complex_matrix, sparse_complex_matrix, mx_el_gt) +DEFBINOP_FN (ne, sparse_complex_matrix, sparse_complex_matrix, mx_el_ne) + +DEFBINOP_FN (el_mul, sparse_complex_matrix, sparse_complex_matrix, product) +DEFBINOP_FN (el_div, sparse_complex_matrix, sparse_complex_matrix, quotient) +DEFBINOP_FN (el_pow, sparse_complex_matrix, sparse_complex_matrix, elem_xpow) + +DEFBINOP (el_ldiv, sparse_complex_matrix, sparse_complex_matrix) +{ + CAST_BINOP_ARGS (const octave_sparse_complex_matrix&, + const octave_sparse_complex_matrix&); + + return octave_value (quotient (v2.sparse_complex_matrix_value (), + v1.sparse_complex_matrix_value ())); +} + +DEFBINOP_FN (el_and, sparse_complex_matrix, sparse_complex_matrix, mx_el_and) +DEFBINOP_FN (el_or, sparse_complex_matrix, sparse_complex_matrix, mx_el_or) + +DEFCATOP_FN (scm_scm, sparse_complex_matrix, sparse_complex_matrix, concat) + +DEFASSIGNOP_FN (assign, sparse_complex_matrix, sparse_complex_matrix, assign) + +void +install_scm_scm_ops (void) +{ + INSTALL_UNOP (op_not, octave_sparse_complex_matrix, not); + INSTALL_UNOP (op_uplus, octave_sparse_complex_matrix, uplus); + INSTALL_UNOP (op_uminus, octave_sparse_complex_matrix, uminus); + INSTALL_UNOP (op_transpose, octave_sparse_complex_matrix, transpose); + INSTALL_UNOP (op_hermitian, octave_sparse_complex_matrix, hermitian); + +#if 0 + INSTALL_NCUNOP (op_incr, octave_sparse_complex_matrix, incr); + INSTALL_NCUNOP (op_decr, octave_sparse_complex_matrix, decr); +#endif + + INSTALL_BINOP (op_add, octave_sparse_complex_matrix, + octave_sparse_complex_matrix, add); + INSTALL_BINOP (op_sub, octave_sparse_complex_matrix, + octave_sparse_complex_matrix, sub); + INSTALL_BINOP (op_mul, octave_sparse_complex_matrix, + octave_sparse_complex_matrix, mul); + INSTALL_BINOP (op_div, octave_sparse_complex_matrix, + octave_sparse_complex_matrix, div); + INSTALL_BINOP (op_pow, octave_sparse_complex_matrix, + octave_sparse_complex_matrix, pow); + INSTALL_BINOP (op_ldiv, octave_sparse_complex_matrix, + octave_sparse_complex_matrix, ldiv); + INSTALL_BINOP (op_lt, octave_sparse_complex_matrix, + octave_sparse_complex_matrix, lt); + INSTALL_BINOP (op_le, octave_sparse_complex_matrix, + octave_sparse_complex_matrix, le); + INSTALL_BINOP (op_eq, octave_sparse_complex_matrix, + octave_sparse_complex_matrix, eq); + INSTALL_BINOP (op_ge, octave_sparse_complex_matrix, + octave_sparse_complex_matrix, ge); + INSTALL_BINOP (op_gt, octave_sparse_complex_matrix, + octave_sparse_complex_matrix, gt); + INSTALL_BINOP (op_ne, octave_sparse_complex_matrix, + octave_sparse_complex_matrix, ne); + INSTALL_BINOP (op_el_mul, octave_sparse_complex_matrix, + octave_sparse_complex_matrix, el_mul); + INSTALL_BINOP (op_el_div, octave_sparse_complex_matrix, + octave_sparse_complex_matrix, el_div); + INSTALL_BINOP (op_el_pow, octave_sparse_complex_matrix, + octave_sparse_complex_matrix, el_pow); + INSTALL_BINOP (op_el_ldiv, octave_sparse_complex_matrix, + octave_sparse_complex_matrix, el_ldiv); + INSTALL_BINOP (op_el_and, octave_sparse_complex_matrix, + octave_sparse_complex_matrix, el_and); + INSTALL_BINOP (op_el_or, octave_sparse_complex_matrix, + octave_sparse_complex_matrix, el_or); + + INSTALL_CATOP (octave_sparse_complex_matrix, + octave_sparse_complex_matrix, scm_scm); + + INSTALL_ASSIGNOP (op_asn_eq, octave_sparse_complex_matrix, + octave_sparse_complex_matrix, assign); +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-scm-sm.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/OPERATORS/op-scm-sm.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,133 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "gripes.h" +#include "oct-obj.h" +#include "ov.h" +#include "ov-typeinfo.h" +#include "ops.h" + +#include "sparse-xdiv.h" +#include "sparse-xpow.h" +#include "smx-sm-scm.h" +#include "smx-scm-sm.h" +#include "ov-re-sparse.h" +#include "ov-cx-sparse.h" + +// sparse complex matrix by sparse matrix ops. + +DEFBINOP_OP (add, sparse_complex_matrix, sparse_matrix, +) +DEFBINOP_OP (sub, sparse_complex_matrix, sparse_matrix, -) + +DEFBINOP_OP (mul, sparse_complex_matrix, sparse_matrix, *) + +DEFBINOP_FN (div, sparse_complex_matrix, sparse_matrix, xdiv) + +DEFBINOPX (pow, sparse_complex_matrix, sparse_matrix) +{ + error ("can't do A ^ B for A and B both matrices"); + return octave_value (); +} + +DEFBINOP_FN (ldiv, sparse_complex_matrix, sparse_matrix, xleftdiv) + +DEFBINOP_FN (lt, sparse_complex_matrix, sparse_matrix, mx_el_lt) +DEFBINOP_FN (le, sparse_complex_matrix, sparse_matrix, mx_el_le) +DEFBINOP_FN (eq, sparse_complex_matrix, sparse_matrix, mx_el_eq) +DEFBINOP_FN (ge, sparse_complex_matrix, sparse_matrix, mx_el_ge) +DEFBINOP_FN (gt, sparse_complex_matrix, sparse_matrix, mx_el_gt) +DEFBINOP_FN (ne, sparse_complex_matrix, sparse_matrix, mx_el_ne) + +DEFBINOP_FN (el_mul, sparse_complex_matrix, sparse_matrix, product) +DEFBINOP_FN (el_div, sparse_complex_matrix, sparse_matrix, quotient) +DEFBINOP_FN (el_pow, sparse_complex_matrix, sparse_matrix, elem_xpow) + +DEFBINOP (el_ldiv, sparse_complex_matrix, sparse_matrix) +{ + CAST_BINOP_ARGS (const octave_sparse_complex_matrix&, + const octave_sparse_matrix&); + + return octave_value + (quotient (v2.sparse_matrix_value (), v1.sparse_complex_matrix_value ())); +} + +DEFBINOP_FN (el_and, sparse_complex_matrix, sparse_matrix, mx_el_and) +DEFBINOP_FN (el_or, sparse_complex_matrix, sparse_matrix, mx_el_or) + +DEFCATOP_FN (scm_sm, sparse_complex_matrix, sparse_matrix, concat) + +DEFASSIGNOP_FN (assign, sparse_complex_matrix, sparse_matrix, assign) + +void +install_scm_sm_ops (void) +{ + INSTALL_BINOP (op_add, octave_sparse_complex_matrix, octave_sparse_matrix, + add); + INSTALL_BINOP (op_sub, octave_sparse_complex_matrix, octave_sparse_matrix, + sub); + INSTALL_BINOP (op_mul, octave_sparse_complex_matrix, octave_sparse_matrix, + mul); + INSTALL_BINOP (op_div, octave_sparse_complex_matrix, octave_sparse_matrix, + div); + INSTALL_BINOP (op_pow, octave_sparse_complex_matrix, octave_sparse_matrix, + pow); + INSTALL_BINOP (op_ldiv, octave_sparse_complex_matrix, octave_sparse_matrix, + ldiv); + INSTALL_BINOP (op_lt, octave_sparse_complex_matrix, octave_sparse_matrix, + lt); + INSTALL_BINOP (op_le, octave_sparse_complex_matrix, octave_sparse_matrix, + le); + INSTALL_BINOP (op_eq, octave_sparse_complex_matrix, octave_sparse_matrix, + eq); + INSTALL_BINOP (op_ge, octave_sparse_complex_matrix, octave_sparse_matrix, + ge); + INSTALL_BINOP (op_gt, octave_sparse_complex_matrix, octave_sparse_matrix, + gt); + INSTALL_BINOP (op_ne, octave_sparse_complex_matrix, octave_sparse_matrix, + ne); + INSTALL_BINOP (op_el_mul, octave_sparse_complex_matrix, + octave_sparse_matrix, el_mul); + INSTALL_BINOP (op_el_div, octave_sparse_complex_matrix, + octave_sparse_matrix, el_div); + INSTALL_BINOP (op_el_pow, octave_sparse_complex_matrix, + octave_sparse_matrix, el_pow); + INSTALL_BINOP (op_el_ldiv, octave_sparse_complex_matrix, + octave_sparse_matrix, el_ldiv); + INSTALL_BINOP (op_el_and, octave_sparse_complex_matrix, + octave_sparse_matrix, el_and); + INSTALL_BINOP (op_el_or, octave_sparse_complex_matrix, + octave_sparse_matrix, el_or); + + INSTALL_CATOP (octave_sparse_complex_matrix, octave_sparse_matrix, scm_sm); + + INSTALL_ASSIGNOP (op_asn_eq, octave_sparse_complex_matrix, + octave_sparse_matrix, assign); +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-sm-cm.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/OPERATORS/op-sm-cm.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,163 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "gripes.h" +#include "oct-obj.h" +#include "ov.h" +#include "ov-typeinfo.h" +#include "ov-cx-mat.h" +#include "ops.h" +#include "xdiv.h" + +#include "sparse-xpow.h" +#include "sparse-xdiv.h" +#include "smx-sm-cm.h" +#include "smx-cm-sm.h" +#include "ov-re-sparse.h" + +// sparse matrix by complex matrix ops. + +DEFBINOP_OP (add, sparse_matrix, complex_matrix, +) +DEFBINOP_OP (sub, sparse_matrix, complex_matrix, -) + +DEFBINOP (mul, sparse_matrix, complex_matrix) +{ + CAST_BINOP_ARGS (const octave_sparse_matrix&, + const octave_complex_matrix&); + + Matrix tmp (v1.matrix_value ()); + + return octave_value ( tmp * v2.complex_matrix_value()); +} + +DEFBINOP (div, sparse_matrix, complex_matrix) +{ + CAST_BINOP_ARGS (const octave_sparse_matrix&, + const octave_complex_matrix&); + + return xdiv (v1.matrix_value (), v2.complex_matrix_value ()); +} + +DEFBINOPX (pow, sparse_matrix, complex_matrix) +{ + error ("can't do A ^ B for A and B both matrices"); + return octave_value (); +} + +DEFBINOP (ldiv, sparse_matrix, complex_matrix) +{ + CAST_BINOP_ARGS (const octave_sparse_matrix&, + const octave_complex_matrix&); + + return xleftdiv (v1.sparse_matrix_value (), v2.complex_matrix_value ()); +} + +DEFBINOP_FN (lt, sparse_matrix, complex_matrix, mx_el_lt) +DEFBINOP_FN (le, sparse_matrix, complex_matrix, mx_el_le) +DEFBINOP_FN (eq, sparse_matrix, complex_matrix, mx_el_eq) +DEFBINOP_FN (ge, sparse_matrix, complex_matrix, mx_el_ge) +DEFBINOP_FN (gt, sparse_matrix, complex_matrix, mx_el_gt) +DEFBINOP_FN (ne, sparse_matrix, complex_matrix, mx_el_ne) + +DEFBINOP_FN (el_mul, sparse_matrix, complex_matrix, product) +DEFBINOP_FN (el_div, sparse_matrix, complex_matrix, quotient) + +DEFBINOP (el_pow, sparse_matrix, complex_matrix) +{ + CAST_BINOP_ARGS (const octave_sparse_matrix&, + const octave_complex_matrix&); + + return octave_value + (elem_xpow (v1.sparse_matrix_value (), SparseComplexMatrix + (v2.complex_matrix_value ()))); +} + +DEFBINOP (el_ldiv, sparse_matrix, complex_matrix) +{ + CAST_BINOP_ARGS (const octave_sparse_matrix&, + const octave_complex_matrix&); + + return octave_value + (quotient (v2.complex_matrix_value (), v1.sparse_matrix_value ())); +} + +DEFBINOP_FN (el_and, sparse_matrix, complex_matrix, mx_el_and) +DEFBINOP_FN (el_or, sparse_matrix, complex_matrix, mx_el_or) + +DEFCATOP (sm_cm, sparse_matrix, complex_matrix) +{ + CAST_BINOP_ARGS (octave_sparse_matrix&, const octave_complex_matrix&); + SparseComplexMatrix tmp (v2.complex_matrix_value ()); + return octave_value (v1.sparse_matrix_value (). concat (tmp, ra_idx)); +} + +DEFCONV (sparse_complex_matrix_conv, sparse_matrix, sparse_complex_matrix) +{ + CAST_CONV_ARG (const octave_sparse_matrix&); + return new octave_complex_matrix (v.complex_matrix_value ()); +} + +void +install_sm_cm_ops (void) +{ + INSTALL_BINOP (op_add, octave_sparse_matrix, octave_complex_matrix, add); + INSTALL_BINOP (op_sub, octave_sparse_matrix, octave_complex_matrix, sub); + INSTALL_BINOP (op_mul, octave_sparse_matrix, octave_complex_matrix, mul); + INSTALL_BINOP (op_div, octave_sparse_matrix, octave_complex_matrix, div); + INSTALL_BINOP (op_pow, octave_sparse_matrix, octave_complex_matrix, pow); + INSTALL_BINOP (op_ldiv, octave_sparse_matrix, octave_complex_matrix, ldiv); + INSTALL_BINOP (op_lt, octave_sparse_matrix, octave_complex_matrix, lt); + INSTALL_BINOP (op_le, octave_sparse_matrix, octave_complex_matrix, le); + INSTALL_BINOP (op_eq, octave_sparse_matrix, octave_complex_matrix, eq); + INSTALL_BINOP (op_ge, octave_sparse_matrix, octave_complex_matrix, ge); + INSTALL_BINOP (op_gt, octave_sparse_matrix, octave_complex_matrix, gt); + INSTALL_BINOP (op_ne, octave_sparse_matrix, octave_complex_matrix, ne); + INSTALL_BINOP (op_el_mul, octave_sparse_matrix, octave_complex_matrix, + el_mul); + INSTALL_BINOP (op_el_div, octave_sparse_matrix, octave_complex_matrix, + el_div); + INSTALL_BINOP (op_el_pow, octave_sparse_matrix, octave_complex_matrix, + el_pow); + INSTALL_BINOP (op_el_ldiv, octave_sparse_matrix, octave_complex_matrix, + el_ldiv); + INSTALL_BINOP (op_el_and, octave_sparse_matrix, octave_complex_matrix, + el_and); + INSTALL_BINOP (op_el_or, octave_sparse_matrix, octave_complex_matrix, + el_or); + + INSTALL_CATOP (octave_sparse_matrix, octave_complex_matrix, sm_cm); + + INSTALL_ASSIGNCONV (octave_sparse_matrix, octave_complex_matrix, + octave_sparse_complex_matrix); + + INSTALL_WIDENOP (octave_sparse_matrix, octave_complex_matrix, + sparse_complex_matrix_conv); +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-sm-cs.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/OPERATORS/op-sm-cs.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,163 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "gripes.h" +#include "oct-obj.h" +#include "ov.h" +#include "ov-typeinfo.h" +#include "ov-complex.h" +#include "ops.h" +#include "xpow.h" + +#include "sparse-xpow.h" +#include "sparse-xdiv.h" +#include "ov-re-sparse.h" +#include "ov-cx-sparse.h" +#include "smx-sm-cs.h" +#include "smx-cs-sm.h" + +// sparse matrix by scalar ops. + +DEFBINOP_OP (add, sparse_matrix, complex, +) +DEFBINOP_OP (sub, sparse_matrix, complex, -) +DEFBINOP_OP (mul, sparse_matrix, complex, *) + +DEFBINOP (div, sparse_matrix, complex) +{ + CAST_BINOP_ARGS (const octave_sparse_matrix&, const octave_complex&); + + Complex d = v2.complex_value (); + octave_value retval; + + if (d == 0.0) + { + gripe_divide_by_zero (); + + retval = octave_value (v1.matrix_value () / d); + } + else + retval = octave_value (v1.sparse_matrix_value () / d); + + return retval; +} + +DEFBINOP (pow, sparse_matrix, complex) +{ + CAST_BINOP_ARGS (const octave_sparse_matrix&, const octave_complex&); + return xpow (v1.matrix_value (), v2.complex_value ()); +} + +DEFBINOP (ldiv, sparse_matrix, complex) +{ + CAST_BINOP_ARGS (const octave_sparse_matrix&, const octave_complex&); + + SparseMatrix m1 = v1.sparse_matrix_value (); + ComplexMatrix m2 = ComplexMatrix (1, 1, v2.complex_value ()); + + return xleftdiv (m1, m2); +} + +DEFBINOP_FN (lt, sparse_matrix, complex, mx_el_lt) +DEFBINOP_FN (le, sparse_matrix, complex, mx_el_le) +DEFBINOP_FN (eq, sparse_matrix, complex, mx_el_eq) +DEFBINOP_FN (ge, sparse_matrix, complex, mx_el_ge) +DEFBINOP_FN (gt, sparse_matrix, complex, mx_el_gt) +DEFBINOP_FN (ne, sparse_matrix, complex, mx_el_ne) + +DEFBINOP_OP (el_mul, sparse_matrix, complex, *) + +DEFBINOP (el_div, sparse_matrix, complex) +{ + CAST_BINOP_ARGS (const octave_sparse_matrix&, const octave_complex&); + + Complex d = v2.complex_value (); + octave_value retval; + + if (d == 0.0) + { + gripe_divide_by_zero (); + + retval = octave_value (v1.matrix_value () / d); + } + else + retval = octave_value (v1.sparse_matrix_value () / d); + + return retval; +} + +DEFBINOP_FN (el_pow, sparse_matrix, complex, elem_xpow) + +DEFBINOP (el_ldiv, sparse_matrix, complex) +{ + CAST_BINOP_ARGS (const octave_sparse_matrix&, const octave_complex&); + + return octave_value (x_el_div (v2.complex_value (), + v1.sparse_matrix_value ())); +} + +DEFBINOP_FN (el_and, sparse_matrix, complex, mx_el_and) +DEFBINOP_FN (el_or, sparse_matrix, complex, mx_el_or) + +DEFCATOP (sm_cs, sparse_matrix, complex) +{ + CAST_BINOP_ARGS (octave_sparse_matrix&, const octave_complex&); + SparseComplexMatrix tmp (1, 1, v2.complex_value ()); + return octave_value (v1.sparse_matrix_value (). concat (tmp, ra_idx)); +} + +void +install_sm_cs_ops (void) +{ + INSTALL_BINOP (op_add, octave_sparse_matrix, octave_complex, add); + INSTALL_BINOP (op_sub, octave_sparse_matrix, octave_complex, sub); + INSTALL_BINOP (op_mul, octave_sparse_matrix, octave_complex, mul); + INSTALL_BINOP (op_div, octave_sparse_matrix, octave_complex, div); + INSTALL_BINOP (op_pow, octave_sparse_matrix, octave_complex, pow); + INSTALL_BINOP (op_ldiv, octave_sparse_matrix, octave_complex, ldiv); + + INSTALL_BINOP (op_lt, octave_sparse_matrix, octave_complex, lt); + INSTALL_BINOP (op_le, octave_sparse_matrix, octave_complex, le); + INSTALL_BINOP (op_eq, octave_sparse_matrix, octave_complex, eq); + INSTALL_BINOP (op_ge, octave_sparse_matrix, octave_complex, ge); + INSTALL_BINOP (op_gt, octave_sparse_matrix, octave_complex, gt); + INSTALL_BINOP (op_ne, octave_sparse_matrix, octave_complex, ne); + INSTALL_BINOP (op_el_mul, octave_sparse_matrix, octave_complex, el_mul); + INSTALL_BINOP (op_el_div, octave_sparse_matrix, octave_complex, el_div); + INSTALL_BINOP (op_el_pow, octave_sparse_matrix, octave_complex, el_pow); + INSTALL_BINOP (op_el_ldiv, octave_sparse_matrix, octave_complex, el_ldiv); + INSTALL_BINOP (op_el_and, octave_sparse_matrix, octave_complex, el_and); + INSTALL_BINOP (op_el_or, octave_sparse_matrix, octave_complex, el_or); + + INSTALL_CATOP (octave_sparse_matrix, octave_complex, sm_cs); + + INSTALL_ASSIGNCONV (octave_sparse_matrix, octave_complex, + octave_sparse_complex_matrix); +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-sm-m.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/OPERATORS/op-sm-m.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,151 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "gripes.h" +#include "oct-obj.h" +#include "ov.h" +#include "ov-typeinfo.h" +#include "ov-re-mat.h" +#include "ops.h" +#include "xdiv.h" + +#include "sparse-xpow.h" +#include "sparse-xdiv.h" +#include "smx-sm-m.h" +#include "smx-m-sm.h" +#include "ov-re-sparse.h" + +// sparse matrix by matrix ops. + +DEFBINOP_OP (add, sparse_matrix, matrix, +) +DEFBINOP_OP (sub, sparse_matrix, matrix, -) + +DEFBINOP (mul, sparse_matrix, matrix) +{ + CAST_BINOP_ARGS (const octave_sparse_matrix&, const octave_matrix&); + + Matrix tmp (v1.matrix_value ()); + + return octave_value ( tmp * v2.matrix_value()); +} + +DEFBINOP (div, sparse_matrix, matrix) +{ + CAST_BINOP_ARGS (const octave_sparse_matrix&, const octave_matrix&); + + return xdiv (v1.matrix_value (), v2.matrix_value ()); +} + +DEFBINOPX (pow, sparse_matrix, matrix) +{ + error ("can't do A ^ B for A and B both matrices"); + return octave_value (); +} + +DEFBINOP (ldiv, sparse_matrix, matrix) +{ + CAST_BINOP_ARGS (const octave_sparse_matrix&, const octave_matrix&); + + return xleftdiv (v1.sparse_matrix_value (), v2.matrix_value ()); +} + + +DEFBINOP_FN (lt, sparse_matrix, matrix, mx_el_lt) +DEFBINOP_FN (le, sparse_matrix, matrix, mx_el_le) +DEFBINOP_FN (eq, sparse_matrix, matrix, mx_el_eq) +DEFBINOP_FN (ge, sparse_matrix, matrix, mx_el_ge) +DEFBINOP_FN (gt, sparse_matrix, matrix, mx_el_gt) +DEFBINOP_FN (ne, sparse_matrix, matrix, mx_el_ne) + +DEFBINOP_FN (el_mul, sparse_matrix, matrix, product) +DEFBINOP_FN (el_div, sparse_matrix, matrix, quotient) + +DEFBINOP (el_pow, sparse_matrix, matrix) +{ + CAST_BINOP_ARGS (const octave_sparse_matrix&, const octave_matrix&); + + return octave_value (elem_xpow (v1.sparse_matrix_value (), + SparseMatrix (v2.matrix_value ()))); +} + +DEFBINOP (el_ldiv, sparse_matrix, matrix) +{ + CAST_BINOP_ARGS (const octave_sparse_matrix&, const octave_matrix&); + + return octave_value + (quotient (v2.matrix_value (), v1.sparse_matrix_value ())); +} + +DEFBINOP_FN (el_and, sparse_matrix, matrix, mx_el_and) +DEFBINOP_FN (el_or, sparse_matrix, matrix, mx_el_or) + +DEFCATOP (sm_m, sparse_matrix, matrix) +{ + CAST_BINOP_ARGS (octave_sparse_matrix&, const octave_matrix&); + SparseMatrix tmp (v2.matrix_value ()); + return octave_value (v1.sparse_matrix_value (). concat (tmp, ra_idx)); +} + +DEFASSIGNOP (assign, sparse_matrix, matrix) +{ + CAST_BINOP_ARGS (octave_sparse_matrix&, const octave_matrix&); + + SparseMatrix tmp (v2.matrix_value ()); + v1.assign (idx, tmp); + return octave_value (); +} + +void +install_sm_m_ops (void) +{ + INSTALL_BINOP (op_add, octave_sparse_matrix, octave_matrix, add); + INSTALL_BINOP (op_sub, octave_sparse_matrix, octave_matrix, sub); + INSTALL_BINOP (op_mul, octave_sparse_matrix, octave_matrix, mul); + INSTALL_BINOP (op_div, octave_sparse_matrix, octave_matrix, div); + INSTALL_BINOP (op_pow, octave_sparse_matrix, octave_matrix, pow); + INSTALL_BINOP (op_ldiv, octave_sparse_matrix, octave_matrix, ldiv); + INSTALL_BINOP (op_lt, octave_sparse_matrix, octave_matrix, lt); + INSTALL_BINOP (op_le, octave_sparse_matrix, octave_matrix, le); + INSTALL_BINOP (op_eq, octave_sparse_matrix, octave_matrix, eq); + INSTALL_BINOP (op_ge, octave_sparse_matrix, octave_matrix, ge); + INSTALL_BINOP (op_gt, octave_sparse_matrix, octave_matrix, gt); + INSTALL_BINOP (op_ne, octave_sparse_matrix, octave_matrix, ne); + INSTALL_BINOP (op_el_mul, octave_sparse_matrix, octave_matrix, el_mul); + INSTALL_BINOP (op_el_div, octave_sparse_matrix, octave_matrix, el_div); + INSTALL_BINOP (op_el_pow, octave_sparse_matrix, octave_matrix, el_pow); + INSTALL_BINOP (op_el_ldiv, octave_sparse_matrix, octave_matrix, el_ldiv); + INSTALL_BINOP (op_el_and, octave_sparse_matrix, octave_matrix, el_and); + INSTALL_BINOP (op_el_or, octave_sparse_matrix, octave_matrix, el_or); + + INSTALL_CATOP (octave_sparse_matrix, octave_matrix, sm_m); + + INSTALL_ASSIGNOP (op_asn_eq, octave_sparse_matrix, octave_matrix, assign); +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-sm-s.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/OPERATORS/op-sm-s.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,173 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "gripes.h" +#include "oct-obj.h" +#include "ov.h" +#include "ov-typeinfo.h" +#include "ov-scalar.h" +#include "ops.h" +#include "xpow.h" + +#include "sparse-xpow.h" +#include "sparse-xdiv.h" +#include "ov-re-sparse.h" + +// sparse matrix by scalar ops. + +DEFBINOP_OP (add, sparse_matrix, scalar, +) +DEFBINOP_OP (sub, sparse_matrix, scalar, -) +DEFBINOP_OP (mul, sparse_matrix, scalar, *) + +DEFBINOP (div, sparse_matrix, scalar) +{ + CAST_BINOP_ARGS (const octave_sparse_matrix&, const octave_scalar&); + + double d = v2.double_value (); + octave_value retval; + + if (d == 0.0) + { + gripe_divide_by_zero (); + + retval = octave_value (v1.matrix_value () / d); + } + else + retval = octave_value (v1.sparse_matrix_value () / d); + + return retval; +} + +DEFBINOP (pow, sparse_matrix, scalar) +{ + CAST_BINOP_ARGS (const octave_sparse_matrix&, const octave_scalar&); + + double tmp = v2.scalar_value (); + if (static_cast (tmp) == tmp) + return xpow (v1.sparse_matrix_value (), tmp); + else + return xpow (v1.matrix_value (), tmp); +} + +DEFBINOP (ldiv, sparse_matrix, scalar) +{ + CAST_BINOP_ARGS (const octave_sparse_matrix&, const octave_scalar&); + + SparseMatrix m1 = v1.sparse_matrix_value (); + Matrix m2 = Matrix (1, 1, v2.scalar_value ()); + + return xleftdiv (m1, m2); +} + +DEFBINOP_FN (lt, sparse_matrix, scalar, mx_el_lt) +DEFBINOP_FN (le, sparse_matrix, scalar, mx_el_le) +DEFBINOP_FN (eq, sparse_matrix, scalar, mx_el_eq) +DEFBINOP_FN (ge, sparse_matrix, scalar, mx_el_ge) +DEFBINOP_FN (gt, sparse_matrix, scalar, mx_el_gt) +DEFBINOP_FN (ne, sparse_matrix, scalar, mx_el_ne) + +DEFBINOP_OP (el_mul, sparse_matrix, scalar, *) + +DEFBINOP (el_div, sparse_matrix, scalar) +{ + CAST_BINOP_ARGS (const octave_sparse_matrix&, const octave_scalar&); + + double d = v2.double_value (); + octave_value retval; + + if (d == 0.0) + { + gripe_divide_by_zero (); + + retval = octave_value (v1.matrix_value () / d); + } + else + retval = octave_value (v1.sparse_matrix_value () / d); + + return retval; +} + +DEFBINOP_FN (el_pow, sparse_matrix, scalar, elem_xpow) + +DEFBINOP (el_ldiv, sparse_matrix, scalar) +{ + CAST_BINOP_ARGS (const octave_sparse_matrix&, const octave_scalar&); + + return octave_value + (x_el_div (v2.complex_value (), v1.sparse_matrix_value ())); +} + +DEFBINOP_FN (el_and, sparse_matrix, scalar, mx_el_and) +DEFBINOP_FN (el_or, sparse_matrix, scalar, mx_el_or) + +DEFCATOP (sm_s, sparse_matrix, scalar) +{ + CAST_BINOP_ARGS (octave_sparse_matrix&, const octave_scalar&); + SparseMatrix tmp (1, 1, v2.scalar_value ()); + return octave_value (v1.sparse_matrix_value (). concat (tmp, ra_idx)); +} + +DEFASSIGNOP (assign, sparse_matrix, scalar) +{ + CAST_BINOP_ARGS (octave_sparse_matrix&, const octave_scalar&); + + SparseMatrix tmp (1, 1, v2.scalar_value ()); + v1.assign (idx, tmp); + return octave_value (); +} + +void +install_sm_s_ops (void) +{ + INSTALL_BINOP (op_add, octave_sparse_matrix, octave_scalar, add); + INSTALL_BINOP (op_sub, octave_sparse_matrix, octave_scalar, sub); + INSTALL_BINOP (op_mul, octave_sparse_matrix, octave_scalar, mul); + INSTALL_BINOP (op_div, octave_sparse_matrix, octave_scalar, div); + INSTALL_BINOP (op_pow, octave_sparse_matrix, octave_scalar, pow); + INSTALL_BINOP (op_ldiv, octave_sparse_matrix, octave_scalar, ldiv); + + INSTALL_BINOP (op_lt, octave_sparse_matrix, octave_scalar, lt); + INSTALL_BINOP (op_le, octave_sparse_matrix, octave_scalar, le); + INSTALL_BINOP (op_eq, octave_sparse_matrix, octave_scalar, eq); + INSTALL_BINOP (op_ge, octave_sparse_matrix, octave_scalar, ge); + INSTALL_BINOP (op_gt, octave_sparse_matrix, octave_scalar, gt); + INSTALL_BINOP (op_ne, octave_sparse_matrix, octave_scalar, ne); + INSTALL_BINOP (op_el_mul, octave_sparse_matrix, octave_scalar, el_mul); + INSTALL_BINOP (op_el_div, octave_sparse_matrix, octave_scalar, el_div); + INSTALL_BINOP (op_el_pow, octave_sparse_matrix, octave_scalar, el_pow); + INSTALL_BINOP (op_el_ldiv, octave_sparse_matrix, octave_scalar, el_ldiv); + INSTALL_BINOP (op_el_and, octave_sparse_matrix, octave_scalar, el_and); + INSTALL_BINOP (op_el_or, octave_sparse_matrix, octave_scalar, el_or); + + INSTALL_CATOP (octave_sparse_matrix, octave_scalar, sm_s); + + INSTALL_ASSIGNOP (op_asn_eq, octave_sparse_matrix, octave_scalar, assign); +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-sm-scm.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/OPERATORS/op-sm-scm.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,140 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "gripes.h" +#include "oct-obj.h" +#include "ov.h" +#include "ov-typeinfo.h" +#include "ops.h" + +#include "sparse-xdiv.h" +#include "sparse-xpow.h" +#include "smx-sm-scm.h" +#include "smx-scm-sm.h" +#include "ov-re-sparse.h" +#include "ov-cx-sparse.h" + +// sparse matrix by sparse complex matrix ops. + +DEFBINOP_OP (add, sparse_matrix, sparse_complex_matrix, +) +DEFBINOP_OP (sub, sparse_matrix, sparse_complex_matrix, -) + +DEFBINOP_OP (mul, sparse_matrix, sparse_complex_matrix, *) + +DEFBINOP_FN (div, sparse_matrix, sparse_complex_matrix, xdiv) + +DEFBINOPX (pow, sparse_matrix, sparse_complex_matrix) +{ + error ("can't do A ^ B for A and B both matrices"); + return octave_value (); +} + +DEFBINOP_FN (ldiv, sparse_matrix, sparse_complex_matrix, xleftdiv) + +DEFBINOP_FN (lt, sparse_matrix, sparse_complex_matrix, mx_el_lt) +DEFBINOP_FN (le, sparse_matrix, sparse_complex_matrix, mx_el_le) +DEFBINOP_FN (eq, sparse_matrix, sparse_complex_matrix, mx_el_eq) +DEFBINOP_FN (ge, sparse_matrix, sparse_complex_matrix, mx_el_ge) +DEFBINOP_FN (gt, sparse_matrix, sparse_complex_matrix, mx_el_gt) +DEFBINOP_FN (ne, sparse_matrix, sparse_complex_matrix, mx_el_ne) + +DEFBINOP_FN (el_mul, sparse_matrix, sparse_complex_matrix, product) +DEFBINOP_FN (el_div, sparse_matrix, sparse_complex_matrix, quotient) +DEFBINOP_FN (el_pow, sparse_matrix, sparse_complex_matrix, elem_xpow) + +DEFBINOP (el_ldiv, sparse_matrix, sparse_complex_matrix) +{ + CAST_BINOP_ARGS (const octave_sparse_matrix&, + const octave_sparse_complex_matrix&); + + return octave_value + (quotient (v2.sparse_complex_matrix_value (), v1.sparse_matrix_value ())); +} + +DEFBINOP_FN (el_and, sparse_matrix, sparse_complex_matrix, mx_el_and) +DEFBINOP_FN (el_or, sparse_matrix, sparse_complex_matrix, mx_el_or) + +DEFCATOP_FN (sm_scm, sparse_matrix, sparse_complex_matrix, concat) + +DEFCONV (sparse_complex_matrix_conv, sparse_matrix, sparse_complex_matrix) +{ + CAST_CONV_ARG (const octave_sparse_matrix&); + return new octave_sparse_complex_matrix (v.sparse_complex_matrix_value ()); +} + +void +install_sm_scm_ops (void) +{ + INSTALL_BINOP (op_add, octave_sparse_matrix, octave_sparse_complex_matrix, + add); + INSTALL_BINOP (op_sub, octave_sparse_matrix, octave_sparse_complex_matrix, + sub); + INSTALL_BINOP (op_mul, octave_sparse_matrix, octave_sparse_complex_matrix, + mul); + INSTALL_BINOP (op_div, octave_sparse_matrix, octave_sparse_complex_matrix, + div); + INSTALL_BINOP (op_pow, octave_sparse_matrix, octave_sparse_complex_matrix, + pow); + INSTALL_BINOP (op_ldiv, octave_sparse_matrix, octave_sparse_complex_matrix, + ldiv); + INSTALL_BINOP (op_lt, octave_sparse_matrix, octave_sparse_complex_matrix, + lt); + INSTALL_BINOP (op_le, octave_sparse_matrix, octave_sparse_complex_matrix, + le); + INSTALL_BINOP (op_eq, octave_sparse_matrix, octave_sparse_complex_matrix, + eq); + INSTALL_BINOP (op_ge, octave_sparse_matrix, octave_sparse_complex_matrix, + ge); + INSTALL_BINOP (op_gt, octave_sparse_matrix, octave_sparse_complex_matrix, + gt); + INSTALL_BINOP (op_ne, octave_sparse_matrix, octave_sparse_complex_matrix, + ne); + INSTALL_BINOP (op_el_mul, octave_sparse_matrix, + octave_sparse_complex_matrix, el_mul); + INSTALL_BINOP (op_el_div, octave_sparse_matrix, + octave_sparse_complex_matrix, el_div); + INSTALL_BINOP (op_el_pow, octave_sparse_matrix, + octave_sparse_complex_matrix, el_pow); + INSTALL_BINOP (op_el_ldiv, octave_sparse_matrix, + octave_sparse_complex_matrix, el_ldiv); + INSTALL_BINOP (op_el_and, octave_sparse_matrix, + octave_sparse_complex_matrix, el_and); + INSTALL_BINOP (op_el_or, octave_sparse_matrix, + octave_sparse_complex_matrix, el_or); + + INSTALL_CATOP (octave_sparse_matrix, octave_sparse_complex_matrix, sm_scm); + + INSTALL_ASSIGNCONV (octave_sparse_matrix, octave_sparse_complex_matrix, + octave_sparse_complex_matrix); + + INSTALL_WIDENOP (octave_sparse_matrix, octave_sparse_complex_matrix, + sparse_complex_matrix_conv); +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-sm-sm.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/OPERATORS/op-sm-sm.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,135 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "gripes.h" +#include "oct-obj.h" +#include "ov.h" +#include "ov-typeinfo.h" +#include "ov-re-mat.h" +#include "ops.h" + +#include "sparse-xpow.h" +#include "sparse-xdiv.h" +#include "ov-re-sparse.h" + +// sparse matrix unary ops. + +DEFUNOP_OP (not, sparse_matrix, !) +DEFUNOP_OP (uplus, sparse_matrix, /* no-op */) +DEFUNOP_OP (uminus, sparse_matrix, -) + +DEFUNOP (transpose, sparse_matrix) +{ + CAST_UNOP_ARG (const octave_sparse_matrix&); + return octave_value (v.sparse_matrix_value().transpose ()); +} + +// sparse matrix by sparse matrix ops. + +DEFBINOP_OP (add, sparse_matrix, sparse_matrix, +) +DEFBINOP_OP (sub, sparse_matrix, sparse_matrix, -) +DEFBINOP_OP (mul, sparse_matrix, sparse_matrix, *) + +DEFBINOP_FN (div, sparse_matrix, sparse_matrix, xdiv) + +DEFBINOPX (pow, sparse_matrix, sparse_matrix) +{ + error ("can't do A ^ B for A and B both matrices"); + return octave_value (); +} + +DEFBINOP_FN (ldiv, sparse_matrix, sparse_matrix, xleftdiv) + +DEFBINOP_FN (lt, sparse_matrix, sparse_matrix, mx_el_lt) +DEFBINOP_FN (le, sparse_matrix, sparse_matrix, mx_el_le) +DEFBINOP_FN (eq, sparse_matrix, sparse_matrix, mx_el_eq) +DEFBINOP_FN (ge, sparse_matrix, sparse_matrix, mx_el_ge) +DEFBINOP_FN (gt, sparse_matrix, sparse_matrix, mx_el_gt) +DEFBINOP_FN (ne, sparse_matrix, sparse_matrix, mx_el_ne) + +DEFBINOP_FN (el_mul, sparse_matrix, sparse_matrix, product) +DEFBINOP_FN (el_div, sparse_matrix, sparse_matrix, quotient) + +DEFBINOP_FN (el_pow, sparse_matrix, sparse_matrix, elem_xpow) + +DEFBINOP (el_ldiv, sparse_matrix, sparse_matrix) +{ + CAST_BINOP_ARGS (const octave_sparse_matrix&, const octave_sparse_matrix&); + return octave_value + (quotient (v2.sparse_matrix_value (), v1.sparse_matrix_value ())); +} + +DEFBINOP_FN (el_and, sparse_matrix, sparse_matrix, mx_el_and) +DEFBINOP_FN (el_or, sparse_matrix, sparse_matrix, mx_el_or) + +DEFCATOP_FN (sm_sm, sparse_matrix, sparse_matrix, concat) + +DEFASSIGNOP_FN (assign, sparse_matrix, sparse_matrix, assign) + +void +install_sm_sm_ops (void) +{ + INSTALL_UNOP (op_not, octave_sparse_matrix, not); + INSTALL_UNOP (op_uplus, octave_sparse_matrix, uplus); + INSTALL_UNOP (op_uminus, octave_sparse_matrix, uminus); + INSTALL_UNOP (op_transpose, octave_sparse_matrix, transpose); + INSTALL_UNOP (op_hermitian, octave_sparse_matrix, transpose); + + INSTALL_BINOP (op_add, octave_sparse_matrix, octave_sparse_matrix, add); + INSTALL_BINOP (op_sub, octave_sparse_matrix, octave_sparse_matrix, sub); + INSTALL_BINOP (op_mul, octave_sparse_matrix, octave_sparse_matrix, mul); + INSTALL_BINOP (op_div, octave_sparse_matrix, octave_sparse_matrix, div); + INSTALL_BINOP (op_pow, octave_sparse_matrix, octave_sparse_matrix, pow); + INSTALL_BINOP (op_ldiv, octave_sparse_matrix, octave_sparse_matrix, ldiv); + INSTALL_BINOP (op_lt, octave_sparse_matrix, octave_sparse_matrix, lt); + INSTALL_BINOP (op_le, octave_sparse_matrix, octave_sparse_matrix, le); + INSTALL_BINOP (op_eq, octave_sparse_matrix, octave_sparse_matrix, eq); + INSTALL_BINOP (op_ge, octave_sparse_matrix, octave_sparse_matrix, ge); + INSTALL_BINOP (op_gt, octave_sparse_matrix, octave_sparse_matrix, gt); + INSTALL_BINOP (op_ne, octave_sparse_matrix, octave_sparse_matrix, ne); + INSTALL_BINOP (op_el_mul, octave_sparse_matrix, octave_sparse_matrix, + el_mul); + INSTALL_BINOP (op_el_div, octave_sparse_matrix, octave_sparse_matrix, + el_div); + INSTALL_BINOP (op_el_pow, octave_sparse_matrix, octave_sparse_matrix, + el_pow); + INSTALL_BINOP (op_el_ldiv, octave_sparse_matrix, octave_sparse_matrix, + el_ldiv); + INSTALL_BINOP (op_el_and, octave_sparse_matrix, octave_sparse_matrix, + el_and); + INSTALL_BINOP (op_el_or, octave_sparse_matrix, octave_sparse_matrix, + el_or); + + INSTALL_CATOP (octave_sparse_matrix, octave_sparse_matrix, sm_sm); + + INSTALL_ASSIGNOP (op_asn_eq, octave_sparse_matrix, octave_sparse_matrix, + assign); +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-str-m.cc --- a/src/OPERATORS/op-str-m.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-str-m.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-str-s.cc --- a/src/OPERATORS/op-str-s.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-str-s.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-str-str.cc --- a/src/OPERATORS/op-str-str.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-str-str.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-struct.cc --- a/src/OPERATORS/op-struct.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-struct.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-ui16-ui16.cc --- a/src/OPERATORS/op-ui16-ui16.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-ui16-ui16.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-ui32-ui32.cc --- a/src/OPERATORS/op-ui32-ui32.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-ui32-ui32.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-ui64-ui64.cc --- a/src/OPERATORS/op-ui64-ui64.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-ui64-ui64.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/OPERATORS/op-ui8-ui8.cc --- a/src/OPERATORS/op-ui8-ui8.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/OPERATORS/op-ui8-ui8.cc Fri Feb 25 19:55:28 2005 +0000 @@ -20,10 +20,6 @@ */ -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma implementation -#endif - #ifdef HAVE_CONFIG_H #include #endif diff -r 9f3299378193 -r 57077d0ddc8e src/data.cc --- a/src/data.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/data.cc Fri Feb 25 19:55:28 2005 +0000 @@ -537,7 +537,7 @@ else { ColumnVector v = m.diag (); - if (v.capacity () > 0) + if (v.numel () > 0) retval = v; } } @@ -560,7 +560,7 @@ else { ComplexColumnVector v = cm.diag (); - if (v.capacity () > 0) + if (v.numel () > 0) retval = v; } } @@ -729,16 +729,26 @@ octave_value tmp; bool any_strings = false; bool all_strings = true; + bool first_non_empty_arg = true; for (int i = 1; i < n_args; i++) - if (args(i).is_string ()) - any_strings = true; - else - all_strings = false; - + if (! args (i).all_zero_dims ()) + { + if (first_non_empty_arg) + { + first_non_empty_arg = false; + tmp = args (i); + } + + if (args(i).is_string ()) + any_strings = true; + else + all_strings = false; + } + if (all_strings) tmp = octave_value (charNDArray (dv, Vstring_fill_char), true); else - tmp = args(1).resize (dim_vector (0,0)).resize (dv); + tmp = tmp.resize (dim_vector (0,0)).resize (dv); if (error_state) return retval; diff -r 9f3299378193 -r 57077d0ddc8e src/ls-mat5.cc --- a/src/ls-mat5.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/ls-mat5.cc Fri Feb 25 19:55:28 2005 +0000 @@ -164,7 +164,7 @@ template void -read_mat5_integer_data (std::istream& is, T &m, int count, bool swap, +read_mat5_integer_data (std::istream& is, T *m, int count, bool swap, mat5_data_type type) { @@ -188,33 +188,27 @@ switch (type) { case miINT8: - READ_INTEGER_DATA (signed char, swap, m.fortran_vec (), 1, - count, is); + READ_INTEGER_DATA (signed char, swap, m, 1, count, is); break; case miUINT8: - READ_INTEGER_DATA (unsigned char, swap, m.fortran_vec (), 1, - count, is); + READ_INTEGER_DATA (unsigned char, swap, m, 1, count, is); break; case miINT16: - READ_INTEGER_DATA (signed TWO_BYTE_INT, swap, m.fortran_vec (), 2, - count, is); + READ_INTEGER_DATA (signed TWO_BYTE_INT, swap, m, 2, count, is); break; case miUINT16: - READ_INTEGER_DATA (unsigned TWO_BYTE_INT, swap, m.fortran_vec (), 2, - count, is); + READ_INTEGER_DATA (unsigned TWO_BYTE_INT, swap, m, 2, count, is); break; case miINT32: - READ_INTEGER_DATA (signed FOUR_BYTE_INT, swap, m.fortran_vec (), 4, - count, is); + READ_INTEGER_DATA (signed FOUR_BYTE_INT, swap, m, 4, count, is); break; case miUINT32: - READ_INTEGER_DATA (unsigned FOUR_BYTE_INT, swap, m.fortran_vec (), 4, - count, is); + READ_INTEGER_DATA (unsigned FOUR_BYTE_INT, swap, m, 4, count, is); break; case miSINGLE: @@ -226,15 +220,13 @@ case miINT64: #ifdef EIGHT_BYTE_INT - READ_INTEGER_DATA (signed EIGHT_BYTE_INT, swap, m.fortran_vec (), 8, - count, is); + READ_INTEGER_DATA (signed EIGHT_BYTE_INT, swap, m, 8, count, is); #endif break; case miUINT64: #ifdef EIGHT_BYTE_INT - READ_INTEGER_DATA (unsigned EIGHT_BYTE_INT, swap, m.fortran_vec (), 8, - count, is); + READ_INTEGER_DATA (unsigned EIGHT_BYTE_INT, swap, m, 8, count, is); #endif break; @@ -247,28 +239,32 @@ } -template void read_mat5_integer_data (std::istream& is, int8NDArray &m, +template void read_mat5_integer_data (std::istream& is, octave_int8 *m, int count, bool swap, mat5_data_type type); -template void read_mat5_integer_data (std::istream& is, int16NDArray &m, +template void read_mat5_integer_data (std::istream& is, octave_int16 *m, int count, bool swap, mat5_data_type type); -template void read_mat5_integer_data (std::istream& is, int32NDArray &m, +template void read_mat5_integer_data (std::istream& is, octave_int32 *m, + int count, bool swap, + mat5_data_type type); +template void read_mat5_integer_data (std::istream& is, octave_int64 *m, int count, bool swap, mat5_data_type type); -template void read_mat5_integer_data (std::istream& is, int64NDArray &m, +template void read_mat5_integer_data (std::istream& is, octave_uint8 *m, int count, bool swap, mat5_data_type type); -template void read_mat5_integer_data (std::istream& is, uint8NDArray &m, +template void read_mat5_integer_data (std::istream& is, octave_uint16 *m, int count, bool swap, mat5_data_type type); -template void read_mat5_integer_data (std::istream& is, uint16NDArray &m, +template void read_mat5_integer_data (std::istream& is, octave_uint32 *m, int count, bool swap, mat5_data_type type); -template void read_mat5_integer_data (std::istream& is, uint32NDArray &m, +template void read_mat5_integer_data (std::istream& is, octave_uint64 *m, int count, bool swap, mat5_data_type type); -template void read_mat5_integer_data (std::istream& is, uint64NDArray &m, + +template void read_mat5_integer_data (std::istream& is, int *m, int count, bool swap, mat5_data_type type); @@ -286,7 +282,7 @@ \ int n = re.length (); \ tmp_pos = is.tellg (); \ - read_mat5_integer_data (is, re, n, swap, \ + read_mat5_integer_data (is, re.fortran_vec (), n, swap, \ (enum mat5_data_type) type); \ \ if (! is || error_state) \ @@ -401,7 +397,7 @@ bool imag; bool logicalvar; enum arrayclasstype arrayclass; - FOUR_BYTE_INT junk; + FOUR_BYTE_INT nnz; FOUR_BYTE_INT flags; dim_vector dims; int len; @@ -448,7 +444,7 @@ global = (flags & 0x0400) != 0; // global variable? logicalvar = (flags & 0x0200) != 0; // we don't use this yet arrayclass = (arrayclasstype)(flags & 0xff); - read_int (is, swap, junk); // an "undefined" entry + read_int (is, swap, nnz); // number of non-zero in sparse // dimensions array subelement { @@ -531,8 +527,124 @@ goto skip_ahead; case mxSPARSE_CLASS: - warning ("load: sparse arrays are not implemented"); - goto skip_ahead; + { + int nr = dims(0); + int nc = dims(1); + SparseMatrix sm; + SparseComplexMatrix scm; + NDArray re; + int *ridx; + int *cidx; + double *data; + + // Setup return value + if (imag) + { + scm = SparseComplexMatrix (nr, nc, nnz); + ridx = scm.ridx (); + cidx = scm.cidx (); + re = NDArray (dim_vector (static_cast (nnz))); + data = re.fortran_vec (); + } + else + { + sm = SparseMatrix (nr, nc, nnz); + ridx = sm.ridx (); + cidx = sm.cidx (); + data = sm.data (); + } + + // row indices + std::streampos tmp_pos; + + if (read_mat5_tag (is, swap, type, len)) + { + error ("load: reading sparse row data for `%s'", retval.c_str ()); + goto data_read_error; + } + + tmp_pos = is.tellg (); + + read_mat5_integer_data (is, ridx, nnz, swap, + (enum mat5_data_type) type); + + if (! is || error_state) + { + error ("load: reading sparse row data for `%s'", retval.c_str ()); + goto data_read_error; + } + + is.seekg (tmp_pos + static_cast (PAD (len))); + + // col indices + if (read_mat5_tag (is, swap, type, len)) + { + error ("load: reading sparse column data for `%s'", retval.c_str ()); + goto data_read_error; + } + + tmp_pos = is.tellg (); + + read_mat5_integer_data (is, cidx, nc + 1, swap, + (enum mat5_data_type) type); + + if (! is || error_state) + { + error ("load: reading sparse column data for `%s'", retval.c_str ()); + goto data_read_error; + } + + is.seekg (tmp_pos + static_cast (PAD (len))); + + // real data subelement + if (read_mat5_tag (is, swap, type, len)) + { + error ("load: reading sparse matrix data for `%s'", retval.c_str ()); + goto data_read_error; + } + + tmp_pos = is.tellg (); + read_mat5_binary_data (is, data, nnz, swap, + (enum mat5_data_type) type, flt_fmt); + + if (! is || error_state) + { + error ("load: reading sparse matrix data for `%s'", retval.c_str ()); + goto data_read_error; + } + + is.seekg (tmp_pos + static_cast (PAD (len))); + + // imaginary data subelement + if (imag) + { + NDArray im (dim_vector (static_cast (nnz))); + + if (read_mat5_tag (is, swap, type, len)) + { + error ("load: reading sparse matrix data for `%s'", retval.c_str ()); + goto data_read_error; + } + + read_mat5_binary_data (is, im.fortran_vec (), nnz, swap, + (enum mat5_data_type) type, flt_fmt); + + if (! is || error_state) + { + error ("load: reading imaginary sparse matrix data for `%s'", + retval.c_str ()); + goto data_read_error; + } + + for (int i = 0; i < nnz; i++) + scm.xdata (i) = Complex (re (i), im (i)); + + tc = scm; + } + else + tc = sm; + } + break; case mxFUNCTION_CLASS: warning ("load: function handles are not implemented"); @@ -913,9 +1025,8 @@ template void -write_mat5_integer_data (std::ostream& os, const T& m, int size) +write_mat5_integer_data (std::ostream& os, const T *m, int size, int nel) { - int nel = m.nelem (); mat5_data_type mst; unsigned len; @@ -927,10 +1038,10 @@ case 2: mst = miUINT16; break; - case 3: + case 4: mst = miUINT32; break; - case 4: + case 8: mst = miUINT64; break; case -1: @@ -941,11 +1052,11 @@ mst = miINT16; size = - size; break; - case -3: + case -4: mst = miINT32; size = - size; break; - case -4: + case -8: default: mst = miINT64; size = - size; @@ -955,7 +1066,7 @@ len = nel*size; write_mat5_tag (os, mst, len); - os.write (X_CAST(char *, m.data ()), len); + os.write (X_CAST(char *, m), len); if (PAD (len) > len) { @@ -964,22 +1075,24 @@ } } -template void write_mat5_integer_data (std::ostream& os, - const int8NDArray &m, int size); -template void write_mat5_integer_data (std::ostream& os, - const int16NDArray &m, int size); -template void write_mat5_integer_data (std::ostream& os, - const int32NDArray &m, int size); -template void write_mat5_integer_data (std::ostream& os, - const int64NDArray &m, int size); -template void write_mat5_integer_data (std::ostream& os, - const uint8NDArray &m, int size); -template void write_mat5_integer_data (std::ostream& os, - const uint16NDArray &m, int size); -template void write_mat5_integer_data (std::ostream& os, - const uint32NDArray &m, int size); -template void write_mat5_integer_data (std::ostream& os, - const uint64NDArray &m, int size); +template void write_mat5_integer_data (std::ostream& os, const octave_int8 *m, + int size, int nel); +template void write_mat5_integer_data (std::ostream& os, const octave_int16 *m, + int size, int nel); +template void write_mat5_integer_data (std::ostream& os, const octave_int32 *m, + int size, int nel); +template void write_mat5_integer_data (std::ostream& os, const octave_int64 *m, + int size, int nel); +template void write_mat5_integer_data (std::ostream& os, const octave_uint8 *m, + int size, int nel); +template void write_mat5_integer_data (std::ostream& os, const octave_uint16 *m, + int size, int nel); +template void write_mat5_integer_data (std::ostream& os, const octave_uint32 *m, + int size, int nel); +template void write_mat5_integer_data (std::ostream& os, const octave_uint64 *m, + int size, int nel); +template void write_mat5_integer_data (std::ostream& os, const int *m, + int size, int nel); // Write out cell element values in the cell array to OS, preceded by // the appropriate tag. @@ -1011,7 +1124,7 @@ bool mark_as_global, bool save_as_floats) { FOUR_BYTE_INT flags=0; - FOUR_BYTE_INT junk=0; + FOUR_BYTE_INT nnz=0; std::streampos fixup, contin; std::string cname = tc.class_name (); @@ -1046,6 +1159,20 @@ flags |= mxUINT32_CLASS; else if (cname == "uint64") flags |= mxUINT64_CLASS; + else if (cname == "sparse") + { + flags |= mxSPARSE_CLASS; + if (tc.is_complex_type ()) + { + SparseComplexMatrix scm = tc.sparse_complex_matrix_value (); + nnz = scm.nnz (); + } + else + { + SparseMatrix sm = tc.sparse_matrix_value (); + nnz = sm.nnz (); + } + } else if (tc.is_real_scalar ()) flags |= mxDOUBLE_CLASS; else if (tc.is_real_matrix () || tc.is_range ()) @@ -1065,7 +1192,7 @@ } os.write ((char *)&flags, 4); - os.write ((char *)&junk, 4); + os.write ((char *)&nnz, 4); { dim_vector dv = tc.dims (); @@ -1128,53 +1255,93 @@ if (paddedlength > len) os.write ((char *)buf, paddedlength - len); } + else if (cname == "sparse") + { + if (tc.is_complex_type ()) + { + SparseComplexMatrix m = tc.sparse_complex_matrix_value (); + int nc = m.cols (); + + write_mat5_integer_data (os, m.ridx (), - sizeof(int), nnz); + write_mat5_integer_data (os, m.cidx (), - sizeof(int), nc + 1); + + NDArray buf (dim_vector (nnz, 1)); + + for (int i = 0; i < nnz; i++) + buf (i) = ::real (m.data (i)); + + write_mat5_array (os, buf, save_as_floats); + + for (int i = 0; i < nnz; i++) + buf (i) = ::imag (m.data (i)); + + write_mat5_array (os, buf, save_as_floats); + } + else + { + SparseMatrix m = tc.sparse_matrix_value (); + int nc = m.cols (); + + write_mat5_integer_data (os, m.ridx (), - sizeof(int), nnz); + write_mat5_integer_data (os, m.cidx (), - sizeof(int), nc + 1); + + // XXX FIXME XXX + // Is there a way to easily do without this buffer + NDArray buf (dim_vector (nnz, 1)); + + for (int i = 0; i < nnz; i++) + buf (i) = m.data (i); + + write_mat5_array (os, buf, save_as_floats); + } + } else if (cname == "int8") { int8NDArray m = tc.int8_array_value (); - write_mat5_integer_data (os, m, -1); + write_mat5_integer_data (os, m.fortran_vec (), -1, m.nelem ()); } else if (cname == "int16") { int16NDArray m = tc.int16_array_value (); - write_mat5_integer_data (os, m, -2); + write_mat5_integer_data (os, m.fortran_vec (), -2, m.nelem ()); } else if (cname == "int32") { int32NDArray m = tc.int32_array_value (); - write_mat5_integer_data (os, m, -4); + write_mat5_integer_data (os, m.fortran_vec (), -4, m.nelem ()); } else if (cname == "int64") { int64NDArray m = tc.int64_array_value (); - write_mat5_integer_data (os, m, -8); + write_mat5_integer_data (os, m.fortran_vec (), -8, m.nelem ()); } else if (cname == "uint8") { uint8NDArray m = tc.uint8_array_value (); - write_mat5_integer_data (os, m, 1); + write_mat5_integer_data (os, m.fortran_vec (), 1, m.nelem ()); } else if (cname == "uint16") { uint16NDArray m = tc.uint16_array_value (); - write_mat5_integer_data (os, m, 2); + write_mat5_integer_data (os, m.fortran_vec (), 2, m.nelem ()); } else if (cname == "uint32") { uint32NDArray m = tc.uint32_array_value (); - write_mat5_integer_data (os, m, 4); + write_mat5_integer_data (os, m.fortran_vec (), 4, m.nelem ()); } else if (cname == "uint64") { uint64NDArray m = tc.uint64_array_value (); - write_mat5_integer_data (os, m, 8); + write_mat5_integer_data (os, m.fortran_vec (), 8, m.nelem ()); } else if (tc.is_real_scalar () || tc.is_real_matrix () || tc.is_range ()) { diff -r 9f3299378193 -r 57077d0ddc8e src/oct.h --- a/src/oct.h Fri Feb 25 17:42:55 2005 +0000 +++ b/src/oct.h Fri Feb 25 19:55:28 2005 +0000 @@ -28,18 +28,18 @@ // config.h needs to be first because it includes #defines that can */ // affect other header files. -#include +#include "config.h" -#include +#include "Matrix.h" -#include -#include -#include -#include -#include -#include -#include -#include +#include "defun-dld.h" +#include "error.h" +#include "gripes.h" +#include "help.h" +#include "oct-obj.h" +#include "pager.h" +#include "utils.h" +#include "variables.h" #endif diff -r 9f3299378193 -r 57077d0ddc8e src/ov-base-sparse.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/ov-base-sparse.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,327 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "oct-obj.h" +#include "ov-base.h" +#include "quit.h" +#include "pr-output.h" + +#include "byte-swap.h" +#include "ls-oct-ascii.h" +#include "ls-utils.h" +#if defined (HAVE_HDF5) +#include "ls-hdf5.h" +#endif + +#include "boolSparse.h" +#include "ov-base-sparse.h" + +template +octave_value +octave_base_sparse::do_index_op (const octave_value_list& idx, + int resize_ok) +{ + octave_value retval; + + int n_idx = idx.length (); + + int nd = matrix.ndims (); + + switch (n_idx) + { + case 0: + error ("invalid number of indices (= 0) for %d-dimensional array", nd); + break; + + case 1: + { + idx_vector i = idx (0).index_vector (); + + if (! error_state) + retval = octave_value (matrix.index (i, resize_ok)); + } + break; + + default: + { + if (n_idx == 2 && nd == 2) + { + idx_vector i = idx (0).index_vector (); + + if (! error_state) + { + idx_vector j = idx (1).index_vector (); + + if (! error_state) + retval = octave_value (matrix.index (i, j, resize_ok)); + } + } + else + { + Array idx_vec (n_idx); + + for (int i = 0; i < n_idx; i++) + { + idx_vec(i) = idx(i).index_vector (); + + if (error_state) + break; + } + + if (! error_state) + retval = octave_value (matrix.index (idx_vec, resize_ok)); + } + } + break; + } + + return retval; +} + +template +octave_value +octave_base_sparse::subsref (const std::string& type, + const std::list& idx) +{ + octave_value retval; + + switch (type[0]) + { + case '(': + retval = do_index_op (idx.front ()); + break; + + case '{': + case '.': + { + std::string nm = type_name (); + error ("%s cannot be indexed with %c", nm.c_str (), type[0]); + } + break; + + default: + panic_impossible (); + } + + return retval.next_subsref (type, idx); +} + +template +octave_value +octave_base_sparse::subsasgn (const std::string& type, + const std::list& idx, + const octave_value& rhs) +{ + octave_value retval; + + switch (type[0]) + { + case '(': + { + if (type.length () == 1) + retval = numeric_assign (type, idx, rhs); + else + { + std::string nm = type_name (); + error ("in indexed assignment of %s, last lhs index must be ()", + nm.c_str ()); + } + } + break; + + case '{': + case '.': + { + if (is_empty ()) + { + octave_value tmp = octave_value::empty_conv (type, rhs); + + retval = tmp.subsasgn (type, idx, rhs); + } + else + { + std::string nm = type_name (); + error ("%s cannot be indexed with %c", nm.c_str (), type[0]); + } + } + break; + + default: + panic_impossible (); + } + + return retval; +} + +template +void +octave_base_sparse::assign (const octave_value_list& idx, const T& rhs) +{ + int len = idx.length (); + + for (int i = 0; i < len; i++) + matrix.set_index (idx(i).index_vector ()); + + ::assign (matrix, rhs); +} + + +template +bool +octave_base_sparse::is_true (void) const +{ + bool retval = false; + dim_vector dv = matrix.dims (); + int nel = dv.numel (); + int nz = nnz (); + + if (nz == nel && nel > 0) + { + T t1 (matrix.reshape (dim_vector (nel, 1))); + + SparseBoolMatrix t2 = t1.all (); + + retval = t2(0); + } + + return retval; +} + +template +bool +octave_base_sparse::print_as_scalar (void) const +{ + dim_vector dv = dims (); + + return (dv.all_ones () || dv.any_zero ()); +} + +template +void +octave_base_sparse::print (std::ostream& os, bool pr_as_read_syntax) const +{ + print_raw (os, pr_as_read_syntax); + newline (os); +} + +template +void +octave_base_sparse::print_info (std::ostream& os, + const std::string& prefix) const +{ + matrix.print_info (os, prefix); +} + +template +void +octave_base_sparse::print_raw (std::ostream& os, + bool pr_as_read_syntax) const +{ + int nr = matrix.rows (); + int nc = matrix.cols (); + int nz = nonzero (); + + os << "Compressed Column Sparse (rows=" << nr << + ", cols=" << nc << + ", nnz=" << nz << ")"; + + // add one to the printed indices to go from + // zero-based to one-based arrays + + if (nz != 0) + { + for (int j = 0; j < nc; j++) + { + OCTAVE_QUIT; + for (int i = matrix.cidx(j); i < matrix.cidx(j+1); i++) + { + os << "\n"; + os << " (" << matrix.ridx(i)+1 << + " , " << j+1 << ") -> "; + octave_print_internal( os, matrix.data(i), pr_as_read_syntax); + } + } + } +} + +template +bool +octave_base_sparse::save_ascii (std::ostream& os, bool&, bool) +{ + dim_vector dv = this->dims (); + + // Ensure that additional memory is deallocated + matrix.maybe_compress (); + + os << "# nnz: " << nnz () << "\n"; + os << "# rows: " << dv (0) << "\n"; + os << "# columns: " << dv (1) << "\n"; + + os << this->matrix; + + return true; +} + +template +bool +octave_base_sparse::load_ascii (std::istream& is) +{ + int nz = 0; + int nr = 0; + int nc = 0; + bool success = true; + + if (extract_keyword (is, "nnz", nz, true) && + extract_keyword (is, "rows", nr, true) && + extract_keyword (is, "columns", nc, true)) + { + T tmp (nr, nc, nz); + + is >> tmp; + + if (!is) + { + error ("load: failed to load matrix constant"); + success = false; + } + + matrix = tmp; + } + else + { + error ("load: failed to extract number of rows and columns"); + success = false; + } + + return success; +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/ov-base-sparse.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/ov-base-sparse.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,157 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#if !defined (octave_base_sparse_h) +#define octave_base_sparse_h 1 + +#include + +#include +#include + +#include "str-vec.h" + +#include "error.h" +#include "oct-obj.h" +#include "ov-base.h" +#include "ov-typeinfo.h" + +#include "boolSparse.h" +#include "SparseType.h" + +class Octave_map; + +class tree_walker; + +class octave_sparse_bool_matrix; + +template +class +octave_base_sparse : public octave_base_value +{ + public: + + octave_base_sparse (void) : octave_base_value (), typ (SparseType ()) { } + + octave_base_sparse (const T& a) : octave_base_value (), matrix (a), + typ (SparseType ()) + { + if (matrix.ndims () == 0) + matrix.resize (dim_vector (0, 0)); + } + + octave_base_sparse (const T& a, const SparseType& t) : octave_base_value (), + matrix (a), typ (t) + { + if (matrix.ndims () == 0) + matrix.resize (dim_vector (0, 0)); + } + + octave_base_sparse (const octave_base_sparse& a) : + octave_base_value (), matrix (a.matrix), typ (a.typ) { } + + ~octave_base_sparse (void) { } + + octave_value *clone (void) const { return new octave_base_sparse (*this); } + octave_value *empty_clone (void) const + { return new octave_base_sparse (); } + + int nnz (void) const { return matrix.nnz (); } + int nonzero (void) const { return matrix.nonzero (); } + + size_t byte_size (void) const { return matrix.byte_size (); } + + octave_value squeeze (void) const { return matrix.squeeze (); } + + octave_value subsref (const std::string& type, + const std::list& idx); + + octave_value_list subsref (const std::string&, + const std::list&, int) + { + panic_impossible (); + return octave_value_list (); + } + + octave_value subsasgn (const std::string& type, + const std::list& idx, + const octave_value& rhs); + + void assign (const octave_value_list& idx, const T& rhs); + + dim_vector dims (void) const { return matrix.dims (); } + + octave_value do_index_op (const octave_value_list& idx, int resize_ok); + + octave_value do_index_op (const octave_value_list& idx) + { return do_index_op (idx, 0); } + + octave_value reshape (const dim_vector& new_dims) const + { return T (matrix.reshape (new_dims)); } + + octave_value permute (const Array& vec, bool inv = false) const + { return T (matrix.permute (vec, inv)); } + + octave_value resize (const dim_vector& dv) const + { T retval (matrix); retval.resize (dv); return retval; } + + octave_value all (int dim = 0) const { return matrix.all (dim); } + octave_value any (int dim = 0) const { return matrix.any (dim); } + + bool is_matrix_type (void) const { return true; } + + bool is_numeric_type (void) const { return true; } + + bool is_defined (void) const { return true; } + + bool is_constant (void) const { return true; } + + bool is_true (void) const; + + int capacity (void) const { return matrix.capacity (); } + + bool print_as_scalar (void) const; + + void print (std::ostream& os, bool pr_as_read_syntax = false) const; + + void print_info (std::ostream& os, const std::string& prefix) const; + + void print_raw (std::ostream& os, bool pr_as_read_syntax = false) const; + + bool save_ascii (std::ostream& os, bool& infnan_warned, + bool strip_nan_and_inf); + + bool load_ascii (std::istream& is); + +protected: + + T matrix; + + SparseType typ; +}; + +#endif + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/ov-base.cc --- a/src/ov-base.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/ov-base.cc Fri Feb 25 19:55:28 2005 +0000 @@ -413,6 +413,30 @@ return retval; } +SparseMatrix +octave_base_value::sparse_matrix_value (bool) const +{ + SparseMatrix retval; + gripe_wrong_type_arg ("octave_base_value::sparse_matrix_value()", type_name ()); + return retval; +} + +SparseComplexMatrix +octave_base_value::sparse_complex_matrix_value (bool) const +{ + SparseComplexMatrix retval; + gripe_wrong_type_arg ("octave_base_value::sparse_complex_matrix_value()", type_name ()); + return retval; +} + +SparseBoolMatrix +octave_base_value::sparse_bool_matrix_value (bool) const +{ + SparseBoolMatrix retval; + gripe_wrong_type_arg ("octave_base_value::sparse_bool_matrix_value()", type_name ()); + return retval; +} + octave_int8 octave_base_value::int8_scalar_value (void) const { diff -r 9f3299378193 -r 57077d0ddc8e src/ov-base.h --- a/src/ov-base.h Fri Feb 25 17:42:55 2005 +0000 +++ b/src/ov-base.h Fri Feb 25 19:55:28 2005 +0000 @@ -94,6 +94,8 @@ int numel (void) const { return dims ().numel (); } + int capacity (void) const { return numel (); } + size_t byte_size (void) const { return 0; } octave_value reshape (const dim_vector&) const; @@ -218,6 +220,12 @@ charNDArray char_array_value (bool = false) const; + SparseMatrix sparse_matrix_value (bool = false) const; + + SparseComplexMatrix sparse_complex_matrix_value (bool = false) const; + + SparseBoolMatrix sparse_bool_matrix_value (bool = false) const; + octave_int8 int8_scalar_value (void) const; octave_int16 int16_scalar_value (void) const; diff -r 9f3299378193 -r 57077d0ddc8e src/ov-bool-mat.h --- a/src/ov-bool-mat.h Fri Feb 25 17:42:55 2005 +0000 +++ b/src/ov-bool-mat.h Fri Feb 25 19:55:28 2005 +0000 @@ -108,6 +108,15 @@ boolNDArray bool_array_value (void) const { return matrix; } + SparseMatrix sparse_matrix_value (bool = false) const + { return SparseMatrix (Matrix (matrix.matrix_value ())); } + + SparseComplexMatrix sparse_complex_matrix_value (bool = false) const + { return SparseComplexMatrix (ComplexMatrix (matrix.matrix_value ())); } + + SparseBoolMatrix sparse_bool_matrix_value (bool = false) const + { return SparseBoolMatrix (matrix.matrix_value ()); } + octave_value convert_to_str_internal (bool pad, bool force) const; void print_raw (std::ostream& os, bool pr_as_read_syntax = false) const; diff -r 9f3299378193 -r 57077d0ddc8e src/ov-bool-sparse.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/ov-bool-sparse.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,696 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include +#include + +#include "ov-base.h" +#include "ov-scalar.h" +#include "ov-bool.h" +#include "ov-bool-mat.h" +#include "gripes.h" +#include "ops.h" + +#include "ov-re-sparse.h" +#include "ov-cx-sparse.h" +#include "ov-bool-sparse.h" + +#include "ov-base-sparse.h" +#include "ov-base-sparse.cc" + +template class octave_base_sparse; + +DEFINE_OCTAVE_ALLOCATOR (octave_sparse_bool_matrix); + +DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA (octave_sparse_bool_matrix, "sparse bool matrix", "sparse"); + +static octave_value * +default_numeric_conversion_function (const octave_value& a) +{ + CAST_CONV_ARG (const octave_sparse_bool_matrix&); + + return new octave_sparse_matrix (SparseMatrix (v.sparse_bool_matrix_value ())); +} + +type_conv_fcn +octave_sparse_bool_matrix::numeric_conversion_function (void) const +{ + return default_numeric_conversion_function; +} + +octave_value * +octave_sparse_bool_matrix::try_narrowing_conversion (void) +{ + octave_value *retval = 0; + + // Don't use numel, since it can overflow for very large matrices + // Note that for the second test, this means it becomes approximative + // since it involves a cast to double to avoid issues of overflow + if (matrix.rows () == 1 && matrix.cols () == 1) + { + // Const copy of the matrix, so the right version of () operator used + const SparseBoolMatrix tmp (matrix); + + retval = new octave_bool (tmp (0)); + } + else if (matrix.cols () > 0 && matrix.rows () > 0 && + double (matrix.byte_size ()) > double (matrix.rows ()) * + double (matrix.cols ()) * sizeof (bool)) + retval = new octave_bool_matrix (matrix.matrix_value ()); + + return retval; +} + +bool +octave_sparse_bool_matrix::valid_as_scalar_index (void) const +{ + // XXX FIXME XXX + return false; +} + +double +octave_sparse_bool_matrix::double_value (bool) const +{ + double retval = lo_ieee_nan_value (); + + if (numel () > 0) + { + // XXX FIXME XXX -- is warn_fortran_indexing the right variable here? + if (Vwarn_fortran_indexing) + gripe_implicit_conversion ("bool sparse matrix", "real scalar"); + + retval = matrix (0, 0); + } + else + gripe_invalid_conversion ("bool sparse matrix", "real scalar"); + + return retval; +} + +Complex +octave_sparse_bool_matrix::complex_value (bool) const +{ + double tmp = lo_ieee_nan_value (); + + Complex retval (tmp, tmp); + + // XXX FIXME XXX -- maybe this should be a function, valid_as_scalar() + if (rows () > 0 && columns () > 0) + { + // XXX FIXME XXX -- is warn_fortran_indexing the right variable here? + if (Vwarn_fortran_indexing) + gripe_implicit_conversion ("bool sparse matrix", "complex scalar"); + + retval = matrix (0, 0); + } + else + gripe_invalid_conversion ("bool sparse matrix", "complex scalar"); + + return retval; +} + +octave_value +octave_sparse_bool_matrix::convert_to_str_internal (bool pad, bool force) const +{ + octave_value tmp = octave_value (array_value ()); + return tmp.convert_to_str (pad, force); +} + +// XXX FIXME XXX These are inefficient ways of creating full matrices + +Matrix +octave_sparse_bool_matrix::matrix_value (bool) const +{ + return Matrix (matrix.matrix_value ()); +} + +ComplexMatrix +octave_sparse_bool_matrix::complex_matrix_value (bool) const +{ + return ComplexMatrix (matrix.matrix_value ()); +} + +ComplexNDArray +octave_sparse_bool_matrix::complex_array_value (bool) const +{ + return ComplexNDArray (ComplexMatrix (matrix.matrix_value ())); +} + +NDArray +octave_sparse_bool_matrix::array_value (bool) const +{ + return NDArray (Matrix(matrix.matrix_value ())); +} + +boolMatrix +octave_sparse_bool_matrix::bool_matrix_value (void) const +{ + return matrix.matrix_value (); +} + +boolNDArray +octave_sparse_bool_matrix::bool_array_value (void) const +{ + return boolNDArray (matrix.matrix_value ()); +} + + +SparseMatrix +octave_sparse_bool_matrix::sparse_matrix_value (void) const +{ + return SparseMatrix (this->matrix); +} + +SparseComplexMatrix +octave_sparse_bool_matrix::sparse_complex_matrix_value (void) const +{ + return SparseComplexMatrix (this->matrix); +} + +bool +octave_sparse_bool_matrix::save_binary (std::ostream& os, bool&) +{ + dim_vector d = this->dims (); + if (d.length() < 1) + return false; + + // Ensure that additional memory is deallocated + matrix.maybe_compress (); + + int nr = d(0); + int nc = d(1); + int nz = nnz (); + + FOUR_BYTE_INT itmp; + // Use negative value for ndims to be consistent with other formats + itmp= -2; + os.write (X_CAST (char *, &itmp), 4); + + itmp= nr; + os.write (X_CAST (char *, &itmp), 4); + + itmp= nc; + os.write (X_CAST (char *, &itmp), 4); + + itmp= nz; + os.write (X_CAST (char *, &itmp), 4); + + // add one to the printed indices to go from + // zero-based to one-based arrays + for (int i = 0; i < nc+1; i++) + { + OCTAVE_QUIT; + itmp = matrix.cidx(i); + os.write (X_CAST (char *, &itmp), 4); + } + + for (int i = 0; i < nz; i++) + { + OCTAVE_QUIT; + itmp = matrix.ridx(i); + os.write (X_CAST (char *, &itmp), 4); + } + + OCTAVE_LOCAL_BUFFER (char, htmp, nz); + + for (int i = 0; i < nz; i++) + htmp[i] = (matrix.data (i) ? 1 : 0); + + os.write (htmp, nz); + + return true; +} + +bool +octave_sparse_bool_matrix::load_binary (std::istream& is, bool swap, + oct_mach_info::float_format fmt) +{ + FOUR_BYTE_INT nz, nc, nr, tmp; + if (! is.read (X_CAST (char *, &tmp), 4)) + return false; + + if (swap) + swap_bytes<4> (&tmp); + + if (tmp != -2) { + error("load: only 2D sparse matrices are supported"); + return false; + } + + if (! is.read (X_CAST (char *, &nr), 4)) + return false; + if (! is.read (X_CAST (char *, &nc), 4)) + return false; + if (! is.read (X_CAST (char *, &nz), 4)) + return false; + + if (swap) + { + swap_bytes<4> (&nr); + swap_bytes<4> (&nc); + swap_bytes<4> (&nz); + } + + SparseBoolMatrix m (nr, nc, nz); + + for (int i = 0; i < nc+1; i++) + { + OCTAVE_QUIT; + if (! is.read (X_CAST (char *, &tmp), 4)) + return false; + if (swap) + swap_bytes<4> (&tmp); + m.cidx(i) = tmp; + } + + for (int i = 0; i < nz; i++) + { + OCTAVE_QUIT; + if (! is.read (X_CAST (char *, &tmp), 4)) + return false; + if (swap) + swap_bytes<4> (&tmp); + m.ridx(i) = tmp; + } + + if (error_state || ! is) + return false; + + OCTAVE_LOCAL_BUFFER (char, htmp, nz); + + if (! is.read (htmp, nz)) + return false; + + for (int i = 0; i < nz; i++) + m.data(i) = (htmp[i] ? 1 : 0); + + matrix = m; + + return true; +} + +#if defined (HAVE_HDF5) +bool +octave_sparse_bool_matrix::save_hdf5 (hid_t loc_id, const char *name, bool) +{ + dim_vector dv = dims (); + int empty = save_hdf5_empty (loc_id, name, dv); + if (empty) + return (empty > 0); + + // Ensure that additional memory is deallocated + matrix.maybe_compress (); + + hid_t group_hid = H5Gcreate (loc_id, name, 0); + if (group_hid < 0) + return false; + + hid_t space_hid = -1, data_hid = -1; + bool retval = true; + SparseBoolMatrix m = sparse_bool_matrix_value (); + int tmp; + hsize_t hdims[2]; + + space_hid = H5Screate_simple (0, hdims, (hsize_t*) 0); + if (space_hid < 0) + { + H5Gclose (group_hid); + return false; + } + + data_hid = H5Dcreate (group_hid, "nr", H5T_NATIVE_INT, space_hid, + H5P_DEFAULT); + if (data_hid < 0) + { + H5Sclose (space_hid); + H5Gclose (group_hid); + return false; + } + + tmp = m.rows (); + retval = H5Dwrite (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, + (void*) &tmp) >= 0; + H5Dclose (data_hid); + if (!retval) + { + H5Sclose (space_hid); + H5Gclose (group_hid); + return false; + } + + data_hid = H5Dcreate (group_hid, "nc", H5T_NATIVE_INT, space_hid, + H5P_DEFAULT); + if (data_hid < 0) + { + H5Sclose (space_hid); + H5Gclose (group_hid); + return false; + } + + tmp = m.cols (); + retval = H5Dwrite (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, + (void*) &tmp) >= 0; + H5Dclose (data_hid); + if (!retval) + { + H5Sclose (space_hid); + H5Gclose (group_hid); + return false; + } + + data_hid = H5Dcreate (group_hid, "nz", H5T_NATIVE_INT, space_hid, + H5P_DEFAULT); + if (data_hid < 0) + { + H5Sclose (space_hid); + H5Gclose (group_hid); + return false; + } + + tmp = m.nnz (); + retval = H5Dwrite (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, + (void*) &tmp) >= 0; + H5Dclose (data_hid); + if (!retval) + { + H5Sclose (space_hid); + H5Gclose (group_hid); + return false; + } + + H5Sclose (space_hid); + + hdims[0] = m.cols() + 1; + hdims[1] = 1; + + space_hid = H5Screate_simple (2, hdims, 0); + + if (space_hid < 0) + { + H5Gclose (group_hid); + return false; + } + + data_hid = H5Dcreate (group_hid, "cidx", H5T_NATIVE_INT, space_hid, + H5P_DEFAULT); + if (data_hid < 0) + { + H5Sclose (space_hid); + H5Gclose (group_hid); + return false; + } + + int * itmp = m.xcidx (); + retval = H5Dwrite (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, + (void*) itmp) >= 0; + H5Dclose (data_hid); + if (!retval) + { + H5Sclose (space_hid); + H5Gclose (group_hid); + return false; + } + + H5Sclose (space_hid); + + hdims[0] = m.nnz(); + hdims[1] = 1; + + space_hid = H5Screate_simple (2, hdims, 0); + + if (space_hid < 0) + { + H5Gclose (group_hid); + return false; + } + + data_hid = H5Dcreate (group_hid, "ridx", H5T_NATIVE_INT, space_hid, + H5P_DEFAULT); + if (data_hid < 0) + { + H5Sclose (space_hid); + H5Gclose (group_hid); + return false; + } + + itmp = m.xridx (); + retval = H5Dwrite (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, + (void*) itmp) >= 0; + H5Dclose (data_hid); + if (!retval) + { + H5Sclose (space_hid); + H5Gclose (group_hid); + return false; + } + + data_hid = H5Dcreate (group_hid, "data", H5T_NATIVE_HBOOL, space_hid, + H5P_DEFAULT); + if (data_hid < 0) + { + H5Sclose (space_hid); + H5Gclose (group_hid); + return false; + } + + hbool_t htmp[m.nnz ()]; + for (int i = 0; i < m.nnz (); i++) + htmp[i] = m.xdata(i); + + retval = H5Dwrite (data_hid, H5T_NATIVE_HBOOL, H5S_ALL, H5S_ALL, + H5P_DEFAULT, (void*) htmp) >= 0; + H5Dclose (data_hid); + H5Sclose (space_hid); + H5Gclose (group_hid); + + return retval; +} + +bool +octave_sparse_bool_matrix::load_hdf5 (hid_t loc_id, const char *name, + bool /* have_h5giterate_bug */) +{ + int nr, nc, nz; + hid_t group_hid, data_hid, space_hid; + hsize_t rank; + + dim_vector dv; + int empty = load_hdf5_empty (loc_id, name, dv); + if (empty > 0) + matrix.resize(dv); + if (empty) + return (empty > 0); + + group_hid = H5Gopen (loc_id, name); + if (group_hid < 0 ) return false; + + data_hid = H5Dopen (group_hid, "nr"); + space_hid = H5Dget_space (data_hid); + rank = H5Sget_simple_extent_ndims (space_hid); + + if (rank != 0) + { + H5Dclose (data_hid); + H5Gclose (group_hid); + return false; + } + + if (H5Dread (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, + H5P_DEFAULT, (void *) &nr) < 0) + { + H5Dclose (data_hid); + H5Gclose (group_hid); + return false; + } + + H5Dclose (data_hid); + + data_hid = H5Dopen (group_hid, "nc"); + space_hid = H5Dget_space (data_hid); + rank = H5Sget_simple_extent_ndims (space_hid); + + if (rank != 0) + { + H5Dclose (data_hid); + H5Gclose (group_hid); + return false; + } + + if (H5Dread (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, + H5P_DEFAULT, (void *) &nc) < 0) + { + H5Dclose (data_hid); + H5Gclose (group_hid); + return false; + } + + H5Dclose (data_hid); + + data_hid = H5Dopen (group_hid, "nz"); + space_hid = H5Dget_space (data_hid); + rank = H5Sget_simple_extent_ndims (space_hid); + + if (rank != 0) + { + H5Dclose (data_hid); + H5Gclose (group_hid); + return false; + } + + if (H5Dread (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, + H5P_DEFAULT, (void *) &nz) < 0) + { + H5Dclose (data_hid); + H5Gclose (group_hid); + return false; + } + + H5Dclose (data_hid); + + SparseBoolMatrix m (nr, nc, nz); + + data_hid = H5Dopen (group_hid, "cidx"); + space_hid = H5Dget_space (data_hid); + rank = H5Sget_simple_extent_ndims (space_hid); + + if (rank != 2) + { + H5Sclose (space_hid); + H5Dclose (data_hid); + H5Gclose (group_hid); + return false; + } + + OCTAVE_LOCAL_BUFFER (hsize_t, hdims, rank); + OCTAVE_LOCAL_BUFFER (hsize_t, maxdims, rank); + + H5Sget_simple_extent_dims (space_hid, hdims, maxdims); + + if (hdims[0] != nc + 1 || hdims[1] != 1) + { + H5Sclose (space_hid); + H5Dclose (data_hid); + H5Gclose (group_hid); + return false; + } + + int *itmp = m.xcidx (); + if (H5Dread (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, + H5P_DEFAULT, (void *) itmp) < 0) + { + H5Sclose (space_hid); + H5Dclose (data_hid); + H5Gclose (group_hid); + return false; + } + + H5Sclose (space_hid); + H5Dclose (data_hid); + + data_hid = H5Dopen (group_hid, "ridx"); + space_hid = H5Dget_space (data_hid); + rank = H5Sget_simple_extent_ndims (space_hid); + + if (rank != 2) + { + H5Sclose (space_hid); + H5Dclose (data_hid); + H5Gclose (group_hid); + return false; + } + + H5Sget_simple_extent_dims (space_hid, hdims, maxdims); + + if (hdims[0] != nz || hdims[1] != 1) + { + H5Sclose (space_hid); + H5Dclose (data_hid); + H5Gclose (group_hid); + return false; + } + + itmp = m.xridx (); + if (H5Dread (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, + H5P_DEFAULT, (void *) itmp) < 0) + { + H5Sclose (space_hid); + H5Dclose (data_hid); + H5Gclose (group_hid); + return false; + } + + H5Sclose (space_hid); + H5Dclose (data_hid); + + data_hid = H5Dopen (group_hid, "data"); + space_hid = H5Dget_space (data_hid); + rank = H5Sget_simple_extent_ndims (space_hid); + + if (rank != 2) + { + H5Sclose (space_hid); + H5Dclose (data_hid); + H5Gclose (group_hid); + return false; + } + + H5Sget_simple_extent_dims (space_hid, hdims, maxdims); + + if (hdims[0] != nz || hdims[1] != 1) + { + H5Sclose (space_hid); + H5Dclose (data_hid); + H5Gclose (group_hid); + return false; + } + + hbool_t htmp[nz]; + bool retval = false; + if (H5Dread (data_hid, H5T_NATIVE_HBOOL, H5S_ALL, H5S_ALL, + H5P_DEFAULT, (void *) htmp) >= 0) + { + retval = true; + + for (int i = 0; i < nz; i++) + m.xdata(i) = htmp[i]; + + matrix = m; + } + + H5Sclose (space_hid); + H5Dclose (data_hid); + H5Gclose (group_hid); + + return retval; +} +#endif + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/ov-bool-sparse.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/ov-bool-sparse.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,149 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#if !defined (octave_sparse_bool_matrix_h) +#define octave_sparse_bool_matrix_h 1 + +#include + +#include +#include + +#include "mx-base.h" +#include "oct-alloc.h" +#include "so-array.h" +#include "str-vec.h" + +#include "error.h" +#include "oct-stream.h" +#include "ov-base.h" +#include "ov-typeinfo.h" + +#include "boolSparse.h" +#include "ov-base-sparse.h" +#include "ov-re-sparse.h" + +class Octave_map; +class octave_value_list; + +class tree_walker; + +class +octave_sparse_bool_matrix : public octave_base_sparse +{ +public: + + octave_sparse_bool_matrix (void) + : octave_base_sparse () { } + + octave_sparse_bool_matrix (const SparseBoolMatrix& bnda) + : octave_base_sparse (bnda) { } + + octave_sparse_bool_matrix (const SparseBoolMatrix& bnda, + const SparseType& t) + : octave_base_sparse (bnda, t) { } + + octave_sparse_bool_matrix (const boolNDArray& m) + : octave_base_sparse (SparseBoolMatrix (m)) { } + + octave_sparse_bool_matrix (const boolMatrix& m) + : octave_base_sparse (SparseBoolMatrix (m)) { } + + octave_sparse_bool_matrix (const Sparse& a) + : octave_base_sparse (a) { } + + octave_sparse_bool_matrix (const octave_sparse_bool_matrix& bm) + : octave_base_sparse (bm) { } + + ~octave_sparse_bool_matrix (void) { } + + octave_value *clone (void) const { return new octave_sparse_bool_matrix (*this); } + octave_value *empty_clone (void) const { return new octave_sparse_bool_matrix (); } + + type_conv_fcn numeric_conversion_function (void) const; + + octave_value *try_narrowing_conversion (void); + +#if 0 + idx_vector index_vector (void) const { return idx_vector (matrix); } +#endif + + bool is_bool_matrix (void) const { return true; } + + bool is_bool_type (void) const { return true; } + + bool is_real_type (void) const { return true; } + + bool valid_as_scalar_index (void) const; + + double double_value (bool = false) const; + + double scalar_value (bool frc_str_conv = false) const + { return double_value (frc_str_conv); } + + Matrix matrix_value (bool = false) const; + + NDArray array_value (bool = false) const; + + Complex complex_value (bool = false) const; + + ComplexMatrix complex_matrix_value (bool = false) const; + + ComplexNDArray complex_array_value (bool = false) const; + + boolMatrix bool_matrix_value (void) const; + + boolNDArray bool_array_value (void) const; + + SparseMatrix sparse_matrix_value (void) const; + + SparseComplexMatrix sparse_complex_matrix_value (void) const; + + SparseBoolMatrix sparse_bool_matrix_value (void) const + { return matrix; } + + octave_value convert_to_str_internal (bool pad, bool force) const; + + bool save_binary (std::ostream& os, bool& save_as_floats); + + bool load_binary (std::istream& is, bool swap, + oct_mach_info::float_format fmt); + +#if defined (HAVE_HDF5) + bool save_hdf5 (hid_t loc_id, const char *name, bool save_as_floats); + + bool load_hdf5 (hid_t loc_id, const char *name, bool have_h5giterate_bug); +#endif + +protected: + + DECLARE_OCTAVE_ALLOCATOR + + DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA +}; + +#endif + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/ov-cell.cc --- a/src/ov-cell.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/ov-cell.cc Fri Feb 25 19:55:28 2005 +0000 @@ -25,6 +25,7 @@ #endif #include +#include #include "lo-sstream.h" #include "lo-utils.h" diff -r 9f3299378193 -r 57077d0ddc8e src/ov-cx-mat.cc --- a/src/ov-cx-mat.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/ov-cx-mat.cc Fri Feb 25 19:55:28 2005 +0000 @@ -179,6 +179,25 @@ return matrix.matrix_value (); } +SparseMatrix +octave_complex_matrix::sparse_matrix_value (bool force_conversion) const +{ + SparseMatrix retval; + + if (! force_conversion && Vwarn_imag_to_real) + gripe_implicit_conversion ("complex matrix", "real matrix"); + + retval = SparseMatrix (::real (matrix.matrix_value ())); + + return retval; +} + +SparseComplexMatrix +octave_complex_matrix::sparse_complex_matrix_value (bool) const +{ + return SparseComplexMatrix (matrix.matrix_value ()); +} + static ComplexMatrix strip_infnan (const ComplexMatrix& m) { diff -r 9f3299378193 -r 57077d0ddc8e src/ov-cx-mat.h --- a/src/ov-cx-mat.h Fri Feb 25 17:42:55 2005 +0000 +++ b/src/ov-cx-mat.h Fri Feb 25 19:55:28 2005 +0000 @@ -104,6 +104,10 @@ ComplexNDArray complex_array_value (bool = false) const { return matrix; } + SparseMatrix sparse_matrix_value (bool = false) const; + + SparseComplexMatrix sparse_complex_matrix_value (bool = false) const; + void increment (void) { matrix += Complex (1.0); } void decrement (void) { matrix -= Complex (1.0); } diff -r 9f3299378193 -r 57077d0ddc8e src/ov-cx-sparse.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/ov-cx-sparse.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,761 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include +#include + +#include "ov-base.h" +#include "ov-scalar.h" +#include "ov-complex.h" +#include "gripes.h" + +#include "ov-re-sparse.h" +#include "ov-cx-sparse.h" + +#include "ov-base-sparse.h" +#include "ov-base-sparse.cc" + +#include "ov-bool-sparse.h" + +template class octave_base_sparse; + +DEFINE_OCTAVE_ALLOCATOR (octave_sparse_complex_matrix); + +DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA (octave_sparse_complex_matrix, "sparse complex matrix", "sparse"); + +octave_value * +octave_sparse_complex_matrix::try_narrowing_conversion (void) +{ + octave_value *retval = 0; + + int nr = matrix.rows (); + int nc = matrix.cols (); + + // Don't use numel, since it can overflow for very large matrices + // Note that for the tests on matrix size, they become approximative + // since they involves a cast to double to avoid issues of overflow + if (matrix.rows () == 1 && matrix.cols () == 1) + { + // Const copy of the matrix, so the right version of () operator used + const SparseComplexMatrix tmp (matrix); + + Complex c = tmp (0, 0); + + if (imag (c) == 0.0) + retval = new octave_scalar (std::real (c)); + else + retval = new octave_complex (c); + } + else if (nr == 0 || nc == 0) + retval = new octave_matrix (Matrix (nr, nc)); + else if (matrix.all_elements_are_real ()) + if (matrix.cols () > 0 && matrix.rows () > 0 && + double (matrix.byte_size ()) > double (matrix.rows ()) * + double (matrix.cols ()) * sizeof (double)) + retval = new octave_matrix (::real (matrix.matrix_value ())); + else + retval = new octave_sparse_matrix (::real (matrix)); + else if (matrix.cols () > 0 && matrix.rows () > 0 && + double (matrix.byte_size ()) > double (matrix.rows ()) * + double (matrix.cols ()) * sizeof (Complex)) + retval = new octave_complex_matrix (matrix.matrix_value ()); + + return retval; +} + +void +octave_sparse_complex_matrix::assign (const octave_value_list& idx, + const SparseComplexMatrix& rhs) +{ + octave_base_sparse::assign (idx, rhs); +} + +void +octave_sparse_complex_matrix::assign (const octave_value_list& idx, + const SparseMatrix& rhs) +{ + int len = idx.length (); + + for (int i = 0; i < len; i++) + matrix.set_index (idx(i).index_vector ()); + + ::assign (matrix, rhs); +} + +bool +octave_sparse_complex_matrix::valid_as_scalar_index (void) const +{ + // XXX FIXME XXX + return false; +} + +double +octave_sparse_complex_matrix::double_value (bool force_conversion) const +{ + double retval = lo_ieee_nan_value (); + + if (! force_conversion && Vwarn_imag_to_real) + gripe_implicit_conversion ("complex sparse matrix", "real scalar"); + + // XXX FIXME XXX -- maybe this should be a function, valid_as_scalar() + if (numel () > 0) + { + // XXX FIXME XXX -- is warn_fortran_indexing the right variable here? + if (Vwarn_fortran_indexing) + gripe_implicit_conversion ("complex sparse matrix", "real scalar"); + + retval = std::real (matrix (0, 0)); + } + else + gripe_invalid_conversion ("complex sparse matrix", "real scalar"); + + return retval; +} + +Matrix +octave_sparse_complex_matrix::matrix_value (bool force_conversion) const +{ + Matrix retval; + + if (! force_conversion && Vwarn_imag_to_real) + gripe_implicit_conversion ("complex sparse matrix", "real matrix"); + + retval = ::real (matrix.matrix_value ()); + + return retval; +} + +Complex +octave_sparse_complex_matrix::complex_value (bool) const +{ + double tmp = lo_ieee_nan_value (); + + Complex retval (tmp, tmp); + + // XXX FIXME XXX -- maybe this should be a function, valid_as_scalar() + if (numel () > 0) + { + // XXX FIXME XXX -- is warn_fortran_indexing the right variable here? + if (Vwarn_fortran_indexing) + gripe_implicit_conversion ("complex sparse matrix", "real scalar"); + + retval = matrix (0, 0); + } + else + gripe_invalid_conversion ("complex sparse matrix", "real scalar"); + + return retval; +} + +ComplexMatrix +octave_sparse_complex_matrix::complex_matrix_value (bool) const +{ + return matrix.matrix_value (); +} + +ComplexNDArray +octave_sparse_complex_matrix::complex_array_value (bool) const +{ + return ComplexNDArray (matrix.matrix_value ()); +} + +SparseMatrix +octave_sparse_complex_matrix::sparse_matrix_value (bool force_conversion) const +{ + SparseMatrix retval; + + if (! force_conversion && Vwarn_imag_to_real) + gripe_implicit_conversion ("complex sparse matrix", + "real sparse matrix"); + + retval = ::real (matrix); + + return retval; +} + +bool +octave_sparse_complex_matrix::save_binary (std::ostream& os, + bool&save_as_floats) +{ + dim_vector d = this->dims (); + if (d.length() < 1) + return false; + + // Ensure that additional memory is deallocated + matrix.maybe_compress (); + + int nr = d(0); + int nc = d(1); + int nz = nnz (); + + FOUR_BYTE_INT itmp; + // Use negative value for ndims to be consistent with other formats + itmp= -2; + os.write (X_CAST (char *, &itmp), 4); + + itmp= nr; + os.write (X_CAST (char *, &itmp), 4); + + itmp= nc; + os.write (X_CAST (char *, &itmp), 4); + + itmp= nz; + os.write (X_CAST (char *, &itmp), 4); + + save_type st = LS_DOUBLE; + if (save_as_floats) + { + if (matrix.too_large_for_float ()) + { + warning ("save: some values too large to save as floats --"); + warning ("save: saving as doubles instead"); + } + else + st = LS_FLOAT; + } + else if (matrix.nnz () > 8192) // XXX FIXME XXX -- make this configurable. + { + double max_val, min_val; + if (matrix.all_integers (max_val, min_val)) + st = get_save_type (max_val, min_val); + } + + // add one to the printed indices to go from + // zero-based to one-based arrays + for (int i = 0; i < nc+1; i++) + { + OCTAVE_QUIT; + itmp = matrix.cidx(i); + os.write (X_CAST (char *, &itmp), 4); + } + + for (int i = 0; i < nz; i++) + { + OCTAVE_QUIT; + itmp = matrix.ridx(i); + os.write (X_CAST (char *, &itmp), 4); + } + + write_doubles (os, X_CAST (const double *, matrix.data()), st, 2 * nz); + + return true; +} + +bool +octave_sparse_complex_matrix::load_binary (std::istream& is, bool swap, + oct_mach_info::float_format fmt) +{ + FOUR_BYTE_INT nz, nc, nr, tmp; + if (! is.read (X_CAST (char *, &tmp), 4)) + return false; + + if (swap) + swap_bytes<4> (&tmp); + + if (tmp != -2) { + error("load: only 2D sparse matrices are supported"); + return false; + } + + if (! is.read (X_CAST (char *, &nr), 4)) + return false; + if (! is.read (X_CAST (char *, &nc), 4)) + return false; + if (! is.read (X_CAST (char *, &nz), 4)) + return false; + + if (swap) + { + swap_bytes<4> (&nr); + swap_bytes<4> (&nc); + swap_bytes<4> (&nz); + } + + SparseComplexMatrix m (nr, nc, nz); + + for (int i = 0; i < nc+1; i++) + { + OCTAVE_QUIT; + if (! is.read (X_CAST (char *, &tmp), 4)) + return false; + if (swap) + swap_bytes<4> (&tmp); + m.cidx(i) = tmp; + } + + for (int i = 0; i < nz; i++) + { + OCTAVE_QUIT; + if (! is.read (X_CAST (char *, &tmp), 4)) + return false; + if (swap) + swap_bytes<4> (&tmp); + m.ridx(i) = tmp; + } + + if (! is.read (X_CAST (char *, &tmp), 1)) + return false; + + read_doubles (is, X_CAST(double *, m.data()), X_CAST (save_type, tmp), + 2 * nz, swap, fmt); + + if (error_state || ! is) + return false; + matrix = m; + + return true; +} + +#if defined (HAVE_HDF5) +bool +octave_sparse_complex_matrix::save_hdf5 (hid_t loc_id, const char *name, + bool save_as_floats) +{ + dim_vector dv = dims (); + int empty = save_hdf5_empty (loc_id, name, dv); + if (empty) + return (empty > 0); + + // Ensure that additional memory is deallocated + matrix.maybe_compress (); + + hid_t group_hid = H5Gcreate (loc_id, name, 0); + if (group_hid < 0) + return false; + + hid_t space_hid = -1, data_hid = -1; + bool retval = true; + SparseComplexMatrix m = sparse_complex_matrix_value (); + int tmp; + hsize_t hdims[2]; + + space_hid = H5Screate_simple (0, hdims, (hsize_t*) 0); + if (space_hid < 0) + { + H5Gclose (group_hid); + return false; + } + + data_hid = H5Dcreate (group_hid, "nr", H5T_NATIVE_INT, space_hid, + H5P_DEFAULT); + if (data_hid < 0) + { + H5Sclose (space_hid); + H5Gclose (group_hid); + return false; + } + + tmp = m.rows (); + retval = H5Dwrite (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, + (void*) &tmp) >= 0; + H5Dclose (data_hid); + if (!retval) + { + H5Sclose (space_hid); + H5Gclose (group_hid); + return false; + } + + data_hid = H5Dcreate (group_hid, "nc", H5T_NATIVE_INT, space_hid, + H5P_DEFAULT); + if (data_hid < 0) + { + H5Sclose (space_hid); + H5Gclose (group_hid); + return false; + } + + tmp = m.cols (); + retval = H5Dwrite (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, + (void*) &tmp) >= 0; + H5Dclose (data_hid); + if (!retval) + { + H5Sclose (space_hid); + H5Gclose (group_hid); + return false; + } + + data_hid = H5Dcreate (group_hid, "nz", H5T_NATIVE_INT, space_hid, + H5P_DEFAULT); + if (data_hid < 0) + { + H5Sclose (space_hid); + H5Gclose (group_hid); + return false; + } + + tmp = m.nnz (); + retval = H5Dwrite (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, + (void*) &tmp) >= 0; + H5Dclose (data_hid); + if (!retval) + { + H5Sclose (space_hid); + H5Gclose (group_hid); + return false; + } + + H5Sclose (space_hid); + + hdims[0] = m.cols() + 1; + hdims[1] = 1; + + space_hid = H5Screate_simple (2, hdims, 0); + + if (space_hid < 0) + { + H5Gclose (group_hid); + return false; + } + + data_hid = H5Dcreate (group_hid, "cidx", H5T_NATIVE_INT, space_hid, + H5P_DEFAULT); + if (data_hid < 0) + { + H5Sclose (space_hid); + H5Gclose (group_hid); + return false; + } + + int * itmp = m.xcidx (); + retval = H5Dwrite (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, + (void*) itmp) >= 0; + H5Dclose (data_hid); + if (!retval) + { + H5Sclose (space_hid); + H5Gclose (group_hid); + return false; + } + + H5Sclose (space_hid); + + hdims[0] = m.nnz(); + hdims[1] = 1; + + space_hid = H5Screate_simple (2, hdims, 0); + + if (space_hid < 0) + { + H5Gclose (group_hid); + return false; + } + + data_hid = H5Dcreate (group_hid, "ridx", H5T_NATIVE_INT, space_hid, + H5P_DEFAULT); + if (data_hid < 0) + { + H5Sclose (space_hid); + H5Gclose (group_hid); + return false; + } + + itmp = m.xridx (); + retval = H5Dwrite (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, + (void*) itmp) >= 0; + H5Dclose (data_hid); + if (!retval) + { + H5Sclose (space_hid); + H5Gclose (group_hid); + return false; + } + + hid_t save_type_hid = H5T_NATIVE_DOUBLE; + + if (save_as_floats) + { + if (m.too_large_for_float ()) + { + warning ("save: some values too large to save as floats --"); + warning ("save: saving as doubles instead"); + } + else + save_type_hid = H5T_NATIVE_FLOAT; + } +#if HAVE_HDF5_INT2FLOAT_CONVERSIONS + // hdf5 currently doesn't support float/integer conversions + else + { + double max_val, min_val; + + if (m.all_integers (max_val, min_val)) + save_type_hid + = save_type_to_hdf5 (get_save_type (max_val, min_val)); + } +#endif /* HAVE_HDF5_INT2FLOAT_CONVERSIONS */ + + hid_t type_hid = hdf5_make_complex_type (save_type_hid); + if (type_hid < 0) + { + H5Sclose (space_hid); + H5Gclose (group_hid); + return false; + } + + data_hid = H5Dcreate (group_hid, "data", type_hid, space_hid, H5P_DEFAULT); + if (data_hid < 0) + { + H5Sclose (space_hid); + H5Tclose (type_hid); + H5Gclose (group_hid); + return false; + } + + hid_t complex_type_hid = hdf5_make_complex_type (H5T_NATIVE_DOUBLE); + retval = false; + if (complex_type_hid >= 0) + { + Complex * ctmp = m.xdata (); + + retval = H5Dwrite (data_hid, complex_type_hid, H5S_ALL, H5S_ALL, + H5P_DEFAULT, (void*) ctmp) >= 0; + } + + H5Dclose (data_hid); + H5Sclose (space_hid); + H5Tclose (type_hid); + H5Gclose (group_hid); + + return retval; +} + +bool +octave_sparse_complex_matrix::load_hdf5 (hid_t loc_id, const char *name, + bool /* have_h5giterate_bug */) +{ + int nr, nc, nz; + hid_t group_hid, data_hid, space_hid; + hsize_t rank; + + dim_vector dv; + int empty = load_hdf5_empty (loc_id, name, dv); + if (empty > 0) + matrix.resize(dv); + if (empty) + return (empty > 0); + + group_hid = H5Gopen (loc_id, name); + if (group_hid < 0 ) return false; + + data_hid = H5Dopen (group_hid, "nr"); + space_hid = H5Dget_space (data_hid); + rank = H5Sget_simple_extent_ndims (space_hid); + + if (rank != 0) + { + H5Dclose (data_hid); + H5Gclose (group_hid); + return false; + } + + if (H5Dread (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, + H5P_DEFAULT, (void *) &nr) < 0) + { + H5Dclose (data_hid); + H5Gclose (group_hid); + return false; + } + + H5Dclose (data_hid); + + data_hid = H5Dopen (group_hid, "nc"); + space_hid = H5Dget_space (data_hid); + rank = H5Sget_simple_extent_ndims (space_hid); + + if (rank != 0) + { + H5Dclose (data_hid); + H5Gclose (group_hid); + return false; + } + + if (H5Dread (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, + H5P_DEFAULT, (void *) &nc) < 0) + { + H5Dclose (data_hid); + H5Gclose (group_hid); + return false; + } + + H5Dclose (data_hid); + + data_hid = H5Dopen (group_hid, "nz"); + space_hid = H5Dget_space (data_hid); + rank = H5Sget_simple_extent_ndims (space_hid); + + if (rank != 0) + { + H5Dclose (data_hid); + H5Gclose (group_hid); + return false; + } + + if (H5Dread (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, + H5P_DEFAULT, (void *) &nz) < 0) + { + H5Dclose (data_hid); + H5Gclose (group_hid); + return false; + } + + H5Dclose (data_hid); + + SparseComplexMatrix m (nr, nc, nz); + + data_hid = H5Dopen (group_hid, "cidx"); + space_hid = H5Dget_space (data_hid); + rank = H5Sget_simple_extent_ndims (space_hid); + + if (rank != 2) + { + H5Sclose (space_hid); + H5Dclose (data_hid); + H5Gclose (group_hid); + return false; + } + + OCTAVE_LOCAL_BUFFER (hsize_t, hdims, rank); + OCTAVE_LOCAL_BUFFER (hsize_t, maxdims, rank); + + H5Sget_simple_extent_dims (space_hid, hdims, maxdims); + + if (hdims[0] != nc + 1 || hdims[1] != 1) + { + H5Sclose (space_hid); + H5Dclose (data_hid); + H5Gclose (group_hid); + return false; + } + + int *itmp = m.xcidx (); + if (H5Dread (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, + H5P_DEFAULT, (void *) itmp) < 0) + { + H5Sclose (space_hid); + H5Dclose (data_hid); + H5Gclose (group_hid); + return false; + } + + H5Sclose (space_hid); + H5Dclose (data_hid); + + data_hid = H5Dopen (group_hid, "ridx"); + space_hid = H5Dget_space (data_hid); + rank = H5Sget_simple_extent_ndims (space_hid); + + if (rank != 2) + { + H5Sclose (space_hid); + H5Dclose (data_hid); + H5Gclose (group_hid); + return false; + } + + H5Sget_simple_extent_dims (space_hid, hdims, maxdims); + + if (hdims[0] != nz || hdims[1] != 1) + { + H5Sclose (space_hid); + H5Dclose (data_hid); + H5Gclose (group_hid); + return false; + } + + itmp = m.xridx (); + if (H5Dread (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, + H5P_DEFAULT, (void *) itmp) < 0) + { + H5Sclose (space_hid); + H5Dclose (data_hid); + H5Gclose (group_hid); + return false; + } + + H5Sclose (space_hid); + H5Dclose (data_hid); + + data_hid = H5Dopen (group_hid, "data"); + hid_t type_hid = H5Dget_type (data_hid); + + hid_t complex_type = hdf5_make_complex_type (H5T_NATIVE_DOUBLE); + + if (! hdf5_types_compatible (type_hid, complex_type)) + { + H5Tclose (complex_type); + H5Dclose (data_hid); + H5Gclose (group_hid); + return false; + } + + space_hid = H5Dget_space (data_hid); + rank = H5Sget_simple_extent_ndims (space_hid); + + if (rank != 2) + { + H5Sclose (space_hid); + H5Dclose (data_hid); + H5Gclose (group_hid); + return false; + } + + H5Sget_simple_extent_dims (space_hid, hdims, maxdims); + + if (hdims[0] != nz || hdims[1] != 1) + { + H5Sclose (space_hid); + H5Dclose (data_hid); + H5Gclose (group_hid); + return false; + } + + Complex *ctmp = m.xdata (); + bool retval = false; + if (H5Dread (data_hid, complex_type, H5S_ALL, H5S_ALL, H5P_DEFAULT, + (void *) ctmp) >= 0) + { + retval = true; + matrix = m; + } + + H5Tclose (complex_type); + H5Sclose (space_hid); + H5Dclose (data_hid); + H5Gclose (group_hid); + + return retval; +} + +#endif + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/ov-cx-sparse.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/ov-cx-sparse.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,147 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#if !defined (octave_sparse_complex_matrix_h) +#define octave_sparse_complex_matrix_h 1 + +#include + +#include +#include + +#include "mx-base.h" +#include "oct-alloc.h" +#include "so-array.h" +#include "str-vec.h" + +#include "error.h" +#include "oct-stream.h" +#include "ov-base.h" +#include "ov-typeinfo.h" + +#include "CSparse.h" +#include "ov-base-sparse.h" +#include "ov-re-sparse.h" +#include "ov-bool-sparse.h" + +class Octave_map; +class octave_value_list; + +class tree_walker; + +class +octave_sparse_complex_matrix : public octave_base_sparse +{ +public: + + octave_sparse_complex_matrix (void) + : octave_base_sparse () { } + + octave_sparse_complex_matrix (const ComplexNDArray& m) + : octave_base_sparse (SparseComplexMatrix (m)) { } + + octave_sparse_complex_matrix (const ComplexMatrix& m) + : octave_base_sparse (SparseComplexMatrix (m)) { } + + octave_sparse_complex_matrix (const SparseComplexMatrix& m) + : octave_base_sparse (m) { } + + octave_sparse_complex_matrix (const SparseComplexMatrix& m, + const SparseType &t) + : octave_base_sparse (m, t) { } + + octave_sparse_complex_matrix (const MSparse& m) + : octave_base_sparse (m) { } + + octave_sparse_complex_matrix (const octave_sparse_complex_matrix& cm) + : octave_base_sparse (cm) { } + + ~octave_sparse_complex_matrix (void) { } + + octave_value *clone (void) const { return new octave_sparse_complex_matrix (*this); } + octave_value *empty_clone (void) const { return new octave_sparse_complex_matrix (); } + + octave_value *try_narrowing_conversion (void); + + void assign (const octave_value_list& idx, const SparseComplexMatrix& rhs); + + void assign (const octave_value_list& idx, const SparseMatrix& rhs); + + bool is_complex_matrix (void) const { return true; } + + bool is_complex_type (void) const { return true; } + + bool valid_as_scalar_index (void) const; + + double double_value (bool = false) const; + + double scalar_value (bool frc_str_conv = false) const + { return double_value (frc_str_conv); } + + Matrix matrix_value (bool = false) const; + + Complex complex_value (bool = false) const; + + ComplexMatrix complex_matrix_value (bool = false) const; + + ComplexNDArray complex_array_value (bool = false) const; + + SparseMatrix sparse_matrix_value (bool = false) const; + + SparseComplexMatrix sparse_complex_matrix_value (bool = false) const + { return matrix; } + +#if 0 + int write (octave_stream& os, int block_size, + oct_data_conv::data_type output_type, int skip, + oct_mach_info::float_format flt_fmt) const + { + // Yes, for compatibility, we drop the imaginary part here. + return os.write (matrix_value (true), block_size, output_type, + skip, flt_fmt); + } +#endif + + bool save_binary (std::ostream& os, bool& save_as_floats); + + bool load_binary (std::istream& is, bool swap, + oct_mach_info::float_format fmt); + +#if defined (HAVE_HDF5) + bool save_hdf5 (hid_t loc_id, const char *name, bool save_as_floats); + + bool load_hdf5 (hid_t loc_id, const char *name, bool have_h5giterate_bug); +#endif + +private: + + DECLARE_OCTAVE_ALLOCATOR + + DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA +}; + +#endif + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/ov-fcn-handle.cc --- a/src/ov-fcn-handle.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/ov-fcn-handle.cc Fri Feb 25 19:55:28 2005 +0000 @@ -25,6 +25,7 @@ #endif #include +#include #include "defun.h" #include "error.h" diff -r 9f3299378193 -r 57077d0ddc8e src/ov-fcn-inline.cc --- a/src/ov-fcn-inline.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/ov-fcn-inline.cc Fri Feb 25 19:55:28 2005 +0000 @@ -29,6 +29,7 @@ #include #include +#include #include "defun.h" #include "error.h" diff -r 9f3299378193 -r 57077d0ddc8e src/ov-fcn-inline.h --- a/src/ov-fcn-inline.h Fri Feb 25 17:42:55 2005 +0000 +++ b/src/ov-fcn-inline.h Fri Feb 25 19:55:28 2005 +0000 @@ -17,10 +17,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -In addition to the terms of the GPL, you are permitted to link -this program with any Open Source program, as defined by the -Open Source Initiative (www.opensource.org) - */ #if !defined (octave_fcn_inline_h) diff -r 9f3299378193 -r 57077d0ddc8e src/ov-int16.cc --- a/src/ov-int16.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/ov-int16.cc Fri Feb 25 19:55:28 2005 +0000 @@ -27,7 +27,6 @@ #include #include -#include #include "lo-ieee.h" #include "lo-utils.h" diff -r 9f3299378193 -r 57077d0ddc8e src/ov-int32.cc --- a/src/ov-int32.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/ov-int32.cc Fri Feb 25 19:55:28 2005 +0000 @@ -27,7 +27,6 @@ #include #include -#include #include "lo-ieee.h" #include "lo-utils.h" diff -r 9f3299378193 -r 57077d0ddc8e src/ov-int64.cc --- a/src/ov-int64.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/ov-int64.cc Fri Feb 25 19:55:28 2005 +0000 @@ -27,7 +27,6 @@ #include #include -#include #include "lo-ieee.h" #include "lo-utils.h" diff -r 9f3299378193 -r 57077d0ddc8e src/ov-int8.cc --- a/src/ov-int8.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/ov-int8.cc Fri Feb 25 19:55:28 2005 +0000 @@ -27,7 +27,6 @@ #include #include -#include #include "lo-ieee.h" #include "lo-utils.h" diff -r 9f3299378193 -r 57077d0ddc8e src/ov-re-mat.cc --- a/src/ov-re-mat.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/ov-re-mat.cc Fri Feb 25 19:55:28 2005 +0000 @@ -160,6 +160,21 @@ return retval; } +SparseMatrix +octave_matrix::sparse_matrix_value (bool) const +{ + return SparseMatrix (matrix.matrix_value ()); +} + +SparseComplexMatrix +octave_matrix::sparse_complex_matrix_value (bool) const +{ + // XXX FIXME XXX Need a SparseComplexMatrix (Matrix) constructor to make + // this function more efficient. Then this should become + // return SparseComplexMatrix (matrix.matrix_value ()); + return SparseComplexMatrix (sparse_matrix_value ()); +} + streamoff_array octave_matrix::streamoff_array_value (void) const { diff -r 9f3299378193 -r 57077d0ddc8e src/ov-re-mat.h --- a/src/ov-re-mat.h Fri Feb 25 17:42:55 2005 +0000 +++ b/src/ov-re-mat.h Fri Feb 25 19:55:28 2005 +0000 @@ -107,6 +107,10 @@ NDArray array_value (bool = false) const { return matrix; } + SparseMatrix sparse_matrix_value (bool = false) const; + + SparseComplexMatrix sparse_complex_matrix_value (bool = false) const; + streamoff_array streamoff_array_value (void) const; void increment (void) { matrix += 1.0; } diff -r 9f3299378193 -r 57077d0ddc8e src/ov-re-sparse.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/ov-re-sparse.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,704 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include +#include + +#include "ov-base.h" +#include "ov-scalar.h" +#include "gripes.h" + +#include "ls-hdf5.h" + +#include "ov-re-sparse.h" + +#include "ov-base-sparse.h" +#include "ov-base-sparse.cc" + +#include "ov-bool-sparse.h" + +template class octave_base_sparse; + +DEFINE_OCTAVE_ALLOCATOR (octave_sparse_matrix); + +DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA (octave_sparse_matrix, "sparse matrix", "sparse"); + +octave_value * +octave_sparse_matrix::try_narrowing_conversion (void) +{ + octave_value *retval = 0; + + // Don't use numel, since it can overflow for very large matrices + // Note that for the second test, this means it becomes approximative + // since it involves a cast to double to avoid issues of overflow + if (matrix.rows () == 1 && matrix.cols () == 1) + { + // Const copy of the matrix, so the right version of () operator used + const SparseMatrix tmp (matrix); + + retval = new octave_scalar (tmp (0)); + } + else if (matrix.cols () > 0 && matrix.rows () > 0 && + double (matrix.byte_size ()) > double (matrix.rows ()) * + double (matrix.cols ()) * sizeof (double)) + retval = new octave_matrix (matrix.matrix_value ()); + + return retval; +} + +bool +octave_sparse_matrix::valid_as_scalar_index (void) const +{ + // XXX FIXME XXX + return false; +} + +double +octave_sparse_matrix::double_value (bool) const +{ + double retval = lo_ieee_nan_value (); + + if (numel () > 0) + { + // XXX FIXME XXX -- is warn_fortran_indexing the right variable here? + if (Vwarn_fortran_indexing) + gripe_implicit_conversion ("real sparse matrix", "real scalar"); + + retval = matrix (0, 0); + } + else + gripe_invalid_conversion ("real sparse matrix", "real scalar"); + + return retval; +} + +Complex +octave_sparse_matrix::complex_value (bool) const +{ + double tmp = lo_ieee_nan_value (); + + Complex retval (tmp, tmp); + + // XXX FIXME XXX -- maybe this should be a function, valid_as_scalar() + if (rows () > 0 && columns () > 0) + { + // XXX FIXME XXX -- is warn_fortran_indexing the right variable here? + if (Vwarn_fortran_indexing) + gripe_implicit_conversion ("real sparse matrix", "complex scalar"); + + retval = matrix (0, 0); + } + else + gripe_invalid_conversion ("real sparse matrix", "complex scalar"); + + return retval; +} + +Matrix +octave_sparse_matrix::matrix_value (bool) const +{ + return matrix.matrix_value (); +} + +ComplexMatrix +octave_sparse_matrix::complex_matrix_value (bool) const +{ + return ComplexMatrix (matrix.matrix_value ()); +} + +ComplexNDArray +octave_sparse_matrix::complex_array_value (bool) const +{ + return ComplexNDArray (ComplexMatrix (matrix.matrix_value ())); +} + +NDArray +octave_sparse_matrix::array_value (bool) const +{ + return NDArray (matrix.matrix_value ()); +} + +streamoff_array +octave_sparse_matrix::streamoff_array_value (void) const +{ + streamoff_array retval (dims ()); + int nc = matrix.cols (); + int nr = matrix.rows (); + + for (int j = 0; j < nc; j++) + for (int i = matrix.cidx(i); i < matrix.cidx(i+1); i++) + { + double d = matrix.data(i); + + if (D_NINT (d) == d) + { + retval(matrix.ridx(i) + nr * j) = + std::streamoff (static_cast (d)); + } + else + { + error ("conversion to streamoff_array value failed"); + break; + } + } + + return retval; +} + +bool +octave_sparse_matrix::save_binary (std::ostream& os, bool&save_as_floats) +{ + dim_vector d = this->dims (); + if (d.length() < 1) + return false; + + // Ensure that additional memory is deallocated + matrix.maybe_compress (); + + int nr = d(0); + int nc = d(1); + int nz = nnz (); + + FOUR_BYTE_INT itmp; + // Use negative value for ndims to be consistent with other formats + itmp= -2; + os.write (X_CAST (char *, &itmp), 4); + + itmp= nr; + os.write (X_CAST (char *, &itmp), 4); + + itmp= nc; + os.write (X_CAST (char *, &itmp), 4); + + itmp= nz; + os.write (X_CAST (char *, &itmp), 4); + + save_type st = LS_DOUBLE; + if (save_as_floats) + { + if (matrix.too_large_for_float ()) + { + warning ("save: some values too large to save as floats --"); + warning ("save: saving as doubles instead"); + } + else + st = LS_FLOAT; + } + else if (matrix.nnz () > 8192) // XXX FIXME XXX -- make this configurable. + { + double max_val, min_val; + if (matrix.all_integers (max_val, min_val)) + st = get_save_type (max_val, min_val); + } + + // add one to the printed indices to go from + // zero-based to one-based arrays + for (int i = 0; i < nc+1; i++) + { + OCTAVE_QUIT; + itmp = matrix.cidx(i); + os.write (X_CAST (char *, &itmp), 4); + } + + for (int i = 0; i < nz; i++) + { + OCTAVE_QUIT; + itmp = matrix.ridx(i); + os.write (X_CAST (char *, &itmp), 4); + } + + write_doubles (os, matrix.data(), st, nz); + + return true; +} + +bool +octave_sparse_matrix::load_binary (std::istream& is, bool swap, + oct_mach_info::float_format fmt) +{ + FOUR_BYTE_INT nz, nc, nr, tmp; + if (! is.read (X_CAST (char *, &tmp), 4)) + return false; + + if (swap) + swap_bytes<4> (&tmp); + + if (tmp != -2) { + error("load: only 2D sparse matrices are supported"); + return false; + } + + if (! is.read (X_CAST (char *, &nr), 4)) + return false; + if (! is.read (X_CAST (char *, &nc), 4)) + return false; + if (! is.read (X_CAST (char *, &nz), 4)) + return false; + + if (swap) + { + swap_bytes<4> (&nr); + swap_bytes<4> (&nc); + swap_bytes<4> (&nz); + } + + SparseMatrix m (nr, nc, nz); + + for (int i = 0; i < nc+1; i++) + { + OCTAVE_QUIT; + if (! is.read (X_CAST (char *, &tmp), 4)) + return false; + if (swap) + swap_bytes<4> (&tmp); + m.xcidx(i) = tmp; + } + + for (int i = 0; i < nz; i++) + { + OCTAVE_QUIT; + if (! is.read (X_CAST (char *, &tmp), 4)) + return false; + if (swap) + swap_bytes<4> (&tmp); + m.xridx(i) = tmp; + } + + if (! is.read (X_CAST (char *, &tmp), 1)) + return false; + + read_doubles (is, m.xdata(), X_CAST (save_type, tmp), nz, swap, fmt); + + if (error_state || ! is) + return false; + matrix = m; + + return true; +} + +#if defined (HAVE_HDF5) +bool +octave_sparse_matrix::save_hdf5 (hid_t loc_id, const char *name, + bool save_as_floats) +{ + dim_vector dv = dims (); + int empty = save_hdf5_empty (loc_id, name, dv); + if (empty) + return (empty > 0); + + // Ensure that additional memory is deallocated + matrix.maybe_compress (); + + hid_t group_hid = H5Gcreate (loc_id, name, 0); + if (group_hid < 0) + return false; + + hid_t space_hid = -1, data_hid = -1; + bool retval = true; + SparseMatrix m = sparse_matrix_value (); + int tmp; + hsize_t hdims[2]; + + space_hid = H5Screate_simple (0, hdims, (hsize_t*) 0); + if (space_hid < 0) + { + H5Gclose (group_hid); + return false; + } + + data_hid = H5Dcreate (group_hid, "nr", H5T_NATIVE_INT, space_hid, + H5P_DEFAULT); + if (data_hid < 0) + { + H5Sclose (space_hid); + H5Gclose (group_hid); + return false; + } + + tmp = m.rows (); + retval = H5Dwrite (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, + (void*) &tmp) >= 0; + H5Dclose (data_hid); + if (!retval) + { + H5Sclose (space_hid); + H5Gclose (group_hid); + return false; + } + + data_hid = H5Dcreate (group_hid, "nc", H5T_NATIVE_INT, space_hid, + H5P_DEFAULT); + if (data_hid < 0) + { + H5Sclose (space_hid); + H5Gclose (group_hid); + return false; + } + + tmp = m.cols (); + retval = H5Dwrite (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, + (void*) &tmp) >= 0; + H5Dclose (data_hid); + if (!retval) + { + H5Sclose (space_hid); + H5Gclose (group_hid); + return false; + } + + data_hid = H5Dcreate (group_hid, "nz", H5T_NATIVE_INT, space_hid, + H5P_DEFAULT); + if (data_hid < 0) + { + H5Sclose (space_hid); + H5Gclose (group_hid); + return false; + } + + tmp = m.nnz (); + retval = H5Dwrite (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, + (void*) &tmp) >= 0; + H5Dclose (data_hid); + if (!retval) + { + H5Sclose (space_hid); + H5Gclose (group_hid); + return false; + } + + H5Sclose (space_hid); + + hdims[0] = m.cols() + 1; + hdims[1] = 1; + + space_hid = H5Screate_simple (2, hdims, 0); + + if (space_hid < 0) + { + H5Gclose (group_hid); + return false; + } + + data_hid = H5Dcreate (group_hid, "cidx", H5T_NATIVE_INT, space_hid, + H5P_DEFAULT); + if (data_hid < 0) + { + H5Sclose (space_hid); + H5Gclose (group_hid); + return false; + } + + int * itmp = m.xcidx (); + retval = H5Dwrite (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, + (void*) itmp) >= 0; + H5Dclose (data_hid); + if (!retval) + { + H5Sclose (space_hid); + H5Gclose (group_hid); + return false; + } + + H5Sclose (space_hid); + + hdims[0] = m.nnz(); + hdims[1] = 1; + + space_hid = H5Screate_simple (2, hdims, 0); + + if (space_hid < 0) + { + H5Gclose (group_hid); + return false; + } + + data_hid = H5Dcreate (group_hid, "ridx", H5T_NATIVE_INT, space_hid, + H5P_DEFAULT); + if (data_hid < 0) + { + H5Sclose (space_hid); + H5Gclose (group_hid); + return false; + } + + itmp = m.xridx (); + retval = H5Dwrite (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, + (void*) itmp) >= 0; + H5Dclose (data_hid); + if (!retval) + { + H5Sclose (space_hid); + H5Gclose (group_hid); + return false; + } + + hid_t save_type_hid = H5T_NATIVE_DOUBLE; + + if (save_as_floats) + { + if (m.too_large_for_float ()) + { + warning ("save: some values too large to save as floats --"); + warning ("save: saving as doubles instead"); + } + else + save_type_hid = H5T_NATIVE_FLOAT; + } +#if HAVE_HDF5_INT2FLOAT_CONVERSIONS + // hdf5 currently doesn't support float/integer conversions + else + { + double max_val, min_val; + + if (m.all_integers (max_val, min_val)) + save_type_hid + = save_type_to_hdf5 (get_save_type (max_val, min_val)); + } +#endif /* HAVE_HDF5_INT2FLOAT_CONVERSIONS */ + + data_hid = H5Dcreate (group_hid, "data", save_type_hid, space_hid, + H5P_DEFAULT); + if (data_hid < 0) + { + H5Sclose (space_hid); + H5Gclose (group_hid); + return false; + } + + double * dtmp = m.xdata (); + retval = H5Dwrite (data_hid, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, + H5P_DEFAULT, (void*) dtmp) >= 0; + H5Dclose (data_hid); + H5Sclose (space_hid); + H5Gclose (group_hid); + + return retval; +} + +bool +octave_sparse_matrix::load_hdf5 (hid_t loc_id, const char *name, + bool /* have_h5giterate_bug */) +{ + int nr, nc, nz; + hid_t group_hid, data_hid, space_hid; + hsize_t rank; + + dim_vector dv; + int empty = load_hdf5_empty (loc_id, name, dv); + if (empty > 0) + matrix.resize(dv); + if (empty) + return (empty > 0); + + group_hid = H5Gopen (loc_id, name); + if (group_hid < 0 ) return false; + + data_hid = H5Dopen (group_hid, "nr"); + space_hid = H5Dget_space (data_hid); + rank = H5Sget_simple_extent_ndims (space_hid); + + if (rank != 0) + { + H5Dclose (data_hid); + H5Gclose (group_hid); + return false; + } + + if (H5Dread (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, + H5P_DEFAULT, (void *) &nr) < 0) + { + H5Dclose (data_hid); + H5Gclose (group_hid); + return false; + } + + H5Dclose (data_hid); + + data_hid = H5Dopen (group_hid, "nc"); + space_hid = H5Dget_space (data_hid); + rank = H5Sget_simple_extent_ndims (space_hid); + + if (rank != 0) + { + H5Dclose (data_hid); + H5Gclose (group_hid); + return false; + } + + if (H5Dread (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, + H5P_DEFAULT, (void *) &nc) < 0) + { + H5Dclose (data_hid); + H5Gclose (group_hid); + return false; + } + + H5Dclose (data_hid); + + data_hid = H5Dopen (group_hid, "nz"); + space_hid = H5Dget_space (data_hid); + rank = H5Sget_simple_extent_ndims (space_hid); + + if (rank != 0) + { + H5Dclose (data_hid); + H5Gclose (group_hid); + return false; + } + + if (H5Dread (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, + H5P_DEFAULT, (void *) &nz) < 0) + { + H5Dclose (data_hid); + H5Gclose (group_hid); + return false; + } + + H5Dclose (data_hid); + + SparseMatrix m (nr, nc, nz); + + data_hid = H5Dopen (group_hid, "cidx"); + space_hid = H5Dget_space (data_hid); + rank = H5Sget_simple_extent_ndims (space_hid); + + if (rank != 2) + { + H5Sclose (space_hid); + H5Dclose (data_hid); + H5Gclose (group_hid); + return false; + } + + OCTAVE_LOCAL_BUFFER (hsize_t, hdims, rank); + OCTAVE_LOCAL_BUFFER (hsize_t, maxdims, rank); + + H5Sget_simple_extent_dims (space_hid, hdims, maxdims); + + if (hdims[0] != nc + 1 || hdims[1] != 1) + { + H5Sclose (space_hid); + H5Dclose (data_hid); + H5Gclose (group_hid); + return false; + } + + int *itmp = m.xcidx (); + if (H5Dread (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, + H5P_DEFAULT, (void *) itmp) < 0) + { + H5Sclose (space_hid); + H5Dclose (data_hid); + H5Gclose (group_hid); + return false; + } + + H5Sclose (space_hid); + H5Dclose (data_hid); + + data_hid = H5Dopen (group_hid, "ridx"); + space_hid = H5Dget_space (data_hid); + rank = H5Sget_simple_extent_ndims (space_hid); + + if (rank != 2) + { + H5Sclose (space_hid); + H5Dclose (data_hid); + H5Gclose (group_hid); + return false; + } + + H5Sget_simple_extent_dims (space_hid, hdims, maxdims); + + if (hdims[0] != nz || hdims[1] != 1) + { + H5Sclose (space_hid); + H5Dclose (data_hid); + H5Gclose (group_hid); + return false; + } + + itmp = m.xridx (); + if (H5Dread (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, + H5P_DEFAULT, (void *) itmp) < 0) + { + H5Sclose (space_hid); + H5Dclose (data_hid); + H5Gclose (group_hid); + return false; + } + + H5Sclose (space_hid); + H5Dclose (data_hid); + + data_hid = H5Dopen (group_hid, "data"); + space_hid = H5Dget_space (data_hid); + rank = H5Sget_simple_extent_ndims (space_hid); + + if (rank != 2) + { + H5Sclose (space_hid); + H5Dclose (data_hid); + H5Gclose (group_hid); + return false; + } + + H5Sget_simple_extent_dims (space_hid, hdims, maxdims); + + if (hdims[0] != nz || hdims[1] != 1) + { + H5Sclose (space_hid); + H5Dclose (data_hid); + H5Gclose (group_hid); + return false; + } + + double *dtmp = m.xdata (); + if (H5Dread (data_hid, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, + H5P_DEFAULT, (void *) dtmp) < 0) + { + H5Sclose (space_hid); + H5Dclose (data_hid); + H5Gclose (group_hid); + return false; + } + + H5Sclose (space_hid); + H5Dclose (data_hid); + H5Gclose (group_hid); + + matrix = m; + + return true; +} +#endif + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/ov-re-sparse.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/ov-re-sparse.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,148 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#if !defined (octave_sparse_matrix_h) +#define octave_sparse_matrix_h 1 + +#include + +#include +#include + +#include "mx-base.h" +#include "oct-alloc.h" +#include "so-array.h" +#include "str-vec.h" + +#include "error.h" +#include "oct-stream.h" +#include "ov-base.h" +#include "ov-typeinfo.h" + +#include "dSparse.h" +#include "SparseType.h" +#include "ov-base-sparse.h" +#include "ov-bool-sparse.h" +#include "ov-cx-sparse.h" + +class Octave_map; +class octave_value_list; + +class tree_walker; + +class +octave_sparse_matrix : public octave_base_sparse +{ +public: + + octave_sparse_matrix (void) + : octave_base_sparse () { } + + octave_sparse_matrix (const Matrix& m) + : octave_base_sparse (SparseMatrix (m)) { } + + octave_sparse_matrix (const NDArray& m) + : octave_base_sparse (SparseMatrix (m)) { } + + octave_sparse_matrix (const SparseMatrix& m) + : octave_base_sparse (m) { } + + octave_sparse_matrix (const SparseMatrix& m, const SparseType& t) + : octave_base_sparse (m, t) { } + + octave_sparse_matrix (const MSparse& m) + : octave_base_sparse (m) { } + + octave_sparse_matrix (const octave_sparse_matrix& m) + : octave_base_sparse (m) { } + + ~octave_sparse_matrix (void) { } + + octave_value *clone (void) const { return new octave_sparse_matrix (*this); } + octave_value *empty_clone (void) const { return new octave_sparse_matrix (); } + + octave_value *try_narrowing_conversion (void); + +#if 0 + idx_vector index_vector (void) const { return idx_vector (matrix); } +#endif + + bool is_real_matrix (void) const { return true; } + + bool is_real_type (void) const { return true; } + + bool valid_as_scalar_index (void) const; + + double double_value (bool = false) const; + + double scalar_value (bool frc_str_conv = false) const + { return double_value (frc_str_conv); } + + Matrix matrix_value (bool = false) const; + + Complex complex_value (bool = false) const; + + ComplexMatrix complex_matrix_value (bool = false) const; + + ComplexNDArray complex_array_value (bool = false) const; + + NDArray array_value (bool = false) const; + + SparseMatrix sparse_matrix_value (bool = false) const + { return matrix; } + + SparseComplexMatrix sparse_complex_matrix_value (bool = false) const + { return SparseComplexMatrix (matrix); } + + streamoff_array streamoff_array_value (void) const; + +#if 0 + int write (octave_stream& os, int block_size, + oct_data_conv::data_type output_type, int skip, + oct_mach_info::float_format flt_fmt) const + { return os.write (matrix, block_size, output_type, skip, flt_fmt); } +#endif + + bool save_binary (std::ostream& os, bool& save_as_floats); + + bool load_binary (std::istream& is, bool swap, + oct_mach_info::float_format fmt); + +#if defined (HAVE_HDF5) + bool save_hdf5 (hid_t loc_id, const char *name, bool save_as_floats); + + bool load_hdf5 (hid_t loc_id, const char *name, bool have_h5giterate_bug); +#endif + +private: + + DECLARE_OCTAVE_ALLOCATOR + + DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA +}; + +#endif + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/ov-uint16.cc --- a/src/ov-uint16.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/ov-uint16.cc Fri Feb 25 19:55:28 2005 +0000 @@ -27,7 +27,6 @@ #include #include -#include #include "lo-ieee.h" #include "lo-utils.h" diff -r 9f3299378193 -r 57077d0ddc8e src/ov-uint32.cc --- a/src/ov-uint32.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/ov-uint32.cc Fri Feb 25 19:55:28 2005 +0000 @@ -27,7 +27,6 @@ #include #include -#include #include "lo-ieee.h" #include "lo-utils.h" diff -r 9f3299378193 -r 57077d0ddc8e src/ov-uint64.cc --- a/src/ov-uint64.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/ov-uint64.cc Fri Feb 25 19:55:28 2005 +0000 @@ -27,7 +27,6 @@ #include #include -#include #include "lo-ieee.h" #include "lo-utils.h" diff -r 9f3299378193 -r 57077d0ddc8e src/ov-uint8.cc --- a/src/ov-uint8.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/ov-uint8.cc Fri Feb 25 19:55:28 2005 +0000 @@ -27,7 +27,6 @@ #include #include -#include #include "lo-ieee.h" #include "lo-utils.h" diff -r 9f3299378193 -r 57077d0ddc8e src/ov.cc --- a/src/ov.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/ov.cc Fri Feb 25 19:55:28 2005 +0000 @@ -38,6 +38,9 @@ #include "ov-cell.h" #include "ov-scalar.h" #include "ov-re-mat.h" +#include "ov-bool-sparse.h" +#include "ov-cx-sparse.h" +#include "ov-re-sparse.h" #include "ov-int8.h" #include "ov-int16.h" #include "ov-int32.h" @@ -602,6 +605,27 @@ maybe_mutate (); } +octave_value::octave_value (const SparseMatrix& m, const SparseType &t) + : rep (new octave_sparse_matrix (m, t)) +{ + rep->count = 1; + maybe_mutate (); +} + +octave_value::octave_value (const SparseComplexMatrix& m, const SparseType &t) + : rep (new octave_sparse_complex_matrix (m, t)) +{ + rep->count = 1; + maybe_mutate (); +} + +octave_value::octave_value (const SparseBoolMatrix& bm, const SparseType &t) + : rep (new octave_sparse_bool_matrix (bm, t)) +{ + rep->count = 1; + maybe_mutate (); +} + octave_value::octave_value (const octave_int8& i) : rep (new octave_int8_scalar (i)) { @@ -1705,6 +1729,13 @@ { octave_value retval; + // Rapid return for concatenation with an empty object. Dimension + // checking handled elsewhere. + if (v1.all_zero_dims ()) + return v2; + if (v2.all_zero_dims ()) + return v1; + int t1 = v1.type_id (); int t2 = v2.type_id (); @@ -2165,6 +2196,9 @@ octave_uint16_matrix::register_type (); octave_uint32_matrix::register_type (); octave_uint64_matrix::register_type (); + octave_sparse_bool_matrix::register_type (); + octave_sparse_matrix::register_type (); + octave_sparse_complex_matrix::register_type (); octave_struct::register_type (); octave_file::register_type (); octave_list::register_type (); diff -r 9f3299378193 -r 57077d0ddc8e src/ov.h --- a/src/ov.h Fri Feb 25 17:42:55 2005 +0000 +++ b/src/ov.h Fri Feb 25 19:55:28 2005 +0000 @@ -39,6 +39,7 @@ #include "oct-alloc.h" #include "oct-time.h" #include "str-vec.h" +#include "SparseType.h" class Cell; class streamoff_array; @@ -214,6 +215,11 @@ octave_value (const charMatrix& chm, bool is_string = false); octave_value (const charNDArray& chnda, bool is_string = false); octave_value (const ArrayN& chnda, bool is_string = false); + octave_value (const SparseMatrix& m, const SparseType& t = SparseType ()); + octave_value (const SparseComplexMatrix& m, + const SparseType& t = SparseType ()); + octave_value (const SparseBoolMatrix& bm, + const SparseType& t = SparseType ()); octave_value (const octave_int8& i); octave_value (const octave_int16& i); octave_value (const octave_int32& i); @@ -356,9 +362,14 @@ int ndims (void) const; + bool all_zero_dims (void) const { return dims().all_zero (); } + virtual int numel (void) const { return rep->numel (); } + virtual int capacity (void) const + { return rep->capacity (); } + virtual size_t byte_size (void) const { return rep->byte_size (); } @@ -568,6 +579,15 @@ virtual charNDArray char_array_value (bool frc_str_conv = false) const { return rep->char_array_value (frc_str_conv); } + virtual SparseMatrix sparse_matrix_value (bool frc_str_conv = false) const + { return rep->sparse_matrix_value (frc_str_conv); } + + virtual SparseComplexMatrix sparse_complex_matrix_value (bool frc_str_conv = false) const + { return rep->sparse_complex_matrix_value (frc_str_conv); } + + virtual SparseBoolMatrix sparse_bool_matrix_value (bool frc_str_conv = false) const + { return rep->sparse_bool_matrix_value (frc_str_conv); } + virtual octave_int8 int8_scalar_value (void) const { return rep->int8_scalar_value (); } diff -r 9f3299378193 -r 57077d0ddc8e src/pt-arg-list.cc --- a/src/pt-arg-list.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/pt-arg-list.cc Fri Feb 25 19:55:28 2005 +0000 @@ -125,10 +125,6 @@ { case -1: { - // We want numel = prod (size ()) here, so don't use - // index_object->numel () as that may be different (it is - // the number of nonzero elements for sparse arrays). - int numel = dv.numel (); if (numel < 0) diff -r 9f3299378193 -r 57077d0ddc8e src/pt-mat.cc --- a/src/pt-mat.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/pt-mat.cc Fri Feb 25 19:55:28 2005 +0000 @@ -592,10 +592,24 @@ ctmp = octave_value (charNDArray (dv, Vstring_fill_char), true); else { - if (all_empty_p) - ctmp = (*(tmp.begin() -> begin())); - else - ctmp = (*(tmp.begin() -> begin())).resize (dim_vector (0,0)).resize (dv); + // Find the first non-empty object + for (tm_const::iterator p = tmp.begin (); p != tmp.end (); p++) + { + tm_row_const row = *p; + for (tm_row_const::iterator q = row.begin (); + q != row.end (); q++) + { + ctmp = *q; + if (! ctmp.all_zero_dims ()) + goto found_non_empty; + } + } + + ctmp = (*(tmp.begin() -> begin())); + + found_non_empty: + if (! all_empty_p) + ctmp = ctmp.resize (dim_vector (0,0)).resize (dv); } if (error_state) diff -r 9f3299378193 -r 57077d0ddc8e src/sparse-xdiv.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/sparse-xdiv.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,640 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "Array-util.h" +#include "oct-cmplx.h" +#include "quit.h" +#include "error.h" + +#include "dSparse.h" +#include "CSparse.h" +#include "oct-spparms.h" +#include "sparse-xdiv.h" + +static inline bool +result_ok (int info) +{ +#ifdef HAVE_LSSOLVE + return (info != -2 && info != -1); +#else + // If the matrix is singular, who cares as we don't have QR based solver yet + return (info != -1); +#endif +} + +static void +solve_singularity_warning (double rcond) +{ + warning ("matrix singular to machine precision, rcond = %g", rcond); + warning ("attempting to find minimum norm solution"); +} + +template +bool +mx_leftdiv_conform (const T1& a, const T2& b) +{ + int a_nr = a.rows (); + int b_nr = b.rows (); + + if (a_nr != b_nr) + { + int a_nc = a.cols (); + int b_nc = b.cols (); + + gripe_nonconformant ("operator \\", a_nr, a_nc, b_nr, b_nc); + return false; + } + + return true; +} + +#define INSTANTIATE_MX_LEFTDIV_CONFORM(T1, T2) \ + template bool mx_leftdiv_conform (const T1&, const T2&) + +INSTANTIATE_MX_LEFTDIV_CONFORM (SparseMatrix, SparseMatrix); +INSTANTIATE_MX_LEFTDIV_CONFORM (SparseMatrix, SparseComplexMatrix); +INSTANTIATE_MX_LEFTDIV_CONFORM (SparseComplexMatrix, SparseMatrix); +INSTANTIATE_MX_LEFTDIV_CONFORM (SparseComplexMatrix, SparseComplexMatrix); +INSTANTIATE_MX_LEFTDIV_CONFORM (SparseMatrix, Matrix); +INSTANTIATE_MX_LEFTDIV_CONFORM (SparseMatrix, ComplexMatrix); +INSTANTIATE_MX_LEFTDIV_CONFORM (SparseComplexMatrix, Matrix); +INSTANTIATE_MX_LEFTDIV_CONFORM (SparseComplexMatrix, ComplexMatrix); + +template +bool +mx_div_conform (const T1& a, const T2& b) +{ + int a_nc = a.cols (); + int b_nc = b.cols (); + + if (a_nc != b_nc) + { + int a_nr = a.rows (); + int b_nr = b.rows (); + + gripe_nonconformant ("operator /", a_nr, a_nc, b_nr, b_nc); + return false; + } + + return true; +} + +#define INSTANTIATE_MX_DIV_CONFORM(T1, T2) \ + template bool mx_div_conform (const T1&, const T2&) + +INSTANTIATE_MX_DIV_CONFORM (SparseMatrix, SparseMatrix); +INSTANTIATE_MX_DIV_CONFORM (SparseMatrix, SparseComplexMatrix); +INSTANTIATE_MX_DIV_CONFORM (SparseComplexMatrix, SparseMatrix); +INSTANTIATE_MX_DIV_CONFORM (SparseComplexMatrix, SparseComplexMatrix); +INSTANTIATE_MX_DIV_CONFORM (Matrix, SparseMatrix); +INSTANTIATE_MX_DIV_CONFORM (Matrix, SparseComplexMatrix); +INSTANTIATE_MX_DIV_CONFORM (ComplexMatrix, SparseMatrix); +INSTANTIATE_MX_DIV_CONFORM (ComplexMatrix, SparseComplexMatrix); + +// Right division functions. +// +// op2 / op1: m cm sm scm +// +-- +---+----+----+----+ +// sparse matrix | 1 | 3 | 5 | 7 | +// +---+----+----+----+ +// sparse complex_matrix | 2 | 4 | 6 | 8 | +// +---+----+----+----+ + +// -*- 1 -*- +Matrix +xdiv (const Matrix& a, const SparseMatrix& b) +{ + if (! mx_div_conform (a, b)) + return Matrix (); + + Matrix atmp = a.transpose (); + SparseMatrix btmp = b.transpose (); + + int info; + if (btmp.rows () == btmp.columns ()) + { + double rcond = 0.0; + + Matrix result = btmp.solve (atmp, info, rcond, + solve_singularity_warning); + + if (result_ok (info)) + return Matrix (result.transpose ()); + } + + int rank; + Matrix result = btmp.lssolve (atmp, info, rank); + + return result.transpose (); +} + +// -*- 2 -*- +ComplexMatrix +xdiv (const Matrix& a, const SparseComplexMatrix& b) +{ + if (! mx_div_conform (a, b)) + return ComplexMatrix (); + + Matrix atmp = a.transpose (); + SparseComplexMatrix btmp = b.hermitian (); + + int info; + if (btmp.rows () == btmp.columns ()) + { + double rcond = 0.0; + + ComplexMatrix result + = btmp.solve (atmp, info, rcond, solve_singularity_warning); + + if (result_ok (info)) + return result.hermitian (); + } + + int rank; + ComplexMatrix result = btmp.lssolve (atmp, info, rank); + + return result.hermitian (); +} + +// -*- 3 -*- +ComplexMatrix +xdiv (const ComplexMatrix& a, const SparseMatrix& b) +{ + if (! mx_div_conform (a, b)) + return ComplexMatrix (); + + ComplexMatrix atmp = a.hermitian (); + SparseMatrix btmp = b.transpose (); + + int info; + if (btmp.rows () == btmp.columns ()) + { + double rcond = 0.0; + + ComplexMatrix result + = btmp.solve (atmp, info, rcond, solve_singularity_warning); + + if (result_ok (info)) + return result.hermitian (); + } + + int rank; + ComplexMatrix result = btmp.lssolve (atmp, info, rank); + + return result.hermitian (); +} + +// -*- 4 -*- +ComplexMatrix +xdiv (const ComplexMatrix& a, const SparseComplexMatrix& b) +{ + if (! mx_div_conform (a, b)) + return ComplexMatrix (); + + ComplexMatrix atmp = a.hermitian (); + SparseComplexMatrix btmp = b.hermitian (); + + int info; + if (btmp.rows () == btmp.columns ()) + { + double rcond = 0.0; + + ComplexMatrix result + = btmp.solve (atmp, info, rcond, solve_singularity_warning); + + if (result_ok (info)) + return result.hermitian (); + } + + int rank; + ComplexMatrix result = btmp.lssolve (atmp, info, rank); + + return result.hermitian (); +} + +// -*- 5 -*- +SparseMatrix +xdiv (const SparseMatrix& a, const SparseMatrix& b) +{ + if (! mx_div_conform (a, b)) + return SparseMatrix (); + + SparseMatrix atmp = a.transpose (); + SparseMatrix btmp = b.transpose (); + + int info; + if (btmp.rows () == btmp.columns ()) + { + double rcond = 0.0; + + SparseMatrix result = btmp.solve (atmp, info, rcond, + solve_singularity_warning); + + if (result_ok (info)) + return SparseMatrix (result.transpose ()); + } + + int rank; + SparseMatrix result = btmp.lssolve (atmp, info, rank); + + return result.transpose (); +} + +// -*- 6 -*- +SparseComplexMatrix +xdiv (const SparseMatrix& a, const SparseComplexMatrix& b) +{ + if (! mx_div_conform (a, b)) + return SparseComplexMatrix (); + + SparseMatrix atmp = a.transpose (); + SparseComplexMatrix btmp = b.hermitian (); + + int info; + if (btmp.rows () == btmp.columns ()) + { + double rcond = 0.0; + + SparseComplexMatrix result + = btmp.solve (atmp, info, rcond, solve_singularity_warning); + + if (result_ok (info)) + return result.hermitian (); + } + + int rank; + SparseComplexMatrix result = btmp.lssolve (atmp, info, rank); + + return result.hermitian (); +} + +// -*- 7 -*- +SparseComplexMatrix +xdiv (const SparseComplexMatrix& a, const SparseMatrix& b) +{ + if (! mx_div_conform (a, b)) + return SparseComplexMatrix (); + + SparseComplexMatrix atmp = a.hermitian (); + SparseMatrix btmp = b.transpose (); + + int info; + if (btmp.rows () == btmp.columns ()) + { + double rcond = 0.0; + + SparseComplexMatrix result + = btmp.solve (atmp, info, rcond, solve_singularity_warning); + + if (result_ok (info)) + return result.hermitian (); + } + + int rank; + SparseComplexMatrix result = btmp.lssolve (atmp, info, rank); + + return result.hermitian (); +} + +// -*- 8 -*- +SparseComplexMatrix +xdiv (const SparseComplexMatrix& a, const SparseComplexMatrix& b) +{ + if (! mx_div_conform (a, b)) + return SparseComplexMatrix (); + + SparseComplexMatrix atmp = a.hermitian (); + SparseComplexMatrix btmp = b.hermitian (); + + int info; + if (btmp.rows () == btmp.columns ()) + { + double rcond = 0.0; + + SparseComplexMatrix result + = btmp.solve (atmp, info, rcond, solve_singularity_warning); + + if (result_ok (info)) + return result.hermitian (); + } + + int rank; + SparseComplexMatrix result = btmp.lssolve (atmp, info, rank); + + return result.hermitian (); +} + +// Funny element by element division operations. +// +// op2 \ op1: s cs +// +-- +---+----+ +// matrix | 1 | 3 | +// +---+----+ +// complex_matrix | 2 | 4 | +// +---+----+ + +Matrix +x_el_div (double a, const SparseMatrix& b) +{ + int nr = b.rows (); + int nc = b.cols (); + + Matrix result; + if (a == 0.) + result = Matrix (nr, nc, octave_NaN); + else if (a > 0.) + result = Matrix (nr, nc, octave_Inf); + else + result = Matrix (nr, nc, -octave_Inf); + + + for (int j = 0; j < nc; j++) + for (int i = b.cidx(j); i < b.cidx(j+1); i++) + { + OCTAVE_QUIT; + result.elem (b.ridx(i), j) = a / b.data (i); + } + + return result; +} + +ComplexMatrix +x_el_div (double a, const SparseComplexMatrix& b) +{ + int nr = b.rows (); + int nc = b.cols (); + + ComplexMatrix result (nr, nc, Complex(octave_NaN, octave_NaN)); + + for (int j = 0; j < nc; j++) + for (int i = b.cidx(j); i < b.cidx(j+1); i++) + { + OCTAVE_QUIT; + result.elem (b.ridx(i), j) = a / b.data (i); + } + + return result; +} + +ComplexMatrix +x_el_div (const Complex a, const SparseMatrix& b) +{ + int nr = b.rows (); + int nc = b.cols (); + + ComplexMatrix result (nr, nc, (a / 0.0)); + + for (int j = 0; j < nc; j++) + for (int i = b.cidx(j); i < b.cidx(j+1); i++) + { + OCTAVE_QUIT; + result.elem (b.ridx(i), j) = a / b.data (i); + } + + return result; +} + +ComplexMatrix +x_el_div (const Complex a, const SparseComplexMatrix& b) +{ + int nr = b.rows (); + int nc = b.cols (); + + ComplexMatrix result (nr, nc, (a / 0.0)); + + for (int j = 0; j < nc; j++) + for (int i = b.cidx(j); i < b.cidx(j+1); i++) + { + OCTAVE_QUIT; + result.elem (b.ridx(i), j) = a / b.data (i); + } + + return result; +} + +// Left division functions. +// +// op2 \ op1: m cm +// +-- +---+----+ +// matrix | 1 | 5 | +// +---+----+ +// complex_matrix | 2 | 6 | +// +---+----+ +// sparse matrix | 3 | 7 | +// +---+----+ +// sparse complex_matrix | 4 | 8 | +// +---+----+ + +// -*- 1 -*- +Matrix +xleftdiv (const SparseMatrix& a, const Matrix& b) +{ + if (! mx_leftdiv_conform (a, b)) + return Matrix (); + + int info; + if (a.rows () == a.columns ()) + { + double rcond = 0.0; + + Matrix result + = a.solve (b, info, rcond, solve_singularity_warning); + + if (result_ok (info)) + return result; + } + + int rank; + return a.lssolve (b, info, rank); +} + +// -*- 2 -*- +ComplexMatrix +xleftdiv (const SparseMatrix& a, const ComplexMatrix& b) +{ + if (! mx_leftdiv_conform (a, b)) + return ComplexMatrix (); + + int info; + if (a.rows () == a.columns ()) + { + double rcond = 0.0; + + ComplexMatrix result + = a.solve (b, info, rcond, solve_singularity_warning); + + if (result_ok (info)) + return result; + } + + int rank; + return a.lssolve (b, info, rank); +} + +// -*- 3 -*- +SparseMatrix +xleftdiv (const SparseMatrix& a, const SparseMatrix& b) +{ + if (! mx_leftdiv_conform (a, b)) + return SparseMatrix (); + + int info; + if (a.rows () == a.columns ()) + { + double rcond = 0.0; + + SparseMatrix result + = a.solve (b, info, rcond, solve_singularity_warning); + + if (result_ok (info)) + return result; + } + + int rank; + return a.lssolve (b, info, rank); +} + +// -*- 4 -*- +SparseComplexMatrix +xleftdiv (const SparseMatrix& a, const SparseComplexMatrix& b) +{ + if (! mx_leftdiv_conform (a, b)) + return SparseComplexMatrix (); + + int info; + if (a.rows () == a.columns ()) + { + double rcond = 0.0; + + SparseComplexMatrix result + = a.solve (b, info, rcond, solve_singularity_warning); + + if (result_ok (info)) + return result; + } + + int rank; + return a.lssolve (b, info, rank); +} + +// -*- 5 -*- +ComplexMatrix +xleftdiv (const SparseComplexMatrix& a, const Matrix& b) +{ + if (! mx_leftdiv_conform (a, b)) + return ComplexMatrix (); + + int info; + if (a.rows () == a.columns ()) + { + double rcond = 0.0; + + ComplexMatrix result + = a.solve (b, info, rcond, solve_singularity_warning); + + if (result_ok (info)) + return result; + } + + int rank; + return a.lssolve (b, info, rank); +} + +// -*- 6 -*- +ComplexMatrix +xleftdiv (const SparseComplexMatrix& a, const ComplexMatrix& b) +{ + if (! mx_leftdiv_conform (a, b)) + return ComplexMatrix (); + + int info; + if (a.rows () == a.columns ()) + { + double rcond = 0.0; + + ComplexMatrix result + = a.solve (b, info, rcond, solve_singularity_warning); + + if (result_ok (info)) + return result; + } + + int rank; + return a.lssolve (b, info, rank); +} + +// -*- 7 -*- +SparseComplexMatrix +xleftdiv (const SparseComplexMatrix& a, const SparseMatrix& b) +{ + if (! mx_leftdiv_conform (a, b)) + return SparseComplexMatrix (); + + int info; + if (a.rows () == a.columns ()) + { + double rcond = 0.0; + + SparseComplexMatrix result + = a.solve (b, info, rcond, solve_singularity_warning); + + if (result_ok (info)) + return result; + } + + int rank; + return a.lssolve (b, info, rank); +} + +// -*- 8 -*- +SparseComplexMatrix +xleftdiv (const SparseComplexMatrix& a, const SparseComplexMatrix& b) +{ + if (! mx_leftdiv_conform (a, b)) + return SparseComplexMatrix (); + + int info; + if (a.rows () == a.columns ()) + { + double rcond = 0.0; + + SparseComplexMatrix result + = a.solve (b, info, rcond, solve_singularity_warning); + + if (result_ok (info)) + return result; + } + + int rank; + return a.lssolve (b, info, rank); +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/sparse-xdiv.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/sparse-xdiv.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,70 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#if !defined (octave_sparse_xdiv_h) +#define octave_sparse_xdiv_h 1 + +#include "oct-cmplx.h" + +class SparseMatrix; +class SparseComplexMatrix; + +extern Matrix xdiv (const Matrix& a, const SparseMatrix& b); +extern ComplexMatrix xdiv (const Matrix& a, const SparseComplexMatrix& b); +extern ComplexMatrix xdiv (const ComplexMatrix& a, const SparseMatrix& b); +extern ComplexMatrix xdiv (const ComplexMatrix& a, + const SparseComplexMatrix& b); + +extern SparseMatrix xdiv (const SparseMatrix& a, const SparseMatrix& b); +extern SparseComplexMatrix xdiv (const SparseMatrix& a, + const SparseComplexMatrix& b); +extern SparseComplexMatrix xdiv (const SparseComplexMatrix& a, + const SparseMatrix& b); +extern SparseComplexMatrix xdiv (const SparseComplexMatrix& a, + const SparseComplexMatrix& b); + +extern Matrix x_el_div (double a, const SparseMatrix& b); +extern ComplexMatrix x_el_div (double a, const SparseComplexMatrix& b); +extern ComplexMatrix x_el_div (const Complex a, const SparseMatrix& b); +extern ComplexMatrix x_el_div (const Complex a, + const SparseComplexMatrix& b); + +extern Matrix xleftdiv (const SparseMatrix& a, const Matrix& b); +extern ComplexMatrix xleftdiv (const SparseMatrix& a, const ComplexMatrix& b); +extern ComplexMatrix xleftdiv (const SparseComplexMatrix& a, const Matrix& b); +extern ComplexMatrix xleftdiv (const SparseComplexMatrix& a, + const ComplexMatrix& b); + +extern SparseMatrix xleftdiv (const SparseMatrix& a, const SparseMatrix& b); +extern SparseComplexMatrix xleftdiv (const SparseMatrix& a, + const SparseComplexMatrix& b); +extern SparseComplexMatrix xleftdiv (const SparseComplexMatrix& a, + const SparseMatrix& b); +extern SparseComplexMatrix xleftdiv (const SparseComplexMatrix& a, + const SparseComplexMatrix& b); + +#endif + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/sparse-xpow.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/sparse-xpow.cc Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,795 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include "Array-util.h" +#include "oct-cmplx.h" +#include "quit.h" + +#include "error.h" +#include "oct-obj.h" +#include "utils.h" + +#include "dSparse.h" +#include "CSparse.h" +#include "ov-re-sparse.h" +#include "ov-cx-sparse.h" +#include "sparse-xpow.h" + +static inline int +xisint (double x) +{ + return (D_NINT (x) == x + && ((x >= 0 && x < INT_MAX) + || (x <= 0 && x > INT_MIN))); +} + + +// Safer pow functions. Only two make sense for sparse matrices, the +// others should all promote to full matrices. + +octave_value +xpow (const SparseMatrix& a, double b) +{ + octave_value retval; + + int nr = a.rows (); + int nc = a.cols (); + + if (nr == 0 || nc == 0 || nr != nc) + error ("for A^b, A must be square"); + else + { + if (static_cast (b) == b) + { + int btmp = static_cast (b); + if (btmp == 0) + { + SparseMatrix tmp = SparseMatrix (nr, nr, nr); + for (int i = 0; i < nr; i++) + { + tmp.data (i) = 1.0; + tmp.ridx (i) = i; + } + for (int i = 0; i < nr + 1; i++) + tmp.cidx (i) = i; + + retval = tmp; + } + else + { + SparseMatrix atmp; + if (btmp < 0) + { + btmp = -btmp; + + int info; + double rcond = 0.0; + + atmp = a.inverse (info, rcond, 1); + + if (info == -1) + warning ("inverse: matrix singular to machine\ + precision, rcond = %g", rcond); + } + else + atmp = a; + + SparseMatrix result (atmp); + + btmp--; + + while (btmp > 0) + { + if (btmp & 1) + result = result * atmp; + + btmp >>= 1; + + if (btmp > 0) + atmp = atmp * atmp; + } + + retval = result; + } + } + else + error ("use full(a) ^ full(b)"); + } + + return retval; +} + +octave_value +xpow (const SparseComplexMatrix& a, double b) +{ + octave_value retval; + + int nr = a.rows (); + int nc = a.cols (); + + if (nr == 0 || nc == 0 || nr != nc) + error ("for A^b, A must be square"); + else + { + if (static_cast (b) == b) + { + int btmp = static_cast (b); + if (btmp == 0) + { + SparseMatrix tmp = SparseMatrix (nr, nr, nr); + for (int i = 0; i < nr; i++) + { + tmp.data (i) = 1.0; + tmp.ridx (i) = i; + } + for (int i = 0; i < nr + 1; i++) + tmp.cidx (i) = i; + + retval = tmp; + } + else + { + SparseComplexMatrix atmp; + if (btmp < 0) + { + btmp = -btmp; + + int info; + double rcond = 0.0; + + atmp = a.inverse (info, rcond, 1); + + if (info == -1) + warning ("inverse: matrix singular to machine\ + precision, rcond = %g", rcond); + } + else + atmp = a; + + SparseComplexMatrix result (atmp); + + btmp--; + + while (btmp > 0) + { + if (btmp & 1) + result = result * atmp; + + btmp >>= 1; + + if (btmp > 0) + atmp = atmp * atmp; + } + + retval = result; + } + } + else + error ("use full(a) ^ full(b)"); + } + + return retval; +} + +// Safer pow functions that work elementwise for matrices. +// +// op2 \ op1: s m cs cm +// +-- +---+---+----+----+ +// scalar | | * | 3 | * | 9 | +// +---+---+----+----+ +// matrix | 1 | 4 | 7 | 10 | +// +---+---+----+----+ +// complex_scalar | * | 5 | * | 11 | +// +---+---+----+----+ +// complex_matrix | 2 | 6 | 8 | 12 | +// +---+---+----+----+ +// +// * -> not needed. + +// XXX FIXME XXX -- these functions need to be fixed so that things +// like +// +// a = -1; b = [ 0, 0.5, 1 ]; r = a .^ b +// +// and +// +// a = -1; b = [ 0, 0.5, 1 ]; for i = 1:3, r(i) = a .^ b(i), end +// +// produce identical results. Also, it would be nice if -1^0.5 +// produced a pure imaginary result instead of a complex number with a +// small real part. But perhaps that's really a problem with the math +// library... + +// -*- 1 -*- +octave_value +elem_xpow (double a, const SparseMatrix& b) +{ + octave_value retval; + + int nr = b.rows (); + int nc = b.cols (); + + double d1, d2; + + if (a < 0.0 && ! b.all_integers (d1, d2)) + { + Complex atmp (a); + ComplexMatrix result (nr, nc); + + for (int j = 0; j < nc; j++) + { + for (int i = 0; i < nr; i++) + { + OCTAVE_QUIT; + result (i, j) = pow (atmp, b(i,j)); + } + } + + retval = result; + } + else + { + Matrix result (nr, nc); + + for (int j = 0; j < nc; j++) + { + for (int i = 0; i < nr; i++) + { + OCTAVE_QUIT; + result (i, j) = pow (a, b(i,j)); + } + } + + retval = result; + } + + return retval; +} + +// -*- 2 -*- +octave_value +elem_xpow (double a, const SparseComplexMatrix& b) +{ + int nr = b.rows (); + int nc = b.cols (); + + Complex atmp (a); + ComplexMatrix result (nr, nc); + + for (int j = 0; j < nc; j++) + { + for (int i = 0; i < nr; i++) + { + OCTAVE_QUIT; + result (i, j) = pow (atmp, b(i,j)); + } + } + + return result; +} + +// -*- 3 -*- +octave_value +elem_xpow (const SparseMatrix& a, double b) +{ + // XXX FIXME XXX What should a .^ 0 give?? Matlab gives a + // sparse matrix with same structure as a, which is strictly + // incorrect. Keep compatiability. + + octave_value retval; + + int nz = a.nnz (); + + if (b <= 0.0) + { + int nr = a.rows (); + int nc = a.cols (); + + if (static_cast (b) != b && a.any_element_is_negative ()) + { + ComplexMatrix result (nr, nc, Complex (pow (0.0, b))); + + // XXX FIXME XXX -- avoid apparent GNU libm bug by + // converting A and B to complex instead of just A. + Complex btmp (b); + + for (int j = 0; j < nc; j++) + for (int i = a.cidx(j); i < a.cidx(j+1); i++) + { + OCTAVE_QUIT; + + Complex atmp (a.data (i)); + + result (a.ridx(i), j) = pow (atmp, btmp); + } + + retval = octave_value (result); + } + else + { + Matrix result (nr, nc, (pow (0.0, b))); + + for (int j = 0; j < nc; j++) + for (int i = a.cidx(j); i < a.cidx(j+1); i++) + { + OCTAVE_QUIT; + result (a.ridx(i), j) = pow (a.data (i), b); + } + + retval = octave_value (result); + } + } + else if (static_cast (b) != b && a.any_element_is_negative ()) + { + SparseComplexMatrix result (a); + + for (int i = 0; i < nz; i++) + { + OCTAVE_QUIT; + + // XXX FIXME XXX -- avoid apparent GNU libm bug by + // converting A and B to complex instead of just A. + + Complex atmp (a.data (i)); + Complex btmp (b); + + result.data (i) = pow (atmp, btmp); + } + + result.maybe_compress (true); + + retval = result; + } + else + { + SparseMatrix result (a); + + for (int i = 0; i < nz; i++) + { + OCTAVE_QUIT; + result.data (i) = pow (a.data (i), b); + } + + result.maybe_compress (true); + + retval = result; + } + + return retval; +} + +// -*- 4 -*- +octave_value +elem_xpow (const SparseMatrix& a, const SparseMatrix& b) +{ + octave_value retval; + + int nr = a.rows (); + int nc = a.cols (); + + int b_nr = b.rows (); + int b_nc = b.cols (); + + if (nr != b_nr || nc != b_nc) + { + gripe_nonconformant ("operator .^", nr, nc, b_nr, b_nc); + return octave_value (); + } + + int convert_to_complex = 0; + for (int j = 0; j < nc; j++) + for (int i = 0; i < nr; i++) + { + OCTAVE_QUIT; + double atmp = a (i, j); + double btmp = b (i, j); + if (atmp < 0.0 && static_cast (btmp) != btmp) + { + convert_to_complex = 1; + goto done; + } + } + +done: + + int nel = 0; + for (int j = 0; j < nc; j++) + for (int i = 0; i < nr; i++) + if (!(a.elem (i, j) == 0. && b.elem (i, j) != 0.)) + nel++; + + if (convert_to_complex) + { + SparseComplexMatrix complex_result (nr, nc, nel); + + int ii = 0; + complex_result.cidx(0) = 0; + for (int j = 0; j < nc; j++) + { + for (int i = 0; i < nr; i++) + { + OCTAVE_QUIT; + Complex atmp (a (i, j)); + Complex btmp (b (i, j)); + Complex tmp = pow (atmp, btmp); + if (tmp != 0.) + { + complex_result.data (ii) = tmp; + complex_result.ridx (ii++) = i; + } + } + complex_result.cidx (j+1) = ii; + } + complex_result.maybe_compress (); + + retval = complex_result; + } + else + { + SparseMatrix result (nr, nc, nel); + int ii = 0; + + result.cidx (0) = 0; + for (int j = 0; j < nc; j++) + { + for (int i = 0; i < nr; i++) + { + OCTAVE_QUIT; + double tmp = pow (a (i, j), b (i, j)); + if (tmp != 0.) + { + result.data (ii) = tmp; + result.ridx (ii++) = i; + } + } + result.cidx (j+1) = ii; + } + + result.maybe_compress (); + + retval = result; + } + + return retval; +} + +// -*- 5 -*- +octave_value +elem_xpow (const SparseMatrix& a, const Complex& b) +{ + octave_value retval; + + if (b == 0.0) + // Can this case ever happen, due to automatic retyping with maybe_mutate? + retval = octave_value (NDArray (a.dims (), 1)); + else + { + int nz = a.nnz (); + SparseComplexMatrix result (a); + + for (int i = 0; i < nz; i++) + { + OCTAVE_QUIT; + result.data (i) = pow (Complex (a.data (i)), b); + } + + result.maybe_compress (true); + + retval = result; + } + + return retval; +} + +// -*- 6 -*- +octave_value +elem_xpow (const SparseMatrix& a, const SparseComplexMatrix& b) +{ + int nr = a.rows (); + int nc = a.cols (); + + int b_nr = b.rows (); + int b_nc = b.cols (); + + if (nr != b_nr || nc != b_nc) + { + gripe_nonconformant ("operator .^", nr, nc, b_nr, b_nc); + return octave_value (); + } + + int nel = 0; + for (int j = 0; j < nc; j++) + for (int i = 0; i < nr; i++) + if (!(a.elem (i, j) == 0. && b.elem (i, j) != 0.)) + nel++; + + SparseComplexMatrix result (nr, nc, nel); + int ii = 0; + + result.cidx(0) = 0; + for (int j = 0; j < nc; j++) + { + for (int i = 0; i < nr; i++) + { + OCTAVE_QUIT; + Complex tmp = pow (Complex (a (i, j)), b (i, j)); + if (tmp != 0.) + { + result.data (ii) = tmp; + result.ridx (ii++) = i; + } + } + result.cidx (j+1) = ii; + } + + result.maybe_compress (); + + return result; +} + +// -*- 7 -*- +octave_value +elem_xpow (const Complex& a, const SparseMatrix& b) +{ + int nr = b.rows (); + int nc = b.cols (); + + ComplexMatrix result (nr, nc); + + for (int j = 0; j < nc; j++) + { + for (int i = 0; i < nr; i++) + { + OCTAVE_QUIT; + double btmp = b (i, j); + if (xisint (btmp)) + result (i, j) = pow (a, static_cast (btmp)); + else + result (i, j) = pow (a, btmp); + } + } + + return result; +} + +// -*- 8 -*- +octave_value +elem_xpow (const Complex& a, const SparseComplexMatrix& b) +{ + int nr = b.rows (); + int nc = b.cols (); + + ComplexMatrix result (nr, nc); + for (int j = 0; j < nc; j++) + for (int i = 0; i < nr; i++) + { + OCTAVE_QUIT; + result (i, j) = pow (a, b (i, j)); + } + + return result; +} + +// -*- 9 -*- +octave_value +elem_xpow (const SparseComplexMatrix& a, double b) +{ + octave_value retval; + + if (b <= 0) + { + int nr = a.rows (); + int nc = a.cols (); + + ComplexMatrix result (nr, nc, Complex (pow (0.0, b))); + + if (xisint (b)) + { + for (int j = 0; j < nc; j++) + for (int i = a.cidx(j); i < a.cidx(j+1); i++) + { + OCTAVE_QUIT; + result (a.ridx(i), j) = + pow (a.data (i), static_cast (b)); + } + } + else + { + for (int j = 0; j < nc; j++) + for (int i = a.cidx(j); i < a.cidx(j+1); i++) + { + OCTAVE_QUIT; + result (a.ridx(i), j) = pow (a.data (i), b); + } + } + + retval = result; + } + else + { + int nz = a.nnz (); + + SparseComplexMatrix result (a); + + if (xisint (b)) + { + for (int i = 0; i < nz; i++) + { + OCTAVE_QUIT; + result.data (i) = pow (a.data (i), static_cast (b)); + } + } + else + { + for (int i = 0; i < nz; i++) + { + OCTAVE_QUIT; + result.data (i) = pow (a.data (i), b); + } + } + + result.maybe_compress (true); + + retval = result; + } + + return retval; +} + +// -*- 10 -*- +octave_value +elem_xpow (const SparseComplexMatrix& a, const SparseMatrix& b) +{ + int nr = a.rows (); + int nc = a.cols (); + + int b_nr = b.rows (); + int b_nc = b.cols (); + + if (nr != b_nr || nc != b_nc) + { + gripe_nonconformant ("operator .^", nr, nc, b_nr, b_nc); + return octave_value (); + } + + int nel = 0; + for (int j = 0; j < nc; j++) + for (int i = 0; i < nr; i++) + if (!(a.elem (i, j) == 0. && b.elem (i, j) != 0.)) + nel++; + + SparseComplexMatrix result (nr, nc, nel); + int ii = 0; + + result.cidx (0) = 0; + for (int j = 0; j < nc; j++) + { + for (int i = 0; i < nr; i++) + { + OCTAVE_QUIT; + double btmp = b (i, j); + Complex tmp; + + if (xisint (btmp)) + tmp = pow (a (i, j), static_cast (btmp)); + else + tmp = pow (a (i, j), btmp); + if (tmp != 0.) + { + result.data (ii) = tmp; + result.ridx (ii++) = i; + } + } + result.cidx (j+1) = ii; + } + + result.maybe_compress (); + + return result; +} + +// -*- 11 -*- +octave_value +elem_xpow (const SparseComplexMatrix& a, const Complex& b) +{ + octave_value retval; + + if (b == 0.0) + // Can this case ever happen, due to automatic retyping with maybe_mutate? + retval = octave_value (NDArray (a.dims (), 1)); + else + { + + int nz = a.nnz (); + + SparseComplexMatrix result (a); + + for (int i = 0; i < nz; i++) + { + OCTAVE_QUIT; + result.data (i) = pow (a.data (i), b); + } + + result.maybe_compress (true); + + retval = result; + } + + return retval; +} + +// -*- 12 -*- +octave_value +elem_xpow (const SparseComplexMatrix& a, const SparseComplexMatrix& b) +{ + int nr = a.rows (); + int nc = a.cols (); + + int b_nr = b.rows (); + int b_nc = b.cols (); + + if (nr != b_nr || nc != b_nc) + { + gripe_nonconformant ("operator .^", nr, nc, b_nr, b_nc); + return octave_value (); + } + + int nel = 0; + for (int j = 0; j < nc; j++) + for (int i = 0; i < nr; i++) + if (!(a.elem (i, j) == 0. && b.elem (i, j) != 0.)) + nel++; + + SparseComplexMatrix result (nr, nc, nel); + int ii = 0; + + result.cidx (0) = 0; + for (int j = 0; j < nc; j++) + { + for (int i = 0; i < nr; i++) + { + OCTAVE_QUIT; + Complex tmp = pow (a (i, j), b (i, j)); + if (tmp != 0.) + { + result.data (ii) = tmp; + result.ridx (ii++) = i; + } + } + result.cidx (j+1) = ii; + } + result.maybe_compress (true); + + return result; +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/sparse-xpow.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/sparse-xpow.h Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,61 @@ +/* + +Copyright (C) 2004 David Bateman +Copyright (C) 1998-2004 Andy Adler + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#if !defined (octave_sparse_xpow_h) +#define octave_sparse_xpow_h 1 + +#include "oct-cmplx.h" + +class SparseMatrix; +class SparseComplexMatrix; +class octave_value; + +extern octave_value xpow (const SparseMatrix& a, double b); +extern octave_value xpow (const SparseComplexMatrix& a, double b); + +extern octave_value elem_xpow (double a, const SparseMatrix& b); +extern octave_value elem_xpow (double a, const SparseComplexMatrix& b); + +extern octave_value elem_xpow (const SparseMatrix& a, double b); +extern octave_value elem_xpow (const SparseMatrix& a, const SparseMatrix& b); +extern octave_value elem_xpow (const SparseMatrix& a, const Complex& b); +extern octave_value elem_xpow (const SparseMatrix& a, + const SparseComplexMatrix& b); + +extern octave_value elem_xpow (const Complex& a, const SparseMatrix& b); +extern octave_value elem_xpow (const Complex& a, + const SparseComplexMatrix& b); + +extern octave_value elem_xpow (const SparseComplexMatrix& a, double b); +extern octave_value elem_xpow (const SparseComplexMatrix& a, + const SparseMatrix& b); +extern octave_value elem_xpow (const SparseComplexMatrix& a, + const Complex& b); +extern octave_value elem_xpow (const SparseComplexMatrix& a, + const SparseComplexMatrix& b); + +#endif + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ diff -r 9f3299378193 -r 57077d0ddc8e src/symtab.cc --- a/src/symtab.cc Fri Feb 25 17:42:55 2005 +0000 +++ b/src/symtab.cc Fri Feb 25 19:55:28 2005 +0000 @@ -607,7 +607,7 @@ break; case 'e': - os << numel (); + os << capacity (); break; case 'n': @@ -1345,7 +1345,7 @@ > static_cast (param_length(pos_t))) ? str.length () : param_length(pos_t)); - elements1 = symbols(i)->numel (); + elements1 = symbols(i)->capacity (); ss1 << elements1; str = ss1.str (); param_length(pos_e) = ((str.length () @@ -1561,7 +1561,7 @@ for (int j = 0; j < len; j++) { symbols(j)->print_symbol_info_line (os, params); - elements += symbols(j)->numel (); + elements += symbols(j)->capacity (); bytes += symbols(j)->byte_size (); } diff -r 9f3299378193 -r 57077d0ddc8e src/symtab.h --- a/src/symtab.h Fri Feb 25 17:42:55 2005 +0000 +++ b/src/symtab.h Fri Feb 25 19:55:28 2005 +0000 @@ -176,6 +176,9 @@ int numel (void) const { return definition.numel (); }; + int capacity (void) const + { return definition.capacity (); }; + dim_vector dims (void) const { return definition.dims (); } @@ -380,6 +383,9 @@ int numel (void) const { return definition->numel (); }; + int capacity (void) const + { return definition->capacity (); }; + dim_vector dims (void) const { return definition->dims (); } int dimensions_string_req_first_space (int print_dims) const; diff -r 9f3299378193 -r 57077d0ddc8e src/token.h --- a/src/token.h Fri Feb 25 17:42:55 2005 +0000 +++ b/src/token.h Fri Feb 25 19:55:28 2005 +0000 @@ -23,10 +23,6 @@ #if !defined (octave_token_h) #define octave_token_h 1 -#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION) -#pragma interface -#endif - #include class symbol_record;