diff --git a/AMD/Doc/License b/AMD/Doc/License deleted file mode 100644 index 81026a17f9..0000000000 --- a/AMD/Doc/License +++ /dev/null @@ -1,39 +0,0 @@ -AMD, Copyright (c) by Timothy A. Davis, -Patrick R. Amestoy, and Iain S. Duff. All Rights Reserved. -AMD is available under alternate licenses, contact T. Davis for details. - -AMD License: - - Your use or distribution of AMD or any modified version of - AMD implies that you agree to this License. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 - USA - - Permission is hereby granted to use or copy this program under the - terms of the GNU LGPL, provided that the Copyright, this License, - and the Availability of the original version is retained on all copies. - User documentation of any code that uses this code or any modified - version of this code must cite the Copyright, this License, the - Availability note, and "Used by permission." Permission to modify - the code and to distribute modified code is granted, provided the - Copyright, this License, and the Availability note are retained, - and a notice that the code was modified is included. - -Availability: - - http://www.suitesparse.com - -------------------------------------------------------------------------------- diff --git a/AMD/Doc/License.txt b/AMD/Doc/License.txt new file mode 100644 index 0000000000..05f154c836 --- /dev/null +++ b/AMD/Doc/License.txt @@ -0,0 +1,91 @@ +AMD, Copyright (c), 1996-2015, Timothy A. Davis, +Patrick R. Amestoy, and Iain S. Duff. All Rights Reserved. + +AMD License: At the user's option, you may use AMD under either the LGPL +version 2.1 license, or the BSD 3-clause license. You may not use both +licenses, nor may you mix-and-match clauses from each license. To use a +license, in the documentation for your application simply state either of the +following, replacing with the name of your application: + + AMD, Copyright (c), 1996-2015, Timothy A. Davis, + Patrick R. Amestoy, and Iain S. Duff. All Rights Reserved. + Used in under the BSD 3-clause license. + +or + + AMD, Copyright (c), 1996-2015, Timothy A. Davis, + Patrick R. Amestoy, and Iain S. Duff. All Rights Reserved. + Used in under the LGPL v2.1 license. + +In the event that your package includes another package by another +author, and and use AMD under different licenses, you may select +one license to apply to both uses of AMD in the combined application. + +Availability: + + http://www.suitesparse.com + +------------------------------------------------------------------------------- +BSD 3-clause: +------------------------------------------------------------------------------- + + Copyright (c), 1996-2015, Timothy A. Davis, + Patrick R. Amestoy, and Iain S. Duff. All Rights Reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the organizations to which the authors are + affiliated, nor the names of its contributors may be used to endorse + or promote products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + DAMAGE. + +------------------------------------------------------------------------------- +LGPL version 2.1: +------------------------------------------------------------------------------- + + Your use or distribution of AMD or any modified version of + AMD implies that you agree to this License. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 + USA + + Permission is hereby granted to use or copy this program under the + terms of the GNU LGPL, provided that the Copyright, this License, + and the Availability of the original version is retained on all copies. + User documentation of any code that uses this code or any modified + version of this code must cite the Copyright, this License, the + Availability note, and "Used by permission." Permission to modify + the code and to distribute modified code is granted, provided the + Copyright, this License, and the Availability note are retained, + and a notice that the code was modified is included. + +------------------------------------------------------------------------------- diff --git a/CHOLMOD/Doc/ChangeLog b/CHOLMOD/Doc/ChangeLog index 9addb64ea2..bbdb6a880d 100644 --- a/CHOLMOD/Doc/ChangeLog +++ b/CHOLMOD/Doc/ChangeLog @@ -1,3 +1,9 @@ +July 14, 2015: version 3.0.6 + + * NGPL did not disable MatrixOps, Modify, and Supernodal modules, + contradicting its definition in the User Guide. Fixed in this release. + * added MATLAB interface for row add/delete (lurowmod mexFunction) + Jan 19, 2015: version 3.0.5 * minor bug fix to cholmod_symmetry.c for the 'quick return' diff --git a/CHOLMOD/Doc/Makefile b/CHOLMOD/Doc/Makefile index d274db615d..d215949ae3 100644 --- a/CHOLMOD/Doc/Makefile +++ b/CHOLMOD/Doc/Makefile @@ -36,6 +36,7 @@ M = \ ../MATLAB/ldlsolve.m \ ../MATLAB/ldlsplit.m \ ../MATLAB/ldlupdate.m \ + ../MATLAB/ldlrowmod.m \ ../MATLAB/metis.m \ ../MATLAB/nesdis.m \ ../MATLAB/resymbol.m \ @@ -61,6 +62,7 @@ UserGuide.pdf: UserGuide.tex UserGuide.bib $(I) $(C) $(M) Makefile getproto rule ./getmproto ../MATLAB/ldlsolve.m > _ldlsolve_m.tex ./getmproto ../MATLAB/ldlsplit.m > _ldlsplit_m.tex ./getmproto ../MATLAB/ldlupdate.m > _ldlupdate_m.tex + ./getmproto ../MATLAB/ldlrowmod.m > _ldlrowmod_m.tex ./getmproto ../MATLAB/metis.m > _metis_m.tex ./getmproto ../MATLAB/mread.m > _mread_m.tex ./getmproto ../MATLAB/spsym.m > _spsym_m.tex diff --git a/CHOLMOD/Doc/UserGuide.pdf b/CHOLMOD/Doc/UserGuide.pdf index 63e89f0f4b..b651089323 100644 Binary files a/CHOLMOD/Doc/UserGuide.pdf and b/CHOLMOD/Doc/UserGuide.pdf differ diff --git a/CHOLMOD/Doc/UserGuide.tex b/CHOLMOD/Doc/UserGuide.tex index 66f49cd0e2..44c62ff20f 100644 --- a/CHOLMOD/Doc/UserGuide.tex +++ b/CHOLMOD/Doc/UserGuide.tex @@ -21,7 +21,7 @@ \title{User Guide for CHOLMOD: a sparse Cholesky factorization and modification package} -\date{VERSION 3.0.5, Jan 19, 2015} +\date{VERSION 3.0.6, July 14, 2015} \maketitle %------------------------------------------------------------------------------- @@ -329,7 +329,9 @@ \item {\tt -DCAMD}: do not include the interfaces to CAMD, CCOLAMD, and CSYMAMD in the Partition module. License: GNU LGPL. \item {\tt -DNGPL}: do not include any GNU GPL Modules in the CHOLMOD library. +Note that the Demo requires the MatrixOps module. \item {\tt -DNMATRIXOPS}: do not include the MatrixOps module. License: GNU GPL. +Note that the Demo requires the MatrixOps module. \item {\tt -DNMODIFY}: do not include the Modify module. License: GNU GPL. \item {\tt -DNSUPERNODAL}: do not include the Supernodal module. License: GNU GPL. \item {\tt -DNPRINT}: do not print anything. @@ -397,6 +399,7 @@ {\tt ldlsolve} & {\tt x = L'}$\backslash${\tt (D}$\backslash${\tt (L}$\backslash${\tt b))} \\ {\tt ldlsplit} & split the output of {\tt ldlchol} into {\tt L} and {\tt D} \\ {\tt ldlupdate} & update/downdate an {\tt L*D*L'} factorization \\ +{\tt ldlrowmod} & add/delete a row from an {\tt L*D*L'} factorization \\ {\tt metis} & interface to {\tt METIS\_NodeND} ordering \\ {\tt mread} & read a sparse or dense Matrix Market file \\ {\tt mwrite} & write a sparse or dense Matrix Market file \\ @@ -434,6 +437,8 @@ \subsection{{\tt ldlsplit}: split an $\m{LDL}\tr$ factorization} \input{_ldlspl \newpage \subsection{{\tt ldlupdate}: update/downdate an $\m{LDL}\tr$ factorization} \input{_ldlupdate_m.tex} \newpage +\subsection{{\tt ldlrowmod}: add/delete a row from an $\m{LDL}\tr$ factorization} \input{_ldlrowmod_m.tex} +\newpage \subsection{{\tt mread}: read a sparse or dense matrix from a Matrix Market file}\input{_mread_m.tex} \subsection{{\tt mwrite}: write a sparse or dense matrix to a Matrix Market file} \input{_mwrite_m.tex} \newpage diff --git a/CHOLMOD/Include/cholmod_core.h b/CHOLMOD/Include/cholmod_core.h index 42c4e59c92..f2d9d90465 100644 --- a/CHOLMOD/Include/cholmod_core.h +++ b/CHOLMOD/Include/cholmod_core.h @@ -246,11 +246,11 @@ #define CHOLMOD_HAS_VERSION_FUNCTION -#define CHOLMOD_DATE "Jan 7, 2015" +#define CHOLMOD_DATE "July 14, 2015" #define CHOLMOD_VER_CODE(main,sub) ((main) * 1000 + (sub)) #define CHOLMOD_MAIN_VERSION 3 #define CHOLMOD_SUB_VERSION 0 -#define CHOLMOD_SUBSUB_VERSION 5 +#define CHOLMOD_SUBSUB_VERSION 6 #define CHOLMOD_VERSION \ CHOLMOD_VER_CODE(CHOLMOD_MAIN_VERSION,CHOLMOD_SUB_VERSION) diff --git a/CHOLMOD/MATLAB/Contents.m b/CHOLMOD/MATLAB/Contents.m index d0a2e259e3..5e0857ee04 100644 --- a/CHOLMOD/MATLAB/Contents.m +++ b/CHOLMOD/MATLAB/Contents.m @@ -5,6 +5,7 @@ % lchol - sparse A=L*L' factorization. % ldlchol - sparse A=LDL' factorization % ldlupdate - multiple-rank update or downdate of a sparse LDL' factorization. +% ldlrowmod - add/delete row from a sparse LDL' factorization. % resymbol - recomputes the symbolic Cholesky factorization of the matrix A. % ldlsolve - solve LDL'x=b using a sparse LDL' factorization % ldlsplit - split an LDL' factorization into L and D. @@ -25,6 +26,7 @@ % cholmod_install - compile and install CHOLMOD, AMD, COLAMD, CCOLAMD, CAMD % cholmod_make - compiles the CHOLMOD mexFunctions % graph_demo - graph partitioning demo +% cholmod_updown_demo - a demo of update/downdate and row add/delete functions % % % Example: @@ -33,4 +35,4 @@ % Note: cholmod has been renamed cholmod2, so as not to conflict with itself % (the MATLAB built-in cholmod function). -% Copyright 2006-2007, Timothy A. Davis, http://www.suitesparse.com +% Copyright 2006-2015, Timothy A. Davis, http://www.suitesparse.com diff --git a/CHOLMOD/MATLAB/Test/cholmod_test.m b/CHOLMOD/MATLAB/Test/cholmod_test.m index 0d281e24f4..c7bc374c6d 100644 --- a/CHOLMOD/MATLAB/Test/cholmod_test.m +++ b/CHOLMOD/MATLAB/Test/cholmod_test.m @@ -13,6 +13,7 @@ function cholmod_test (nmat, do_diary) % do_diary: 1 to save results in a diary, 0 otherwise. Default 0. % % cholmod_demo: run tests on a few random matrices +% cholmod_updown_demo: run tests for update/downdate and row add/delete % graph_demo: graph partitioning demo % test0: test most CHOLMOD functions % test1: test sparse2 @@ -112,7 +113,8 @@ function cholmod_test (nmat, do_diary) try - cholmod_demo ; waitbar ( 1/tt, h, 'CHOLMOD graph demo'); + cholmod_demo ; waitbar ( 1/tt, h, 'CHOLMOD up/down demo'); + cholmod_update_demo ; waitbar ( 1/tt, h, 'CHOLMOD graph demo'); if (do_metis) graph_demo ; end diff --git a/CHOLMOD/MATLAB/Test/test0.m b/CHOLMOD/MATLAB/Test/test0.m index 96c1cdfd94..b9ee1a8419 100644 --- a/CHOLMOD/MATLAB/Test/test0.m +++ b/CHOLMOD/MATLAB/Test/test0.m @@ -206,7 +206,6 @@ function test0 (nmat) else fprintf (' no fill-in\n') ; end - clear LD % check the factorization, LD2 has LDL' factorization of S+C*C' [L,D] = ldlsplit (LD2) ; @@ -275,11 +274,52 @@ function test0 (nmat) err2 = norm (S2*x-b,1) / norm (S,1) ; fprintf ('MATLAB residual: %6.1e (sparse b)\n', err2) ; + % ---------------------------------------------------------------------- + % test the row delete + k = max (1, fix (n/2)) ; + tic + LD6 = ldlrowmod (LD,k) ; + t6 = toc ; + fprintf ('\nCHOLMOD time: ldlrowmod, delete %10.4f nnz(L) %d', ... + t6, nnz (LD6)) ; + + I = speye (n) ; + S2 = S ; + S2 (k,:) = I (k,:) ; + S2 (:,k) = I (:,k) ; + + % check the factorization, LD6 has LDL' factorization of S2 + [L,D] = ldlsplit (LD6) ; + err = ldl_normest (S2, L, D) / lnorm ; + if (err > 1e-6) + error ('!') ; + end + + % test the row add, by adding the row back in again + Ck = S (:,k) ; + S2 (:,k) = Ck ; + S2 (k,:) = Ck' ; + + tic + LD7 = ldlrowmod (LD6,k,Ck) ; + t7 = toc ; + fprintf ('\nCHOLMOD time: ldlrowmod, add %10.4f nnz(L) %d', ... + t7, nnz (LD7)) ; + + % check the factorization, LD7 has LDL' factorization of S + [L,D] = ldlsplit (LD7) ; + err = ldl_normest (S, L, D) / lnorm ; + if (err > 1e-6) + error ('!') ; + end + + % ---------------------------------------------------------------------- + % catch % fprintf ('failed\n') ; % end - clear A S C L R LD LD2 LD3 D p q C1 C2 LD3 S2 LD4 b x LD5 + clear A S C L R LD LD2 LD3 D p q C1 C2 LD3 S2 LD4 b x LD5 I LDL6 LD7 Ck end diff --git a/CHOLMOD/MATLAB/cholmod_demo.m b/CHOLMOD/MATLAB/cholmod_demo.m index 61a6ffc019..980b98f8e6 100644 --- a/CHOLMOD/MATLAB/cholmod_demo.m +++ b/CHOLMOD/MATLAB/cholmod_demo.m @@ -115,15 +115,35 @@ function try_matrix (A) t2, 1e-6 * fl / t2) ; tic -LD = ldlupdate (LD,C) ; +LD2 = ldlupdate (LD,C) ; t3 = toc ; fprintf ('CHOLMOD ldlupdate(sparse(A),C) time: %6.2f (rank-1, C dense)\n', t3) ; -[L,D] = ldlsplit (LD) ; -L = full (L) ; +[L,D] = ldlsplit (LD2) ; +% L = full (L) ; err = norm ((S+C*C') - L*D*L', 1) / norm (S,1) ; fprintf ('err: %g\n', err) ; +k = max (1,fix(n/2)) ; +tic +LD3 = ldlrowmod (LD, k) ; +t4 = toc ; +fprintf ('CHOLMOD ldlrowmod(LD,k) time: %6.2f\n', t4) ; + +[L,D] = ldlsplit (LD3) ; +S2 = S ; +I = speye (n) ; +S2 (k,:) = I (k,:) ; +S2 (:,k) = I (:,k) ; +err = norm (S2 - L*D*L', 1) / norm (S,1) ; +fprintf ('err: %g\n', err) ; + +LD4 = ldlchol (S2) ; +[L,D] = ldlsplit (LD4) ; +% L = full (L) ; +err = norm (S2 - L*D*L', 1) / norm (S,1) ; +fprintf ('err: %g\n', err) ; + tic R = chol (S) ; %#ok s1 = toc ; diff --git a/CHOLMOD/MATLAB/cholmod_install.m b/CHOLMOD/MATLAB/cholmod_install.m index 5f50730a8b..d53b600f0c 100644 --- a/CHOLMOD/MATLAB/cholmod_install.m +++ b/CHOLMOD/MATLAB/cholmod_install.m @@ -16,9 +16,9 @@ function cholmod_install (metis_path) % % See also analyze, bisect, chol2, cholmod2, etree2, lchol, ldlchol, ldlsolve, % ldlupdate, metis, spsym, nesdis, septree, resymbol, sdmult, sparse2, -% symbfact2, mread, mwrite, amd2, colamd2, camd, ccolamd +% symbfact2, mread, mwrite, amd2, colamd2, camd, ccolamd, ldlrowmod -% Copyright 2006-2007, Timothy A. Davis +% Copyright 2006-2015, Timothy A. Davis if (nargin < 1) metis_path = '../../metis-4.0' ; diff --git a/CHOLMOD/MATLAB/cholmod_make.m b/CHOLMOD/MATLAB/cholmod_make.m index 5daf8b89b1..5437c097ea 100644 --- a/CHOLMOD/MATLAB/cholmod_make.m +++ b/CHOLMOD/MATLAB/cholmod_make.m @@ -15,9 +15,9 @@ function cholmod_make (metis_path) % % See also analyze, bisect, chol2, cholmod2, etree2, lchol, ldlchol, ldlsolve, % ldlupdate, metis, spsym, nesdis, septree, resymbol, sdmult, sparse2, -% symbfact2, mread, mwrite +% symbfact2, mread, mwrite, ldlrowmod -% Copyright 2006-2007, Timothy A. Davis, http://www.suitesparse.com +% Copyright 2006-2015, Timothy A. Davis, http://www.suitesparse.com details = 0 ; % 1 if details of each command are to be printed @@ -283,6 +283,7 @@ function cholmod_make (metis_path) 'ldlchol', ... 'ldlsolve', ... 'ldlupdate', ... + 'ldlrowmod', ... 'metis', ... 'spsym', ... 'nesdis', ... diff --git a/CHOLMOD/MATLAB/cholmod_updown_demo.m b/CHOLMOD/MATLAB/cholmod_updown_demo.m new file mode 100644 index 0000000000..ec1c5dc478 --- /dev/null +++ b/CHOLMOD/MATLAB/cholmod_updown_demo.m @@ -0,0 +1,197 @@ +function cholmod_updown_demo +%CHOLMOD_UPDOWN_DEMO a demo for CHOLMOD's update/downdate and row add/delete +% +% Provides a short demo of CHOLMOD's update/downdate and row add/delete +% functions. +% +% Example: +% cholmod_updown_demo +% +% See also CHOLMOD_DEMO + +% Copyright 2015, Timothy A. Davis, http://www.suitesparse.com + +fprintf ('\n\n------------------------------------------------------------\n') ; +fprintf ('demo of CHOLMOD update/downdate and row add/delete functions\n') ; +fprintf ('------------------------------------------------------------\n\n') ; + +% A is the matrix used in the MATLAB 'bench' demo +A = delsq (numgrid ('L', 300)) ; +n = size (A,1) ; +% make b small so we can use absolute error norms, norm (A*x-b) +b = rand (n,1) / n ; + +% L*D*L' = A(p,p). The 2nd argument is zero if A is positive definite. +[LD,ignore,p] = ldlchol (A) ; + +% solve Ax=b using the L*D*L' factorization of A(p,p) +c = b (p) ; +x = ldlsolve (LD, c) ; +x (p) = x ; +err = norm (A*x-b) ; +fprintf ('norm (A*x-b) using ldlsolve: %g\n', err) ; +if (err > 1e-12) + error ('!') +end + +% solve again, just using backslash +tic +x = A\b ; +t1 = toc ; +err = norm (A*x-b) ; +fprintf ('norm (A*x-b) using backslash: %g\n', err) ; +fprintf ('time for x=A\\b: %g\n', t1) ; +if (err > 1e-12) + error ('!') +end + +% check the norm of LDL'-S +[L,D] = ldlsplit (LD) ; +S = A (p,p) ; +err = norm (L*D*L' - S, 1) ; +fprintf ('nnz (L) for original matrix: %d\n', nnz (L)) ; + +% rank-1 update of the L*D*L' factorization +% A becomes A2=A+W*W', and S becomes S2=S+C*C'. Some fillin occurs. +fprintf ('\n\n------------------------------------------------------------\n') ; +fprintf ('Update A to A+W*W'', and the permuted S=A(p,p) becomes S+C*C'':\n') ; +W = sparse ([1 2 3 152], [1 1 1 1], [5 -1 -1 -1], n, 1) +C = W (p,:) +tic +LD2 = ldlupdate (LD, C, '+') ; +t2 = toc ; +S2 = S + C*C' ; +A2 = A + W*W' ; +[L,D] = ldlsplit (LD2) ; +err = norm (L*D*L' - S2, 1) ; +fprintf ('norm (LDL-S2) after update: %g\n', err) ; +fprintf ('nnz (L) after rank-1 update: %d\n', nnz (L)) ; +if (err > 1e-12) + error ('!') +end + +% solve A2*x=b using the updated LDL factorization +tic +c = b (p) ; +x = ldlsolve (LD2, c) ; +x (p) = x ; +t3 = toc ; +err = norm (A2*x-b) ; +fprintf ('norm (A*x-b) using ldlsolve: %g\n', err) ; +if (err > 1e-12) + error ('!') +end +fprintf ('time to solve x=A\\b using update: %g\n', t2 + t3) ; + +% solve again, just using backslash +tic +x = A2\b ; +t1 = toc ; +err = norm (A2*x-b) ; +fprintf ('norm (A*x-b) using backslash: %g\n', err) ; +if (err > 1e-12) + error ('!') +end +fprintf ('time for x=A\\b: %g\n', t1) ; +fprintf ('speedup of update vs backslash: %g\n', t1 / (t2 + t3)) ; + +% invert the permutation +invp = zeros (1,n) ; +invp (p) = 1:n ; + +% delete row 3 of A to get A3. This corresponds to row invp(3) in S and LDL +fprintf ('\n\n------------------------------------------------------------\n') ; +fprintf ('Delete row 3\n') ; +k = 3 ; +pk = invp (k) ; +I = speye (n) ; +A3 = A ; +A3 (:,k) = I (:,k) ; +A3 (k,:) = I (k,:) ; +tic +LD3 = ldlrowmod (LD, pk) ; +t2 = toc ; + +S3 = S ; +S3 (:,pk) = I (:,pk) ; +S3 (pk,:) = I (pk,:) ; +[L,D] = ldlsplit (LD3) ; +err = norm (L*D*L' - S3, 1) ; +fprintf ('norm (LDL-S3) after row del: %g\n', err) ; +if (err > 1e-12) + error ('!') +end + +% solve A3*x=b using the modified LDL factorization +tic +c = b (p) ; +x = ldlsolve (LD3, c) ; % x = S3\c +x (p) = x ; % now x = A3\b +t3 = toc ; +err = norm (A3*x-b) ; +fprintf ('norm (A3*x-b) after row del: %g\n', err) ; +fprintf ('nnz (L) after row del: %d\n', nnz (L)) ; +if (err > 1e-12) + error ('!') +end + +% solve again using backslash +tic +x = A3\b ; +t1 = toc ; +err = norm (A3*x-b) ; +fprintf ('norm (A3*x-b) with backslash: %g\n', err) ; +fprintf ('time for x=A\\b with backslash %g\n', t1) ; +fprintf ('time for x=A\\b using rowdel: %g\n', t2 + t3) ; +fprintf ('speedup of rowdel vs backslash: %g\n', t1 / (t2 + t3)) ; + +% add row 3 back to A3 to get A4. This corresponds to row invp(3) in S and LDL +fprintf ('\n\n------------------------------------------------------------\n') ; +fprintf ('Add row 3 back\n') ; +W = sparse ([1 3 7 9], [1 1 1 1], [-1 8 -1 -1], n, 1) ; +A4 = A3 ; +A4 (:,k) = W ; +A4 (k,:) = W' ; +C = W (p) ; % permuted version of row/column 3 +S4 = S3 ; +S4 (:,pk) = C ; +S4 (pk,:) = C' ; + +tic +LD4 = ldlrowmod (LD3, pk, C) ; +t2 = toc ; +fprintf ('nnz (L) after row add: %d\n', nnz (L)) ; + +[L,D] = ldlsplit (LD4) ; +err = norm (L*D*L' - S4, 1) ; +fprintf ('norm (LDL-S4) after row add: %g\n', err) ; +if (err > 1e-12) + error ('!') +end + +% solve A4*x=b using the modified LDL factorization +tic +c = b (p) ; +x = ldlsolve (LD4, c) ; % x = S4\c +x (p) = x ; % now x = A4\b +t3 = toc ; +err = norm (A4*x-b) ; +fprintf ('norm (A4*x-b) after row add: %g\n', err) ; +if (err > 1e-12) + error ('!') +end + +% solve A4*x=b using backslash +tic +x = A4\b ; +t1 = toc ; +err = norm (A4*x-b) ; +fprintf ('norm (A4*x-b) with backslash: %g\n', err) ; +if (err > 1e-12) + error ('!') +end + +fprintf ('time for x=A\\b with backslash %g\n', t1) ; +fprintf ('time for x=A\\b using rowadd: %g\n', t2 + t3) ; +fprintf ('speedup of rowadd vs backslash: %g\n', t1 / (t2 + t3)) ; + diff --git a/CHOLMOD/MATLAB/ldlrowmod.c b/CHOLMOD/MATLAB/ldlrowmod.c new file mode 100644 index 0000000000..1f6708040e --- /dev/null +++ b/CHOLMOD/MATLAB/ldlrowmod.c @@ -0,0 +1,192 @@ +/* ========================================================================== */ +/* === CHOLMOD/MATLAB/ldlrowmod mexFunction ================================= */ +/* ========================================================================== */ + +/* ----------------------------------------------------------------------------- + * CHOLMOD/MATLAB Module. Copyright (C) 2005-2006, Timothy A. Davis. + * The CHOLMOD/MATLAB Module is licensed under Version 2.0 of the GNU + * General Public License. See gpl.txt for a text of the license. + * CHOLMOD is also available under other licenses; contact authors for details. + * http://www.suitesparse.com + * MATLAB(tm) is a Trademark of The MathWorks, Inc. + * -------------------------------------------------------------------------- */ + +/* Rank-1 row add/delete of a sparse LDL' factorization. + * + * 'Adding' or 'deleting' a row does not change the dimension of L. + * Instead, deleting a row A(k,:) and the corresponding column A(:,k) means + * replacing the kth row and column of A with the kth row and column of the + * identity matrix. Adding a row is the opposite. This function then modifies + * the LDL' factorization of A to reflect this change. + * + * To add a row k, the kth row of A is assumed to already be the kth row of + * identity. This condition is not checked. + * + * On input, LD contains the LDL' factorization of A. See ldlchol for details. + * If A has been permuted, then C must reflect that permutation. In other + * words, the caller must have already permuted C according the the fill- + * reducing ordering found by ldlchol. + * + * Usage: + * + * LD = ldlrowmod (LD,k,C) add row k to an LDL' factorization + * LD = ldlrowmod (LD,k) delete row k from an LDL' factorization + * + * See ldlrowmod.m for details. LD and C must be real and sparse. + * C is a column vector that is the new column A(:,k). + * + * The bulk of the time is spent copying the input LD to the output LD. This + * mexFunction could be much faster if it could safely modify its input LD. + */ + +#include "cholmod_matlab.h" + +void mexFunction +( + int nargout, + mxArray *pargout [ ], + int nargin, + const mxArray *pargin [ ] +) +{ + double dummy = 0 ; + double *Lx, *Lx2 ; + Long *Li, *Lp, *Li2, *Lp2, *Lnz2, *ColCount ; + cholmod_sparse Cmatrix, *C, *Lsparse ; + cholmod_factor *L ; + cholmod_common Common, *cm ; + Long j, k, s, rowadd, n, lnz, ok ; + + /* ---------------------------------------------------------------------- */ + /* start CHOLMOD and set parameters */ + /* ---------------------------------------------------------------------- */ + + cm = &Common ; + cholmod_l_start (cm) ; + sputil_config (SPUMONI, cm) ; + + /* ---------------------------------------------------------------------- */ + /* check inputs */ + /* ---------------------------------------------------------------------- */ + + if (nargout > 1 || nargin < 2 || nargin > 3) + { + mexErrMsgTxt ("Usage: LD = ldlrowmod (LD,k,C) or ldlrowmod (LD,k)") ; + } + + n = mxGetN (pargin [0]) ; + k = (Long) mxGetScalar (pargin [1]) ; + k = k - 1 ; /* change from 1-based to 0-based */ + + if (!mxIsSparse (pargin [0]) + || n != mxGetM (pargin [0]) + || mxIsComplex (pargin [0])) + { + mexErrMsgTxt ("ldlrowmod: L must be real, square, and sparse") ; + } + + /* ---------------------------------------------------------------------- */ + /* determine if we're doing an rowadd or rowdel */ + /* ---------------------------------------------------------------------- */ + + rowadd = (nargin > 2) ; + + if (rowadd) + { + if (!mxIsSparse (pargin [2]) + || n != mxGetM (pargin [2]) + || 1 != mxGetN (pargin [2]) + || mxIsComplex (pargin [2])) + { + mexErrMsgTxt ("ldlrowmod: C must be a real sparse vector, " + "with the same number of rows as LD") ; + } + } + + /* ---------------------------------------------------------------------- */ + /* get C: sparse vector of incoming/outgoing column */ + /* ---------------------------------------------------------------------- */ + + C = (rowadd) ? sputil_get_sparse (pargin [2], &Cmatrix, &dummy, 0) : NULL ; + + /* ---------------------------------------------------------------------- */ + /* construct a copy of the input sparse matrix L */ + /* ---------------------------------------------------------------------- */ + + /* get the MATLAB L */ + Lp = (Long *) mxGetJc (pargin [0]) ; + Li = (Long *) mxGetIr (pargin [0]) ; + Lx = mxGetPr (pargin [0]) ; + + /* allocate the CHOLMOD symbolic L */ + L = cholmod_l_allocate_factor (n, cm) ; + L->ordering = CHOLMOD_NATURAL ; + ColCount = L->ColCount ; + for (j = 0 ; j < n ; j++) + { + ColCount [j] = Lp [j+1] - Lp [j] ; + } + + /* allocate space for a CHOLMOD LDL' packed factor */ + cholmod_l_change_factor (CHOLMOD_REAL, FALSE, FALSE, TRUE, TRUE, L, cm) ; + + /* copy MATLAB L into CHOLMOD L */ + Lp2 = L->p ; + Li2 = L->i ; + Lx2 = L->x ; + Lnz2 = L->nz ; + lnz = L->nzmax ; + for (j = 0 ; j <= n ; j++) + { + Lp2 [j] = Lp [j] ; + } + for (j = 0 ; j < n ; j++) + { + Lnz2 [j] = Lp [j+1] - Lp [j] ; + } + for (s = 0 ; s < lnz ; s++) + { + Li2 [s] = Li [s] ; + } + for (s = 0 ; s < lnz ; s++) + { + Lx2 [s] = Lx [s] ; + } + + /* ---------------------------------------------------------------------- */ + /* rowadd/rowdel the LDL' factorization */ + /* ---------------------------------------------------------------------- */ + + if (rowadd) + { + ok = cholmod_l_rowadd (k, C, L, cm) ; + } + else + { + ok = cholmod_l_rowdel (k, NULL, L, cm) ; + } + if (!ok) mexErrMsgTxt ("ldlrowmod failed\n") ; + + /* ---------------------------------------------------------------------- */ + /* copy the results back to MATLAB */ + /* ---------------------------------------------------------------------- */ + + /* change L back to packed LDL' (it may have become unpacked if the + * sparsity pattern changed). This change takes O(n) time if the pattern + * of L wasn't updated. */ + Lsparse = cholmod_l_factor_to_sparse (L, cm) ; + + /* return L as a sparse matrix */ + pargout [0] = sputil_put_sparse (&Lsparse, cm) ; + + /* ---------------------------------------------------------------------- */ + /* free workspace and the CHOLMOD L, except for what is copied to MATLAB */ + /* ---------------------------------------------------------------------- */ + + cholmod_l_free_factor (&L, cm) ; + cholmod_l_finish (cm) ; + cholmod_l_print_common (" ", cm) ; + /* + if (cm->malloc_count != 3 + mxIsComplex (pargout[0])) mexErrMsgTxt ("!") ; + */ +} diff --git a/CHOLMOD/MATLAB/ldlrowmod.m b/CHOLMOD/MATLAB/ldlrowmod.m new file mode 100644 index 0000000000..7b74419b93 --- /dev/null +++ b/CHOLMOD/MATLAB/ldlrowmod.m @@ -0,0 +1,55 @@ +function LD = ldlrowmod (LD,k,C) %#ok +%LDLROWMOD add/delete a row from a sparse LDL' factorization. +% +% On input, LD contains the LDL' factorization of A (L*D*L'=A or A(q,q)). +% The unit-diagonal of L is not stored. In its place is the diagonal matrix +% D. LD can be computed using the CHOLMOD mexFunctions: +% +% LD = ldlchol (A) ; +% or +% [LD,p,q] = ldlchol (A) ; +% +% With this LD, either of the following MATLAB statements, +% +% Example: +% LD = ldlrowmod (LD,k,C) add row k to an LDL' factorization +% +% returns the LDL' factorization of S, where S = A except for S(:,k) = C +% and S (k,:) = C. The kth row of A is assumed to initially be equal to +% the kth row of identity. To delete a row: +% +% LD = ldlrowmod (LD,k) delete row k from an LDL' factorization +% +% returns the LDL' factorization of S, where S = A except that S(:,k) and +% S (k,:) become the kth column/row of speye(n), repespectively. +% +% LD and C must be sparse and real. LD must be square, and C must have the +% same number of rows as LD. You must not modify LD in MATLAB (see the +% WARNING below). +% +% Note that if C is sparse with few columns, most of the time spent in this +% routine is taken by copying the input LD to the output LD. If MATLAB +% allowed mexFunctions to safely modify its inputs, this mexFunction would +% be much faster, since not all of LD changes. +% +% See also LDLCHOL, LDLSPLIT, LDLSOLVE, CHOLUPDATE, LDLUPDATE +% +% =========================================================================== +% =============================== WARNING =================================== +% =========================================================================== +% MATLAB drops zero entries from its sparse matrices. LD can contain +% numerically zero entries that are symbolically present in the sparse matrix +% data structure. These are essential for ldlrowmod and ldlsolve to work +% properly, since they exploit the graph-theoretic structure of a sparse +% Cholesky factorization. If you modify LD in MATLAB, those zero entries may +% get dropped and the required graph property will be destroyed. In this +% case, ldlrowmod and ldlsolve will fail catastrophically (possibly with a +% segmentation fault, terminating MATLAB). It takes much more time to ensure +% this property holds than the time it takes to do the row add/delete or the +% solve, so ldlrowmod and ldlsolve simply assume the propertly holds. +% =========================================================================== + +% Copyright 2006-2007, Timothy A. Davis, http://www.suitesparse.com + +error ('ldlrowmod mexFunction not found') ; + diff --git a/CHOLMOD/MATLAB/ldlsolve.m b/CHOLMOD/MATLAB/ldlsolve.m index 399e3415b7..5e4bafc6aa 100644 --- a/CHOLMOD/MATLAB/ldlsolve.m +++ b/CHOLMOD/MATLAB/ldlsolve.m @@ -9,12 +9,12 @@ % [L,D] = ldlsplit (LD) ; % x = L' \ (D \ (L \ b)) ; % -% LD is from ldlchol, or as updated by ldlupdate. You must not modify LD as -% obtained from ldlchol or ldlupdate prior to passing it to this function. -% See ldlupdate for more details. +% LD is from ldlchol, or as updated by ldlupdate or ldlrowmod. You must not +% modify LD as obtained from ldlchol, ldlupdate, or ldlrowmod prior to passing +% it to this function. See ldlupdate for more details. % -% See also LDLCHOL, LDLUPDATE, LDLSPLIT +% See also LDLCHOL, LDLUPDATE, LDLSPLIT, LDLROWMOD -% Copyright 2006-2007, Timothy A. Davis, http://www.suitesparse.com +% Copyright 2006-2017, Timothy A. Davis, http://www.suitesparse.com error ('ldlsolve mexFunction not found') ; diff --git a/CHOLMOD/MATLAB/resymbol.m b/CHOLMOD/MATLAB/resymbol.m index 4d3169ce4f..697fe758ff 100644 --- a/CHOLMOD/MATLAB/resymbol.m +++ b/CHOLMOD/MATLAB/resymbol.m @@ -8,11 +8,12 @@ % symmetric. Only tril(A) is used. Entries in L that are not in the Cholesky % factorization of A are removed from L. L can be from an LL' or LDL' % factorization (lchol or ldlchol). resymbol is useful after a series of -% downdates via ldlupdate, since downdates do not remove any entries in L. -% The numerical values of A are ignored; only its nonzero pattern is used. +% downdates via ldlupdate or ldlrowmod, since downdates do not remove any +% entries in L. The numerical values of A are ignored; only its nonzero +% pattern is used. % -% See also LCHOL, LDLUPDATE +% See also LCHOL, LDLUPDATE, LDLROWMOD -% Copyright 2006-2007, Timothy A. Davis, http://www.suitesparse.com +% Copyright 2006-2015, Timothy A. Davis, http://www.suitesparse.com error ('resymbol not found') ; diff --git a/CHOLMOD/Makefile b/CHOLMOD/Makefile index 5412c0bb93..f5b82ec702 100644 --- a/CHOLMOD/Makefile +++ b/CHOLMOD/Makefile @@ -2,7 +2,7 @@ # CHOLMOD Makefile #------------------------------------------------------------------------------- -VERSION = 3.0.5 +VERSION = 3.0.6 # Note: If you do not have METIS, or do not wish to use it in CHOLMOD, you must # compile CHOLMOD with the -DNPARTITION flag. diff --git a/CHOLMOD/MatrixOps/cholmod_drop.c b/CHOLMOD/MatrixOps/cholmod_drop.c index 69eb0fa502..de0ce8a2c4 100644 --- a/CHOLMOD/MatrixOps/cholmod_drop.c +++ b/CHOLMOD/MatrixOps/cholmod_drop.c @@ -19,6 +19,7 @@ * Supports pattern and real matrices, complex and zomplex not supported. */ +#ifndef NGPL #ifndef NMATRIXOPS #include "cholmod_internal.h" @@ -181,3 +182,4 @@ int CHOLMOD(drop) return (TRUE) ; } #endif +#endif diff --git a/CHOLMOD/MatrixOps/cholmod_horzcat.c b/CHOLMOD/MatrixOps/cholmod_horzcat.c index 9388e9a904..b57961beba 100644 --- a/CHOLMOD/MatrixOps/cholmod_horzcat.c +++ b/CHOLMOD/MatrixOps/cholmod_horzcat.c @@ -23,6 +23,7 @@ * A and B cannot be complex or zomplex, unless values is FALSE. */ +#ifndef NGPL #ifndef NMATRIXOPS #include "cholmod_internal.h" @@ -201,3 +202,4 @@ cholmod_sparse *CHOLMOD(horzcat) return (C) ; } #endif +#endif diff --git a/CHOLMOD/MatrixOps/cholmod_norm.c b/CHOLMOD/MatrixOps/cholmod_norm.c index 200f5bde1e..48648539fc 100644 --- a/CHOLMOD/MatrixOps/cholmod_norm.c +++ b/CHOLMOD/MatrixOps/cholmod_norm.c @@ -17,6 +17,7 @@ * Pattern, real, complex, and zomplex sparse matrices are supported. */ +#ifndef NGPL #ifndef NMATRIXOPS #include "cholmod_internal.h" @@ -450,3 +451,4 @@ double CHOLMOD(norm_sparse) return (anorm) ; } #endif +#endif diff --git a/CHOLMOD/MatrixOps/cholmod_scale.c b/CHOLMOD/MatrixOps/cholmod_scale.c index 2f722c686f..e2bf173909 100644 --- a/CHOLMOD/MatrixOps/cholmod_scale.c +++ b/CHOLMOD/MatrixOps/cholmod_scale.c @@ -51,6 +51,7 @@ * Only real matrices are supported. */ +#ifndef NGPL #ifndef NMATRIXOPS #include "cholmod_internal.h" @@ -215,3 +216,4 @@ int CHOLMOD(scale) return (TRUE) ; } #endif +#endif diff --git a/CHOLMOD/MatrixOps/cholmod_sdmult.c b/CHOLMOD/MatrixOps/cholmod_sdmult.c index fd40b48ecc..876921d21f 100644 --- a/CHOLMOD/MatrixOps/cholmod_sdmult.c +++ b/CHOLMOD/MatrixOps/cholmod_sdmult.c @@ -32,6 +32,7 @@ * must all match. */ +#ifndef NGPL #ifndef NMATRIXOPS #include "cholmod_internal.h" @@ -147,3 +148,4 @@ int CHOLMOD(sdmult) return (TRUE) ; } #endif +#endif diff --git a/CHOLMOD/MatrixOps/cholmod_ssmult.c b/CHOLMOD/MatrixOps/cholmod_ssmult.c index fbdf0ce27d..13b3a40b99 100644 --- a/CHOLMOD/MatrixOps/cholmod_ssmult.c +++ b/CHOLMOD/MatrixOps/cholmod_ssmult.c @@ -34,6 +34,7 @@ * is FALSE). */ +#ifndef NGPL #ifndef NMATRIXOPS #include "cholmod_internal.h" @@ -485,3 +486,4 @@ cholmod_sparse *CHOLMOD(ssmult) return (C) ; } #endif +#endif diff --git a/CHOLMOD/MatrixOps/cholmod_submatrix.c b/CHOLMOD/MatrixOps/cholmod_submatrix.c index a4120534c2..7acb9c0e78 100644 --- a/CHOLMOD/MatrixOps/cholmod_submatrix.c +++ b/CHOLMOD/MatrixOps/cholmod_submatrix.c @@ -38,6 +38,7 @@ * are supported only when "values" is FALSE. */ +#ifndef NGPL #ifndef NMATRIXOPS #include "cholmod_internal.h" @@ -423,3 +424,4 @@ cholmod_sparse *CHOLMOD(submatrix) return (C) ; } #endif +#endif diff --git a/CHOLMOD/MatrixOps/cholmod_symmetry.c b/CHOLMOD/MatrixOps/cholmod_symmetry.c index 3bae8c7bdc..a82ab05713 100644 --- a/CHOLMOD/MatrixOps/cholmod_symmetry.c +++ b/CHOLMOD/MatrixOps/cholmod_symmetry.c @@ -87,6 +87,7 @@ * regardless of the value of the option parameter. */ +#ifndef NGPL #ifndef NMATRIXOPS #include "cholmod_internal.h" @@ -486,3 +487,4 @@ int CHOLMOD(symmetry) return (result) ; } #endif +#endif diff --git a/CHOLMOD/MatrixOps/cholmod_vertcat.c b/CHOLMOD/MatrixOps/cholmod_vertcat.c index 4199a91dc2..5641ae3ae2 100644 --- a/CHOLMOD/MatrixOps/cholmod_vertcat.c +++ b/CHOLMOD/MatrixOps/cholmod_vertcat.c @@ -23,6 +23,7 @@ * are supported only if "values" is FALSE. */ +#ifndef NGPL #ifndef NMATRIXOPS #include "cholmod_internal.h" @@ -199,3 +200,4 @@ cholmod_sparse *CHOLMOD(vertcat) return (C) ; } #endif +#endif diff --git a/CHOLMOD/Modify/cholmod_rowadd.c b/CHOLMOD/Modify/cholmod_rowadd.c index dd7ecf0e31..82a2642869 100644 --- a/CHOLMOD/Modify/cholmod_rowadd.c +++ b/CHOLMOD/Modify/cholmod_rowadd.c @@ -20,6 +20,7 @@ * numeric identity matrix before the row is added. */ +#ifndef NGPL #ifndef NMODIFY #include "cholmod_internal.h" @@ -676,3 +677,4 @@ int CHOLMOD(rowadd_mark) return (ok) ; } #endif +#endif diff --git a/CHOLMOD/Modify/cholmod_rowdel.c b/CHOLMOD/Modify/cholmod_rowdel.c index ccf1ce7039..2760a8a39d 100644 --- a/CHOLMOD/Modify/cholmod_rowdel.c +++ b/CHOLMOD/Modify/cholmod_rowdel.c @@ -21,6 +21,7 @@ * is used, it can have any valid xtype). */ +#ifndef NGPL #ifndef NMODIFY #include "cholmod_internal.h" @@ -459,3 +460,4 @@ int CHOLMOD(rowdel_mark) return (ok) ; } #endif +#endif diff --git a/CHOLMOD/Modify/cholmod_updown.c b/CHOLMOD/Modify/cholmod_updown.c index e3621f427b..0ab15f42d6 100644 --- a/CHOLMOD/Modify/cholmod_updown.c +++ b/CHOLMOD/Modify/cholmod_updown.c @@ -61,6 +61,7 @@ * numeric identity matrix. */ +#ifndef NGPL #ifndef NMODIFY #include "cholmod_internal.h" @@ -1593,3 +1594,4 @@ int CHOLMOD(updown_mask2) return (TRUE) ; } #endif +#endif diff --git a/CHOLMOD/Supernodal/cholmod_super_numeric.c b/CHOLMOD/Supernodal/cholmod_super_numeric.c index 78c4effcc4..7cfee2725d 100644 --- a/CHOLMOD/Supernodal/cholmod_super_numeric.c +++ b/CHOLMOD/Supernodal/cholmod_super_numeric.c @@ -56,6 +56,7 @@ * must match. */ +#ifndef NGPL #ifndef NSUPERNODAL #include "cholmod_internal.h" @@ -309,3 +310,4 @@ int CHOLMOD(super_numeric) return (ok) ; } #endif +#endif diff --git a/CHOLMOD/Supernodal/cholmod_super_solve.c b/CHOLMOD/Supernodal/cholmod_super_solve.c index ff6b8a90ac..ff5bf00756 100644 --- a/CHOLMOD/Supernodal/cholmod_super_solve.c +++ b/CHOLMOD/Supernodal/cholmod_super_solve.c @@ -15,6 +15,7 @@ * interface that performs that operation. */ +#ifndef NGPL #ifndef NSUPERNODAL #include "cholmod_internal.h" @@ -214,3 +215,4 @@ int CHOLMOD(super_ltsolve) /* TRUE if OK, FALSE if BLAS overflow occured */ return (Common->blas_ok) ; } #endif +#endif diff --git a/CHOLMOD/Supernodal/cholmod_super_symbolic.c b/CHOLMOD/Supernodal/cholmod_super_symbolic.c index ad8037c785..72491b800d 100644 --- a/CHOLMOD/Supernodal/cholmod_super_symbolic.c +++ b/CHOLMOD/Supernodal/cholmod_super_symbolic.c @@ -40,6 +40,7 @@ * Supports any xtype (pattern, real, complex, or zomplex). */ +#ifndef NGPL #ifndef NSUPERNODAL #include "cholmod_internal.h" @@ -990,3 +991,4 @@ int CHOLMOD(super_symbolic) return (CHOLMOD(super_symbolic2) (TRUE, A, F, Parent, L, Common)) ; } #endif +#endif diff --git a/CHOLMOD/Tcov/Makefile b/CHOLMOD/Tcov/Makefile index 37274af008..dd67e1c11d 100644 --- a/CHOLMOD/Tcov/Makefile +++ b/CHOLMOD/Tcov/Makefile @@ -24,7 +24,7 @@ CC = gcc C = $(CC) $(CF) $(CHOLMOD_CONFIG) $(NANTESTS) # default LAPACK and BLAS from SuiteSparse_config.mk: - LIB = $(METIS) -lm $(LAPACK) $(BLAS) + LIB = $(METIS) -lm $(LAPACK) $(BLAS) -lrt # optimized LAPACK and BLAS # LIB = $(METIS) -lm $(LAPACK) $(BLAS) $(XERBLA) -L/shared/apps/rhel-6.2/intel/ics-2013/lib/intel64 -liomp5 diff --git a/ChangeLog b/ChangeLog index e915ffecca..18414eee30 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +Aug 2015: SuiteSparse version 4.4.6 + + * SPQR: changed default tol when A has infs, from inf to realmax (~1e308) + +July 2015: SuiteSparse version 4.4.5 + + * CHOLMOD 3.0.6: + - minor fix to CHOLMOD (-DNGPL did not work as expected) + - added MATLAB interface for row add/delete (lurowmod) + * KLU 1.3.3: Fix for klu_dump.c (debugging case only) + * UFcollection: added additional stats for matrix collection + * AMD: changed the license. Was LGPL only, now either LGPL or BSD, + at the user's option. See AMD/Doc/License.txt for details. + Mar 24, 2015: SuiteSparse version 4.4.4 * CHOLMOD version number corrected. In 4.4.3, the CHOLMOD_SUBSUB_VERSION diff --git a/KLU/Demo/kludemo.out b/KLU/Demo/kludemo.out index e81081939c..d132681f11 100644 --- a/KLU/Demo/kludemo.out +++ b/KLU/Demo/kludemo.out @@ -5,73 +5,73 @@ x [2] = 3 x [3] = 4 x [4] = 5 ./kludemo < ../Matrix/1c.mtx -KLU: Oct 23, 2014, version: 1.3.2 +KLU: June 3, 2015, version: 1.3.3 n 1 nnz(A) 1 nnz(L+U+F) 1 resid 0 recip growth 1 condest 1 rcond 1 flops 0 peak memory usage: 492 bytes ./kludemo < ../Matrix/arrowc.mtx -KLU: Oct 23, 2014, version: 1.3.2 +KLU: June 3, 2015, version: 1.3.3 n 100 nnz(A) 298 nnz(L+U+F) 298 resid 1.68007e-14 recip growth 0.019999 condest 295.99 rcond 0.019999 flops 297 peak memory usage: 32244 bytes ./kludemo < ../Matrix/arrow.mtx -KLU: Oct 23, 2014, version: 1.3.2 +KLU: June 3, 2015, version: 1.3.3 n 100 nnz(A) 298 nnz(L+U+F) 298 resid 1.77636e-15 recip growth 0.0204082 condest 303 rcond 0.0204082 flops 297 peak memory usage: 20412 bytes ./kludemo < ../Matrix/impcol_a.mtx -KLU: Oct 23, 2014, version: 1.3.2 +KLU: June 3, 2015, version: 1.3.3 n 207 nnz(A) 572 nnz(L+U+F) 615 resid 6.98492e-10 recip growth 0.00957447 condest 4.35093e+07 rcond 4.5277e-05 flops 259 peak memory usage: 34276 bytes ./kludemo < ../Matrix/w156.mtx -KLU: Oct 23, 2014, version: 1.3.2 +KLU: June 3, 2015, version: 1.3.3 n 156 nnz(A) 362 nnz(L+U+F) 396 resid 6.23816e-08 recip growth 0.00889922 condest 1.79787e+09 rcond 0.000124785 flops 175 peak memory usage: 39516 bytes ./kludemo < ../Matrix/ctina.mtx -KLU: Oct 23, 2014, version: 1.3.2 +KLU: June 3, 2015, version: 1.3.3 n 11 nnz(A) 36 nnz(L+U+F) 45 resid 4.44089e-16 recip growth 1 condest 56 rcond 1 flops 73 peak memory usage: 4268 bytes ./kluldemo < ../Matrix/1c.mtx -KLU: Oct 23, 2014, version: 1.3.2 +KLU: June 3, 2015, version: 1.3.3 n 1 nnz(A) 1 nnz(L+U+F) 1 resid 0 recip growth 1 condest 1 rcond 1 flops 0 peak memory usage: 600 bytes ./kluldemo < ../Matrix/arrowc.mtx -KLU: Oct 23, 2014, version: 1.3.2 +KLU: June 3, 2015, version: 1.3.3 n 100 nnz(A) 298 nnz(L+U+F) 298 resid 1.68007e-14 recip growth 0.019999 condest 295.99 rcond 0.019999 flops 297 peak memory usage: 39000 bytes ./kluldemo < ../Matrix/arrow.mtx -KLU: Oct 23, 2014, version: 1.3.2 +KLU: June 3, 2015, version: 1.3.3 n 100 nnz(A) 298 nnz(L+U+F) 298 resid 1.77636e-15 recip growth 0.0204082 condest 303 rcond 0.0204082 flops 297 peak memory usage: 29584 bytes ./kluldemo < ../Matrix/impcol_a.mtx -KLU: Oct 23, 2014, version: 1.3.2 +KLU: June 3, 2015, version: 1.3.3 n 207 nnz(A) 572 nnz(L+U+F) 615 resid 6.98492e-10 recip growth 0.00957447 condest 4.35093e+07 rcond 4.5277e-05 flops 259 peak memory usage: 44800 bytes ./kluldemo < ../Matrix/w156.mtx -KLU: Oct 23, 2014, version: 1.3.2 +KLU: June 3, 2015, version: 1.3.3 n 156 nnz(A) 362 nnz(L+U+F) 396 resid 6.23816e-08 recip growth 0.00889922 condest 1.79787e+09 rcond 0.000124785 flops 175 peak memory usage: 47480 bytes ./kluldemo < ../Matrix/ctina.mtx -KLU: Oct 23, 2014, version: 1.3.2 +KLU: June 3, 2015, version: 1.3.3 n 11 nnz(A) 36 nnz(L+U+F) 45 resid 4.44089e-16 recip growth 1 condest 56 rcond 1 flops 73 peak memory usage: 5144 bytes diff --git a/KLU/Doc/ChangeLog b/KLU/Doc/ChangeLog index c14a1bf738..d71e056634 100644 --- a/KLU/Doc/ChangeLog +++ b/KLU/Doc/ChangeLog @@ -1,3 +1,8 @@ +June 3, 2015: version 1.3.3 + + * fix to klu_dump.c, only when debugging is enabled. + No affect on production code. + Oct 23, 2014: version 1.3.2 * modified MATLAB/klu_make.m. No change to C source code. diff --git a/KLU/Doc/KLU_UserGuide.pdf b/KLU/Doc/KLU_UserGuide.pdf index f5c509d6d5..a8cb61b856 100644 Binary files a/KLU/Doc/KLU_UserGuide.pdf and b/KLU/Doc/KLU_UserGuide.pdf differ diff --git a/KLU/Doc/KLU_UserGuide.tex b/KLU/Doc/KLU_UserGuide.tex index 6ad491aff5..dddda59f21 100644 --- a/KLU/Doc/KLU_UserGuide.tex +++ b/KLU/Doc/KLU_UserGuide.tex @@ -26,7 +26,7 @@ } \and Eka Palamadai Natarajan} -\date{VERSION 1.3.2, Oct 23, 2014} +\date{VERSION 1.3.3, June 3, 2015} \maketitle %------------------------------------------------------------------------------ diff --git a/KLU/Doc/Makefile b/KLU/Doc/Makefile index afa0942b55..1330d1e674 100644 --- a/KLU/Doc/Makefile +++ b/KLU/Doc/Makefile @@ -24,13 +24,13 @@ distclean: clean KLU_UserGuide.pdf: KLU_UserGuide.tex KLU_UserGuide.bib \ ../Include/klu.h ../../BTF/Include/btf.h Makefile - echo '\\begin{verbatim}' > klu_h.tex + echo '\begin{verbatim}' > klu_h.tex expand -8 ../Include/klu.h >> klu_h.tex echo '\end{verbatim}' >> klu_h.tex - echo '\\begin{verbatim}' > btf_h.tex + echo '\begin{verbatim}' > btf_h.tex expand -8 ../../BTF/Include/btf.h >> btf_h.tex echo '\end{verbatim}' >> btf_h.tex - echo '\\begin{verbatim}' > klu_simple_c.tex + echo '\begin{verbatim}' > klu_simple_c.tex expand -8 ../Demo/klu_simple.c >> klu_simple_c.tex echo '\end{verbatim}' >> klu_simple_c.tex pdflatex KLU_UserGuide diff --git a/KLU/Include/klu.h b/KLU/Include/klu.h index efbc5236c8..6ec875d261 100644 --- a/KLU/Include/klu.h +++ b/KLU/Include/klu.h @@ -819,11 +819,11 @@ void *klu_l_realloc (size_t, size_t, size_t, void *, klu_l_common *) ; * #endif */ -#define KLU_DATE "Oct 23, 2014" +#define KLU_DATE "June 3, 2015" #define KLU_VERSION_CODE(main,sub) ((main) * 1000 + (sub)) #define KLU_MAIN_VERSION 1 #define KLU_SUB_VERSION 3 -#define KLU_SUBSUB_VERSION 2 +#define KLU_SUBSUB_VERSION 3 #define KLU_VERSION KLU_VERSION_CODE(KLU_MAIN_VERSION,KLU_SUB_VERSION) #ifdef __cplusplus diff --git a/KLU/Makefile b/KLU/Makefile index 1ca71fd1f0..b3dd90b83c 100644 --- a/KLU/Makefile +++ b/KLU/Makefile @@ -2,7 +2,7 @@ # KLU Makefile #------------------------------------------------------------------------------ -VERSION = 1.3.2 +VERSION = 1.3.3 default: all diff --git a/KLU/Source/klu_dump.c b/KLU/Source/klu_dump.c index 63170bc4c9..8f5590053e 100644 --- a/KLU/Source/klu_dump.c +++ b/KLU/Source/klu_dump.c @@ -110,14 +110,19 @@ Int KLU_valid_LU (Int n, Int flag_test_start_ptr, Int Xip [ ], for (j = 0 ; j < n ; j++) { p1 = Xip [j] ; - p2 = Xip [j+1] ; - PRINTF (("\nColumn: %d p1: %d p2: %d\n", j, p1, p2)) ; - if (p1 > p2) + PRINTF (("\nColumn of factor: %d p1: %d ", j, p1)) ; + if (j < n-1) { - /* column pointers must be ascending */ - PRINTF (("column %d pointer bad\n", j)) ; - return (FALSE) ; + p2 = Xip [j+1] ; + PRINTF (("p2: %d ", p2)) ; + if (p1 > p2) + { + /* column pointers must be ascending */ + PRINTF (("column %d pointer bad\n", j)) ; + return (FALSE) ; + } } + PRINTF (("\n")) ; GET_POINTER (LU, Xip, Xlen, Xi, Xx, j, len) ; for (p = 0 ; p < len ; p++) { diff --git a/MATLAB_Tools/UFcollection/Doc/ChangeLog b/MATLAB_Tools/UFcollection/Doc/ChangeLog index b24cdb321d..6d31d98af6 100644 --- a/MATLAB_Tools/UFcollection/Doc/ChangeLog +++ b/MATLAB_Tools/UFcollection/Doc/ChangeLog @@ -1,3 +1,8 @@ +June 3, 2015: + + * correction in SuiteSparse 4.4.5 to UFindex.m, introduced a typo in + UFindex.m in SuiteSparse 4.3.0. + Jun 20, 2012: verison 1.6.2 * minor update for Windows (removed filesep) diff --git a/MATLAB_Tools/UFcollection/UFindex.m b/MATLAB_Tools/UFcollection/UFindex.m index ff5aec38f4..1ef48213ee 100644 --- a/MATLAB_Tools/UFcollection/UFindex.m +++ b/MATLAB_Tools/UFcollection/UFindex.m @@ -42,6 +42,12 @@ % posdef 1 if positive definite, 0 otherwise % isND 1 if a 2D/3D problem, 0 otherwise % isGraph 1 if a graph, 0 otherwise +% lowerbandwidth lower bandwidth, [i j]=find(A), max(0,max(i-j)) +% upperbandwidth upper bandwidth, [i j]=find(A), max(0,max(j-i)) +% rcm_lowerbandwidth lower bandwidth after symrcm +% rcm_upperbandwidth upper bandwidth after symrcm +% xmin smallest nonzero value +% xmax largest nonzero value % % If the statistic is intentionally not computed, it is set to -2. Some % statistics are not computed for rectangular or structurally singular @@ -154,6 +160,8 @@ UF_Index.upperbandwidth = nothing ; UF_Index.rcm_lowerbandwidth = nothing ; UF_Index.rcm_upperbandwidth = nothing ; + UF_Index.xmin = nothing ; + UF_Index.xmax = nothing ; else @@ -189,10 +197,12 @@ UF_Index.ncc = [UF_Index.ncc nothing] ; UF_Index.isND = [UF_Index.isND nothing] ; UF_Index.isGraph = [UF_Index.isGraph nothing] ; - UF_Index.lowerbandwidth = [UF_Index.lowerbandwidth nothing ; - UF_Index.upperbandwidth = [UF_Index.upperbandwidth nothing ; - UF_Index.rcm_lowerbandwidth = [UF_Index.rcm_upperbandwidth nothing ; - UF_Index.rcm_upperbandwidth = [UF_Index.rcm_upperbandwidth nothing ; + UF_Index.lowerbandwidth = [UF_Index.lowerbandwidth nothing] ; + UF_Index.upperbandwidth = [UF_Index.upperbandwidth nothing] ; + UF_Index.rcm_lowerbandwidth = [UF_Index.rcm_upperbandwidth nothing]; + UF_Index.rcm_upperbandwidth = [UF_Index.rcm_upperbandwidth nothing]; + UF_Index.xmin = [UF_Index.xmin nothing] ; + UF_Index.xmax = [UF_Index.xmax nothing] ; end end end @@ -362,6 +372,8 @@ UF_Index.upperbandwidth (id) = stats.upperbandwidth ; UF_Index.rcm_lowerbandwidth (id) = stats.rcm_lowerbandwidth ; UF_Index.rcm_upperbandwidth (id) = stats.rcm_upperbandwidth ; + UF_Index.xmin (id) = stats.xmin ; + UF_Index.xmax (id) = stats.xmax ; %--------------------------------------------------------------------------- % clear the problem and save the index and UFstats.csv diff --git a/MATLAB_Tools/UFcollection/UFstats.m b/MATLAB_Tools/UFcollection/UFstats.m index 541834b70c..058d1d55e3 100644 --- a/MATLAB_Tools/UFcollection/UFstats.m +++ b/MATLAB_Tools/UFcollection/UFstats.m @@ -36,6 +36,8 @@ % upperbandwidth upper bandwidth, [i j]=find(A), max(0,max(j-i)) % rcm_lowerbandwidth lower bandwidth after symrcm % rcm_upperbandwidth upper bandwidth after symrcm +% xmin smallest nonzero value +% xmax largest nonzero value % % amd_lnz and amd_flops are not computed for rectangular matrices. % @@ -179,6 +181,7 @@ fprintf ('rcm: lo %d up %d', ... stats.rcm_lowerbandwidth, stats.rcm_upperbandwidth) ; end +fprintf ('\n') ; clear AZ i j p %------------------------------------------------------------------------------- @@ -439,5 +442,19 @@ fprintf ('nblocks %d\n', stats.nblocks) ; fprintf ('sprank %d, time: %g\n', stats.sprank, toc) ; -fprintf ('UFstats done\n') ; +%------------------------------------------------------------------------------- +% xmin and xmax +%------------------------------------------------------------------------------- + +[i,j,x] = find (A) ; +stats.xmin = min (x) ; +stats.xmax = max (x) ; +fprintf ('xmin %32.16g xmax %32.16g\n', stats.xmin, stats.xmax) ; +if (stats.xmin == 0 || stats.xmax == 0) + error ('explicit zeros in the matrix!') ; +end + +%------------------------------------------------------------------------------- + +fprintf ('UFstats done\n') ; diff --git a/README.txt b/README.txt index 8b5f561922..d3256c32f8 100644 --- a/README.txt +++ b/README.txt @@ -1,6 +1,6 @@ SuiteSparse: A Suite of Sparse matrix packages at http://www.suitesparse.com -March 24, 2015. SuiteSparse VERSION 4.4.4 +July 13, 2015. SuiteSparse VERSION 4.4.5 ------------------ SuiteSparse/README diff --git a/SPQR/Doc/ChangeLog b/SPQR/Doc/ChangeLog index da9e153e6d..51cf43df6b 100644 --- a/SPQR/Doc/ChangeLog +++ b/SPQR/Doc/ChangeLog @@ -1,3 +1,7 @@ +Aug 28, 2015: version 2.0.2 + + * changed the default tol when A has inf's + Mar 24, 2015: version 2.0.1 * minor changes to documentation diff --git a/SPQR/Doc/spqr_user_guide.pdf b/SPQR/Doc/spqr_user_guide.pdf index bc316525ab..7c32495792 100644 Binary files a/SPQR/Doc/spqr_user_guide.pdf and b/SPQR/Doc/spqr_user_guide.pdf differ diff --git a/SPQR/Doc/spqr_user_guide.tex b/SPQR/Doc/spqr_user_guide.tex index 60aa6f6e79..63fc4a3ec2 100644 --- a/SPQR/Doc/spqr_user_guide.tex +++ b/SPQR/Doc/spqr_user_guide.tex @@ -29,7 +29,7 @@ Science Foundation, under grants 0203270, 0620286, and 0619080.}, Sencer Nuri Yeralan, and Sanjay Ranka} -\date{VERSION 2.0.1, March 24, 2015} +\date{VERSION 2.0.2, Aug 28, 2015} %------------------------------------------------------------------------------- \begin{document} diff --git a/SPQR/Include/SuiteSparseQR_definitions.h b/SPQR/Include/SuiteSparseQR_definitions.h index 5a96fdbcf6..ab6cf851af 100644 --- a/SPQR/Include/SuiteSparseQR_definitions.h +++ b/SPQR/Include/SuiteSparseQR_definitions.h @@ -59,11 +59,11 @@ #endif */ -#define SPQR_DATE "Mar 24, 2015" +#define SPQR_DATE "Aug 28, 2015" #define SPQR_VER_CODE(main,sub) ((main) * 1000 + (sub)) #define SPQR_MAIN_VERSION 2 #define SPQR_SUB_VERSION 0 -#define SPQR_SUBSUB_VERSION 1 +#define SPQR_SUBSUB_VERSION 2 #define SPQR_VERSION SPQR_VER_CODE(SPQR_MAIN_VERSION,SPQR_SUB_VERSION) #endif diff --git a/SPQR/Makefile b/SPQR/Makefile index a4af9fc668..dfa0f14281 100644 --- a/SPQR/Makefile +++ b/SPQR/Makefile @@ -2,7 +2,7 @@ # SuiteSparseQR Makefile #------------------------------------------------------------------------------- -VERSION = 2.0.1 +VERSION = 2.0.2 include ../SuiteSparse_config/SuiteSparse_config.mk diff --git a/SPQR/Source/spqr_tol.cpp b/SPQR/Source/spqr_tol.cpp index 035924ba6a..b1ab7467e3 100644 --- a/SPQR/Source/spqr_tol.cpp +++ b/SPQR/Source/spqr_tol.cpp @@ -5,6 +5,7 @@ // Return the default column 2-norm tolerance #include "spqr.hpp" +#include // return the default tol (-1 if error) template double spqr_tol @@ -18,8 +19,14 @@ template double spqr_tol { RETURN_IF_NULL_COMMON (EMPTY) ; RETURN_IF_NULL (A, EMPTY) ; - return (20 * ((double) A->nrow + (double) A->ncol) * DBL_EPSILON * - spqr_maxcolnorm (A, cc)) ; + double tol = (20 * ((double) A->nrow + (double) A->ncol) * DBL_EPSILON * + spqr_maxcolnorm (A, cc)); + // MathWorks modification: if the tolerance becomes Inf, replace it with + // realmax; otherwise, we may end up with an all-zero matrix R + // (see g1284493) + tol = std::min(tol, std::numeric_limits::max()); + + return (tol) ; } template double spqr_tol // return the default tol diff --git a/SuiteSparse_config/Makefile b/SuiteSparse_config/Makefile index 474cf8a436..71e65cfab2 100644 --- a/SuiteSparse_config/Makefile +++ b/SuiteSparse_config/Makefile @@ -2,7 +2,7 @@ # SuiteSparse_config Makefile #------------------------------------------------------------------------------- -VERSION = 4.4.4 +VERSION = 4.4.6 default: ccode diff --git a/SuiteSparse_config/SuiteSparse_config.h b/SuiteSparse_config/SuiteSparse_config.h index 682968f214..cd1ce9ba01 100644 --- a/SuiteSparse_config/SuiteSparse_config.h +++ b/SuiteSparse_config/SuiteSparse_config.h @@ -189,11 +189,11 @@ int SuiteSparse_divcomplex * BTF version 1.2.1 * CAMD version 2.4.1 * CCOLAMD version 2.9.1 - * CHOLMOD version 3.0.5 + * CHOLMOD version 3.0.6 * COLAMD version 2.9.1 * CSparse version 3.1.4 * CXSparse version 3.1.4 - * KLU version 1.3.2 + * KLU version 1.3.3 * LDL version 2.2.1 * RBio version 2.2.1 * SPQR version 2.0.1 @@ -233,11 +233,11 @@ int SuiteSparse_version /* returns SUITESPARSE_VERSION */ */ #define SUITESPARSE_HAS_VERSION_FUNCTION -#define SUITESPARSE_DATE "Mar 24, 2015" +#define SUITESPARSE_DATE "Aug 28, 2015" #define SUITESPARSE_VER_CODE(main,sub) ((main) * 1000 + (sub)) #define SUITESPARSE_MAIN_VERSION 4 #define SUITESPARSE_SUB_VERSION 4 -#define SUITESPARSE_SUBSUB_VERSION 4 +#define SUITESPARSE_SUBSUB_VERSION 6 #define SUITESPARSE_VERSION \ SUITESPARSE_VER_CODE(SUITESPARSE_MAIN_VERSION,SUITESPARSE_SUB_VERSION) diff --git a/UFget/mat/UF_Index.mat b/UFget/mat/UF_Index.mat index 33213c8417..c15345da04 100644 Binary files a/UFget/mat/UF_Index.mat and b/UFget/mat/UF_Index.mat differ diff --git a/UFget/matrices/UFstats.csv b/UFget/matrices/UFstats.csv index 6c42242605..0c4c0fcd15 100644 --- a/UFget/matrices/UFstats.csv +++ b/UFget/matrices/UFstats.csv @@ -1,5 +1,5 @@ -2650 -03-Dec-2012 16:02:06 +2757 +03-Jun-2015 15:41:38 HB,1138_bus,1138,1138,4054,1,0,0,1,1,1,power network problem HB,494_bus,494,494,1666,1,0,0,1,1,1,power network problem HB,662_bus,662,662,2474,1,0,0,1,1,1,power network problem @@ -1477,7 +1477,7 @@ Pajek,football,35,35,118,1,0,0,0,0,0,directed weighted graph Pajek,GD00_a,352,352,458,1,1,0,0,0,0,directed graph Pajek,GD00_c,638,638,1041,1,0,0,0,0.02133850630455868,0.01551891367604268,directed multigraph Pajek,GD01_a,311,311,645,1,0,0,0,0.01550387596899225,0.01550387596899225,directed weighted graph -Pajek,GD01_A,953,953,645,1,0,0,0,0.01550387596899225,0.01550387596899225,directed multigraph +Pajek,GD01_Acap,953,953,645,1,0,0,0,0.01550387596899225,0.01550387596899225,directed multigraph Pajek,GD01_b,18,18,37,1,1,0,0,0.5142857142857142,0.5142857142857142,directed graph Pajek,GD01_c,33,33,135,1,0,0,0,0,0,directed multigraph Pajek,GD02_a,23,23,87,1,1,0,0,0.6436781609195402,0.6436781609195402,directed graph @@ -2650,3 +2650,110 @@ Janna,CoupCons3D,416800,416800,17277420,1,0,1,0,1,0.008881642549324996,structura Janna,ML_Laplace,377002,377002,27582698,1,0,1,0,1,7.351401706466176e-08,structural problem Janna,Transport,1602111,1602111,23487281,1,0,1,0,1,0,structural problem Janna,ML_Geer,1504002,1504002,110686677,1,0,1,0,1,2.381330188145693e-07,structural problem +ANSYS,Delor64K,64719,1785345,652140,1,0,0,0,0,0,least squares problem +ANSYS,Delor295K,295734,1823928,2401323,1,0,0,0,0,0,least squares problem +ANSYS,Delor338K,343236,887058,4211599,1,0,0,0,0,0,least squares problem +Sorensen,Linux_call_graph,324085,324085,1208908,1,0,0,0,0.0006324084497715383,0.0006125422157473015,directed weighted graph +LeGresley,LeGresley_2508,2508,2508,16727,1,0,0,0,0.8376116463886349,0.2557141852450946,power network problem +LeGresley,LeGresley_4908,4908,4908,30482,1,0,0,0,0.9773607038123168,0.02995112414467253,power network problem +LeGresley,LeGresley_87936,87936,87936,593276,1,0,0,0,0.9792020608292309,0.03427471928313486,power network problem +Brogan,specular,477976,1600,7647040,1,0,1,0,0,0,computer vision problem +Janna,Bump_2911,2911419,2911419,127729899,1,0,1,1,1,1,2D/3D problem +Janna,Queen_4147,4147110,4147110,316548962,1,0,1,1,1,1,2D/3D problem +Janna,PFlow_742,742793,742793,37138461,1,0,1,1,1,1,2D/3D problem +Freescale,Freescale2,2999349,2999349,14313235,1,0,0,0,0.9853083953765489,0.5600838032920651,circuit simulation matrix +Moqri,MISKnowledgeMap,2427,2427,57022,1,0,0,0,1,1,undirected weighted graph +Mazaheri,bundle_adj,513351,513351,20207907,1,0,1,1,1,1,computer vision problem +VDOL,dynamicSoaringProblem_1,647,647,5367,1,0,0,0,1,1,optimal control problem +VDOL,dynamicSoaringProblem_2,1591,1591,15588,1,0,0,0,1,1,optimal control problem +VDOL,dynamicSoaringProblem_3,2871,2871,32022,1,0,0,0,1,1,optimal control problem +VDOL,dynamicSoaringProblem_4,3191,3191,36516,1,0,0,0,1,1,optimal control problem +VDOL,dynamicSoaringProblem_5,3271,3271,36789,1,0,0,0,1,1,optimal control problem +VDOL,dynamicSoaringProblem_6,3431,3431,36741,1,0,0,0,1,1,optimal control problem +VDOL,dynamicSoaringProblem_7,3511,3511,37680,1,0,0,0,1,1,optimal control problem +VDOL,dynamicSoaringProblem_8,3543,3543,38136,1,0,0,0,1,1,optimal control problem +VDOL,freeFlyingRobot_1,798,798,5246,1,0,0,0,1,1,optimal control problem +VDOL,freeFlyingRobot_2,1338,1338,11600,1,0,0,0,1,1,optimal control problem +VDOL,freeFlyingRobot_3,1718,1718,12922,1,0,0,0,1,1,optimal control problem +VDOL,freeFlyingRobot_4,2358,2358,18218,1,0,0,0,1,1,optimal control problem +VDOL,freeFlyingRobot_5,2878,2878,24582,1,0,0,0,1,1,optimal control problem +VDOL,freeFlyingRobot_6,3358,3358,27030,1,0,0,0,1,1,optimal control problem +VDOL,freeFlyingRobot_7,3918,3918,31046,1,0,0,0,1,1,optimal control problem +VDOL,freeFlyingRobot_8,4398,4398,34958,1,0,0,0,1,1,optimal control problem +VDOL,freeFlyingRobot_9,4778,4778,39964,1,0,0,0,1,1,optimal control problem +VDOL,freeFlyingRobot_10,5218,5218,40080,1,0,0,0,1,1,optimal control problem +VDOL,freeFlyingRobot_11,5438,5438,40054,1,0,0,0,1,1,optimal control problem +VDOL,freeFlyingRobot_12,5578,5578,41940,1,0,0,0,1,1,optimal control problem +VDOL,freeFlyingRobot_13,5718,5718,43994,1,0,0,0,1,1,optimal control problem +VDOL,freeFlyingRobot_14,5958,5958,43298,1,0,0,0,1,1,optimal control problem +VDOL,freeFlyingRobot_15,6038,6038,43378,1,0,0,0,1,1,optimal control problem +VDOL,freeFlyingRobot_16,6078,6078,44006,1,0,0,0,1,1,optimal control problem +VDOL,goddardRocketProblem_1,831,831,8498,1,0,0,0,1,1,optimal control problem +VDOL,goddardRocketProblem_2,867,867,9058,1,0,0,0,1,1,optimal control problem +VDOL,hangGlider_1,360,360,3477,1,0,0,0,1,1,optimal control problem +VDOL,hangGlider_2,1647,1647,14754,1,0,0,0,1,1,optimal control problem +VDOL,hangGlider_3,10260,10260,92703,1,0,0,0,1,1,optimal control problem +VDOL,hangGlider_4,15561,15561,149532,1,0,0,0,1,1,optimal control problem +VDOL,hangGlider_5,16011,16011,155246,1,0,0,0,1,1,optimal control problem +VDOL,kineticBatchReactor_1,2052,2052,20600,1,0,0,0,1,1,optimal control problem +VDOL,kineticBatchReactor_2,4361,4361,44840,1,0,0,0,1,1,optimal control problem +VDOL,kineticBatchReactor_3,5082,5082,53219,1,0,0,0,1,1,optimal control problem +VDOL,kineticBatchReactor_4,7105,7105,74869,1,0,0,0,1,1,optimal control problem +VDOL,kineticBatchReactor_5,7641,7641,80767,1,0,0,0,1,1,optimal control problem +VDOL,kineticBatchReactor_6,7773,7773,82500,1,0,0,0,1,1,optimal control problem +VDOL,kineticBatchReactor_7,7968,7968,84508,1,0,0,0,1,1,optimal control problem +VDOL,kineticBatchReactor_8,8052,8052,85194,1,0,0,0,1,1,optimal control problem +VDOL,kineticBatchReactor_9,8115,8115,86183,1,0,0,0,1,1,optimal control problem +VDOL,lowThrust_1,584,584,6133,1,0,0,0,1,1,optimal control problem +VDOL,lowThrust_2,2312,2312,26261,1,0,0,0,1,1,optimal control problem +VDOL,lowThrust_3,7064,7064,80645,1,0,0,0,1,1,optimal control problem +VDOL,lowThrust_4,13562,13562,160947,1,0,0,0,1,1,optimal control problem +VDOL,lowThrust_5,16262,16262,198369,1,0,0,0,1,1,optimal control problem +VDOL,lowThrust_6,16928,16928,207349,1,0,0,0,1,1,optimal control problem +VDOL,lowThrust_7,17378,17378,211561,1,0,0,0,1,1,optimal control problem +VDOL,lowThrust_8,17702,17702,216445,1,0,0,0,1,1,optimal control problem +VDOL,lowThrust_9,18044,18044,219589,1,0,0,0,1,1,optimal control problem +VDOL,lowThrust_10,18260,18260,222005,1,0,0,0,1,1,optimal control problem +VDOL,lowThrust_11,18368,18368,223801,1,0,0,0,1,1,optimal control problem +VDOL,lowThrust_12,18458,18458,224593,1,0,0,0,1,1,optimal control problem +VDOL,lowThrust_13,18476,18476,224897,1,0,0,0,1,1,optimal control problem +VDOL,orbitRaising_1,442,442,2906,1,0,0,0,1,1,optimal control problem +VDOL,orbitRaising_2,739,739,6526,1,0,0,0,1,1,optimal control problem +VDOL,orbitRaising_3,761,761,6098,1,0,0,0,1,1,optimal control problem +VDOL,orbitRaising_4,915,915,7790,1,0,0,0,1,1,optimal control problem +VDOL,reorientation_1,677,677,7326,1,0,0,0,1,1,optimal control problem +VDOL,reorientation_2,1544,1544,17910,1,0,0,0,1,1,optimal control problem +VDOL,reorientation_3,2513,2513,32166,1,0,0,0,1,1,optimal control problem +VDOL,reorientation_4,2717,2717,33630,1,0,0,0,1,1,optimal control problem +VDOL,reorientation_5,2904,2904,35590,1,0,0,0,1,1,optimal control problem +VDOL,reorientation_6,3006,3006,37342,1,0,0,0,1,1,optimal control problem +VDOL,reorientation_7,3057,3057,37150,1,0,0,0,1,1,optimal control problem +VDOL,reorientation_8,3108,3108,37894,1,0,0,0,1,1,optimal control problem +VDOL,spaceShuttleEntry_1,560,560,6891,1,0,0,0,1,1,optimal control problem +VDOL,spaceShuttleEntry_2,1428,1428,24073,1,0,0,0,1,1,optimal control problem +VDOL,spaceShuttleEntry_3,1834,1834,28757,1,0,0,0,1,1,optimal control problem +VDOL,spaceShuttleEntry_4,2450,2450,39669,1,0,0,0,1,1,optimal control problem +VDOL,spaceStation_1,99,99,927,1,0,0,0,1,1,optimal control problem +VDOL,spaceStation_2,329,329,5817,1,0,0,0,1,1,optimal control problem +VDOL,spaceStation_3,467,467,5103,1,0,0,0,1,1,optimal control problem +VDOL,spaceStation_4,950,950,13626,1,0,0,0,1,1,optimal control problem +VDOL,spaceStation_5,1019,1019,15219,1,0,0,0,1,1,optimal control problem +VDOL,spaceStation_6,1111,1111,17595,1,0,0,0,1,1,optimal control problem +VDOL,spaceStation_7,1134,1134,18252,1,0,0,0,1,1,optimal control problem +VDOL,spaceStation_8,1157,1157,18945,1,0,0,0,1,1,optimal control problem +VDOL,spaceStation_9,1180,1180,19674,1,0,0,0,1,1,optimal control problem +VDOL,spaceStation_10,1272,1272,17478,1,0,0,0,1,1,optimal control problem +VDOL,spaceStation_11,1364,1364,18954,1,0,0,0,1,1,optimal control problem +VDOL,spaceStation_12,1410,1410,19728,1,0,0,0,1,1,optimal control problem +VDOL,spaceStation_13,1617,1617,23649,1,0,0,0,1,1,optimal control problem +VDOL,spaceStation_14,1640,1640,24324,1,0,0,0,1,1,optimal control problem +VDOL,tumorAntiAngiogenesis_1,205,205,1783,1,0,0,0,1,1,optimal control problem +VDOL,tumorAntiAngiogenesis_2,305,305,2699,1,0,0,0,1,1,optimal control problem +VDOL,tumorAntiAngiogenesis_3,410,410,3952,1,0,0,0,1,1,optimal control problem +VDOL,tumorAntiAngiogenesis_4,455,455,4593,1,0,0,0,1,1,optimal control problem +VDOL,tumorAntiAngiogenesis_5,460,460,4690,1,0,0,0,1,1,optimal control problem +VDOL,tumorAntiAngiogenesis_6,465,465,4795,1,0,0,0,1,1,optimal control problem +VDOL,tumorAntiAngiogenesis_7,475,475,4597,1,0,0,0,1,1,optimal control problem +VDOL,tumorAntiAngiogenesis_8,490,490,4776,1,0,0,0,1,1,optimal control problem +Meng,iChem_Jacobian,274087,274087,4137369,0,0,0,0,0.9801722990969854,0.6457048695901567,computational chemistry problem +Harvard_Seismology,JP,87616,67320,13734559,1,0,0,0,0,0,tomography problem